ng-firebase-table-kxp 1.2.2 → 1.2.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ng-firebase-table-kxp.mjs","sources":["../../../projects/ng-firebase-table-kxp/src/lib/ng-firebase-table-kxp.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/types/Table.ts","../../../projects/ng-firebase-table-kxp/src/lib/utils/table.utils.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/table.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/filter.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/tooltip.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/pagination.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tabs/table-tabs.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tabs/table-tabs.component.html","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tooltip/table-tooltip.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tooltip/table-tooltip.component.html","../../../projects/ng-firebase-table-kxp/src/lib/components/table/table.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/components/table/table.component.html","../../../projects/ng-firebase-table-kxp/src/lib/ng-firebase-table-kxp.module.ts","../../../projects/ng-firebase-table-kxp/src/lib/ng-firebase-table-kxp.service.ts","../../../projects/ng-firebase-table-kxp/src/public-api.ts","../../../projects/ng-firebase-table-kxp/src/ng-firebase-table-kxp.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-ng-firebase-table-kxp',\n standalone: false,\n template: ` <p>ng-firebase-table-kxp works!</p> `,\n styles: [],\n})\nexport class NgFirebaseTableKxpComponent {}\n","import {\r\n CollectionReference,\r\n DocumentReference,\r\n QueryDocumentSnapshot,\r\n} from '@angular/fire/compat/firestore';\r\nimport { PipeTransform } from '@angular/core';\r\nimport firebase from 'firebase/compat';\r\nimport WhereFilterOp = firebase.firestore.WhereFilterOp;\r\nimport { OrderByDirection } from 'firebase/firestore';\r\n\r\nexport const TABLE_DEFAULTS = {\r\n SORT_FIELD: 'createdAt',\r\n SORT_ORDER: 'desc' as const,\r\n PAGE_SIZE: 25,\r\n DEBOUNCE_TIME_MS: 500,\r\n DEFAULT_BG_COLOR: '#1976d2',\r\n DEFAULT_TEXT_COLOR: '#ffffff',\r\n};\r\n\r\nexport interface TableData {\r\n displayedColumns: Column[];\r\n filterableOptions?: FilterableOption[];\r\n collectionRef: CollectionReference<unknown>;\r\n collection: string;\r\n name: string;\r\n totalRef?: { ref: DocumentReference<unknown>; field: string }[];\r\n download: boolean;\r\n pagination: boolean;\r\n isNotClickable?: boolean;\r\n url?: string;\r\n sortBy?: { field: string; order: OrderByDirection };\r\n conditions?: {\r\n operator: WhereFilterOp;\r\n firestoreProperty: string;\r\n dashProperty: string | string[];\r\n }[];\r\n filterFn?: (item: any) => boolean;\r\n color?: { bg: string; text: string };\r\n showSimpleSearch?: boolean; // Flag para mostrar/ocultar campo de busca simples (padrão: true)\r\n actionButton?: {\r\n label: string;\r\n routerLink: string;\r\n icon?: string;\r\n colorClass?: string;\r\n method?: (row: any, event?: any) => any;\r\n condition?: (row?: any) => boolean;\r\n };\r\n tabs?: Tab;\r\n}\r\n\r\nexport interface Tab {\r\n method: (tab: any, event?: any) => any;\r\n tabsData: TabData[];\r\n}\r\n\r\nexport interface TabData {\r\n label: string;\r\n counter?: number;\r\n counterClass?: string;\r\n}\r\n\r\nexport interface Column {\r\n property: string;\r\n title?: string;\r\n charLimit?: number;\r\n pipe?: PipeTransform;\r\n iconClass?: {\r\n text?: string;\r\n class?: string;\r\n condition?: (row: any) => any;\r\n buttonMethod?: (row: any, event?: any) => any;\r\n }[];\r\n isSortable?: boolean;\r\n isFilterable?: boolean;\r\n isFilterableByDate?: boolean;\r\n hasLink?: boolean | string;\r\n hasDownload?: boolean | string;\r\n relation?: {\r\n targetedCollection: string; //users (collection targeted do join)\r\n sourceProperty: string; // userId << da collection atual `orders`\r\n targetedProperty: string; // name ?? (propriedade que quero puxar da tabela users)\r\n };\r\n queryLength?: {\r\n collection: string;\r\n property: string;\r\n operator: WhereFilterOp;\r\n value: string;\r\n };\r\n image?: Image;\r\n method?: (row: any, event?: any) => any;\r\n filterPredicates?: string[];\r\n calculateValue?: (row: any) => any;\r\n arrayField?: string;\r\n tooltip?: { color: string; text: string };\r\n}\r\n\r\nexport interface Image {\r\n class: string;\r\n path?: string;\r\n url?: boolean;\r\n default?: string;\r\n}\r\n\r\nexport interface FilterableOption {\r\n title: string;\r\n items: {\r\n property: string;\r\n value: string | boolean;\r\n label: string;\r\n }[];\r\n}\r\n\r\nexport interface Pagination {\r\n batchSize: number;\r\n collection: string;\r\n doc?: {\r\n firstDoc: QueryDocumentSnapshot<any> | null;\r\n lastDoc: QueryDocumentSnapshot<any> | null;\r\n };\r\n navigation: 'reload' | 'forward' | 'backward';\r\n arrange: Arrange;\r\n conditions?: Condition[];\r\n filterFn?: (item: any) => boolean;\r\n size?: number;\r\n clientPageIndex?: number;\r\n}\r\n\r\nexport interface Condition {\r\n operator: WhereFilterOp;\r\n firestoreProperty: string;\r\n dashProperty: string | string[];\r\n}\r\n\r\nexport interface Arrange {\r\n filters: {\r\n arrange:\r\n | 'ascending'\r\n | 'descending'\r\n | 'filter'\r\n | 'filterByDate'\r\n | 'equals'\r\n | '';\r\n filter?: { property: string; filtering: string } | null;\r\n dateFilter?: {\r\n initial: Date;\r\n final: Date;\r\n };\r\n }[];\r\n sortBy: { field: string; order: OrderByDirection };\r\n elementId?: { property: string; value: string };\r\n}\r\n\r\n// Tipo para itens do dropdown de filtros e ordenação\r\nexport type DropdownItem = Column & {\r\n arrange: 'filter' | 'filterByDate' | 'equals' | 'ascending' | 'descending';\r\n title: string;\r\n icon?: string;\r\n};\r\n\r\n// Tipo para itens selecionados em filtros\r\nexport interface FilterSelectItem {\r\n property: string;\r\n value: string | boolean;\r\n label: string;\r\n}\r\n","import { Column } from '../types/Table';\r\n\r\n/**\r\n * Obtém o valor aninhado de um objeto dado um caminho (ex: 'user.address.city')\r\n */\r\nexport function getNestedValue(obj: any, path: string): any {\r\n if (!path) return undefined;\r\n const properties = path.split('.');\r\n return properties.reduce(\r\n (acc, currentPart) => acc && acc[currentPart],\r\n obj\r\n );\r\n}\r\n\r\n/**\r\n * Formata um array de objetos em uma string com valores separados por vírgula\r\n */\r\nexport function formatArrayValue(array: any[], field: string): string {\r\n if (!Array.isArray(array) || array.length === 0) {\r\n return '';\r\n }\r\n\r\n const values = array\r\n .map((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n return item[field] || '';\r\n }\r\n return String(item);\r\n })\r\n .filter((value) => value !== '' && value !== null && value !== undefined);\r\n\r\n return values.join(', ');\r\n}\r\n\r\n/**\r\n * Obtém o valor de exibição para uma célula da tabela\r\n */\r\nexport function getDisplayValue(\r\n col: Column,\r\n row: any,\r\n withinLimit: boolean = false\r\n): string {\r\n let value: any;\r\n\r\n if (col.calculateValue) {\r\n value = col.calculateValue(row);\r\n } else {\r\n value = getNestedValue(row, col.property);\r\n }\r\n\r\n if (Array.isArray(value) && col.arrayField) {\r\n value = formatArrayValue(value, col.arrayField);\r\n }\r\n\r\n if (col.queryLength && row[col.property]) {\r\n value = row[col.property];\r\n }\r\n\r\n value = col.pipe ? col.pipe.transform(value) : value;\r\n\r\n if (value === null || value === undefined) {\r\n value = '';\r\n } else {\r\n value = String(value);\r\n }\r\n\r\n if (withinLimit || !col.charLimit || value.length <= col.charLimit) {\r\n return value;\r\n }\r\n return value.substring(0, col.charLimit) + '...';\r\n}\r\n\r\n/**\r\n * Verifica se um valor é string\r\n */\r\nexport function isString(value: any): boolean {\r\n return typeof value === 'string';\r\n}\r\n\r\n/**\r\n * TrackBy function para colunas\r\n */\r\nexport function trackByProperty(_index: number, col: Column): string {\r\n return col.property;\r\n}\r\n\r\n/**\r\n * Gera uma chave única para identificar uma imagem em carregamento\r\n */\r\nexport function getImageKey(row: any, col: Column): string {\r\n const rowId = row.id || row._id || JSON.stringify(row);\r\n return `${rowId}-${col.property}`;\r\n}\r\n\r\n\r\n","import { Injectable, Optional } from '@angular/core';\r\nimport {\r\n AngularFirestore,\r\n CollectionReference,\r\n QueryDocumentSnapshot,\r\n} from '@angular/fire/compat/firestore';\r\nimport firebase from 'firebase/compat/app';\r\nimport { Arrange, Condition, Pagination } from '../types/Table';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { AbstractControl, ValidatorFn } from '@angular/forms';\r\nimport * as moment from 'moment';\r\n\r\ninterface ErrorWithCode extends Error {\r\n code: string;\r\n}\r\n\r\ninterface ErrorWithMessage {\r\n message: string;\r\n}\r\n\r\ninterface PaginationResult {\r\n items: Array<Record<string, unknown> & { id: string }>;\r\n filterLength: number | null;\r\n firstDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null;\r\n lastDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null;\r\n hasNextPage: boolean;\r\n hasPreviousPage?: boolean;\r\n currentClientPageIndex?: number;\r\n totalPages?: number;\r\n}\r\n\r\n@Injectable()\r\nexport class TableService {\r\n constructor(\r\n @Optional() private ngFire: AngularFirestore,\r\n @Optional() private dialog: MatDialog,\r\n @Optional() private toastr: ToastrService\r\n ) {}\r\n\r\n async getItems(\r\n collection: CollectionReference<unknown>\r\n ): Promise<Array<Record<string, unknown> & { id: string }>> {\r\n try {\r\n const querySnapshot = await collection.get();\r\n return querySnapshot.docs.map(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { ...(data ?? {}), id: doc.id } as Record<string, unknown> & {\r\n id: string;\r\n };\r\n }\r\n );\r\n } catch (error) {\r\n console.warn('Collection não encontrada:', error);\r\n return [];\r\n }\r\n }\r\n\r\n private async executeQuery(params: Pagination): Promise<PaginationResult> {\r\n if (params.filterFn) {\r\n // Lógica com filtro no cliente (filterFn)\r\n const BATCH_FETCH_SIZE = params.batchSize;\r\n const GOAL_SIZE = params.batchSize + 1;\r\n\r\n if (params.navigation === 'forward' || params.navigation === 'reload') {\r\n if (params.navigation === 'reload' && params.doc) {\r\n params.doc.lastDoc = null;\r\n }\r\n\r\n let lastDocCursor: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n params.doc ? params.doc.lastDoc : null;\r\n let pageResults: Array<Record<string, unknown> & { id: string }> = [];\r\n let allFetchedDocs: firebase.firestore.QueryDocumentSnapshot<unknown>[] =\r\n [];\r\n let hasMoreDocsInDb = true;\r\n\r\n while (pageResults.length < GOAL_SIZE && hasMoreDocsInDb) {\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n query = this.applyFilters(query, params.arrange, params.conditions);\r\n\r\n if (lastDocCursor) {\r\n query = query.startAfter(lastDocCursor);\r\n }\r\n query = query.limit(BATCH_FETCH_SIZE);\r\n\r\n const snapshot = await query.get();\r\n\r\n if (snapshot.empty) {\r\n hasMoreDocsInDb = false;\r\n break;\r\n }\r\n\r\n lastDocCursor = snapshot.docs[snapshot.docs.length - 1];\r\n allFetchedDocs.push(...snapshot.docs);\r\n\r\n const batchUsers = snapshot.docs\r\n .map((doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<\r\n string,\r\n unknown\r\n > & { id: string };\r\n })\r\n .filter(params.filterFn);\r\n\r\n pageResults.push(...batchUsers);\r\n\r\n if (snapshot.size < BATCH_FETCH_SIZE) {\r\n hasMoreDocsInDb = false;\r\n }\r\n }\r\n\r\n const hasNextPage = pageResults.length > params.batchSize;\r\n const finalItems = pageResults.slice(0, params.batchSize);\r\n\r\n const firstDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[0]?.id\r\n ) || null;\r\n const lastDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[finalItems.length - 1]?.id\r\n ) || null;\r\n\r\n return {\r\n items: finalItems,\r\n filterLength: null,\r\n firstDoc: firstDocOfPage,\r\n lastDoc: lastDocOfPage,\r\n hasNextPage: hasNextPage,\r\n hasPreviousPage:\r\n !!(params.doc && params.doc.lastDoc) &&\r\n params.navigation !== 'reload',\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n // Lógica para trás (backward)\r\n else if (params.navigation === 'backward') {\r\n if (!params.doc || !params.doc.firstDoc) {\r\n return {\r\n items: [],\r\n filterLength: null,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: true,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n\r\n let pageResults: Array<Record<string, unknown> & { id: string }> = [];\r\n let allFetchedDocs: firebase.firestore.QueryDocumentSnapshot<unknown>[] =\r\n [];\r\n let hasMoreDocsInDb = true;\r\n\r\n let boundaryDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n params.doc.firstDoc;\r\n\r\n while (pageResults.length < GOAL_SIZE && hasMoreDocsInDb) {\r\n if (!boundaryDoc) break;\r\n\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n query = this.applyFilters(query, params.arrange, params.conditions);\r\n\r\n query = query.endBefore(boundaryDoc);\r\n query = query.limitToLast(BATCH_FETCH_SIZE);\r\n\r\n const snapshot = await query.get();\r\n\r\n if (snapshot.empty) {\r\n hasMoreDocsInDb = false;\r\n break;\r\n }\r\n\r\n boundaryDoc = snapshot\r\n .docs[0] as firebase.firestore.QueryDocumentSnapshot<unknown>;\r\n\r\n allFetchedDocs = [...snapshot.docs, ...allFetchedDocs];\r\n\r\n const batchUsers = snapshot.docs\r\n .map((doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<\r\n string,\r\n unknown\r\n > & { id: string };\r\n })\r\n .filter(params.filterFn);\r\n\r\n pageResults = [...batchUsers, ...pageResults];\r\n\r\n if (snapshot.size < BATCH_FETCH_SIZE) {\r\n hasMoreDocsInDb = false;\r\n }\r\n }\r\n\r\n const finalItems = pageResults.slice(0, params.batchSize);\r\n\r\n const firstDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[0]?.id\r\n ) || null;\r\n const lastDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[finalItems.length - 1]?.id\r\n ) || null;\r\n\r\n return {\r\n items: finalItems,\r\n filterLength: null,\r\n firstDoc: firstDocOfPage,\r\n lastDoc: lastDocOfPage,\r\n hasNextPage: true,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n } else {\r\n let items: Array<Record<string, unknown> & { id: string }> = [];\r\n let docs: firebase.firestore.QueryDocumentSnapshot<unknown>[] = [];\r\n let hasNextPage = false;\r\n let filterLength: null | number = null;\r\n\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n if (params.conditions) {\r\n params.conditions.forEach((c: Condition) => {\r\n if (c.operator === '!=') {\r\n query = query.orderBy(c.firestoreProperty);\r\n }\r\n });\r\n }\r\n\r\n query = this.applyFilters(query, params.arrange, params.conditions);\r\n\r\n if (params.navigation === 'reload') {\r\n query = query.limit(params.batchSize + 1);\r\n if (params.doc && params.doc.firstDoc) {\r\n query = query.startAt(params.doc.firstDoc);\r\n }\r\n } else if (params.navigation === 'forward') {\r\n query = query.limit(params.batchSize + 1);\r\n\r\n if (params.doc && params.doc.lastDoc) {\r\n query = query.startAfter(params.doc.lastDoc);\r\n }\r\n } else {\r\n // backward\r\n query = query.limitToLast(params.batchSize + 1);\r\n if (params.doc && params.doc.firstDoc) {\r\n query = query.endBefore(params.doc.firstDoc);\r\n }\r\n }\r\n\r\n const itemCol = await query.get();\r\n itemCol.docs.forEach(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n docs.push(doc)\r\n );\r\n const itemPromises = docs.map(\r\n async (item: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const itemData = item.data() as Record<string, unknown> | undefined;\r\n items.push({ id: item.id, ...(itemData ?? {}) } as Record<\r\n string,\r\n unknown\r\n > & { id: string });\r\n }\r\n );\r\n\r\n let lastDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n docs[docs.length - 1] || null;\r\n let firstDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n docs[0];\r\n\r\n if (\r\n (items.length > params.batchSize && params.navigation === 'forward') ||\r\n (params.navigation === 'reload' && items.length > params.batchSize)\r\n ) {\r\n lastDoc = docs[docs.length - 2] || null;\r\n items.pop();\r\n hasNextPage = true;\r\n }\r\n if (items.length > params.batchSize && params.navigation === 'backward') {\r\n firstDoc = docs[1];\r\n items.shift();\r\n hasNextPage = true;\r\n }\r\n\r\n await Promise.all(itemPromises);\r\n return {\r\n items,\r\n filterLength,\r\n lastDoc,\r\n firstDoc,\r\n hasNextPage,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n\r\n // Fallback para garantir que sempre retornamos algo\r\n return {\r\n items: [],\r\n filterLength: null,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n\r\n applyFilters(\r\n query: firebase.firestore.Query<unknown>,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined\r\n ): firebase.firestore.Query<unknown> {\r\n if (conditions) {\r\n conditions.map((cond: Condition) => {\r\n query = query.where(\r\n cond.firestoreProperty,\r\n cond.operator,\r\n cond.dashProperty\r\n );\r\n });\r\n }\r\n\r\n let hasFilterSpecificOrderBy = false;\r\n let appliedOrderByField: string | null = null;\r\n\r\n const equalsFilters = arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n const otherFilters = arrange.filters.filter(\r\n (f): f is Arrange['filters'][0] => f.arrange !== 'equals'\r\n );\r\n\r\n const equalsGroupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, string[]>, current) => {\r\n const prop = current.filter!.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(current.filter!.filtering);\r\n return acc;\r\n },\r\n {} as Record<string, string[]>\r\n );\r\n\r\n for (const prop in equalsGroupedByProperty) {\r\n const values = equalsGroupedByProperty[prop];\r\n if (values.length > 0) {\r\n query = query.where(prop, 'in', values);\r\n }\r\n }\r\n\r\n otherFilters.forEach((filterItem: Arrange['filters'][0]) => {\r\n // Aplicar filtragem por busca\r\n if (\r\n filterItem.filter?.filtering &&\r\n filterItem.filter?.property !== '' &&\r\n filterItem.arrange === 'filter'\r\n ) {\r\n query = query\r\n .where(\r\n filterItem.filter.property,\r\n '>=',\r\n filterItem.filter.filtering.trim().toUpperCase()\r\n )\r\n .where(\r\n filterItem.filter.property,\r\n '<=',\r\n filterItem.filter.filtering.trim().toUpperCase() + '\\uf8ff'\r\n );\r\n if (!hasFilterSpecificOrderBy) {\r\n query = query.orderBy(filterItem.filter.property);\r\n hasFilterSpecificOrderBy = true;\r\n appliedOrderByField = filterItem.filter.property;\r\n }\r\n }\r\n\r\n // Aplicar filtro do tipo \"filterByDate\"\r\n if (filterItem.dateFilter && filterItem.arrange === 'filterByDate') {\r\n query = query\r\n .where(arrange.sortBy.field, '>=', filterItem.dateFilter.initial)\r\n .where(arrange.sortBy.field, '<=', filterItem.dateFilter.final);\r\n if (!hasFilterSpecificOrderBy) {\r\n query = query.orderBy(arrange.sortBy.field);\r\n hasFilterSpecificOrderBy = true;\r\n appliedOrderByField = arrange.sortBy.field;\r\n }\r\n }\r\n });\r\n\r\n // Aplicar sortBy\r\n if (arrange.sortBy && arrange.sortBy.field && arrange.sortBy.order) {\r\n if (appliedOrderByField !== arrange.sortBy.field) {\r\n query = query.orderBy(arrange.sortBy.field, arrange.sortBy.order);\r\n }\r\n }\r\n return query;\r\n }\r\n\r\n private getIdFilter(params: Pagination): string | null {\r\n if (!params.arrange?.filters) return null;\r\n\r\n const idFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'filter';\r\n filter: { property: string; filtering: string };\r\n } =>\r\n f.arrange === 'filter' &&\r\n !!f.filter &&\r\n f.filter.property === 'id' &&\r\n !!f.filter.filtering\r\n );\r\n\r\n return idFilter?.filter?.filtering?.trim() || null;\r\n }\r\n\r\n private async getDocumentById(\r\n collection: string,\r\n docId: string\r\n ): Promise<(Record<string, unknown> & { id: string }) | null> {\r\n try {\r\n const docRef = this.ngFire.collection(collection).doc(docId);\r\n const docSnapshot = await docRef.get().toPromise();\r\n\r\n if (docSnapshot && docSnapshot.exists) {\r\n const data = docSnapshot.data() as Record<string, unknown> | undefined;\r\n return {\r\n id: docSnapshot.id,\r\n ...(data ?? {}),\r\n } as Record<string, unknown> & { id: string };\r\n }\r\n return null;\r\n } catch (error) {\r\n console.warn('Erro ao buscar documento por ID:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private async searchByIdPartial(\r\n params: Pagination,\r\n searchTerm: string\r\n ): Promise<PaginationResult> {\r\n const exactMatch = await this.getDocumentById(\r\n params.collection,\r\n searchTerm\r\n );\r\n\r\n if (exactMatch) {\r\n if (params.conditions) {\r\n const operators = this.operators;\r\n const passesConditions = params.conditions.every((cond) => {\r\n const operatorFn = operators[cond.operator as keyof typeof operators];\r\n return operatorFn\r\n ? operatorFn(exactMatch[cond.firestoreProperty], cond.dashProperty)\r\n : false;\r\n });\r\n\r\n if (!passesConditions) {\r\n return {\r\n items: [],\r\n filterLength: 0,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: 0,\r\n totalPages: 0,\r\n };\r\n }\r\n }\r\n\r\n if (params.filterFn && !params.filterFn(exactMatch)) {\r\n return {\r\n items: [],\r\n filterLength: 0,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: 0,\r\n totalPages: 0,\r\n };\r\n }\r\n\r\n return {\r\n items: [exactMatch],\r\n filterLength: 1,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: 0,\r\n totalPages: 1,\r\n };\r\n }\r\n\r\n const searchTermLower = searchTerm.toLowerCase();\r\n\r\n const paramsWithoutIdFilter = {\r\n ...params,\r\n arrange: {\r\n ...params.arrange,\r\n filters: params.arrange.filters.filter(\r\n (f) => !(f.arrange === 'filter' && f.filter?.property === 'id')\r\n ),\r\n },\r\n };\r\n\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n // Aplicar conditions\r\n if (params.conditions) {\r\n params.conditions.forEach((cond) => {\r\n query = query.where(\r\n cond.firestoreProperty,\r\n cond.operator,\r\n cond.dashProperty\r\n );\r\n });\r\n }\r\n\r\n // Aplicar sortBy\r\n if (params.arrange?.sortBy?.field && params.arrange?.sortBy?.order) {\r\n query = query.orderBy(\r\n params.arrange.sortBy.field,\r\n params.arrange.sortBy.order\r\n );\r\n }\r\n\r\n const snapshot = await query.get();\r\n let items: Array<Record<string, unknown> & { id: string }> = snapshot.docs\r\n .map((doc) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<string, unknown> & {\r\n id: string;\r\n };\r\n })\r\n .filter((item) => item.id.toLowerCase().includes(searchTermLower));\r\n\r\n // Separar equals filters e outros filtros\r\n const equalsFilters = paramsWithoutIdFilter.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n const otherFilters = paramsWithoutIdFilter.arrange.filters.filter(\r\n (f): f is Arrange['filters'][0] =>\r\n f.arrange !== 'equals' &&\r\n (f.arrange !== 'filter' || f.filter?.property !== 'id')\r\n );\r\n\r\n // Aplicar equals filters com lógica OR dentro de cada propriedade\r\n if (equalsFilters.length > 0) {\r\n // Agrupar por propriedade para aplicar OR\r\n const groupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, (string | boolean)[]>, f) => {\r\n const prop = f.filter.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(f.filter.filtering);\r\n return acc;\r\n },\r\n {} as Record<string, (string | boolean)[]>\r\n );\r\n\r\n // Filtrar: item deve ter pelo menos um valor de CADA propriedade\r\n items = items.filter((item) => {\r\n return Object.entries(groupedByProperty).every(([prop, values]) => {\r\n const itemValue = item[prop];\r\n return values.includes(itemValue as string | boolean);\r\n });\r\n });\r\n }\r\n\r\n // Aplicar outros filtros\r\n otherFilters.forEach((filterItem) => {\r\n if (\r\n filterItem.arrange === 'filter' &&\r\n filterItem.filter?.filtering &&\r\n filterItem.filter?.property\r\n ) {\r\n const filterValue = String(filterItem.filter.filtering)\r\n .trim()\r\n .toLowerCase();\r\n items = items.filter((item) => {\r\n const itemValue = String(\r\n item[filterItem.filter!.property] ?? ''\r\n ).toLowerCase();\r\n return itemValue.includes(filterValue);\r\n });\r\n }\r\n });\r\n\r\n // Aplicar filterFn se existir\r\n if (params.filterFn) {\r\n items = items.filter(params.filterFn);\r\n }\r\n\r\n // Paginação\r\n const pageSize = params.batchSize;\r\n let currentClientPageIndex = 0;\r\n\r\n if (params.navigation === 'reload') {\r\n currentClientPageIndex = 0;\r\n } else {\r\n // Usar o índice passado pelo componente sem incrementar/decrementar\r\n currentClientPageIndex = params.clientPageIndex || 0;\r\n }\r\n\r\n const startIndex = currentClientPageIndex * pageSize;\r\n const endIndex = startIndex + pageSize;\r\n const paginatedItems = items.slice(startIndex, endIndex);\r\n\r\n const totalPages = Math.ceil(items.length / pageSize);\r\n const hasNextPage = currentClientPageIndex < totalPages - 1;\r\n const hasPreviousPage = currentClientPageIndex > 0;\r\n\r\n return {\r\n items: paginatedItems,\r\n filterLength: items.length,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage,\r\n hasPreviousPage,\r\n currentClientPageIndex,\r\n totalPages,\r\n };\r\n }\r\n\r\n private shouldUseClientSideFallback(params: Pagination): boolean {\r\n const hasConditions = params.conditions && params.conditions.length > 0;\r\n const hasArrangeFilters =\r\n params.arrange?.filters && params.arrange.filters.length > 0;\r\n const hasSortBy = params.arrange?.sortBy?.field;\r\n\r\n if (params.filterFn) {\r\n return false;\r\n }\r\n\r\n if (hasArrangeFilters) {\r\n const equalsFilters = params.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n\r\n if (equalsFilters.length > 0) {\r\n const propertiesSet = new Set(\r\n equalsFilters.map((f) => f.filter.property)\r\n );\r\n\r\n if (propertiesSet.size > 1) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n if (hasConditions && hasArrangeFilters && hasSortBy) {\r\n return true;\r\n }\r\n\r\n if (hasConditions && hasArrangeFilters) {\r\n return true;\r\n }\r\n\r\n if (hasArrangeFilters && params.arrange.filters.length > 1 && hasSortBy) {\r\n const equalsFilters = params.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n\r\n if (equalsFilters.length > 0) {\r\n const propertiesSet = new Set(\r\n equalsFilters.map((f) => f.filter.property)\r\n );\r\n if (\r\n propertiesSet.size === 1 &&\r\n equalsFilters.length === params.arrange.filters.length\r\n ) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n async getPaginated(params: Pagination): Promise<PaginationResult> {\r\n const idFilterValue = this.getIdFilter(params);\r\n if (idFilterValue) {\r\n const result = await this.searchByIdPartial(params, idFilterValue);\r\n return result;\r\n }\r\n\r\n // Detectar preventivamente se deve usar fallback\r\n if (this.shouldUseClientSideFallback(params)) {\r\n await this.trackMissingIndexPreventive(\r\n params.collection,\r\n params.arrange,\r\n params.conditions\r\n );\r\n\r\n const result = await this.executeClientSideQuery(params);\r\n return result;\r\n }\r\n\r\n try {\r\n const result = await this.executeQuery(params);\r\n return result;\r\n } catch (error: unknown) {\r\n if (\r\n error &&\r\n typeof error === 'object' &&\r\n 'code' in error &&\r\n (error as ErrorWithCode).code === 'failed-precondition'\r\n ) {\r\n await this.trackMissingIndex(\r\n error,\r\n params.collection,\r\n params.arrange,\r\n params.conditions\r\n );\r\n\r\n const result = await this.executeClientSideQuery(params);\r\n return result;\r\n } else if (\r\n error &&\r\n typeof error === 'object' &&\r\n 'code' in error &&\r\n (error as ErrorWithCode).code === 'invalid-argument'\r\n ) {\r\n await this.trackMissingIndex(\r\n error,\r\n params.collection,\r\n params.arrange,\r\n params.conditions\r\n );\r\n\r\n const result = await this.executeClientSideQuery(params);\r\n return result;\r\n } else {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n async executeClientSideQuery(params: Pagination): Promise<PaginationResult> {\r\n // Otimizar usando pelo menos uma cláusula .where() quando possível\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n let appliedCondition: Condition | null = null;\r\n let hasAppliedWhereClause = false;\r\n\r\n // Primeiro, tenta aplicar condições simples\r\n if (params.conditions && params.conditions.length > 0) {\r\n const simpleCondition = params.conditions.find((cond: Condition) =>\r\n ['==', '>', '<', '>=', '<=', 'in', 'array-contains'].includes(\r\n cond.operator\r\n )\r\n );\r\n\r\n if (simpleCondition) {\r\n query = query.where(\r\n simpleCondition.firestoreProperty,\r\n simpleCondition.operator,\r\n simpleCondition.dashProperty\r\n );\r\n appliedCondition = simpleCondition;\r\n hasAppliedWhereClause = true;\r\n }\r\n }\r\n\r\n // Se não há condições disponíveis, tenta aplicar filtros do arrange\r\n let appliedFirestoreFilter: Arrange['filters'][0] | 'all-equals' | null =\r\n null;\r\n if (!hasAppliedWhereClause && params.arrange?.filters) {\r\n // Agrupar equals filters por propriedade\r\n const equalsFilters = params.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n\r\n const equalsGroupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, (string | boolean)[]>, current) => {\r\n const prop = current.filter.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(current.filter.filtering);\r\n return acc;\r\n },\r\n {} as Record<string, (string | boolean)[]>\r\n );\r\n\r\n // Se há apenas UMA propriedade com múltiplos valores, aplicar no Firestore com 'in'\r\n const properties = Object.keys(equalsGroupedByProperty);\r\n if (properties.length === 1 && equalsFilters.length > 0) {\r\n const prop = properties[0];\r\n const values = equalsGroupedByProperty[prop];\r\n query = query.where(prop, 'in', values);\r\n hasAppliedWhereClause = true;\r\n // Marcar TODOS os equals filters dessa propriedade como aplicados\r\n appliedFirestoreFilter = 'all-equals';\r\n } else if (properties.length === 0) {\r\n const otherFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] &\r\n (\r\n | {\r\n arrange: 'filter';\r\n filter: { property: string; filtering: string };\r\n }\r\n | {\r\n arrange: 'filterByDate';\r\n dateFilter: { initial: Date; final: Date };\r\n }\r\n ) =>\r\n (f.arrange === 'filter' &&\r\n !!f.filter?.filtering &&\r\n !!f.filter?.property) ||\r\n (f.arrange === 'filterByDate' &&\r\n !!f.dateFilter?.initial &&\r\n !!f.dateFilter?.final)\r\n );\r\n\r\n if (otherFilter) {\r\n if (otherFilter.arrange === 'filter' && otherFilter.filter) {\r\n const filterValue = otherFilter.filter.filtering\r\n .trim()\r\n .toUpperCase();\r\n query = query\r\n .where(otherFilter.filter.property, '>=', filterValue)\r\n .where(otherFilter.filter.property, '<=', filterValue + '\\uf8ff');\r\n hasAppliedWhereClause = true;\r\n appliedFirestoreFilter = otherFilter;\r\n } else if (\r\n otherFilter.arrange === 'filterByDate' &&\r\n otherFilter.dateFilter &&\r\n params.arrange.sortBy?.field\r\n ) {\r\n query = query\r\n .where(\r\n params.arrange.sortBy.field,\r\n '>=',\r\n otherFilter.dateFilter.initial\r\n )\r\n .where(\r\n params.arrange.sortBy.field,\r\n '<=',\r\n otherFilter.dateFilter.final\r\n );\r\n hasAppliedWhereClause = true;\r\n appliedFirestoreFilter = otherFilter;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const allDocsSnapshot = await query.get();\r\n let items: Array<Record<string, unknown> & { id: string }> =\r\n allDocsSnapshot.docs.map(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<string, unknown> & {\r\n id: string;\r\n };\r\n }\r\n );\r\n\r\n // Aplicar condições restantes\r\n if (params.conditions) {\r\n const remainingConditions = params.conditions.filter(\r\n (cond: Condition) => cond !== appliedCondition\r\n );\r\n if (remainingConditions.length > 0) {\r\n const operators = this.operators;\r\n items = items.filter((item) => {\r\n return remainingConditions.every((cond: Condition) => {\r\n const operatorFn =\r\n operators[cond.operator as keyof typeof operators];\r\n return operatorFn\r\n ? operatorFn(item[cond.firestoreProperty], cond.dashProperty)\r\n : false;\r\n });\r\n });\r\n }\r\n }\r\n\r\n const { filters, sortBy } = params.arrange;\r\n\r\n // Track which filter was already applied in Firestore to avoid double filtering\r\n if (hasAppliedWhereClause && !appliedCondition && params.arrange?.filters) {\r\n const equalsFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter?.filtering\r\n );\r\n if (equalsFilter) {\r\n appliedFirestoreFilter = equalsFilter;\r\n } else {\r\n const foundFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] &\r\n (\r\n | {\r\n arrange: 'filter';\r\n filter: { property: string; filtering: string };\r\n }\r\n | {\r\n arrange: 'filterByDate';\r\n dateFilter: { initial: Date; final: Date };\r\n }\r\n ) =>\r\n (f.arrange === 'filter' &&\r\n !!f.filter?.filtering &&\r\n !!f.filter?.property) ||\r\n (f.arrange === 'filterByDate' &&\r\n !!f.dateFilter?.initial &&\r\n !!f.dateFilter?.final)\r\n );\r\n if (foundFilter) {\r\n appliedFirestoreFilter = foundFilter;\r\n }\r\n }\r\n }\r\n\r\n const equalsFilters = filters.filter(\r\n (f): f is Arrange['filters'][0] & { arrange: 'equals' } =>\r\n f.arrange === 'equals'\r\n );\r\n const otherFilters = filters.filter(\r\n (f): f is Arrange['filters'][0] => f.arrange !== 'equals'\r\n );\r\n\r\n // Aplicar equals filters no client-side apenas se não foram aplicados no Firestore\r\n if (appliedFirestoreFilter !== 'all-equals' && equalsFilters.length > 0) {\r\n // Agrupar por propriedade para aplicar OR dentro de cada propriedade\r\n const groupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, (string | boolean)[]>, f) => {\r\n if (f.filter) {\r\n const prop = f.filter.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(f.filter.filtering);\r\n }\r\n return acc;\r\n },\r\n {} as Record<string, (string | boolean)[]>\r\n );\r\n\r\n // Filtrar: item deve ter pelo menos um valor de CADA propriedade\r\n // (AND entre propriedades, OR dentro de cada propriedade)\r\n items = items.filter((item) => {\r\n return Object.entries(groupedByProperty).every(([prop, values]) => {\r\n const itemValue = item[prop];\r\n return values.includes(itemValue as string | boolean);\r\n });\r\n });\r\n }\r\n\r\n otherFilters.forEach((filterItem) => {\r\n if (appliedFirestoreFilter === filterItem) {\r\n return;\r\n }\r\n\r\n if (\r\n filterItem.arrange === 'filter' &&\r\n filterItem.filter?.filtering &&\r\n filterItem.filter?.property\r\n ) {\r\n const filterValue = String(filterItem.filter.filtering)\r\n .trim()\r\n .toLowerCase();\r\n items = items.filter((item) => {\r\n const itemValue = String(\r\n item[filterItem.filter!.property] ?? ''\r\n ).toLowerCase();\r\n return itemValue.includes(filterValue);\r\n });\r\n }\r\n\r\n if (\r\n filterItem.arrange === 'filterByDate' &&\r\n filterItem.dateFilter?.initial &&\r\n filterItem.dateFilter?.final &&\r\n sortBy.field\r\n ) {\r\n items = items.filter((item) => {\r\n try {\r\n const fieldValue = item[sortBy.field];\r\n\r\n if (!fieldValue) {\r\n return false;\r\n }\r\n\r\n let itemDate: Date;\r\n const fieldValueObj = fieldValue as\r\n | { toDate?: () => Date }\r\n | Date\r\n | string\r\n | number\r\n | null\r\n | undefined;\r\n if (\r\n fieldValueObj &&\r\n typeof fieldValueObj === 'object' &&\r\n 'toDate' in fieldValueObj &&\r\n typeof fieldValueObj.toDate === 'function'\r\n ) {\r\n itemDate = fieldValueObj.toDate();\r\n } else if (fieldValueObj instanceof Date) {\r\n itemDate = fieldValueObj;\r\n } else if (typeof fieldValueObj === 'string') {\r\n itemDate = new Date(fieldValueObj);\r\n if (isNaN(itemDate.getTime())) {\r\n return false;\r\n }\r\n } else if (typeof fieldValueObj === 'number') {\r\n itemDate = new Date(fieldValueObj);\r\n } else {\r\n return false;\r\n }\r\n\r\n if (!filterItem.dateFilter) {\r\n return false;\r\n }\r\n\r\n return (\r\n itemDate >= filterItem.dateFilter.initial &&\r\n itemDate <= filterItem.dateFilter.final\r\n );\r\n } catch (error) {\r\n console.warn(\r\n 'Erro ao processar filtro de data para o item:',\r\n item.id,\r\n error\r\n );\r\n return false;\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Aplicar filterFn se existir\r\n if (params.filterFn) {\r\n items = items.filter(params.filterFn);\r\n }\r\n\r\n if (sortBy && sortBy.field && sortBy.order) {\r\n items.sort((a, b) => {\r\n const valA = a[sortBy.field] as unknown;\r\n const valB = b[sortBy.field] as unknown;\r\n\r\n if (valA === null || valA === undefined) return 1;\r\n if (valB === null || valB === undefined) return -1;\r\n\r\n if (valA < valB) {\r\n return sortBy.order === 'asc' ? -1 : 1;\r\n }\r\n if (valA > valB) {\r\n return sortBy.order === 'asc' ? 1 : -1;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n // Implementação adequada da paginação\r\n let currentClientPageIndex = 0;\r\n\r\n // Determinar a página atual baseada na navegação\r\n if (params.navigation === 'reload') {\r\n currentClientPageIndex = 0;\r\n } else {\r\n currentClientPageIndex = params.clientPageIndex || 0;\r\n }\r\n\r\n const pageSize = params.batchSize;\r\n const startIndex = currentClientPageIndex * pageSize;\r\n const endIndex = startIndex + pageSize;\r\n const paginatedItems = items.slice(startIndex, endIndex);\r\n\r\n const totalPages = Math.ceil(items.length / pageSize);\r\n const hasNextPage = currentClientPageIndex < totalPages - 1;\r\n const hasPreviousPage = currentClientPageIndex > 0;\r\n\r\n return {\r\n items: paginatedItems,\r\n filterLength: items.length,\r\n lastDoc: null,\r\n firstDoc: null,\r\n hasNextPage: hasNextPage,\r\n hasPreviousPage: hasPreviousPage,\r\n currentClientPageIndex: currentClientPageIndex,\r\n totalPages: totalPages,\r\n };\r\n }\r\n\r\n async getItemsData(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): Promise<Array<Record<string, unknown> & { id: string }>> {\r\n try {\r\n let query: firebase.firestore.Query<unknown> =\r\n this.ngFire.collection(collection).ref;\r\n\r\n query = this.applyFilters(query, arrange, conditions);\r\n const snapshot = await query.get();\r\n return await Promise.all(\r\n snapshot.docs.map(\r\n async (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n const id = doc.id;\r\n return {\r\n id,\r\n ...(data ?? {}),\r\n } as Record<string, unknown> & { id: string };\r\n }\r\n )\r\n );\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n public operators = {\r\n '==': (a: unknown, b: unknown): boolean => a === b,\r\n '!=': (a: unknown, b: unknown): boolean => a !== b,\r\n '>': (a: unknown, b: unknown): boolean => (a as number) > (b as number),\r\n '<': (a: unknown, b: unknown): boolean => (a as number) < (b as number),\r\n '>=': (a: unknown, b: unknown): boolean => (a as number) >= (b as number),\r\n '<=': (a: unknown, b: unknown): boolean => (a as number) <= (b as number),\r\n in: (a: unknown, b: unknown): boolean => Array.isArray(b) && b.includes(a),\r\n 'not-in': (a: unknown, b: unknown): boolean =>\r\n Array.isArray(b) && !b.includes(a),\r\n 'array-contains': (a: unknown, b: unknown): boolean =>\r\n Array.isArray(a) && a.includes(b),\r\n 'array-contains-any': (a: unknown, b: unknown): boolean =>\r\n Array.isArray(a) &&\r\n Array.isArray(b) &&\r\n b.some((item: unknown) => a.includes(item)),\r\n includes: (a: unknown, b: unknown): boolean => {\r\n if (typeof a === 'string' && typeof b === 'string') {\r\n return a.includes(b);\r\n }\r\n if (Array.isArray(a)) {\r\n return a.includes(b);\r\n }\r\n return false;\r\n },\r\n };\r\n\r\n async deleteIndex(id: string, col: string): Promise<boolean> {\r\n try {\r\n const batch = this.ngFire.firestore.batch();\r\n\r\n const docRef = this.ngFire.collection(col).doc(id);\r\n const docSnapshot = (await firstValueFrom(\r\n docRef.get()\r\n )) as firebase.firestore.DocumentSnapshot<unknown>;\r\n const doc = docSnapshot.data() as Record<string, unknown> | undefined;\r\n batch.delete(docRef.ref);\r\n if (doc && typeof doc['index'] === 'number') {\r\n await this.reindex(doc['index'] as number, col, batch);\r\n }\r\n await batch.commit();\r\n\r\n this.toastr.success('Item excluído com sucesso!');\r\n return true;\r\n } catch (e) {\r\n const error = e as unknown;\r\n console.error('Erro ao deletar item:', error);\r\n this.toastr.error('Erro ao deletar item.');\r\n return false;\r\n }\r\n }\r\n\r\n async reindex(\r\n index: number,\r\n col: string,\r\n batch: firebase.firestore.WriteBatch\r\n ): Promise<void> {\r\n try {\r\n const snapshot = (await firstValueFrom(\r\n this.ngFire.collection(col).get()\r\n )) as firebase.firestore.QuerySnapshot<unknown>;\r\n const docs = snapshot.docs;\r\n for (let doc of docs) {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n if (\r\n data &&\r\n typeof data['index'] === 'number' &&\r\n (data['index'] as number) > index\r\n ) {\r\n data['index'] = ((data['index'] as number) - 1) as unknown;\r\n const docRef = this.ngFire.collection(col).doc(doc.id).ref;\r\n batch.update(docRef, data);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Erro ao reindexar:', error);\r\n }\r\n return;\r\n }\r\n\r\n dateFormatValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: unknown } | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n const dateStr = control.value.trim();\r\n const datePattern = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/;\r\n\r\n if (!datePattern.test(dateStr)) {\r\n return { invalidFormat: true };\r\n }\r\n\r\n const parts = dateStr.split('/');\r\n const day = parts[0].padStart(2, '0');\r\n const month = parts[1].padStart(2, '0');\r\n const year = parts[2];\r\n const normalizedDate = `${day}/${month}/${year}`;\r\n\r\n const date = moment(normalizedDate, 'DD/MM/YYYY', true);\r\n\r\n if (!date.isValid()) {\r\n return { invalidDate: true };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n async updateIndex(index: number, id: string, col: string): Promise<void> {\r\n await this.ngFire.collection(col).doc(id).update({ index });\r\n }\r\n\r\n /**\r\n * Extrai o link de criação de índice da mensagem de erro do Firestore\r\n */\r\n private extractIndexLink(error: unknown): string | null {\r\n if (\r\n !error ||\r\n typeof error !== 'object' ||\r\n !('message' in error) ||\r\n typeof (error as ErrorWithMessage).message !== 'string'\r\n )\r\n return null;\r\n\r\n const linkMatch = (error as ErrorWithMessage).message.match(\r\n /(https:\\/\\/console\\.firebase\\.google\\.com\\/[^\\s]+)/\r\n );\r\n return linkMatch ? linkMatch[1] : null;\r\n }\r\n\r\n /**\r\n * Rastreia índices ausentes ao usar fallback preventivo\r\n */\r\n private async trackMissingIndexPreventive(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): Promise<void> {\r\n try {\r\n const querySignature = this.generateQuerySignature(\r\n collection,\r\n arrange,\r\n conditions\r\n );\r\n const docId = `${collection}_${querySignature}`;\r\n\r\n const indexLink = this.generateIndexLink(collection, arrange, conditions);\r\n\r\n const indexInstructions = this.generateIndexInstructions(\r\n collection,\r\n arrange,\r\n conditions\r\n );\r\n\r\n const trackingData: Record<string, unknown> = {\r\n collection,\r\n indexLink,\r\n indexInstructions,\r\n arrange: {\r\n sortBy: arrange.sortBy,\r\n filters:\r\n arrange.filters?.map((f) => ({\r\n arrange: f.arrange,\r\n property: f.filter?.property || null,\r\n dateField:\r\n f.arrange === 'filterByDate' ? arrange.sortBy?.field : null,\r\n })) || [],\r\n },\r\n conditions:\r\n conditions?.map((c: Condition) => ({\r\n property: c.firestoreProperty,\r\n operator: c.operator,\r\n })) || [],\r\n errorMessage: `Fallback preventivo usado para a collection ${collection}. A query exigiria índice composto.`,\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n };\r\n\r\n const docRef = this.ngFire.collection('missingIndexes').doc(docId);\r\n const doc = await docRef.get().toPromise();\r\n\r\n if (doc && doc.exists) {\r\n await docRef.update({\r\n count: firebase.firestore.FieldValue.increment(1),\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n lastError: trackingData['errorMessage'],\r\n });\r\n } else {\r\n await docRef.set({\r\n ...trackingData,\r\n count: 1,\r\n createdAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n });\r\n }\r\n } catch (trackingError) {\r\n console.warn('Falha ao rastrear fallback preventivo:', trackingError);\r\n }\r\n }\r\n\r\n /**\r\n * Gera uma assinatura única para uma query\r\n */\r\n private generateQuerySignature(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): string {\r\n const signature = {\r\n collection,\r\n sortBy: arrange.sortBy,\r\n filters:\r\n arrange.filters?.map((f: Arrange['filters'][0]) => ({\r\n arrange: f.arrange,\r\n property: f.filter?.property || null,\r\n })) || [],\r\n conditions:\r\n conditions?.map((c: Condition) => ({\r\n property: c.firestoreProperty,\r\n operator: c.operator,\r\n })) || [],\r\n };\r\n\r\n return btoa(JSON.stringify(signature))\r\n .replace(/[^a-zA-Z0-9]/g, '')\r\n .substring(0, 20);\r\n }\r\n\r\n /**\r\n * Gera instruções claras para criar o índice manualmente\r\n */\r\n private generateIndexInstructions(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): {\r\n summary: string;\r\n collection: string;\r\n fields: Array<{\r\n field: string;\r\n order: string;\r\n type: string;\r\n operator: string;\r\n description: string;\r\n }>;\r\n queryExample: string;\r\n stepByStep: string[];\r\n notes: string[];\r\n } {\r\n const instructions: {\r\n summary: string;\r\n collection: string;\r\n fields: Array<{\r\n field: string;\r\n order: string;\r\n type: string;\r\n operator: string;\r\n description: string;\r\n }>;\r\n queryExample: string;\r\n stepByStep: string[];\r\n notes: string[];\r\n } = {\r\n summary: '',\r\n collection: collection,\r\n fields: [],\r\n queryExample: '',\r\n stepByStep: [],\r\n notes: [],\r\n };\r\n\r\n const fields: Array<{\r\n field: string;\r\n order: string;\r\n type: string;\r\n operator: string;\r\n description: string;\r\n }> = [];\r\n\r\n if (conditions && conditions.length > 0) {\r\n conditions.forEach((condition: Condition) => {\r\n if (condition.firestoreProperty) {\r\n fields.push({\r\n field: condition.firestoreProperty,\r\n order: 'Ascending',\r\n type: 'WHERE clause',\r\n operator: condition.operator,\r\n description: `Filtrar por ${condition.firestoreProperty} usando operador ${condition.operator}`,\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (arrange.filters && arrange.filters.length > 0) {\r\n arrange.filters.forEach((filter) => {\r\n if (filter.filter?.property) {\r\n fields.push({\r\n field: filter.filter.property,\r\n order: 'Ascending',\r\n type: 'WHERE clause (filter)',\r\n operator: filter.arrange === 'filter' ? 'CONTAINS' : 'RANGE',\r\n description: `Filtrar por ${filter.filter.property} usando filtro ${filter.arrange}`,\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (arrange.sortBy?.field) {\r\n fields.push({\r\n field: arrange.sortBy.field,\r\n order: arrange.sortBy.order === 'desc' ? 'Descending' : 'Ascending',\r\n type: 'ORDER BY clause',\r\n operator: 'N/A',\r\n description: `Ordenar resultados por ${arrange.sortBy.field} em ordem ${arrange.sortBy.order}`,\r\n });\r\n }\r\n\r\n instructions.fields = fields;\r\n\r\n const fieldNames = fields.map((f) => f.field).join(' + ');\r\n instructions.summary = `Criar índice composto para ${collection}: ${fieldNames}`;\r\n\r\n let queryExample = `db.collection('${collection}')`;\r\n\r\n fields.forEach((field, index: number) => {\r\n if (field.type.includes('WHERE')) {\r\n if (field.operator === '==') {\r\n queryExample += `\\n .where('${field.field}', '==', 'value')`;\r\n } else if (field.operator === 'CONTAINS') {\r\n queryExample += `\\n .where('${field.field}', '>=', 'searchText')`;\r\n } else {\r\n queryExample += `\\n .where('${field.field}', '${field.operator}', 'value')`;\r\n }\r\n }\r\n });\r\n\r\n const orderByField = fields.find((f) => f.type.includes('ORDER BY'));\r\n if (orderByField) {\r\n queryExample += `\\n .orderBy('${\r\n orderByField.field\r\n }', '${orderByField.order.toLowerCase()}')`;\r\n }\r\n\r\n instructions.queryExample = queryExample;\r\n\r\n instructions.stepByStep = [\r\n '1. Ir para Firebase Console → Firestore → Indexes',\r\n '2. Clicar em \"Create Index\"',\r\n `3. Definir Collection ID: ${collection}`,\r\n '4. Configurar campos nesta ORDEM EXATA:',\r\n ...fields.map(\r\n (field, index: number) =>\r\n ` ${index + 1}. Campo: ${field.field}, Order: ${\r\n field.order\r\n }, Array: No`\r\n ),\r\n '5. Definir Query scopes: Collection',\r\n '6. Clicar em \"Create\" e aguardar conclusão',\r\n ];\r\n\r\n instructions.notes = [\r\n '⚠️ A ordem dos campos é CRÍTICA - deve corresponder exatamente à ordem da query',\r\n '⚠️ As cláusulas WHERE devem vir ANTES do campo ORDER BY',\r\n '⚠️ Este índice só funcionará para queries com esta combinação EXATA de campos',\r\n '⚠️ A criação do índice pode levar vários minutos',\r\n ];\r\n\r\n return instructions;\r\n }\r\n\r\n /**\r\n * Gera um link de índice baseado na estrutura da query\r\n */\r\n private generateIndexLink(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): string | null {\r\n try {\r\n const indexFields: string[] = [];\r\n\r\n if (conditions && conditions.length > 0) {\r\n conditions.forEach((condition: Condition) => {\r\n if (condition.firestoreProperty) {\r\n indexFields.push(condition.firestoreProperty);\r\n }\r\n });\r\n }\r\n\r\n if (arrange.filters && arrange.filters.length > 0) {\r\n arrange.filters.forEach((filter: Arrange['filters'][0]) => {\r\n if (filter.filter?.property) {\r\n indexFields.push(filter.filter.property);\r\n }\r\n });\r\n }\r\n\r\n if (arrange.sortBy?.field) {\r\n indexFields.push(arrange.sortBy.field);\r\n }\r\n\r\n if (indexFields.length > 1) {\r\n // Obter o projectId dinamicamente do Firebase\r\n const options = this.ngFire?.firestore?.app?.options as\r\n | Record<string, unknown>\r\n | undefined;\r\n const projectId = options?.['projectId'] as string | undefined;\r\n\r\n if (!projectId) {\r\n console.warn('Não foi possível obter o projectId do Firebase');\r\n return null;\r\n }\r\n\r\n const baseUrl = `https://console.firebase.google.com/project/${projectId}/firestore/indexes`;\r\n const queryParams = new URLSearchParams({\r\n create_composite: `collection=${collection}&fields=${indexFields.join(\r\n ','\r\n )}`,\r\n });\r\n\r\n const finalLink = `${baseUrl}?${queryParams.toString()}`;\r\n return finalLink;\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n console.warn('Falha ao gerar link de índice:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private async trackMissingIndex(\r\n error: unknown,\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): Promise<void> {\r\n try {\r\n const indexLink = this.extractIndexLink(error);\r\n if (!indexLink) return;\r\n\r\n const linkHash = btoa(indexLink)\r\n .replace(/[^a-zA-Z0-9]/g, '')\r\n .substring(0, 20);\r\n const docId = `${collection}_${linkHash}`;\r\n\r\n const indexInstructions = this.generateIndexInstructions(\r\n collection,\r\n arrange,\r\n conditions\r\n );\r\n\r\n const trackingData: Record<string, unknown> = {\r\n collection,\r\n indexLink,\r\n indexInstructions,\r\n arrange: {\r\n sortBy: arrange.sortBy,\r\n filters:\r\n arrange.filters?.map((f) => ({\r\n arrange: f.arrange,\r\n property: f.filter?.property || null,\r\n dateField:\r\n f.arrange === 'filterByDate' ? arrange.sortBy?.field : null,\r\n })) || [],\r\n },\r\n conditions:\r\n conditions?.map((c: Condition) => ({\r\n property: c.firestoreProperty,\r\n operator: c.operator,\r\n })) || [],\r\n errorMessage:\r\n error &&\r\n typeof error === 'object' &&\r\n 'message' in error &&\r\n typeof (error as ErrorWithMessage).message === 'string'\r\n ? (error as ErrorWithMessage).message\r\n : String(error),\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n };\r\n\r\n const docRef = this.ngFire.collection('missingIndexes').doc(docId);\r\n const doc = await docRef.get().toPromise();\r\n\r\n const errorMessage =\r\n error &&\r\n typeof error === 'object' &&\r\n 'message' in error &&\r\n typeof (error as ErrorWithMessage).message === 'string'\r\n ? (error as ErrorWithMessage).message\r\n : String(error);\r\n\r\n if (doc && doc.exists) {\r\n await docRef.update({\r\n count: firebase.firestore.FieldValue.increment(1),\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n lastError: errorMessage,\r\n });\r\n } else {\r\n await docRef.set({\r\n ...trackingData,\r\n count: 1,\r\n createdAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n });\r\n }\r\n } catch (trackingError) {\r\n console.warn('Falha ao rastrear índice ausente:', trackingError);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormArray, FormControl, FormGroup } from '@angular/forms';\r\nimport { Arrange, Column, TABLE_DEFAULTS } from '../types/Table';\r\nimport { TableService } from './table.service';\r\nimport { OrderByDirection } from 'firebase/firestore';\r\n\r\nexport interface FilterConfig {\r\n selectFilter: any;\r\n typeFilter?: string;\r\n selectItem?: any[];\r\n initialDate?: string;\r\n finalDate?: string;\r\n}\r\n\r\nexport interface DateFiltersByProperty {\r\n [property: string]: Array<{ initial: Date; final: Date }>;\r\n}\r\n\r\nexport interface ProcessedFilter {\r\n group: FormGroup;\r\n selectedFilter: any;\r\n arrange: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FilterService {\r\n constructor(private tableService: TableService) {}\r\n\r\n /**\r\n * Cria um novo FormGroup para um filtro\r\n */\r\n createFilterGroup(): FormGroup {\r\n const dateValidator = this.tableService.dateFormatValidator();\r\n\r\n return new FormGroup({\r\n selectFilter: new FormControl(''),\r\n typeFilter: new FormControl(''),\r\n selectItem: new FormControl(''),\r\n initialDate: new FormControl('', [dateValidator]),\r\n finalDate: new FormControl('', [dateValidator]),\r\n });\r\n }\r\n\r\n /**\r\n * Adiciona um novo filtro ao FormArray\r\n */\r\n addFilter(\r\n filtersForm: FormArray,\r\n isPaginated: boolean,\r\n filterData?: FilterConfig\r\n ): void {\r\n if (\r\n isPaginated &&\r\n this.hasActiveDateFilter(filtersForm) &&\r\n filterData?.selectFilter?.arrange === 'filterByDate'\r\n ) {\r\n return;\r\n }\r\n\r\n const newFilterGroup = this.createFilterGroup();\r\n\r\n if (filterData) {\r\n if (filterData.selectFilter) {\r\n newFilterGroup.get('selectFilter')?.setValue(filterData.selectFilter);\r\n }\r\n if (filterData.typeFilter) {\r\n newFilterGroup.get('typeFilter')?.setValue(filterData.typeFilter);\r\n }\r\n if (filterData.selectItem) {\r\n newFilterGroup.get('selectItem')?.setValue(filterData.selectItem);\r\n }\r\n if (filterData.initialDate) {\r\n newFilterGroup.get('initialDate')?.setValue(filterData.initialDate);\r\n }\r\n if (filterData.finalDate) {\r\n newFilterGroup.get('finalDate')?.setValue(filterData.finalDate);\r\n }\r\n }\r\n\r\n filtersForm.push(newFilterGroup);\r\n }\r\n\r\n /**\r\n * Verifica se há um filtro de data ativo\r\n */\r\n hasActiveDateFilter(filtersForm: FormArray): boolean {\r\n return filtersForm.controls.some((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n return selectedFilter?.arrange === 'filterByDate';\r\n });\r\n }\r\n\r\n /**\r\n * Retorna as opções de filtro disponíveis\r\n */\r\n getAvailableFilterOptions(\r\n dropdownItems: any[],\r\n isPaginated: boolean,\r\n filtersForm: FormArray\r\n ): any[] {\r\n if (isPaginated && this.hasActiveDateFilter(filtersForm)) {\r\n return dropdownItems.filter((item) => item.arrange !== 'filterByDate');\r\n }\r\n return dropdownItems;\r\n }\r\n\r\n /**\r\n * Remove um filtro do FormArray\r\n */\r\n removeFilter(filtersForm: FormArray, index: number): void {\r\n filtersForm.removeAt(index);\r\n if (filtersForm.length === 0) {\r\n this.addFilter(filtersForm, false);\r\n }\r\n }\r\n\r\n /**\r\n * Remove todos os filtros do FormArray\r\n */\r\n removeAllFilters(filtersForm: FormArray): void {\r\n filtersForm.clear();\r\n this.addFilter(filtersForm, false);\r\n }\r\n\r\n /**\r\n * Aplica máscara de data (DD/MM/AAAA)\r\n */\r\n applyDateMask(\r\n event: any,\r\n controlName: 'initialDate' | 'finalDate',\r\n filterGroup: FormGroup\r\n ): void {\r\n const input = event.target;\r\n let value = input.value.replace(/\\D/g, '');\r\n\r\n if (value.length > 8) {\r\n value = value.slice(0, 8);\r\n }\r\n\r\n if (value.length <= 2) {\r\n // mantém como está\r\n } else if (value.length <= 4) {\r\n value = value.slice(0, 2) + '/' + value.slice(2);\r\n } else {\r\n value =\r\n value.slice(0, 2) + '/' + value.slice(2, 4) + '/' + value.slice(4, 8);\r\n }\r\n\r\n filterGroup.get(controlName)?.setValue(value, { emitEvent: false });\r\n }\r\n\r\n /**\r\n * Aplica filtros client-side aos itens\r\n */\r\n applyClientSideFilters<T = any>(\r\n items: T[],\r\n filtersForm: FormArray,\r\n sortBy: { field: string; order: OrderByDirection }\r\n ): T[] {\r\n let filteredItems = [...items];\r\n\r\n const dateFiltersByProperty: DateFiltersByProperty = {};\r\n const otherFilters: ProcessedFilter[] = [];\r\n\r\n filtersForm.controls.forEach((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n if (!selectedFilter) return;\r\n\r\n const arrange = selectedFilter.arrange;\r\n\r\n if (arrange === 'filterByDate') {\r\n const initial = group.get('initialDate')?.value;\r\n const final = group.get('finalDate')?.value;\r\n\r\n if (initial && final && initial.trim() && final.trim()) {\r\n try {\r\n const datePattern = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/;\r\n if (!datePattern.test(initial) || !datePattern.test(final)) {\r\n return;\r\n }\r\n\r\n const [dayI, monthI, yearI] = initial.split('/');\r\n const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);\r\n const [dayF, monthF, yearF] = final.split('/');\r\n const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);\r\n finalDate.setHours(23, 59, 59);\r\n\r\n if (isNaN(initialDate.getTime()) || isNaN(finalDate.getTime())) {\r\n return;\r\n }\r\n\r\n const dateField = selectedFilter.property || sortBy.field;\r\n\r\n if (!dateFiltersByProperty[dateField]) {\r\n dateFiltersByProperty[dateField] = [];\r\n }\r\n\r\n dateFiltersByProperty[dateField].push({\r\n initial: initialDate,\r\n final: finalDate,\r\n });\r\n } catch (error) {\r\n console.warn('Erro ao processar datas do filtro:', error);\r\n }\r\n }\r\n } else {\r\n otherFilters.push({ group, selectedFilter, arrange });\r\n }\r\n });\r\n\r\n // Aplicar filtros de data\r\n Object.keys(dateFiltersByProperty).forEach((dateField) => {\r\n const intervals = dateFiltersByProperty[dateField];\r\n\r\n filteredItems = filteredItems.filter((item: any) => {\r\n try {\r\n const fieldValue = item[dateField];\r\n\r\n if (!fieldValue) {\r\n return false;\r\n }\r\n\r\n let itemDate: Date;\r\n if (typeof fieldValue.toDate === 'function') {\r\n itemDate = fieldValue.toDate();\r\n } else if (fieldValue instanceof Date) {\r\n itemDate = fieldValue;\r\n } else if (typeof fieldValue === 'string') {\r\n itemDate = new Date(fieldValue);\r\n if (isNaN(itemDate.getTime())) {\r\n return false;\r\n }\r\n } else if (typeof fieldValue === 'number') {\r\n itemDate = new Date(fieldValue);\r\n } else {\r\n return false;\r\n }\r\n\r\n return intervals.some(\r\n (interval) =>\r\n itemDate >= interval.initial && itemDate <= interval.final\r\n );\r\n } catch (error) {\r\n console.warn(\r\n 'Erro ao processar filtro de data para o item:',\r\n item.id,\r\n error\r\n );\r\n return false;\r\n }\r\n });\r\n });\r\n\r\n // Aplicar outros filtros\r\n otherFilters.forEach(({ group, selectedFilter, arrange }) => {\r\n if (arrange === 'filter') {\r\n const filterValue = group.get('typeFilter')?.value;\r\n if (filterValue && filterValue.trim()) {\r\n const property = selectedFilter.property;\r\n filteredItems = filteredItems.filter((item: any) => {\r\n const value = String(item[property] || '')\r\n .trim()\r\n .toLocaleLowerCase();\r\n return value.includes(filterValue.trim().toLocaleLowerCase());\r\n });\r\n }\r\n } else if (\r\n selectedFilter.hasOwnProperty('items') &&\r\n arrange === 'equals'\r\n ) {\r\n const selectedItems = group.get('selectItem')?.value;\r\n if (Array.isArray(selectedItems) && selectedItems.length > 0) {\r\n filteredItems = filteredItems.filter((item: any) => {\r\n return selectedItems.some((selectedItem: any) => {\r\n const itemValue = item[selectedItem.property];\r\n return itemValue === selectedItem.value;\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return filteredItems;\r\n }\r\n\r\n /**\r\n * Constrói o objeto Arrange a partir dos filtros ativos\r\n */\r\n buildArrangeFromFilters(\r\n filtersForm: FormArray,\r\n sortBy: { field: string; order: OrderByDirection }\r\n ): Arrange {\r\n const activeFilters = filtersForm.controls\r\n .flatMap((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n if (!selectedFilter) return [];\r\n\r\n const arrange = selectedFilter.arrange;\r\n\r\n if (arrange === 'filter') {\r\n const filterValue = group.get('typeFilter')?.value;\r\n if (!filterValue) return [];\r\n return {\r\n arrange,\r\n filter: {\r\n property: selectedFilter.property,\r\n filtering: filterValue,\r\n },\r\n dateFilter: undefined,\r\n };\r\n }\r\n\r\n if (arrange === 'filterByDate') {\r\n const initial = group.get('initialDate')?.value;\r\n const final = group.get('finalDate')?.value;\r\n if (initial && final) {\r\n try {\r\n const [dayI, monthI, yearI] = initial.split('/');\r\n const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);\r\n const [dayF, monthF, yearF] = final.split('/');\r\n const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);\r\n finalDate.setHours(23, 59, 59);\r\n return {\r\n arrange,\r\n filter: undefined,\r\n dateFilter: {\r\n initial: initialDate,\r\n final: finalDate,\r\n },\r\n };\r\n } catch (error) {\r\n return [];\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {\r\n const selectedItems = group.get('selectItem')?.value;\r\n if (Array.isArray(selectedItems) && selectedItems.length > 0) {\r\n return selectedItems.map((item) => ({\r\n arrange,\r\n filter: {\r\n property: item.property,\r\n filtering: item.value,\r\n },\r\n dateFilter: undefined,\r\n }));\r\n }\r\n }\r\n\r\n return [];\r\n })\r\n .filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));\r\n\r\n return {\r\n filters: activeFilters,\r\n sortBy: sortBy,\r\n };\r\n }\r\n\r\n /**\r\n * Extrai filtros ativos para paginação\r\n */\r\n extractActiveFilters(filtersForm: FormArray): any[] {\r\n return filtersForm.controls\r\n .flatMap((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n if (!selectedFilter) return [];\r\n\r\n const arrange = selectedFilter.arrange;\r\n\r\n if (arrange === 'filter') {\r\n const filterValue = group.get('typeFilter')?.value;\r\n if (!filterValue) return [];\r\n return {\r\n arrange,\r\n filter: {\r\n property: selectedFilter.property,\r\n filtering: filterValue,\r\n },\r\n dateFilter: undefined,\r\n };\r\n }\r\n\r\n if (arrange === 'filterByDate') {\r\n const initial = group.get('initialDate')?.value;\r\n const final = group.get('finalDate')?.value;\r\n if (initial && final) {\r\n const [dayI, monthI, yearI] = initial.split('/');\r\n const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);\r\n const [dayF, monthF, yearF] = final.split('/');\r\n const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);\r\n finalDate.setHours(23, 59, 59);\r\n return {\r\n arrange,\r\n filter: undefined,\r\n dateFilter: {\r\n initial: initialDate,\r\n final: finalDate,\r\n },\r\n };\r\n }\r\n return [];\r\n }\r\n\r\n if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {\r\n const selectedItems = group.get('selectItem')?.value;\r\n if (Array.isArray(selectedItems) && selectedItems.length > 0) {\r\n return selectedItems.map((item) => ({\r\n arrange,\r\n filter: {\r\n property: item.property,\r\n filtering: item.value,\r\n },\r\n dateFilter: undefined,\r\n }));\r\n }\r\n }\r\n\r\n return [];\r\n })\r\n .filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));\r\n }\r\n\r\n /**\r\n * Inicializa os dropdownItems baseado nas colunas\r\n */\r\n initializeDropdownItems(displayedColumns: Column[]): {\r\n dropdownItems: any[];\r\n sortableDropdownItems: any[];\r\n hasFilterableColumn: boolean;\r\n hasSortableColumn: boolean;\r\n } {\r\n const dropdownItems: any[] = [];\r\n const sortableDropdownItems: any[] = [];\r\n let hasFilterableColumn = false;\r\n let hasSortableColumn = false;\r\n\r\n displayedColumns.forEach((col) => {\r\n if (col.isFilterable) {\r\n hasFilterableColumn = true;\r\n dropdownItems.push({\r\n ...col,\r\n arrange: 'filter',\r\n title: col.title,\r\n });\r\n }\r\n if (col.isSortable) {\r\n hasSortableColumn = true;\r\n sortableDropdownItems.push({\r\n ...col,\r\n arrange: 'ascending',\r\n title: col.title + ': crescente',\r\n });\r\n sortableDropdownItems.push({\r\n ...col,\r\n arrange: 'descending',\r\n title: col.title + ': decrescente',\r\n });\r\n }\r\n if (col.isFilterableByDate) {\r\n dropdownItems.push({\r\n ...col,\r\n arrange: 'filterByDate',\r\n title: col.title + ': filtro por data',\r\n });\r\n }\r\n });\r\n\r\n return {\r\n dropdownItems,\r\n sortableDropdownItems,\r\n hasFilterableColumn,\r\n hasSortableColumn,\r\n };\r\n }\r\n\r\n /**\r\n * Adiciona opções de filtro customizadas\r\n */\r\n addFilterableOptions(dropdownItems: any[], filterableOptions: any[]): any[] {\r\n if (\r\n filterableOptions &&\r\n Array.isArray(filterableOptions) &&\r\n filterableOptions.length > 0\r\n ) {\r\n filterableOptions.forEach((option) =>\r\n dropdownItems.push({ ...option, arrange: 'equals' })\r\n );\r\n }\r\n return dropdownItems;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Column } from '../types/Table';\r\n\r\nexport interface TooltipState {\r\n hoveredCell: { row: any; col: any } | null;\r\n showTooltip: boolean;\r\n tooltipContent: string;\r\n tooltipPosition: { x: number; y: number };\r\n tooltipBgColor: string;\r\n tooltipBgStyle: { [key: string]: string } | null;\r\n tooltipTextColor: string;\r\n tooltipTextStyle: { [key: string]: string } | null;\r\n}\r\n\r\nexport interface TooltipConfig {\r\n color?: string;\r\n text?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TooltipService {\r\n private tooltipTimeout: any = null;\r\n\r\n /**\r\n * Cria um estado inicial para o tooltip\r\n */\r\n createInitialState(): TooltipState {\r\n return {\r\n hoveredCell: null,\r\n showTooltip: false,\r\n tooltipContent: '',\r\n tooltipPosition: { x: 0, y: 0 },\r\n tooltipBgColor: 'bg-gray-800',\r\n tooltipBgStyle: null,\r\n tooltipTextColor: 'text-white',\r\n tooltipTextStyle: null,\r\n };\r\n }\r\n\r\n /**\r\n * Processa as cores do tooltip\r\n */\r\n processTooltipColors(config?: TooltipConfig): {\r\n bgColor: string;\r\n bgStyle: { [key: string]: string } | null;\r\n textColor: string;\r\n textStyle: { [key: string]: string } | null;\r\n } {\r\n const result = {\r\n bgColor: 'bg-gray-800',\r\n bgStyle: null as { [key: string]: string } | null,\r\n textColor: 'text-white',\r\n textStyle: null as { [key: string]: string } | null,\r\n };\r\n\r\n const tooltipBgColor = config?.color || 'bg-gray-800';\r\n if (tooltipBgColor.startsWith('#') || tooltipBgColor.startsWith('rgb')) {\r\n result.bgColor = '';\r\n result.bgStyle = { 'background-color': tooltipBgColor };\r\n } else {\r\n result.bgColor = tooltipBgColor;\r\n result.bgStyle = null;\r\n }\r\n\r\n const tooltipTextColor = config?.text || 'text-white';\r\n if (\r\n tooltipTextColor.startsWith('#') ||\r\n tooltipTextColor.startsWith('rgb')\r\n ) {\r\n result.textColor = '';\r\n result.textStyle = { color: tooltipTextColor };\r\n } else {\r\n result.textColor = tooltipTextColor;\r\n result.textStyle = null;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Manipula o evento de mouse enter na célula\r\n */\r\n handleMouseEnter(\r\n event: MouseEvent,\r\n row: any,\r\n col: Column,\r\n getDisplayValue: (col: Column, row: any, withinLimit: boolean) => string,\r\n onShow: (state: Partial<TooltipState>) => void\r\n ): void {\r\n // Só mostrar tooltip se a coluna tiver charLimit definido\r\n if (!col.charLimit) {\r\n return;\r\n }\r\n\r\n const fullValue = getDisplayValue(col, row, true);\r\n\r\n // Só mostrar tooltip se o valor completo for maior que o limite\r\n if (fullValue.length <= col.charLimit) {\r\n return;\r\n }\r\n\r\n const colors = this.processTooltipColors(col.tooltip);\r\n\r\n const state: Partial<TooltipState> = {\r\n hoveredCell: { row, col },\r\n tooltipContent: fullValue,\r\n tooltipBgColor: colors.bgColor,\r\n tooltipBgStyle: colors.bgStyle,\r\n tooltipTextColor: colors.textColor,\r\n tooltipTextStyle: colors.textStyle,\r\n tooltipPosition: {\r\n x: event.clientX + 10,\r\n y: event.clientY - 10,\r\n },\r\n };\r\n\r\n onShow(state);\r\n\r\n // Limpar timeout anterior se existir\r\n if (this.tooltipTimeout) {\r\n clearTimeout(this.tooltipTimeout);\r\n }\r\n\r\n // Timeout para mostrar o tooltip\r\n this.tooltipTimeout = setTimeout(() => {\r\n onShow({ showTooltip: true });\r\n }, 500);\r\n }\r\n\r\n /**\r\n * Manipula o evento de mouse leave na célula\r\n */\r\n handleMouseLeave(onHide: (state: TooltipState) => void): void {\r\n if (this.tooltipTimeout) {\r\n clearTimeout(this.tooltipTimeout);\r\n this.tooltipTimeout = null;\r\n }\r\n\r\n onHide(this.createInitialState());\r\n }\r\n\r\n /**\r\n * Manipula o movimento do mouse\r\n */\r\n handleMouseMove(\r\n event: MouseEvent,\r\n showTooltip: boolean,\r\n onMove: (position: { x: number; y: number }) => void\r\n ): void {\r\n if (showTooltip) {\r\n onMove({\r\n x: event.clientX + 10,\r\n y: event.clientY - 10,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Combina estilos do tooltip para aplicação\r\n */\r\n getTooltipStyles(state: TooltipState): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (state.tooltipBgStyle) {\r\n Object.assign(styles, state.tooltipBgStyle);\r\n }\r\n if (state.tooltipTextStyle) {\r\n Object.assign(styles, state.tooltipTextStyle);\r\n }\r\n return styles;\r\n }\r\n\r\n /**\r\n * Limpa recursos ao destruir\r\n */\r\n destroy(): void {\r\n if (this.tooltipTimeout) {\r\n clearTimeout(this.tooltipTimeout);\r\n this.tooltipTimeout = null;\r\n }\r\n }\r\n}\r\n\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { PageEvent } from '@angular/material/paginator';\r\n\r\nexport interface PaginationState {\r\n currentPageNumber: number;\r\n currentClientPageIndex: number;\r\n pageSize: number;\r\n totalItems: number;\r\n hasNextPage: boolean;\r\n}\r\n\r\nexport interface NavigationResult {\r\n direction: 'forward' | 'backward' | 'reload';\r\n resetDocs: boolean;\r\n originalPageSize: number | null;\r\n shouldNavigate: boolean;\r\n newClientPageIndex: number;\r\n newPageNumber: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PaginationService {\r\n calculateNavigation(\r\n event: PageEvent,\r\n currentState: PaginationState\r\n ): NavigationResult {\r\n const previousPageIndex = event.previousPageIndex ?? 0;\r\n const pageIndex = event.pageIndex;\r\n const eventPageSize = event.pageSize;\r\n const totalItems = currentState.totalItems;\r\n const currentComponentPageSize = currentState.pageSize;\r\n\r\n let navigationDirection: 'forward' | 'backward' | 'reload' = 'reload';\r\n let resetDocs = false;\r\n let originalPageSize: number | null = null;\r\n let shouldNavigate = true;\r\n let newClientPageIndex = pageIndex;\r\n let newPageNumber = currentState.currentPageNumber;\r\n\r\n const lastPageIndex = Math.max(\r\n 0,\r\n Math.ceil(totalItems / eventPageSize) - 1\r\n );\r\n\r\n // Atualizar número da página\r\n if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {\r\n newPageNumber++;\r\n } else if (\r\n previousPageIndex !== undefined &&\r\n pageIndex < previousPageIndex\r\n ) {\r\n newPageNumber = Math.max(1, newPageNumber - 1);\r\n }\r\n\r\n // Mudança de tamanho de página\r\n if (eventPageSize !== currentComponentPageSize) {\r\n navigationDirection = 'forward';\r\n resetDocs = true;\r\n newClientPageIndex = 0;\r\n }\r\n // Indo para primeira página\r\n else if (\r\n pageIndex === 0 &&\r\n previousPageIndex !== undefined &&\r\n pageIndex < previousPageIndex\r\n ) {\r\n navigationDirection = 'forward';\r\n newPageNumber = 1;\r\n newClientPageIndex = 0;\r\n resetDocs = true;\r\n }\r\n // Indo para última página (salto)\r\n else if (\r\n pageIndex === lastPageIndex &&\r\n previousPageIndex !== undefined &&\r\n pageIndex > previousPageIndex &&\r\n pageIndex - previousPageIndex > 1\r\n ) {\r\n navigationDirection = 'backward';\r\n resetDocs = true;\r\n\r\n const itemsExpectedInLastPage =\r\n totalItems - lastPageIndex * eventPageSize;\r\n\r\n if (\r\n itemsExpectedInLastPage > 0 &&\r\n itemsExpectedInLastPage < eventPageSize\r\n ) {\r\n originalPageSize = currentComponentPageSize;\r\n }\r\n }\r\n // Próxima página\r\n else if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {\r\n navigationDirection = 'forward';\r\n resetDocs = false;\r\n }\r\n // Página anterior\r\n else if (previousPageIndex !== undefined && pageIndex < previousPageIndex) {\r\n navigationDirection = 'backward';\r\n resetDocs = false;\r\n }\r\n // Mesma página (reload)\r\n else if (\r\n previousPageIndex !== undefined &&\r\n pageIndex === previousPageIndex\r\n ) {\r\n navigationDirection = 'reload';\r\n resetDocs = false;\r\n }\r\n // Caso inicial (primeira carga)\r\n else if (previousPageIndex === undefined && pageIndex === 0) {\r\n shouldNavigate = false;\r\n }\r\n // Caso não tratado\r\n else {\r\n console.warn('Condição de navegação não tratada:', event);\r\n shouldNavigate = false;\r\n }\r\n\r\n return {\r\n direction: navigationDirection,\r\n resetDocs,\r\n originalPageSize,\r\n shouldNavigate,\r\n newClientPageIndex,\r\n newPageNumber,\r\n };\r\n }\r\n\r\n /**\r\n * Calcula o número de itens esperados na última página\r\n */\r\n calculateLastPageItemCount(totalItems: number, pageSize: number): number {\r\n const lastPageIndex = Math.max(0, Math.ceil(totalItems / pageSize) - 1);\r\n return totalItems - lastPageIndex * pageSize;\r\n }\r\n\r\n /**\r\n * Calcula o índice da última página\r\n */\r\n calculateLastPageIndex(totalItems: number, pageSize: number): number {\r\n return Math.max(0, Math.ceil(totalItems / pageSize) - 1);\r\n }\r\n\r\n /**\r\n * Verifica se deve mostrar o botão de próxima página\r\n */\r\n shouldShowNextButton(hasNextPage: boolean, isPaginated: boolean): boolean {\r\n return hasNextPage || !isPaginated;\r\n }\r\n}\r\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { TabData } from '../../types/Table';\n\n@Component({\n selector: 'lib-table-tabs',\n standalone: false,\n templateUrl: './table-tabs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableTabsComponent {\n @Input() tabsData: TabData[] = [];\n @Input() selectedTab: number = 0;\n @Output() tabSelected = new EventEmitter<{ tab: TabData; index: number }>();\n\n private readonly TABS_PER_GROUP = 6;\n\n /**\n * Retorna os índices dos grupos de tabs (invertidos para exibição vertical)\n */\n getTabGroups(): number[] {\n if (!this.tabsData || this.tabsData.length === 0) return [];\n\n const totalGroups = Math.ceil(this.tabsData.length / this.TABS_PER_GROUP);\n const groups: number[] = [];\n\n for (let i = totalGroups - 1; i >= 0; i--) {\n groups.push(i);\n }\n\n return groups;\n }\n\n /**\n * Retorna os tabs de um grupo específico\n */\n getTabGroup(groupIndex: number): TabData[] {\n if (!this.tabsData || this.tabsData.length === 0) return [];\n\n const startIndex = groupIndex * this.TABS_PER_GROUP;\n const endIndex = Math.min(\n startIndex + this.TABS_PER_GROUP,\n this.tabsData.length,\n );\n\n return this.tabsData.slice(startIndex, endIndex);\n }\n\n /**\n * Calcula o índice real do tab considerando a inversão vertical\n */\n getRealTabIndex(groupDisplayIndex: number, tabIndexInGroup: number): number {\n if (!this.tabsData) return 0;\n const totalGroups = Math.ceil(this.tabsData.length / this.TABS_PER_GROUP);\n const realGroupIndex = totalGroups - 1 - groupDisplayIndex;\n return realGroupIndex * this.TABS_PER_GROUP + tabIndexInGroup;\n }\n\n /**\n * Manipula a seleção de um tab\n */\n onTabSelected(groupDisplayIndex: number, tabIndexInGroup: number): void {\n const realIndex = this.getRealTabIndex(groupDisplayIndex, tabIndexInGroup);\n const tab = this.tabsData[realIndex];\n if (tab) {\n this.tabSelected.emit({ tab, index: realIndex });\n }\n }\n\n /**\n * Verifica se um tab está selecionado\n */\n isTabSelected(originalIndex: number): boolean {\n return this.selectedTab === originalIndex;\n }\n}\n","<div class=\"mx-auto flex flex-col\" *ngIf=\"tabsData && tabsData.length > 0\">\r\n <ng-container *ngFor=\"let groupIndex of getTabGroups(); let i = index\">\r\n <div class=\"mx-auto flex flex-row\">\r\n <ng-container *ngFor=\"let tab of getTabGroup(groupIndex); let j = index\">\r\n <button\r\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\r\n [ngClass]=\"\r\n isTabSelected(getRealTabIndex(i, j))\r\n ? 'border-b-0 brightness-110'\r\n : ''\r\n \"\r\n (click)=\"onTabSelected(i, j)\"\r\n >\r\n {{ tab.label }}\r\n <span\r\n *ngIf=\"tab.counter !== undefined\"\r\n class=\"ml-2 text-xs font-bold\"\r\n [ngClass]=\"tab.counterClass\"\r\n >\r\n {{ tab.counter }}\r\n </span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { TooltipState } from '../../services/tooltip.service';\n\n@Component({\n selector: 'lib-table-tooltip',\n standalone: false,\n templateUrl: './table-tooltip.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableTooltipComponent {\n @Input() state!: TooltipState;\n @Input() styles: { [key: string]: string } = {};\n\n get showTooltip(): boolean {\n return this.state?.showTooltip ?? false;\n }\n\n get tooltipContent(): string {\n return this.state?.tooltipContent ?? '';\n }\n\n get tooltipPosition(): { x: number; y: number } {\n return this.state?.tooltipPosition ?? { x: 0, y: 0 };\n }\n\n get tooltipBgColor(): string {\n return this.state?.tooltipBgColor ?? 'bg-gray-800';\n }\n\n get tooltipTextColor(): string {\n return this.state?.tooltipTextColor ?? 'text-white';\n }\n}\n","<div\r\n *ngIf=\"showTooltip\"\r\n class=\"fixed z-50 max-w-md break-words rounded-lg px-3 py-2 text-sm shadow-lg\"\r\n [ngClass]=\"\r\n (tooltipBgColor || 'bg-gray-800') + ' ' + (tooltipTextColor || 'text-white')\r\n \"\r\n [ngStyle]=\"styles\"\r\n [style.left.px]=\"tooltipPosition.x\"\r\n [style.top.px]=\"tooltipPosition.y\"\r\n [style.pointer-events]=\"'none'\"\r\n>\r\n {{ tooltipContent }}\r\n</div>\r\n","import {\n Arrange,\n Condition,\n TabData,\n TableData,\n Column,\n TABLE_DEFAULTS,\n DropdownItem,\n FilterSelectItem,\n Pagination,\n} from '../../types/Table';\nimport {\n Component,\n Input,\n OnInit,\n ViewChild,\n AfterViewInit,\n OnChanges,\n SimpleChanges,\n ElementRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnDestroy,\n} from '@angular/core';\nimport {\n AngularFirestore,\n QueryDocumentSnapshot,\n} from '@angular/fire/compat/firestore';\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Router } from '@angular/router';\nimport { TableService } from '../../services/table.service';\nimport { FilterService } from '../../services/filter.service';\nimport { TooltipService, TooltipState } from '../../services/tooltip.service';\nimport { PaginationService } from '../../services/pagination.service';\nimport {\n getDisplayValue,\n getNestedValue,\n isString,\n trackByProperty,\n getImageKey,\n} from '../../utils/table.utils';\nimport {\n debounceTime,\n firstValueFrom,\n Subject,\n takeUntil,\n BehaviorSubject,\n} from 'rxjs';\nimport { OrderByDirection } from 'firebase/firestore';\nimport firebase from 'firebase/compat';\nimport WhereFilterOp = firebase.firestore.WhereFilterOp;\nimport firestore = firebase.firestore;\nimport { FormControl, FormArray, FormGroup } from '@angular/forms';\n\n@Component({\n selector: 'lib-table',\n standalone: false,\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableComponent<T = any>\n implements OnInit, AfterViewInit, OnChanges, OnDestroy\n{\n // INPUTS\n @Input() data!: TableData;\n @Input() downloadTable?: (arrange: Arrange, conditions: Condition[]) => void;\n arrange: Arrange | null = null;\n\n // VARIABLES\n dataSource!: MatTableDataSource<T>;\n currentPageNumber = 1;\n currentClientPageIndex = 0;\n\n public isLoading$ = new BehaviorSubject<boolean>(false);\n\n public items: T[] = [];\n public filteredItems: T[] = [];\n private lastDoc: QueryDocumentSnapshot<T> | null = null;\n private firstDoc: QueryDocumentSnapshot<T> | null = null;\n private sortBy: { field: string; order: OrderByDirection } = {\n field: TABLE_DEFAULTS.SORT_FIELD,\n order: TABLE_DEFAULTS.SORT_ORDER,\n };\n public columnProperties: string[] = [];\n\n filtersForm: FormArray;\n selectSort: FormControl = new FormControl('');\n currentArrange = '';\n\n hasNextPage: boolean = false;\n dropdownItems: DropdownItem[] = [];\n sortableDropdownItems: DropdownItem[] = [];\n pageSize = TABLE_DEFAULTS.PAGE_SIZE;\n totalItems = 0;\n pageEvent?: PageEvent;\n filterValue: string | null = null;\n\n hasFilterableColumn: boolean = false;\n hasSortableColumn: boolean = false;\n filterPredicate: ((data: T, filter: string) => boolean) | undefined;\n private filterSubject = new Subject<string>();\n private readonly debounceTimeMs = TABLE_DEFAULTS.DEBOUNCE_TIME_MS;\n\n selectedTab: number = 0;\n\n @ViewChild(MatPaginator) paginator!: MatPaginator;\n @ViewChild(MatSort) sort!: MatSort;\n\n // Propriedades para controle do tooltip\n tooltipState: TooltipState;\n\n // Controle de loading de imagens\n imageLoadingState = new Map<string, boolean>();\n\n private destroy$ = new Subject<void>();\n\n // CONSTRUCTOR\n constructor(\n private router: Router,\n private tableService: TableService,\n private filterService: FilterService,\n private tooltipService: TooltipService,\n private paginationService: PaginationService,\n private firestore: AngularFirestore,\n private el: ElementRef,\n private cdr: ChangeDetectorRef,\n ) {\n this.filtersForm = new FormArray([this.filterService.createFilterGroup()]);\n this.tooltipState = this.tooltipService.createInitialState();\n }\n\n getActionButtonClass(): string {\n return (\n (this.data?.actionButton?.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n );\n }\n\n getTableRowNgClass(): Record<string, boolean> {\n return {\n 'example-element-row': this.data?.isNotClickable === true,\n 'example-element-row cursor-pointer': !this.data?.isNotClickable,\n };\n }\n\n getPaginatorNgClass(): Record<string, boolean> {\n return {\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(this.currentArrange) ||\n !!this.data?.filterFn,\n 'hide-next-button':\n !this.hasNextPage && this.data?.pagination === true,\n 'hide-last-button':\n (!this.hasNextPage && this.data?.pagination === true) ||\n !!this.data?.filterFn,\n };\n }\n\n // FILTER METHODS (delegados ao FilterService)\n\n createFilterGroup(): FormGroup {\n return this.filterService.createFilterGroup();\n }\n\n addFilter(filterData?: {\n selectFilter: DropdownItem | null;\n typeFilter?: string;\n selectItem?: FilterSelectItem[];\n initialDate?: string;\n finalDate?: string;\n }): void {\n this.filterService.addFilter(\n this.filtersForm,\n this.data.pagination === true,\n filterData,\n );\n }\n\n hasActiveDateFilter(): boolean {\n return this.filterService.hasActiveDateFilter(this.filtersForm);\n }\n\n getAvailableFilterOptions(): DropdownItem[] {\n return this.filterService.getAvailableFilterOptions(\n this.dropdownItems,\n this.data.pagination === true,\n this.filtersForm,\n );\n }\n\n onSelectFilterChange(): void {\n const lastIndex = this.filtersForm.length - 1;\n const lastFilter = this.filtersForm.at(lastIndex);\n const selectedFilter = lastFilter.get('selectFilter')?.value;\n\n if (selectedFilter) {\n if (\n selectedFilter.arrange === 'filterByDate' &&\n this.data.pagination === true\n ) {\n return;\n }\n this.addFilter();\n }\n }\n\n removeFilter(index: number): void {\n this.filterService.removeFilter(this.filtersForm, index);\n }\n\n removeAllFilters(): void {\n this.filterService.removeAllFilters(this.filtersForm);\n this.resetFilter();\n }\n\n onDateInput(\n event: Event,\n controlName: 'initialDate' | 'finalDate',\n filterIndex: number,\n ): void {\n const filterGroup = this.filtersForm.at(filterIndex) as FormGroup;\n this.filterService.applyDateMask(event, controlName, filterGroup);\n }\n\n onDateFilterChange(): void {\n if (this.data.pagination === false) {\n this.arrange = this.filterService.buildArrangeFromFilters(\n this.filtersForm,\n this.sortBy,\n );\n this.applyFiltersToDataSource();\n this.cdr.markForCheck();\n }\n }\n\n private applyFiltersToDataSource(): void {\n if (!this.dataSource) return;\n\n let filteredItems = this.filterService.applyClientSideFilters<T>(\n [...this.items],\n this.filtersForm,\n this.sortBy,\n );\n this.dataSource.data = filteredItems;\n this.filteredItems = filteredItems;\n this.totalItems = filteredItems.length;\n\n this.cdr.markForCheck();\n }\n\n private applyClientSideFilters(items: T[]): T[] {\n return this.filterService.applyClientSideFilters<T>(\n items,\n this.filtersForm,\n this.sortBy,\n );\n }\n\n private buildArrangeFromFilters(): Arrange {\n return this.filterService.buildArrangeFromFilters(\n this.filtersForm,\n this.sortBy,\n );\n }\n\n // TOOLTIP METHODS (delegados ao TooltipService)\n\n getTooltipStyles(): { [key: string]: string } {\n return this.tooltipService.getTooltipStyles(this.tooltipState);\n }\n\n onCellMouseEnter(event: MouseEvent, row: T, col: Column): void {\n this.tooltipService.handleMouseEnter(\n event,\n row,\n col,\n (c, r, w) => this.getDisplayValue(c, r, w),\n (state) => {\n this.tooltipState = { ...this.tooltipState, ...state };\n this.cdr.markForCheck();\n },\n );\n }\n\n onCellMouseLeave(): void {\n this.tooltipService.handleMouseLeave((state) => {\n this.tooltipState = state;\n this.cdr.markForCheck();\n });\n }\n\n onCellMouseMove(event: MouseEvent): void {\n this.tooltipService.handleMouseMove(\n event,\n this.tooltipState.showTooltip,\n (position) => {\n this.tooltipState = { ...this.tooltipState, tooltipPosition: position };\n this.cdr.markForCheck();\n },\n );\n }\n\n // TAB METHODS\n\n onTabSelected(event: { tab: TabData; index: number }): void {\n if (!this.data.tabs?.method) return;\n this.selectedTab = event.index;\n this.data.tabs.method(event.tab, event.index);\n this.cdr.markForCheck();\n }\n\n // UTILITY METHODS (delegados aos utils)\n\n getDisplayValue(col: Column, row: T, withinLimit: boolean = false): string {\n return getDisplayValue(col, row, withinLimit);\n }\n\n getNestedValue(obj: unknown, path: string): unknown {\n return getNestedValue(obj, path);\n }\n\n isString(value: unknown): boolean {\n return isString(value);\n }\n\n trackByProperty(_index: number, col: Column): string {\n return trackByProperty(_index, col);\n }\n\n // IMAGE LOADING METHODS\n\n private getImageKey(row: T, col: Column): string {\n return getImageKey(row, col);\n }\n\n isImageLoading(row: T, col: Column): boolean {\n const key = this.getImageKey(row, col);\n return !this.imageLoadingState.has(key);\n }\n\n onImageLoad(row: T, col: Column): void {\n const key = this.getImageKey(row, col);\n this.imageLoadingState.set(key, true);\n this.cdr.markForCheck();\n }\n\n onImageError(event: Event, row: T, col: Column, defaultImage?: string): void {\n const key = this.getImageKey(row, col);\n this.imageLoadingState.set(key, true);\n\n const target = event.target as HTMLImageElement;\n if (target) {\n if (defaultImage) {\n target.src = defaultImage;\n target.onerror = null;\n } else {\n target.style.display = 'none';\n }\n }\n\n this.cdr.markForCheck();\n }\n\n // LIFECYCLE METHODS\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['data']) {\n setTimeout(() => this.applyCustomColors(), 0);\n }\n }\n\n ngAfterViewInit(): void {\n this.applyCustomColors();\n }\n\n ngOnDestroy(): void {\n this.tooltipService.destroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private applyCustomColors(): void {\n const hostElement = this.el?.nativeElement;\n if (!hostElement || !this.data) return;\n\n if (this.data.color?.bg) {\n hostElement.style.setProperty('--table-color', this.data.color.bg);\n hostElement.style.setProperty('--table-header-bg', this.data.color.bg);\n }\n if (this.data.color?.text) {\n hostElement.style.setProperty('--table-text-color', this.data.color.text);\n hostElement.style.setProperty(\n '--table-header-text',\n this.data.color.text,\n );\n }\n\n setTimeout(() => {\n const headerCells = hostElement.querySelectorAll(\n '.mat-header-cell, .mat-mdc-header-cell, th.mat-header-cell, th.mat-mdc-header-cell',\n );\n headerCells.forEach((cell: HTMLElement) => {\n if (this.data.color?.bg) {\n cell.style.backgroundColor = this.data.color.bg;\n }\n if (this.data.color?.text) {\n cell.style.color = this.data.color.text;\n }\n });\n }, 100);\n }\n\n public async ngOnInit(): Promise<void> {\n if (!this.data.color) {\n this.data.color = {\n bg: TABLE_DEFAULTS.DEFAULT_BG_COLOR,\n text: TABLE_DEFAULTS.DEFAULT_TEXT_COLOR,\n };\n }\n if (this.data.showSimpleSearch === undefined) {\n this.data.showSimpleSearch = true;\n }\n\n this.columnProperties = this.data.displayedColumns.map(\n (column) => column.property,\n );\n this.cdr.markForCheck();\n\n if (this.data.actionButton && !this.data.actionButton.condition) {\n this.data.actionButton.condition = (_row?: T) => true;\n }\n\n // Inicializar dropdownItems usando FilterService\n const filterConfig = this.filterService.initializeDropdownItems(\n this.data.displayedColumns,\n );\n this.dropdownItems = filterConfig.dropdownItems;\n this.sortableDropdownItems = filterConfig.sortableDropdownItems;\n this.hasFilterableColumn = filterConfig.hasFilterableColumn;\n this.hasSortableColumn = filterConfig.hasSortableColumn;\n\n if (this.data.filterableOptions) {\n this.dropdownItems = this.filterService.addFilterableOptions(\n this.dropdownItems,\n this.data.filterableOptions,\n );\n }\n\n // Sem paginação\n if (this.data.pagination === false) {\n await this.loadItems();\n this.cdr.markForCheck();\n }\n\n // Com paginação\n if (this.data.pagination === true) {\n if (this.data.sortBy) {\n this.sortBy = {\n field: this.data.sortBy.field,\n order: this.data.sortBy.order,\n };\n }\n this.filterSubject\n .pipe(debounceTime(this.debounceTimeMs), takeUntil(this.destroy$))\n .subscribe(() => {\n this.loadItemsPaginated('reload', true);\n });\n\n this.isLoading$.next(true);\n this.cdr.markForCheck();\n await this.loadItemsPaginated('reload', true);\n\n this.sort.active = 'createdAt';\n this.sort.direction = 'desc';\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n this.totalItems = 0;\n if (this.data.totalRef) {\n for (const totalRef of this.data.totalRef) {\n const totalRefDoc = await totalRef.ref.get();\n const docData = totalRefDoc.data() as\n | Record<string, unknown>\n | undefined;\n if (docData && docData[totalRef.field]) {\n const fieldValue = docData[totalRef.field];\n this.totalItems = (this.totalItems +\n (typeof fieldValue === 'number' ? fieldValue : 0)) as number;\n }\n }\n }\n this.isLoading$.next(false);\n this.cdr.markForCheck();\n }\n }\n\n // DATA LOADING METHODS\n\n private async loadItems(): Promise<void> {\n this.imageLoadingState.clear();\n this.items = (await this.tableService.getItems(\n this.data.collectionRef,\n )) as T[];\n if (this.data.conditions) {\n this.filterItems();\n }\n await this.loadRelations();\n await this.loadQueryLengths();\n this.totalItems = this.items.length;\n\n this.arrange = {\n filters: [],\n sortBy: this.data.sortBy || {\n field: TABLE_DEFAULTS.SORT_FIELD,\n order: TABLE_DEFAULTS.SORT_ORDER,\n },\n };\n this.sortBy = this.data.sortBy || {\n field: TABLE_DEFAULTS.SORT_FIELD,\n order: TABLE_DEFAULTS.SORT_ORDER,\n };\n\n let itemsToDisplay = [...this.items];\n itemsToDisplay = this.applyClientSideFilters(itemsToDisplay);\n this.filteredItems = itemsToDisplay;\n\n this.dataSource = new MatTableDataSource(itemsToDisplay);\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n if (this.data.sortBy) {\n this.dataSource.sort.active = this.data.sortBy.field;\n this.dataSource.sort.direction = this.data.sortBy.order;\n this.dataSource.sort.sortChange.emit();\n }\n\n this.dataSource.filterPredicate = (data, filter: string) => {\n const item = data as Record<string, unknown>;\n return this.data.displayedColumns.some((col): boolean => {\n if (col.filterPredicates) {\n return col.filterPredicates.some((predicate): boolean => {\n const propertyValue = item[col.property];\n if (!propertyValue || typeof propertyValue !== 'object') {\n return false;\n }\n\n const propertyRecord = propertyValue as Record<string, unknown>;\n const predicateValue = propertyRecord[predicate];\n if (predicateValue === null || predicateValue === undefined) {\n return false;\n }\n\n return String(predicateValue)\n .trim()\n .toLocaleLowerCase()\n .includes(filter);\n });\n }\n\n if (col.property && col.isFilterable) {\n const propertyValue = item[col.property];\n if (propertyValue === null || propertyValue === undefined) {\n return false;\n }\n\n return String(propertyValue)\n .trim()\n .toLocaleLowerCase()\n .includes(filter);\n }\n return false;\n });\n };\n this.filterPredicate = this.dataSource.filterPredicate;\n this.cdr.markForCheck();\n }\n\n private async loadItemsPaginated(\n navigation: 'reload' | 'forward' | 'backward' = 'reload',\n reset: boolean = false,\n ): Promise<void> {\n this.imageLoadingState.clear();\n if (reset && ['forward', 'reload'].includes(navigation)) {\n this.lastDoc = null;\n this.currentClientPageIndex = 0;\n }\n if (reset && ['backward', 'reload'].includes(navigation)) {\n this.firstDoc = null;\n this.currentClientPageIndex = 0;\n }\n\n const activeFilters = this.filterService.extractActiveFilters(\n this.filtersForm,\n );\n\n this.arrange = {\n filters: activeFilters,\n sortBy: this.sortBy,\n };\n\n const paginated: Pagination = {\n batchSize: this.pageSize,\n collection: this.data.collection,\n doc: { lastDoc: this.lastDoc, firstDoc: this.firstDoc },\n navigation,\n arrange: this.arrange!,\n conditions: this.data.conditions,\n size: this.totalItems,\n filterFn: this.data.filterFn,\n clientPageIndex: this.currentClientPageIndex,\n };\n\n const result = await this.tableService.getPaginated(paginated);\n this.items = result.items as T[];\n await this.loadRelations();\n await this.loadQueryLengths();\n this.lastDoc = result.lastDoc as QueryDocumentSnapshot<T> | null;\n this.firstDoc = result.firstDoc as QueryDocumentSnapshot<T> | null;\n\n if (result.currentClientPageIndex !== undefined) {\n this.currentClientPageIndex = result.currentClientPageIndex;\n }\n\n let sum = 0;\n if (this.data.totalRef) {\n for (const totalRef of this.data.totalRef) {\n const totalRefDoc = await totalRef.ref.get();\n const docData = totalRefDoc.data() as\n | Record<string, unknown>\n | undefined;\n if (docData || result.filterLength) {\n const fieldValue = docData ? docData[totalRef.field] : undefined;\n const numericValue = typeof fieldValue === 'number' ? fieldValue : 0;\n sum = result.filterLength ?? ((sum + numericValue) as number);\n }\n }\n this.totalItems = sum;\n }\n\n this.hasNextPage = result.hasNextPage;\n this.dataSource = new MatTableDataSource(this.items);\n this.filterPredicate = this.dataSource.filterPredicate;\n this.cdr.markForCheck();\n }\n\n // PAGINATION METHODS\n\n async onPageChange(event?: PageEvent): Promise<void> {\n if (this.data.pagination !== true || !event) return;\n\n this.isLoading$.next(true);\n\n const currentState = {\n currentPageNumber: this.currentPageNumber,\n currentClientPageIndex: this.currentClientPageIndex,\n pageSize: this.pageSize,\n totalItems: this.totalItems,\n hasNextPage: this.hasNextPage,\n };\n\n const navigation = this.paginationService.calculateNavigation(\n event,\n currentState,\n );\n\n if (!navigation.shouldNavigate) {\n this.isLoading$.next(false);\n this.pageEvent = event;\n return;\n }\n\n // Atualizar estado local\n this.currentClientPageIndex = navigation.newClientPageIndex;\n this.currentPageNumber = navigation.newPageNumber;\n\n // Atualizar pageSize se mudou\n if (event.pageSize !== this.pageSize) {\n this.pageSize = event.pageSize;\n }\n\n // Ajustar pageSize temporariamente para última página se necessário\n const lastPageIndex = this.paginationService.calculateLastPageIndex(\n this.totalItems,\n event.pageSize,\n );\n let originalPageSize: number | null = null;\n\n if (\n event.pageIndex === lastPageIndex &&\n navigation.direction === 'backward' &&\n navigation.resetDocs\n ) {\n const itemsExpectedInLastPage =\n this.paginationService.calculateLastPageItemCount(\n this.totalItems,\n event.pageSize,\n );\n\n if (\n itemsExpectedInLastPage > 0 &&\n itemsExpectedInLastPage < event.pageSize\n ) {\n originalPageSize = this.pageSize;\n this.pageSize = itemsExpectedInLastPage;\n }\n }\n\n try {\n await this.loadItemsPaginated(navigation.direction, navigation.resetDocs);\n } catch (error) {\n console.error('Erro ao carregar itens paginados:', error);\n } finally {\n if (originalPageSize !== null) {\n this.pageSize = originalPageSize;\n }\n }\n\n this.pageEvent = event;\n this.isLoading$.next(false);\n this.cdr.markForCheck();\n }\n\n // FILTER/SEARCH METHODS\n\n applyFilter(value: string): void {\n if (this.data.pagination === false) {\n this.dataSource.filter = String(value).trim().toLowerCase();\n }\n if (this.data.pagination === true) {\n this.filterValue = value;\n this.filterSubject.next(this.filterValue);\n }\n }\n\n async search(event?: Event): Promise<void> {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (this.selectSort.value) {\n if (this.selectSort.value.arrange === 'ascending') {\n this.sortBy = {\n field: this.selectSort.value.property,\n order: 'asc',\n };\n }\n if (this.selectSort.value.arrange === 'descending') {\n this.sortBy = {\n field: this.selectSort.value.property,\n order: 'desc',\n };\n }\n }\n\n if (this.data.pagination === false) {\n this.arrange = this.buildArrangeFromFilters();\n this.applyFiltersToDataSource();\n this.currentArrange =\n this.filtersForm.length > 0\n ? (this.filtersForm.at(0).get('selectFilter')?.value?.arrange ?? '')\n : '';\n this.cdr.markForCheck();\n } else {\n await this.loadItemsPaginated('reload', true);\n this.currentArrange =\n this.filtersForm.length > 0\n ? (this.filtersForm.at(0).get('selectFilter')?.value?.arrange ?? '')\n : '';\n this.paginator.firstPage();\n this.cdr.markForCheck();\n }\n }\n\n async resetFilter(): Promise<void> {\n this.dataSource.filter = '';\n if (this.filterPredicate) {\n this.dataSource.filterPredicate = this.filterPredicate;\n }\n\n this.filtersForm.clear();\n this.addFilter();\n this.selectSort.patchValue('');\n this.sortBy = {\n order: this.data.sortBy ? this.data.sortBy.order : 'desc',\n field: this.data.sortBy ? this.data.sortBy.field : 'createdAt',\n };\n\n if (this.data.pagination === false) {\n this.arrange = {\n filters: [],\n sortBy: this.sortBy,\n };\n this.dataSource.data = [...this.items];\n this.totalItems = this.items.length;\n this.currentArrange = '';\n this.cdr.markForCheck();\n } else {\n await this.loadItemsPaginated('reload', true);\n this.currentArrange = '';\n this.paginator.firstPage();\n this.cdr.markForCheck();\n }\n }\n\n // NAVIGATION METHODS\n\n goToDetails(row: T): void {\n if (this.data.isNotClickable) {\n return;\n }\n const urlPath = this.data.url || this.data.name;\n const rowWithId = row as Record<string, unknown> & { id: string };\n const url = this.router.serializeUrl(\n this.router.createUrlTree([`/${urlPath}`, rowWithId.id]),\n );\n window.open(url, '_blank');\n }\n\n // RELATION METHODS\n\n async getRelation(params: {\n id: string;\n collection: string;\n newProperty: string;\n }): Promise<string> {\n try {\n let snapshot: firestore.DocumentSnapshot<unknown> | undefined;\n if (\n params.id !== '' &&\n params.id !== undefined &&\n params.collection !== undefined &&\n params.collection !== ''\n ) {\n snapshot = await firstValueFrom(\n this.firestore.collection(params.collection).doc(params.id).get(),\n );\n }\n if (snapshot && snapshot.exists) {\n const data = snapshot.data() as Record<string, unknown> | undefined;\n const value = data?.[params.newProperty];\n return typeof value === 'string' ? value : '';\n }\n return '';\n } catch (e) {\n console.error(e);\n return '';\n }\n }\n\n private async loadRelations(): Promise<void> {\n const relationPromises = this.data.displayedColumns\n .filter((col) => col.relation)\n .flatMap((col) =>\n this.items.map(async (item) => {\n if (col.relation) {\n const itemRecord = item as Record<string, unknown>;\n itemRecord[col.property] = await this.getRelation({\n id: String(itemRecord[col.relation.sourceProperty] ?? ''),\n collection: col.relation.targetedCollection,\n newProperty: col.relation.targetedProperty || col.property,\n });\n }\n }),\n );\n\n await Promise.all(relationPromises);\n }\n\n async getQueryLength(params: {\n item: T;\n relation: {\n collection: string;\n property: string;\n operator: WhereFilterOp;\n value: string;\n };\n }): Promise<number> {\n const itemRecord = params.item as Record<string, unknown>;\n const snapshot = await this.firestore\n .collection(params.relation.collection)\n .ref.where(\n params.relation.property,\n params.relation.operator,\n itemRecord[params.relation.value],\n )\n .get();\n return snapshot.size;\n }\n\n private async loadQueryLengths(): Promise<void> {\n const lengthPromises = this.data.displayedColumns\n .filter((col) => col.queryLength)\n .flatMap((col) =>\n this.items.map(async (item) => {\n if (col.queryLength) {\n const itemRecord = item as Record<string, unknown>;\n itemRecord[col.property] = await this.getQueryLength({\n item: item,\n relation: col.queryLength,\n });\n }\n }),\n );\n await Promise.all(lengthPromises);\n }\n\n private filterItems(): void {\n if (this.data.conditions) {\n this.data.conditions.forEach((cond) => {\n this.items = this.items.filter((item) => {\n const operatorFunction =\n this.tableService.operators[\n cond.operator as keyof typeof this.tableService.operators\n ];\n if (operatorFunction) {\n const itemRecord = item as Record<string, unknown>;\n return operatorFunction(\n itemRecord[cond.firestoreProperty],\n cond.dashProperty,\n );\n }\n return false;\n });\n });\n }\n }\n\n // PUBLIC METHODS\n\n async reloadTable(): Promise<void> {\n if (this.data.pagination) {\n await this.loadItemsPaginated('reload', true);\n this.paginator.firstPage();\n this.cdr.markForCheck();\n } else {\n await this.loadItems();\n }\n }\n\n updateDisplayedColumns(): void {\n if (this.dataSource) {\n this.dataSource = new MatTableDataSource<T>([]);\n }\n\n this.columnProperties = this.data.displayedColumns.map(\n (column) => column.property,\n );\n\n const filterConfig = this.filterService.initializeDropdownItems(\n this.data.displayedColumns,\n );\n this.dropdownItems = filterConfig.dropdownItems;\n this.sortableDropdownItems = filterConfig.sortableDropdownItems;\n\n if (this.data.filterableOptions) {\n this.dropdownItems = this.filterService.addFilterableOptions(\n this.dropdownItems,\n this.data.filterableOptions,\n );\n }\n this.cdr.markForCheck();\n }\n\n shouldShowActionButton(): boolean {\n if (!this.data?.actionButton) {\n return false;\n }\n\n if (!this.data.actionButton.condition) {\n return true;\n }\n\n try {\n return this.data.actionButton.condition(null) ?? true;\n } catch {\n return true;\n }\n }\n\n handleDownload(): void {\n if (!this.downloadTable) return;\n\n if (this.data.pagination === false) {\n if (this.dataSource && this.dataSource.filteredData) {\n this.filteredItems = [...this.dataSource.filteredData];\n }\n\n const arrange = this.buildArrangeFromFilters();\n this.downloadTable(arrange, this.data.conditions || []);\n } else {\n if (this.arrange) {\n this.downloadTable(this.arrange, this.data.conditions || []);\n }\n }\n }\n}\n","<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e Ações</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"getActionButtonClass()\"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3 p-2\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Action Buttons -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <!-- UNIFIED CONTROL PANEL (for non-paginated tables): SEARCH, SORT & FILTERS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === false &&\n (hasFilterableColumn === true ||\n dropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e Ações</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"getActionButtonClass()\"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH -->\n <div\n class=\"mb-4\"\n *ngIf=\"hasFilterableColumn === true && data.showSimpleSearch !== false\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- FILTERS PANEL -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true ||\n this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <!-- TABS COMPONENT -->\n <lib-table-tabs\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n [tabsData]=\"data.tabs.tabsData\"\n [selectedTab]=\"selectedTab\"\n (tabSelected)=\"onTabSelected($event)\"\n ></lib-table-tabs>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns; trackBy: trackByProperty\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <!-- Imagem com loading -->\n <div\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n\n <!-- Imagem com URL completa e loading -->\n <div\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"getTableRowNgClass()\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!(isLoading$ | async)\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading$ | async\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"getPaginatorNgClass()\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !(isLoading$ | async) &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <lib-table-tooltip\n [state]=\"tooltipState\"\n [styles]=\"getTooltipStyles()\"\n ></lib-table-tooltip>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\n\n// Angular Material\nimport { MatTableModule } from '@angular/material/table';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDialogModule } from '@angular/material/dialog';\n\n// Components\nimport { NgFirebaseTableKxpComponent } from './ng-firebase-table-kxp.component';\nimport { TableComponent } from './components/table/table.component';\nimport { TableTabsComponent } from './components/table-tabs/table-tabs.component';\nimport { TableTooltipComponent } from './components/table-tooltip/table-tooltip.component';\n\n// Services\nimport { TableService } from './services/table.service';\nimport { FilterService } from './services/filter.service';\nimport { TooltipService } from './services/tooltip.service';\nimport { PaginationService } from './services/pagination.service';\n\n@NgModule({\n declarations: [\n NgFirebaseTableKxpComponent,\n TableComponent,\n TableTabsComponent,\n TableTooltipComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n RouterModule,\n MatTableModule,\n MatPaginatorModule,\n MatSortModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatTooltipModule,\n MatProgressSpinnerModule,\n MatIconModule,\n MatDialogModule,\n ],\n exports: [\n NgFirebaseTableKxpComponent,\n TableComponent,\n TableTabsComponent,\n TableTooltipComponent,\n ],\n providers: [TableService, FilterService, TooltipService, PaginationService],\n})\nexport class NgFirebaseTableKxpModule {}\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgFirebaseTableKxpService {\r\n constructor() {}\r\n}\r\n","/*\r\n * Public API Surface of ng-firebase-table-kxp\r\n */\r\n\r\n// Main module\r\nexport * from './lib/ng-firebase-table-kxp.module';\r\n\r\n// Legacy components (se existirem)\r\nexport * from './lib/ng-firebase-table-kxp.service';\r\nexport * from './lib/ng-firebase-table-kxp.component';\r\n\r\n// Components\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/table-tabs/table-tabs.component';\r\nexport * from './lib/components/table-tooltip/table-tooltip.component';\r\n\r\n// Services\r\nexport * from './lib/services/table.service';\r\nexport * from './lib/services/filter.service';\r\nexport * from './lib/services/tooltip.service';\r\nexport * from './lib/services/pagination.service';\r\n\r\n// Types\r\nexport * from './lib/types/Table';\r\n\r\n// Utils\r\nexport * from './lib/utils/table.utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TableService","i1","i2.TableService","i3.FilterService","i4.TooltipService","i5.PaginationService","i6","i7","i18.TableTabsComponent","i19.TableTooltipComponent"],"mappings":"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"}
1
+ {"version":3,"file":"ng-firebase-table-kxp.mjs","sources":["../../../projects/ng-firebase-table-kxp/src/lib/ng-firebase-table-kxp.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/types/Table.ts","../../../projects/ng-firebase-table-kxp/src/lib/utils/table.utils.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/table.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/filter.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/tooltip.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/services/pagination.service.ts","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tabs/table-tabs.component.html","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tabs/table-tabs.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tooltip/table-tooltip.component.html","../../../projects/ng-firebase-table-kxp/src/lib/components/table-tooltip/table-tooltip.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/components/table/table.component.html","../../../projects/ng-firebase-table-kxp/src/lib/components/table/table.component.ts","../../../projects/ng-firebase-table-kxp/src/lib/ng-firebase-table-kxp.module.ts","../../../projects/ng-firebase-table-kxp/src/lib/ng-firebase-table-kxp.service.ts","../../../projects/ng-firebase-table-kxp/src/public-api.ts","../../../projects/ng-firebase-table-kxp/src/ng-firebase-table-kxp.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-ng-firebase-table-kxp',\n standalone: false,\n template: ` <p>ng-firebase-table-kxp works!</p> `,\n styles: [],\n})\nexport class NgFirebaseTableKxpComponent {}\n","import {\r\n CollectionReference,\r\n DocumentReference,\r\n QueryDocumentSnapshot,\r\n} from '@angular/fire/compat/firestore';\r\nimport { PipeTransform } from '@angular/core';\r\nimport firebase from 'firebase/compat';\r\nimport WhereFilterOp = firebase.firestore.WhereFilterOp;\r\nimport { OrderByDirection } from 'firebase/firestore';\r\n\r\nexport const TABLE_DEFAULTS = {\r\n SORT_FIELD: 'createdAt',\r\n SORT_ORDER: 'desc' as const,\r\n PAGE_SIZE: 25,\r\n DEBOUNCE_TIME_MS: 500,\r\n DEFAULT_BG_COLOR: '#1976d2',\r\n DEFAULT_TEXT_COLOR: '#ffffff',\r\n};\r\n\r\nexport interface TableData {\r\n displayedColumns: Column[];\r\n filterableOptions?: FilterableOption[];\r\n collectionRef: CollectionReference<unknown>;\r\n collection: string;\r\n name: string;\r\n totalRef?: { ref: DocumentReference<unknown>; field: string }[];\r\n download: boolean;\r\n pagination: boolean;\r\n isNotClickable?: boolean;\r\n url?: string;\r\n sortBy?: { field: string; order: OrderByDirection };\r\n conditions?: {\r\n operator: WhereFilterOp;\r\n firestoreProperty: string;\r\n dashProperty: string | string[];\r\n }[];\r\n filterFn?: (item: any) => boolean;\r\n color?: { bg: string; text: string };\r\n showSimpleSearch?: boolean; // Flag para mostrar/ocultar campo de busca simples (padrão: true)\r\n actionButton?: {\r\n label: string;\r\n routerLink: string;\r\n icon?: string;\r\n colorClass?: string;\r\n method?: (row: any, event?: any) => any;\r\n condition?: (row?: any) => boolean;\r\n };\r\n tabs?: Tab;\r\n}\r\n\r\nexport interface Tab {\r\n method: (tab: any, event?: any) => any;\r\n tabsData: TabData[];\r\n}\r\n\r\nexport interface TabData {\r\n label: string;\r\n counter?: number;\r\n counterClass?: string;\r\n}\r\n\r\nexport interface Column {\r\n property: string;\r\n title?: string;\r\n charLimit?: number;\r\n pipe?: PipeTransform;\r\n iconClass?: {\r\n text?: string;\r\n class?: string;\r\n condition?: (row: any) => any;\r\n buttonMethod?: (row: any, event?: any) => any;\r\n }[];\r\n isSortable?: boolean;\r\n isFilterable?: boolean;\r\n isFilterableByDate?: boolean;\r\n hasLink?: boolean | string;\r\n hasDownload?: boolean | string;\r\n relation?: {\r\n targetedCollection: string; //users (collection targeted do join)\r\n sourceProperty: string; // userId << da collection atual `orders`\r\n targetedProperty: string; // name ?? (propriedade que quero puxar da tabela users)\r\n };\r\n queryLength?: {\r\n collection: string;\r\n property: string;\r\n operator: WhereFilterOp;\r\n value: string;\r\n };\r\n image?: Image;\r\n method?: (row: any, event?: any) => any;\r\n filterPredicates?: string[];\r\n calculateValue?: (row: any) => any;\r\n arrayField?: string;\r\n tooltip?: { color: string; text: string };\r\n}\r\n\r\nexport interface Image {\r\n class: string;\r\n path?: string;\r\n url?: boolean;\r\n default?: string;\r\n}\r\n\r\nexport interface FilterableOption {\r\n title: string;\r\n items: {\r\n property: string;\r\n value: string | boolean;\r\n label: string;\r\n }[];\r\n}\r\n\r\nexport interface Pagination {\r\n batchSize: number;\r\n collection: string;\r\n doc?: {\r\n firstDoc: QueryDocumentSnapshot<any> | null;\r\n lastDoc: QueryDocumentSnapshot<any> | null;\r\n };\r\n navigation: 'reload' | 'forward' | 'backward';\r\n arrange: Arrange;\r\n conditions?: Condition[];\r\n filterFn?: (item: any) => boolean;\r\n size?: number;\r\n clientPageIndex?: number;\r\n}\r\n\r\nexport interface Condition {\r\n operator: WhereFilterOp;\r\n firestoreProperty: string;\r\n dashProperty: string | string[];\r\n}\r\n\r\nexport interface Arrange {\r\n filters: {\r\n arrange:\r\n | 'ascending'\r\n | 'descending'\r\n | 'filter'\r\n | 'filterByDate'\r\n | 'equals'\r\n | '';\r\n filter?: { property: string; filtering: string } | null;\r\n dateFilter?: {\r\n initial: Date;\r\n final: Date;\r\n };\r\n }[];\r\n sortBy: { field: string; order: OrderByDirection };\r\n elementId?: { property: string; value: string };\r\n}\r\n\r\n// Tipo para itens do dropdown de filtros e ordenação\r\nexport type DropdownItem = Column & {\r\n arrange: 'filter' | 'filterByDate' | 'equals' | 'ascending' | 'descending';\r\n title: string;\r\n icon?: string;\r\n};\r\n\r\n// Tipo para itens selecionados em filtros\r\nexport interface FilterSelectItem {\r\n property: string;\r\n value: string | boolean;\r\n label: string;\r\n}\r\n","import { Column } from '../types/Table';\r\n\r\n/**\r\n * Obtém o valor aninhado de um objeto dado um caminho (ex: 'user.address.city')\r\n */\r\nexport function getNestedValue(obj: any, path: string): any {\r\n if (!path) return undefined;\r\n const properties = path.split('.');\r\n return properties.reduce(\r\n (acc, currentPart) => acc && acc[currentPart],\r\n obj\r\n );\r\n}\r\n\r\n/**\r\n * Formata um array de objetos em uma string com valores separados por vírgula\r\n */\r\nexport function formatArrayValue(array: any[], field: string): string {\r\n if (!Array.isArray(array) || array.length === 0) {\r\n return '';\r\n }\r\n\r\n const values = array\r\n .map((item) => {\r\n if (typeof item === 'object' && item !== null) {\r\n return item[field] || '';\r\n }\r\n return String(item);\r\n })\r\n .filter((value) => value !== '' && value !== null && value !== undefined);\r\n\r\n return values.join(', ');\r\n}\r\n\r\n/**\r\n * Obtém o valor de exibição para uma célula da tabela\r\n */\r\nexport function getDisplayValue(\r\n col: Column,\r\n row: any,\r\n withinLimit: boolean = false\r\n): string {\r\n let value: any;\r\n\r\n if (col.calculateValue) {\r\n value = col.calculateValue(row);\r\n } else {\r\n value = getNestedValue(row, col.property);\r\n }\r\n\r\n if (Array.isArray(value) && col.arrayField) {\r\n value = formatArrayValue(value, col.arrayField);\r\n }\r\n\r\n if (col.queryLength && row[col.property]) {\r\n value = row[col.property];\r\n }\r\n\r\n value = col.pipe ? col.pipe.transform(value) : value;\r\n\r\n if (value === null || value === undefined) {\r\n value = '';\r\n } else {\r\n value = String(value);\r\n }\r\n\r\n if (withinLimit || !col.charLimit || value.length <= col.charLimit) {\r\n return value;\r\n }\r\n return value.substring(0, col.charLimit) + '...';\r\n}\r\n\r\n/**\r\n * Verifica se um valor é string\r\n */\r\nexport function isString(value: any): boolean {\r\n return typeof value === 'string';\r\n}\r\n\r\n/**\r\n * TrackBy function para colunas\r\n */\r\nexport function trackByProperty(_index: number, col: Column): string {\r\n return col.property;\r\n}\r\n\r\n/**\r\n * Gera uma chave única para identificar uma imagem em carregamento\r\n */\r\nexport function getImageKey(row: any, col: Column): string {\r\n const rowId = row.id || row._id || JSON.stringify(row);\r\n return `${rowId}-${col.property}`;\r\n}\r\n\r\n\r\n","import { Injectable, Optional } from '@angular/core';\r\nimport {\r\n AngularFirestore,\r\n CollectionReference,\r\n QueryDocumentSnapshot,\r\n} from '@angular/fire/compat/firestore';\r\nimport firebase from 'firebase/compat/app';\r\nimport { Arrange, Condition, Pagination } from '../types/Table';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport { AbstractControl, ValidatorFn } from '@angular/forms';\r\nimport * as moment from 'moment';\r\n\r\ninterface ErrorWithCode extends Error {\r\n code: string;\r\n}\r\n\r\ninterface ErrorWithMessage {\r\n message: string;\r\n}\r\n\r\ninterface PaginationResult {\r\n items: Array<Record<string, unknown> & { id: string }>;\r\n filterLength: number | null;\r\n firstDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null;\r\n lastDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null;\r\n hasNextPage: boolean;\r\n hasPreviousPage?: boolean;\r\n currentClientPageIndex?: number;\r\n totalPages?: number;\r\n}\r\n\r\n@Injectable()\r\nexport class TableService {\r\n constructor(\r\n @Optional() private ngFire: AngularFirestore,\r\n @Optional() private dialog: MatDialog,\r\n @Optional() private toastr: ToastrService\r\n ) {}\r\n\r\n async getItems(\r\n collection: CollectionReference<unknown>\r\n ): Promise<Array<Record<string, unknown> & { id: string }>> {\r\n try {\r\n const querySnapshot = await collection.get();\r\n return querySnapshot.docs.map(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { ...(data ?? {}), id: doc.id } as Record<string, unknown> & {\r\n id: string;\r\n };\r\n }\r\n );\r\n } catch (error) {\r\n console.warn('Collection não encontrada:', error);\r\n return [];\r\n }\r\n }\r\n\r\n private async executeQuery(params: Pagination): Promise<PaginationResult> {\r\n if (params.filterFn) {\r\n // Lógica com filtro no cliente (filterFn)\r\n const BATCH_FETCH_SIZE = params.batchSize;\r\n const GOAL_SIZE = params.batchSize + 1;\r\n\r\n if (params.navigation === 'forward' || params.navigation === 'reload') {\r\n if (params.navigation === 'reload' && params.doc) {\r\n params.doc.lastDoc = null;\r\n }\r\n\r\n let lastDocCursor: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n params.doc ? params.doc.lastDoc : null;\r\n let pageResults: Array<Record<string, unknown> & { id: string }> = [];\r\n let allFetchedDocs: firebase.firestore.QueryDocumentSnapshot<unknown>[] =\r\n [];\r\n let hasMoreDocsInDb = true;\r\n\r\n while (pageResults.length < GOAL_SIZE && hasMoreDocsInDb) {\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n query = this.applyFilters(query, params.arrange, params.conditions);\r\n\r\n if (lastDocCursor) {\r\n query = query.startAfter(lastDocCursor);\r\n }\r\n query = query.limit(BATCH_FETCH_SIZE);\r\n\r\n const snapshot = await query.get();\r\n\r\n if (snapshot.empty) {\r\n hasMoreDocsInDb = false;\r\n break;\r\n }\r\n\r\n lastDocCursor = snapshot.docs[snapshot.docs.length - 1];\r\n allFetchedDocs.push(...snapshot.docs);\r\n\r\n const batchUsers = snapshot.docs\r\n .map((doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<\r\n string,\r\n unknown\r\n > & { id: string };\r\n })\r\n .filter(params.filterFn);\r\n\r\n pageResults.push(...batchUsers);\r\n\r\n if (snapshot.size < BATCH_FETCH_SIZE) {\r\n hasMoreDocsInDb = false;\r\n }\r\n }\r\n\r\n const hasNextPage = pageResults.length > params.batchSize;\r\n const finalItems = pageResults.slice(0, params.batchSize);\r\n\r\n const firstDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[0]?.id\r\n ) || null;\r\n const lastDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[finalItems.length - 1]?.id\r\n ) || null;\r\n\r\n return {\r\n items: finalItems,\r\n filterLength: null,\r\n firstDoc: firstDocOfPage,\r\n lastDoc: lastDocOfPage,\r\n hasNextPage: hasNextPage,\r\n hasPreviousPage:\r\n !!(params.doc && params.doc.lastDoc) &&\r\n params.navigation !== 'reload',\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n // Lógica para trás (backward)\r\n else if (params.navigation === 'backward') {\r\n if (!params.doc || !params.doc.firstDoc) {\r\n return {\r\n items: [],\r\n filterLength: null,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: true,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n\r\n let pageResults: Array<Record<string, unknown> & { id: string }> = [];\r\n let allFetchedDocs: firebase.firestore.QueryDocumentSnapshot<unknown>[] =\r\n [];\r\n let hasMoreDocsInDb = true;\r\n\r\n let boundaryDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n params.doc.firstDoc;\r\n\r\n while (pageResults.length < GOAL_SIZE && hasMoreDocsInDb) {\r\n if (!boundaryDoc) break;\r\n\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n query = this.applyFilters(query, params.arrange, params.conditions);\r\n\r\n query = query.endBefore(boundaryDoc);\r\n query = query.limitToLast(BATCH_FETCH_SIZE);\r\n\r\n const snapshot = await query.get();\r\n\r\n if (snapshot.empty) {\r\n hasMoreDocsInDb = false;\r\n break;\r\n }\r\n\r\n boundaryDoc = snapshot\r\n .docs[0] as firebase.firestore.QueryDocumentSnapshot<unknown>;\r\n\r\n allFetchedDocs = [...snapshot.docs, ...allFetchedDocs];\r\n\r\n const batchUsers = snapshot.docs\r\n .map((doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<\r\n string,\r\n unknown\r\n > & { id: string };\r\n })\r\n .filter(params.filterFn);\r\n\r\n pageResults = [...batchUsers, ...pageResults];\r\n\r\n if (snapshot.size < BATCH_FETCH_SIZE) {\r\n hasMoreDocsInDb = false;\r\n }\r\n }\r\n\r\n const finalItems = pageResults.slice(0, params.batchSize);\r\n\r\n const firstDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[0]?.id\r\n ) || null;\r\n const lastDocOfPage =\r\n allFetchedDocs.find(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n doc.id === finalItems[finalItems.length - 1]?.id\r\n ) || null;\r\n\r\n return {\r\n items: finalItems,\r\n filterLength: null,\r\n firstDoc: firstDocOfPage,\r\n lastDoc: lastDocOfPage,\r\n hasNextPage: true,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n } else {\r\n let items: Array<Record<string, unknown> & { id: string }> = [];\r\n let docs: firebase.firestore.QueryDocumentSnapshot<unknown>[] = [];\r\n let hasNextPage = false;\r\n let filterLength: null | number = null;\r\n\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n if (params.conditions) {\r\n params.conditions.forEach((c: Condition) => {\r\n if (c.operator === '!=') {\r\n query = query.orderBy(c.firestoreProperty);\r\n }\r\n });\r\n }\r\n\r\n query = this.applyFilters(query, params.arrange, params.conditions);\r\n\r\n if (params.navigation === 'reload') {\r\n query = query.limit(params.batchSize + 1);\r\n if (params.doc && params.doc.firstDoc) {\r\n query = query.startAt(params.doc.firstDoc);\r\n }\r\n } else if (params.navigation === 'forward') {\r\n query = query.limit(params.batchSize + 1);\r\n\r\n if (params.doc && params.doc.lastDoc) {\r\n query = query.startAfter(params.doc.lastDoc);\r\n }\r\n } else {\r\n // backward\r\n query = query.limitToLast(params.batchSize + 1);\r\n if (params.doc && params.doc.firstDoc) {\r\n query = query.endBefore(params.doc.firstDoc);\r\n }\r\n }\r\n\r\n const itemCol = await query.get();\r\n itemCol.docs.forEach(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) =>\r\n docs.push(doc)\r\n );\r\n const itemPromises = docs.map(\r\n async (item: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const itemData = item.data() as Record<string, unknown> | undefined;\r\n items.push({ id: item.id, ...(itemData ?? {}) } as Record<\r\n string,\r\n unknown\r\n > & { id: string });\r\n }\r\n );\r\n\r\n let lastDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n docs[docs.length - 1] || null;\r\n let firstDoc: firebase.firestore.QueryDocumentSnapshot<unknown> | null =\r\n docs[0];\r\n\r\n if (\r\n (items.length > params.batchSize && params.navigation === 'forward') ||\r\n (params.navigation === 'reload' && items.length > params.batchSize)\r\n ) {\r\n lastDoc = docs[docs.length - 2] || null;\r\n items.pop();\r\n hasNextPage = true;\r\n }\r\n if (items.length > params.batchSize && params.navigation === 'backward') {\r\n firstDoc = docs[1];\r\n items.shift();\r\n hasNextPage = true;\r\n }\r\n\r\n await Promise.all(itemPromises);\r\n return {\r\n items,\r\n filterLength,\r\n lastDoc,\r\n firstDoc,\r\n hasNextPage,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n\r\n // Fallback para garantir que sempre retornamos algo\r\n return {\r\n items: [],\r\n filterLength: null,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n currentClientPageIndex: undefined,\r\n };\r\n }\r\n\r\n applyFilters(\r\n query: firebase.firestore.Query<unknown>,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined\r\n ): firebase.firestore.Query<unknown> {\r\n if (conditions) {\r\n conditions.map((cond: Condition) => {\r\n query = query.where(\r\n cond.firestoreProperty,\r\n cond.operator,\r\n cond.dashProperty\r\n );\r\n });\r\n }\r\n\r\n let hasFilterSpecificOrderBy = false;\r\n let appliedOrderByField: string | null = null;\r\n\r\n const equalsFilters = arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n const otherFilters = arrange.filters.filter(\r\n (f): f is Arrange['filters'][0] => f.arrange !== 'equals'\r\n );\r\n\r\n const equalsGroupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, string[]>, current) => {\r\n const prop = current.filter!.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(current.filter!.filtering);\r\n return acc;\r\n },\r\n {} as Record<string, string[]>\r\n );\r\n\r\n for (const prop in equalsGroupedByProperty) {\r\n const values = equalsGroupedByProperty[prop];\r\n if (values.length > 0) {\r\n query = query.where(prop, 'in', values);\r\n }\r\n }\r\n\r\n otherFilters.forEach((filterItem: Arrange['filters'][0]) => {\r\n // Aplicar filtragem por busca\r\n if (\r\n filterItem.filter?.filtering &&\r\n filterItem.filter?.property !== '' &&\r\n filterItem.arrange === 'filter'\r\n ) {\r\n query = query\r\n .where(\r\n filterItem.filter.property,\r\n '>=',\r\n filterItem.filter.filtering.trim().toUpperCase()\r\n )\r\n .where(\r\n filterItem.filter.property,\r\n '<=',\r\n filterItem.filter.filtering.trim().toUpperCase() + '\\uf8ff'\r\n );\r\n if (!hasFilterSpecificOrderBy) {\r\n query = query.orderBy(filterItem.filter.property);\r\n hasFilterSpecificOrderBy = true;\r\n appliedOrderByField = filterItem.filter.property;\r\n }\r\n }\r\n\r\n // Aplicar filtro do tipo \"filterByDate\"\r\n if (filterItem.dateFilter && filterItem.arrange === 'filterByDate') {\r\n query = query\r\n .where(arrange.sortBy.field, '>=', filterItem.dateFilter.initial)\r\n .where(arrange.sortBy.field, '<=', filterItem.dateFilter.final);\r\n if (!hasFilterSpecificOrderBy) {\r\n query = query.orderBy(arrange.sortBy.field);\r\n hasFilterSpecificOrderBy = true;\r\n appliedOrderByField = arrange.sortBy.field;\r\n }\r\n }\r\n });\r\n\r\n // Aplicar sortBy\r\n if (arrange.sortBy && arrange.sortBy.field && arrange.sortBy.order) {\r\n if (appliedOrderByField !== arrange.sortBy.field) {\r\n query = query.orderBy(arrange.sortBy.field, arrange.sortBy.order);\r\n }\r\n }\r\n return query;\r\n }\r\n\r\n private getIdFilter(params: Pagination): string | null {\r\n if (!params.arrange?.filters) return null;\r\n\r\n const idFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'filter';\r\n filter: { property: string; filtering: string };\r\n } =>\r\n f.arrange === 'filter' &&\r\n !!f.filter &&\r\n f.filter.property === 'id' &&\r\n !!f.filter.filtering\r\n );\r\n\r\n return idFilter?.filter?.filtering?.trim() || null;\r\n }\r\n\r\n private async getDocumentById(\r\n collection: string,\r\n docId: string\r\n ): Promise<(Record<string, unknown> & { id: string }) | null> {\r\n try {\r\n const docRef = this.ngFire.collection(collection).doc(docId);\r\n const docSnapshot = await docRef.get().toPromise();\r\n\r\n if (docSnapshot && docSnapshot.exists) {\r\n const data = docSnapshot.data() as Record<string, unknown> | undefined;\r\n return {\r\n id: docSnapshot.id,\r\n ...(data ?? {}),\r\n } as Record<string, unknown> & { id: string };\r\n }\r\n return null;\r\n } catch (error) {\r\n console.warn('Erro ao buscar documento por ID:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private async searchByIdPartial(\r\n params: Pagination,\r\n searchTerm: string\r\n ): Promise<PaginationResult> {\r\n const exactMatch = await this.getDocumentById(\r\n params.collection,\r\n searchTerm\r\n );\r\n\r\n if (exactMatch) {\r\n if (params.conditions) {\r\n const operators = this.operators;\r\n const passesConditions = params.conditions.every((cond) => {\r\n const operatorFn = operators[cond.operator as keyof typeof operators];\r\n return operatorFn\r\n ? operatorFn(exactMatch[cond.firestoreProperty], cond.dashProperty)\r\n : false;\r\n });\r\n\r\n if (!passesConditions) {\r\n return {\r\n items: [],\r\n filterLength: 0,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: 0,\r\n totalPages: 0,\r\n };\r\n }\r\n }\r\n\r\n if (params.filterFn && !params.filterFn(exactMatch)) {\r\n return {\r\n items: [],\r\n filterLength: 0,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: 0,\r\n totalPages: 0,\r\n };\r\n }\r\n\r\n return {\r\n items: [exactMatch],\r\n filterLength: 1,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage: false,\r\n hasPreviousPage: false,\r\n currentClientPageIndex: 0,\r\n totalPages: 1,\r\n };\r\n }\r\n\r\n const searchTermLower = searchTerm.toLowerCase();\r\n\r\n const paramsWithoutIdFilter = {\r\n ...params,\r\n arrange: {\r\n ...params.arrange,\r\n filters: params.arrange.filters.filter(\r\n (f) => !(f.arrange === 'filter' && f.filter?.property === 'id')\r\n ),\r\n },\r\n };\r\n\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n // Aplicar conditions\r\n if (params.conditions) {\r\n params.conditions.forEach((cond) => {\r\n query = query.where(\r\n cond.firestoreProperty,\r\n cond.operator,\r\n cond.dashProperty\r\n );\r\n });\r\n }\r\n\r\n // Aplicar sortBy\r\n if (params.arrange?.sortBy?.field && params.arrange?.sortBy?.order) {\r\n query = query.orderBy(\r\n params.arrange.sortBy.field,\r\n params.arrange.sortBy.order\r\n );\r\n }\r\n\r\n const snapshot = await query.get();\r\n let items: Array<Record<string, unknown> & { id: string }> = snapshot.docs\r\n .map((doc) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<string, unknown> & {\r\n id: string;\r\n };\r\n })\r\n .filter((item) => item.id.toLowerCase().includes(searchTermLower));\r\n\r\n // Separar equals filters e outros filtros\r\n const equalsFilters = paramsWithoutIdFilter.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n const otherFilters = paramsWithoutIdFilter.arrange.filters.filter(\r\n (f): f is Arrange['filters'][0] =>\r\n f.arrange !== 'equals' &&\r\n (f.arrange !== 'filter' || f.filter?.property !== 'id')\r\n );\r\n\r\n // Aplicar equals filters com lógica OR dentro de cada propriedade\r\n if (equalsFilters.length > 0) {\r\n // Agrupar por propriedade para aplicar OR\r\n const groupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, (string | boolean)[]>, f) => {\r\n const prop = f.filter.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(f.filter.filtering);\r\n return acc;\r\n },\r\n {} as Record<string, (string | boolean)[]>\r\n );\r\n\r\n // Filtrar: item deve ter pelo menos um valor de CADA propriedade\r\n items = items.filter((item) => {\r\n return Object.entries(groupedByProperty).every(([prop, values]) => {\r\n const itemValue = item[prop];\r\n return values.includes(itemValue as string | boolean);\r\n });\r\n });\r\n }\r\n\r\n // Aplicar outros filtros\r\n otherFilters.forEach((filterItem) => {\r\n if (\r\n filterItem.arrange === 'filter' &&\r\n filterItem.filter?.filtering &&\r\n filterItem.filter?.property\r\n ) {\r\n const filterValue = String(filterItem.filter.filtering)\r\n .trim()\r\n .toLowerCase();\r\n items = items.filter((item) => {\r\n const itemValue = String(\r\n item[filterItem.filter!.property] ?? ''\r\n ).toLowerCase();\r\n return itemValue.includes(filterValue);\r\n });\r\n }\r\n });\r\n\r\n // Aplicar filterFn se existir\r\n if (params.filterFn) {\r\n items = items.filter(params.filterFn);\r\n }\r\n\r\n // Paginação\r\n const pageSize = params.batchSize;\r\n let currentClientPageIndex = 0;\r\n\r\n if (params.navigation === 'reload') {\r\n currentClientPageIndex = 0;\r\n } else {\r\n // Usar o índice passado pelo componente sem incrementar/decrementar\r\n currentClientPageIndex = params.clientPageIndex || 0;\r\n }\r\n\r\n const startIndex = currentClientPageIndex * pageSize;\r\n const endIndex = startIndex + pageSize;\r\n const paginatedItems = items.slice(startIndex, endIndex);\r\n\r\n const totalPages = Math.ceil(items.length / pageSize);\r\n const hasNextPage = currentClientPageIndex < totalPages - 1;\r\n const hasPreviousPage = currentClientPageIndex > 0;\r\n\r\n return {\r\n items: paginatedItems,\r\n filterLength: items.length,\r\n firstDoc: null,\r\n lastDoc: null,\r\n hasNextPage,\r\n hasPreviousPage,\r\n currentClientPageIndex,\r\n totalPages,\r\n };\r\n }\r\n\r\n private shouldUseClientSideFallback(params: Pagination): boolean {\r\n const hasConditions = params.conditions && params.conditions.length > 0;\r\n const hasArrangeFilters =\r\n params.arrange?.filters && params.arrange.filters.length > 0;\r\n const hasSortBy = params.arrange?.sortBy?.field;\r\n\r\n if (params.filterFn) {\r\n return false;\r\n }\r\n\r\n if (hasArrangeFilters) {\r\n const equalsFilters = params.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n\r\n if (equalsFilters.length > 0) {\r\n const propertiesSet = new Set(\r\n equalsFilters.map((f) => f.filter.property)\r\n );\r\n\r\n if (propertiesSet.size > 1) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n if (hasConditions && hasArrangeFilters && hasSortBy) {\r\n return true;\r\n }\r\n\r\n if (hasConditions && hasArrangeFilters) {\r\n return true;\r\n }\r\n\r\n if (hasArrangeFilters && params.arrange.filters.length > 1 && hasSortBy) {\r\n const equalsFilters = params.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n\r\n if (equalsFilters.length > 0) {\r\n const propertiesSet = new Set(\r\n equalsFilters.map((f) => f.filter.property)\r\n );\r\n if (\r\n propertiesSet.size === 1 &&\r\n equalsFilters.length === params.arrange.filters.length\r\n ) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n async getPaginated(params: Pagination): Promise<PaginationResult> {\r\n const idFilterValue = this.getIdFilter(params);\r\n if (idFilterValue) {\r\n const result = await this.searchByIdPartial(params, idFilterValue);\r\n return result;\r\n }\r\n\r\n // Detectar preventivamente se deve usar fallback\r\n if (this.shouldUseClientSideFallback(params)) {\r\n await this.trackMissingIndexPreventive(\r\n params.collection,\r\n params.arrange,\r\n params.conditions\r\n );\r\n\r\n const result = await this.executeClientSideQuery(params);\r\n return result;\r\n }\r\n\r\n try {\r\n const result = await this.executeQuery(params);\r\n return result;\r\n } catch (error: unknown) {\r\n if (\r\n error &&\r\n typeof error === 'object' &&\r\n 'code' in error &&\r\n (error as ErrorWithCode).code === 'failed-precondition'\r\n ) {\r\n await this.trackMissingIndex(\r\n error,\r\n params.collection,\r\n params.arrange,\r\n params.conditions\r\n );\r\n\r\n const result = await this.executeClientSideQuery(params);\r\n return result;\r\n } else if (\r\n error &&\r\n typeof error === 'object' &&\r\n 'code' in error &&\r\n (error as ErrorWithCode).code === 'invalid-argument'\r\n ) {\r\n await this.trackMissingIndex(\r\n error,\r\n params.collection,\r\n params.arrange,\r\n params.conditions\r\n );\r\n\r\n const result = await this.executeClientSideQuery(params);\r\n return result;\r\n } else {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n async executeClientSideQuery(params: Pagination): Promise<PaginationResult> {\r\n // Otimizar usando pelo menos uma cláusula .where() quando possível\r\n let query: firebase.firestore.Query<unknown> = this.ngFire.collection(\r\n params.collection\r\n ).ref;\r\n\r\n let appliedCondition: Condition | null = null;\r\n let hasAppliedWhereClause = false;\r\n\r\n // Primeiro, tenta aplicar condições simples\r\n if (params.conditions && params.conditions.length > 0) {\r\n const simpleCondition = params.conditions.find((cond: Condition) =>\r\n ['==', '>', '<', '>=', '<=', 'in', 'array-contains'].includes(\r\n cond.operator\r\n )\r\n );\r\n\r\n if (simpleCondition) {\r\n query = query.where(\r\n simpleCondition.firestoreProperty,\r\n simpleCondition.operator,\r\n simpleCondition.dashProperty\r\n );\r\n appliedCondition = simpleCondition;\r\n hasAppliedWhereClause = true;\r\n }\r\n }\r\n\r\n // Se não há condições disponíveis, tenta aplicar filtros do arrange\r\n let appliedFirestoreFilter: Arrange['filters'][0] | 'all-equals' | null =\r\n null;\r\n if (!hasAppliedWhereClause && params.arrange?.filters) {\r\n // Agrupar equals filters por propriedade\r\n const equalsFilters = params.arrange.filters.filter(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter\r\n );\r\n\r\n const equalsGroupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, (string | boolean)[]>, current) => {\r\n const prop = current.filter.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(current.filter.filtering);\r\n return acc;\r\n },\r\n {} as Record<string, (string | boolean)[]>\r\n );\r\n\r\n // Se há apenas UMA propriedade com múltiplos valores, aplicar no Firestore com 'in'\r\n const properties = Object.keys(equalsGroupedByProperty);\r\n if (properties.length === 1 && equalsFilters.length > 0) {\r\n const prop = properties[0];\r\n const values = equalsGroupedByProperty[prop];\r\n query = query.where(prop, 'in', values);\r\n hasAppliedWhereClause = true;\r\n // Marcar TODOS os equals filters dessa propriedade como aplicados\r\n appliedFirestoreFilter = 'all-equals';\r\n } else if (properties.length === 0) {\r\n const otherFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] &\r\n (\r\n | {\r\n arrange: 'filter';\r\n filter: { property: string; filtering: string };\r\n }\r\n | {\r\n arrange: 'filterByDate';\r\n dateFilter: { initial: Date; final: Date };\r\n }\r\n ) =>\r\n (f.arrange === 'filter' &&\r\n !!f.filter?.filtering &&\r\n !!f.filter?.property) ||\r\n (f.arrange === 'filterByDate' &&\r\n !!f.dateFilter?.initial &&\r\n !!f.dateFilter?.final)\r\n );\r\n\r\n if (otherFilter) {\r\n if (otherFilter.arrange === 'filter' && otherFilter.filter) {\r\n const filterValue = otherFilter.filter.filtering\r\n .trim()\r\n .toUpperCase();\r\n query = query\r\n .where(otherFilter.filter.property, '>=', filterValue)\r\n .where(otherFilter.filter.property, '<=', filterValue + '\\uf8ff');\r\n hasAppliedWhereClause = true;\r\n appliedFirestoreFilter = otherFilter;\r\n } else if (\r\n otherFilter.arrange === 'filterByDate' &&\r\n otherFilter.dateFilter &&\r\n params.arrange.sortBy?.field\r\n ) {\r\n query = query\r\n .where(\r\n params.arrange.sortBy.field,\r\n '>=',\r\n otherFilter.dateFilter.initial\r\n )\r\n .where(\r\n params.arrange.sortBy.field,\r\n '<=',\r\n otherFilter.dateFilter.final\r\n );\r\n hasAppliedWhereClause = true;\r\n appliedFirestoreFilter = otherFilter;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const allDocsSnapshot = await query.get();\r\n let items: Array<Record<string, unknown> & { id: string }> =\r\n allDocsSnapshot.docs.map(\r\n (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n return { id: doc.id, ...(data ?? {}) } as Record<string, unknown> & {\r\n id: string;\r\n };\r\n }\r\n );\r\n\r\n // Aplicar condições restantes\r\n if (params.conditions) {\r\n const remainingConditions = params.conditions.filter(\r\n (cond: Condition) => cond !== appliedCondition\r\n );\r\n if (remainingConditions.length > 0) {\r\n const operators = this.operators;\r\n items = items.filter((item) => {\r\n return remainingConditions.every((cond: Condition) => {\r\n const operatorFn =\r\n operators[cond.operator as keyof typeof operators];\r\n return operatorFn\r\n ? operatorFn(item[cond.firestoreProperty], cond.dashProperty)\r\n : false;\r\n });\r\n });\r\n }\r\n }\r\n\r\n const { filters, sortBy } = params.arrange;\r\n\r\n // Track which filter was already applied in Firestore to avoid double filtering\r\n if (hasAppliedWhereClause && !appliedCondition && params.arrange?.filters) {\r\n const equalsFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] & {\r\n arrange: 'equals';\r\n filter: { property: string; filtering: string };\r\n } => f.arrange === 'equals' && !!f.filter?.filtering\r\n );\r\n if (equalsFilter) {\r\n appliedFirestoreFilter = equalsFilter;\r\n } else {\r\n const foundFilter = params.arrange.filters.find(\r\n (\r\n f\r\n ): f is Arrange['filters'][0] &\r\n (\r\n | {\r\n arrange: 'filter';\r\n filter: { property: string; filtering: string };\r\n }\r\n | {\r\n arrange: 'filterByDate';\r\n dateFilter: { initial: Date; final: Date };\r\n }\r\n ) =>\r\n (f.arrange === 'filter' &&\r\n !!f.filter?.filtering &&\r\n !!f.filter?.property) ||\r\n (f.arrange === 'filterByDate' &&\r\n !!f.dateFilter?.initial &&\r\n !!f.dateFilter?.final)\r\n );\r\n if (foundFilter) {\r\n appliedFirestoreFilter = foundFilter;\r\n }\r\n }\r\n }\r\n\r\n const equalsFilters = filters.filter(\r\n (f): f is Arrange['filters'][0] & { arrange: 'equals' } =>\r\n f.arrange === 'equals'\r\n );\r\n const otherFilters = filters.filter(\r\n (f): f is Arrange['filters'][0] => f.arrange !== 'equals'\r\n );\r\n\r\n // Aplicar equals filters no client-side apenas se não foram aplicados no Firestore\r\n if (appliedFirestoreFilter !== 'all-equals' && equalsFilters.length > 0) {\r\n // Agrupar por propriedade para aplicar OR dentro de cada propriedade\r\n const groupedByProperty = equalsFilters.reduce(\r\n (acc: Record<string, (string | boolean)[]>, f) => {\r\n if (f.filter) {\r\n const prop = f.filter.property;\r\n if (!acc[prop]) {\r\n acc[prop] = [];\r\n }\r\n acc[prop].push(f.filter.filtering);\r\n }\r\n return acc;\r\n },\r\n {} as Record<string, (string | boolean)[]>\r\n );\r\n\r\n // Filtrar: item deve ter pelo menos um valor de CADA propriedade\r\n // (AND entre propriedades, OR dentro de cada propriedade)\r\n items = items.filter((item) => {\r\n return Object.entries(groupedByProperty).every(([prop, values]) => {\r\n const itemValue = item[prop];\r\n return values.includes(itemValue as string | boolean);\r\n });\r\n });\r\n }\r\n\r\n otherFilters.forEach((filterItem) => {\r\n if (appliedFirestoreFilter === filterItem) {\r\n return;\r\n }\r\n\r\n if (\r\n filterItem.arrange === 'filter' &&\r\n filterItem.filter?.filtering &&\r\n filterItem.filter?.property\r\n ) {\r\n const filterValue = String(filterItem.filter.filtering)\r\n .trim()\r\n .toLowerCase();\r\n items = items.filter((item) => {\r\n const itemValue = String(\r\n item[filterItem.filter!.property] ?? ''\r\n ).toLowerCase();\r\n return itemValue.includes(filterValue);\r\n });\r\n }\r\n\r\n if (\r\n filterItem.arrange === 'filterByDate' &&\r\n filterItem.dateFilter?.initial &&\r\n filterItem.dateFilter?.final &&\r\n sortBy.field\r\n ) {\r\n items = items.filter((item) => {\r\n try {\r\n const fieldValue = item[sortBy.field];\r\n\r\n if (!fieldValue) {\r\n return false;\r\n }\r\n\r\n let itemDate: Date;\r\n const fieldValueObj = fieldValue as\r\n | { toDate?: () => Date }\r\n | Date\r\n | string\r\n | number\r\n | null\r\n | undefined;\r\n if (\r\n fieldValueObj &&\r\n typeof fieldValueObj === 'object' &&\r\n 'toDate' in fieldValueObj &&\r\n typeof fieldValueObj.toDate === 'function'\r\n ) {\r\n itemDate = fieldValueObj.toDate();\r\n } else if (fieldValueObj instanceof Date) {\r\n itemDate = fieldValueObj;\r\n } else if (typeof fieldValueObj === 'string') {\r\n itemDate = new Date(fieldValueObj);\r\n if (isNaN(itemDate.getTime())) {\r\n return false;\r\n }\r\n } else if (typeof fieldValueObj === 'number') {\r\n itemDate = new Date(fieldValueObj);\r\n } else {\r\n return false;\r\n }\r\n\r\n if (!filterItem.dateFilter) {\r\n return false;\r\n }\r\n\r\n return (\r\n itemDate >= filterItem.dateFilter.initial &&\r\n itemDate <= filterItem.dateFilter.final\r\n );\r\n } catch (error) {\r\n console.warn(\r\n 'Erro ao processar filtro de data para o item:',\r\n item.id,\r\n error\r\n );\r\n return false;\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Aplicar filterFn se existir\r\n if (params.filterFn) {\r\n items = items.filter(params.filterFn);\r\n }\r\n\r\n if (sortBy && sortBy.field && sortBy.order) {\r\n items.sort((a, b) => {\r\n const valA = a[sortBy.field] as unknown;\r\n const valB = b[sortBy.field] as unknown;\r\n\r\n if (valA === null || valA === undefined) return 1;\r\n if (valB === null || valB === undefined) return -1;\r\n\r\n if (valA < valB) {\r\n return sortBy.order === 'asc' ? -1 : 1;\r\n }\r\n if (valA > valB) {\r\n return sortBy.order === 'asc' ? 1 : -1;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n // Implementação adequada da paginação\r\n let currentClientPageIndex = 0;\r\n\r\n // Determinar a página atual baseada na navegação\r\n if (params.navigation === 'reload') {\r\n currentClientPageIndex = 0;\r\n } else {\r\n currentClientPageIndex = params.clientPageIndex || 0;\r\n }\r\n\r\n const pageSize = params.batchSize;\r\n const startIndex = currentClientPageIndex * pageSize;\r\n const endIndex = startIndex + pageSize;\r\n const paginatedItems = items.slice(startIndex, endIndex);\r\n\r\n const totalPages = Math.ceil(items.length / pageSize);\r\n const hasNextPage = currentClientPageIndex < totalPages - 1;\r\n const hasPreviousPage = currentClientPageIndex > 0;\r\n\r\n return {\r\n items: paginatedItems,\r\n filterLength: items.length,\r\n lastDoc: null,\r\n firstDoc: null,\r\n hasNextPage: hasNextPage,\r\n hasPreviousPage: hasPreviousPage,\r\n currentClientPageIndex: currentClientPageIndex,\r\n totalPages: totalPages,\r\n };\r\n }\r\n\r\n async getItemsData(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): Promise<Array<Record<string, unknown> & { id: string }>> {\r\n try {\r\n let query: firebase.firestore.Query<unknown> =\r\n this.ngFire.collection(collection).ref;\r\n\r\n query = this.applyFilters(query, arrange, conditions);\r\n const snapshot = await query.get();\r\n return await Promise.all(\r\n snapshot.docs.map(\r\n async (doc: firebase.firestore.QueryDocumentSnapshot<unknown>) => {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n const id = doc.id;\r\n return {\r\n id,\r\n ...(data ?? {}),\r\n } as Record<string, unknown> & { id: string };\r\n }\r\n )\r\n );\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n public operators = {\r\n '==': (a: unknown, b: unknown): boolean => a === b,\r\n '!=': (a: unknown, b: unknown): boolean => a !== b,\r\n '>': (a: unknown, b: unknown): boolean => (a as number) > (b as number),\r\n '<': (a: unknown, b: unknown): boolean => (a as number) < (b as number),\r\n '>=': (a: unknown, b: unknown): boolean => (a as number) >= (b as number),\r\n '<=': (a: unknown, b: unknown): boolean => (a as number) <= (b as number),\r\n in: (a: unknown, b: unknown): boolean => Array.isArray(b) && b.includes(a),\r\n 'not-in': (a: unknown, b: unknown): boolean =>\r\n Array.isArray(b) && !b.includes(a),\r\n 'array-contains': (a: unknown, b: unknown): boolean =>\r\n Array.isArray(a) && a.includes(b),\r\n 'array-contains-any': (a: unknown, b: unknown): boolean =>\r\n Array.isArray(a) &&\r\n Array.isArray(b) &&\r\n b.some((item: unknown) => a.includes(item)),\r\n includes: (a: unknown, b: unknown): boolean => {\r\n if (typeof a === 'string' && typeof b === 'string') {\r\n return a.includes(b);\r\n }\r\n if (Array.isArray(a)) {\r\n return a.includes(b);\r\n }\r\n return false;\r\n },\r\n };\r\n\r\n async deleteIndex(id: string, col: string): Promise<boolean> {\r\n try {\r\n const batch = this.ngFire.firestore.batch();\r\n\r\n const docRef = this.ngFire.collection(col).doc(id);\r\n const docSnapshot = (await firstValueFrom(\r\n docRef.get()\r\n )) as firebase.firestore.DocumentSnapshot<unknown>;\r\n const doc = docSnapshot.data() as Record<string, unknown> | undefined;\r\n batch.delete(docRef.ref);\r\n if (doc && typeof doc['index'] === 'number') {\r\n await this.reindex(doc['index'] as number, col, batch);\r\n }\r\n await batch.commit();\r\n\r\n this.toastr.success('Item excluído com sucesso!');\r\n return true;\r\n } catch (e) {\r\n const error = e as unknown;\r\n console.error('Erro ao deletar item:', error);\r\n this.toastr.error('Erro ao deletar item.');\r\n return false;\r\n }\r\n }\r\n\r\n async reindex(\r\n index: number,\r\n col: string,\r\n batch: firebase.firestore.WriteBatch\r\n ): Promise<void> {\r\n try {\r\n const snapshot = (await firstValueFrom(\r\n this.ngFire.collection(col).get()\r\n )) as firebase.firestore.QuerySnapshot<unknown>;\r\n const docs = snapshot.docs;\r\n for (let doc of docs) {\r\n const data = doc.data() as Record<string, unknown> | undefined;\r\n if (\r\n data &&\r\n typeof data['index'] === 'number' &&\r\n (data['index'] as number) > index\r\n ) {\r\n data['index'] = ((data['index'] as number) - 1) as unknown;\r\n const docRef = this.ngFire.collection(col).doc(doc.id).ref;\r\n batch.update(docRef, data);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Erro ao reindexar:', error);\r\n }\r\n return;\r\n }\r\n\r\n dateFormatValidator(): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: unknown } | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n const dateStr = control.value.trim();\r\n const datePattern = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/;\r\n\r\n if (!datePattern.test(dateStr)) {\r\n return { invalidFormat: true };\r\n }\r\n\r\n const parts = dateStr.split('/');\r\n const day = parts[0].padStart(2, '0');\r\n const month = parts[1].padStart(2, '0');\r\n const year = parts[2];\r\n const normalizedDate = `${day}/${month}/${year}`;\r\n\r\n const date = moment(normalizedDate, 'DD/MM/YYYY', true);\r\n\r\n if (!date.isValid()) {\r\n return { invalidDate: true };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n async updateIndex(index: number, id: string, col: string): Promise<void> {\r\n await this.ngFire.collection(col).doc(id).update({ index });\r\n }\r\n\r\n /**\r\n * Extrai o link de criação de índice da mensagem de erro do Firestore\r\n */\r\n private extractIndexLink(error: unknown): string | null {\r\n if (\r\n !error ||\r\n typeof error !== 'object' ||\r\n !('message' in error) ||\r\n typeof (error as ErrorWithMessage).message !== 'string'\r\n )\r\n return null;\r\n\r\n const linkMatch = (error as ErrorWithMessage).message.match(\r\n /(https:\\/\\/console\\.firebase\\.google\\.com\\/[^\\s]+)/\r\n );\r\n return linkMatch ? linkMatch[1] : null;\r\n }\r\n\r\n /**\r\n * Rastreia índices ausentes ao usar fallback preventivo\r\n */\r\n private async trackMissingIndexPreventive(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): Promise<void> {\r\n try {\r\n const querySignature = this.generateQuerySignature(\r\n collection,\r\n arrange,\r\n conditions\r\n );\r\n const docId = `${collection}_${querySignature}`;\r\n\r\n const indexLink = this.generateIndexLink(collection, arrange, conditions);\r\n\r\n const indexInstructions = this.generateIndexInstructions(\r\n collection,\r\n arrange,\r\n conditions\r\n );\r\n\r\n const trackingData: Record<string, unknown> = {\r\n collection,\r\n indexLink,\r\n indexInstructions,\r\n arrange: {\r\n sortBy: arrange.sortBy,\r\n filters:\r\n arrange.filters?.map((f) => ({\r\n arrange: f.arrange,\r\n property: f.filter?.property || null,\r\n dateField:\r\n f.arrange === 'filterByDate' ? arrange.sortBy?.field : null,\r\n })) || [],\r\n },\r\n conditions:\r\n conditions?.map((c: Condition) => ({\r\n property: c.firestoreProperty,\r\n operator: c.operator,\r\n })) || [],\r\n errorMessage: `Fallback preventivo usado para a collection ${collection}. A query exigiria índice composto.`,\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n };\r\n\r\n const docRef = this.ngFire.collection('missingIndexes').doc(docId);\r\n const doc = await docRef.get().toPromise();\r\n\r\n if (doc && doc.exists) {\r\n await docRef.update({\r\n count: firebase.firestore.FieldValue.increment(1),\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n lastError: trackingData['errorMessage'],\r\n });\r\n } else {\r\n await docRef.set({\r\n ...trackingData,\r\n count: 1,\r\n createdAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n });\r\n }\r\n } catch (trackingError) {\r\n console.warn('Falha ao rastrear fallback preventivo:', trackingError);\r\n }\r\n }\r\n\r\n /**\r\n * Gera uma assinatura única para uma query\r\n */\r\n private generateQuerySignature(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): string {\r\n const signature = {\r\n collection,\r\n sortBy: arrange.sortBy,\r\n filters:\r\n arrange.filters?.map((f: Arrange['filters'][0]) => ({\r\n arrange: f.arrange,\r\n property: f.filter?.property || null,\r\n })) || [],\r\n conditions:\r\n conditions?.map((c: Condition) => ({\r\n property: c.firestoreProperty,\r\n operator: c.operator,\r\n })) || [],\r\n };\r\n\r\n return btoa(JSON.stringify(signature))\r\n .replace(/[^a-zA-Z0-9]/g, '')\r\n .substring(0, 20);\r\n }\r\n\r\n /**\r\n * Gera instruções claras para criar o índice manualmente\r\n */\r\n private generateIndexInstructions(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): {\r\n summary: string;\r\n collection: string;\r\n fields: Array<{\r\n field: string;\r\n order: string;\r\n type: string;\r\n operator: string;\r\n description: string;\r\n }>;\r\n queryExample: string;\r\n stepByStep: string[];\r\n notes: string[];\r\n } {\r\n const instructions: {\r\n summary: string;\r\n collection: string;\r\n fields: Array<{\r\n field: string;\r\n order: string;\r\n type: string;\r\n operator: string;\r\n description: string;\r\n }>;\r\n queryExample: string;\r\n stepByStep: string[];\r\n notes: string[];\r\n } = {\r\n summary: '',\r\n collection: collection,\r\n fields: [],\r\n queryExample: '',\r\n stepByStep: [],\r\n notes: [],\r\n };\r\n\r\n const fields: Array<{\r\n field: string;\r\n order: string;\r\n type: string;\r\n operator: string;\r\n description: string;\r\n }> = [];\r\n\r\n if (conditions && conditions.length > 0) {\r\n conditions.forEach((condition: Condition) => {\r\n if (condition.firestoreProperty) {\r\n fields.push({\r\n field: condition.firestoreProperty,\r\n order: 'Ascending',\r\n type: 'WHERE clause',\r\n operator: condition.operator,\r\n description: `Filtrar por ${condition.firestoreProperty} usando operador ${condition.operator}`,\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (arrange.filters && arrange.filters.length > 0) {\r\n arrange.filters.forEach((filter) => {\r\n if (filter.filter?.property) {\r\n fields.push({\r\n field: filter.filter.property,\r\n order: 'Ascending',\r\n type: 'WHERE clause (filter)',\r\n operator: filter.arrange === 'filter' ? 'CONTAINS' : 'RANGE',\r\n description: `Filtrar por ${filter.filter.property} usando filtro ${filter.arrange}`,\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (arrange.sortBy?.field) {\r\n fields.push({\r\n field: arrange.sortBy.field,\r\n order: arrange.sortBy.order === 'desc' ? 'Descending' : 'Ascending',\r\n type: 'ORDER BY clause',\r\n operator: 'N/A',\r\n description: `Ordenar resultados por ${arrange.sortBy.field} em ordem ${arrange.sortBy.order}`,\r\n });\r\n }\r\n\r\n instructions.fields = fields;\r\n\r\n const fieldNames = fields.map((f) => f.field).join(' + ');\r\n instructions.summary = `Criar índice composto para ${collection}: ${fieldNames}`;\r\n\r\n let queryExample = `db.collection('${collection}')`;\r\n\r\n fields.forEach((field, index: number) => {\r\n if (field.type.includes('WHERE')) {\r\n if (field.operator === '==') {\r\n queryExample += `\\n .where('${field.field}', '==', 'value')`;\r\n } else if (field.operator === 'CONTAINS') {\r\n queryExample += `\\n .where('${field.field}', '>=', 'searchText')`;\r\n } else {\r\n queryExample += `\\n .where('${field.field}', '${field.operator}', 'value')`;\r\n }\r\n }\r\n });\r\n\r\n const orderByField = fields.find((f) => f.type.includes('ORDER BY'));\r\n if (orderByField) {\r\n queryExample += `\\n .orderBy('${\r\n orderByField.field\r\n }', '${orderByField.order.toLowerCase()}')`;\r\n }\r\n\r\n instructions.queryExample = queryExample;\r\n\r\n instructions.stepByStep = [\r\n '1. Ir para Firebase Console → Firestore → Indexes',\r\n '2. Clicar em \"Create Index\"',\r\n `3. Definir Collection ID: ${collection}`,\r\n '4. Configurar campos nesta ORDEM EXATA:',\r\n ...fields.map(\r\n (field, index: number) =>\r\n ` ${index + 1}. Campo: ${field.field}, Order: ${\r\n field.order\r\n }, Array: No`\r\n ),\r\n '5. Definir Query scopes: Collection',\r\n '6. Clicar em \"Create\" e aguardar conclusão',\r\n ];\r\n\r\n instructions.notes = [\r\n '⚠️ A ordem dos campos é CRÍTICA - deve corresponder exatamente à ordem da query',\r\n '⚠️ As cláusulas WHERE devem vir ANTES do campo ORDER BY',\r\n '⚠️ Este índice só funcionará para queries com esta combinação EXATA de campos',\r\n '⚠️ A criação do índice pode levar vários minutos',\r\n ];\r\n\r\n return instructions;\r\n }\r\n\r\n /**\r\n * Gera um link de índice baseado na estrutura da query\r\n */\r\n private generateIndexLink(\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): string | null {\r\n try {\r\n const indexFields: string[] = [];\r\n\r\n if (conditions && conditions.length > 0) {\r\n conditions.forEach((condition: Condition) => {\r\n if (condition.firestoreProperty) {\r\n indexFields.push(condition.firestoreProperty);\r\n }\r\n });\r\n }\r\n\r\n if (arrange.filters && arrange.filters.length > 0) {\r\n arrange.filters.forEach((filter: Arrange['filters'][0]) => {\r\n if (filter.filter?.property) {\r\n indexFields.push(filter.filter.property);\r\n }\r\n });\r\n }\r\n\r\n if (arrange.sortBy?.field) {\r\n indexFields.push(arrange.sortBy.field);\r\n }\r\n\r\n if (indexFields.length > 1) {\r\n // Obter o projectId dinamicamente do Firebase\r\n const options = this.ngFire?.firestore?.app?.options as\r\n | Record<string, unknown>\r\n | undefined;\r\n const projectId = options?.['projectId'] as string | undefined;\r\n\r\n if (!projectId) {\r\n console.warn('Não foi possível obter o projectId do Firebase');\r\n return null;\r\n }\r\n\r\n const baseUrl = `https://console.firebase.google.com/project/${projectId}/firestore/indexes`;\r\n const queryParams = new URLSearchParams({\r\n create_composite: `collection=${collection}&fields=${indexFields.join(\r\n ','\r\n )}`,\r\n });\r\n\r\n const finalLink = `${baseUrl}?${queryParams.toString()}`;\r\n return finalLink;\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n console.warn('Falha ao gerar link de índice:', error);\r\n return null;\r\n }\r\n }\r\n\r\n private async trackMissingIndex(\r\n error: unknown,\r\n collection: string,\r\n arrange: Arrange,\r\n conditions: Condition[] | undefined = undefined\r\n ): Promise<void> {\r\n try {\r\n const indexLink = this.extractIndexLink(error);\r\n if (!indexLink) return;\r\n\r\n const linkHash = btoa(indexLink)\r\n .replace(/[^a-zA-Z0-9]/g, '')\r\n .substring(0, 20);\r\n const docId = `${collection}_${linkHash}`;\r\n\r\n const indexInstructions = this.generateIndexInstructions(\r\n collection,\r\n arrange,\r\n conditions\r\n );\r\n\r\n const trackingData: Record<string, unknown> = {\r\n collection,\r\n indexLink,\r\n indexInstructions,\r\n arrange: {\r\n sortBy: arrange.sortBy,\r\n filters:\r\n arrange.filters?.map((f) => ({\r\n arrange: f.arrange,\r\n property: f.filter?.property || null,\r\n dateField:\r\n f.arrange === 'filterByDate' ? arrange.sortBy?.field : null,\r\n })) || [],\r\n },\r\n conditions:\r\n conditions?.map((c: Condition) => ({\r\n property: c.firestoreProperty,\r\n operator: c.operator,\r\n })) || [],\r\n errorMessage:\r\n error &&\r\n typeof error === 'object' &&\r\n 'message' in error &&\r\n typeof (error as ErrorWithMessage).message === 'string'\r\n ? (error as ErrorWithMessage).message\r\n : String(error),\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n };\r\n\r\n const docRef = this.ngFire.collection('missingIndexes').doc(docId);\r\n const doc = await docRef.get().toPromise();\r\n\r\n const errorMessage =\r\n error &&\r\n typeof error === 'object' &&\r\n 'message' in error &&\r\n typeof (error as ErrorWithMessage).message === 'string'\r\n ? (error as ErrorWithMessage).message\r\n : String(error);\r\n\r\n if (doc && doc.exists) {\r\n await docRef.update({\r\n count: firebase.firestore.FieldValue.increment(1),\r\n updatedAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n lastError: errorMessage,\r\n });\r\n } else {\r\n await docRef.set({\r\n ...trackingData,\r\n count: 1,\r\n createdAt: firebase.firestore.FieldValue.serverTimestamp(),\r\n });\r\n }\r\n } catch (trackingError) {\r\n console.warn('Falha ao rastrear índice ausente:', trackingError);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormArray, FormControl, FormGroup } from '@angular/forms';\r\nimport { Arrange, Column, TABLE_DEFAULTS } from '../types/Table';\r\nimport { TableService } from './table.service';\r\nimport { OrderByDirection } from 'firebase/firestore';\r\n\r\nexport interface FilterConfig {\r\n selectFilter: any;\r\n typeFilter?: string;\r\n selectItem?: any[];\r\n initialDate?: string;\r\n finalDate?: string;\r\n}\r\n\r\nexport interface DateFiltersByProperty {\r\n [property: string]: Array<{ initial: Date; final: Date }>;\r\n}\r\n\r\nexport interface ProcessedFilter {\r\n group: FormGroup;\r\n selectedFilter: any;\r\n arrange: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FilterService {\r\n constructor(private tableService: TableService) {}\r\n\r\n /**\r\n * Cria um novo FormGroup para um filtro\r\n */\r\n createFilterGroup(): FormGroup {\r\n const dateValidator = this.tableService.dateFormatValidator();\r\n\r\n return new FormGroup({\r\n selectFilter: new FormControl(''),\r\n typeFilter: new FormControl(''),\r\n selectItem: new FormControl(''),\r\n initialDate: new FormControl('', [dateValidator]),\r\n finalDate: new FormControl('', [dateValidator]),\r\n });\r\n }\r\n\r\n /**\r\n * Adiciona um novo filtro ao FormArray\r\n */\r\n addFilter(\r\n filtersForm: FormArray,\r\n isPaginated: boolean,\r\n filterData?: FilterConfig\r\n ): void {\r\n if (\r\n isPaginated &&\r\n this.hasActiveDateFilter(filtersForm) &&\r\n filterData?.selectFilter?.arrange === 'filterByDate'\r\n ) {\r\n return;\r\n }\r\n\r\n const newFilterGroup = this.createFilterGroup();\r\n\r\n if (filterData) {\r\n if (filterData.selectFilter) {\r\n newFilterGroup.get('selectFilter')?.setValue(filterData.selectFilter);\r\n }\r\n if (filterData.typeFilter) {\r\n newFilterGroup.get('typeFilter')?.setValue(filterData.typeFilter);\r\n }\r\n if (filterData.selectItem) {\r\n newFilterGroup.get('selectItem')?.setValue(filterData.selectItem);\r\n }\r\n if (filterData.initialDate) {\r\n newFilterGroup.get('initialDate')?.setValue(filterData.initialDate);\r\n }\r\n if (filterData.finalDate) {\r\n newFilterGroup.get('finalDate')?.setValue(filterData.finalDate);\r\n }\r\n }\r\n\r\n filtersForm.push(newFilterGroup);\r\n }\r\n\r\n /**\r\n * Verifica se há um filtro de data ativo\r\n */\r\n hasActiveDateFilter(filtersForm: FormArray): boolean {\r\n return filtersForm.controls.some((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n return selectedFilter?.arrange === 'filterByDate';\r\n });\r\n }\r\n\r\n /**\r\n * Retorna as opções de filtro disponíveis\r\n */\r\n getAvailableFilterOptions(\r\n dropdownItems: any[],\r\n isPaginated: boolean,\r\n filtersForm: FormArray\r\n ): any[] {\r\n if (isPaginated && this.hasActiveDateFilter(filtersForm)) {\r\n return dropdownItems.filter((item) => item.arrange !== 'filterByDate');\r\n }\r\n return dropdownItems;\r\n }\r\n\r\n /**\r\n * Remove um filtro do FormArray\r\n */\r\n removeFilter(filtersForm: FormArray, index: number): void {\r\n filtersForm.removeAt(index);\r\n if (filtersForm.length === 0) {\r\n this.addFilter(filtersForm, false);\r\n }\r\n }\r\n\r\n /**\r\n * Remove todos os filtros do FormArray\r\n */\r\n removeAllFilters(filtersForm: FormArray): void {\r\n filtersForm.clear();\r\n this.addFilter(filtersForm, false);\r\n }\r\n\r\n /**\r\n * Aplica máscara de data (DD/MM/AAAA)\r\n */\r\n applyDateMask(\r\n event: any,\r\n controlName: 'initialDate' | 'finalDate',\r\n filterGroup: FormGroup\r\n ): void {\r\n const input = event.target;\r\n let value = input.value.replace(/\\D/g, '');\r\n\r\n if (value.length > 8) {\r\n value = value.slice(0, 8);\r\n }\r\n\r\n if (value.length <= 2) {\r\n // mantém como está\r\n } else if (value.length <= 4) {\r\n value = value.slice(0, 2) + '/' + value.slice(2);\r\n } else {\r\n value =\r\n value.slice(0, 2) + '/' + value.slice(2, 4) + '/' + value.slice(4, 8);\r\n }\r\n\r\n filterGroup.get(controlName)?.setValue(value, { emitEvent: false });\r\n }\r\n\r\n /**\r\n * Aplica filtros client-side aos itens\r\n */\r\n applyClientSideFilters<T = any>(\r\n items: T[],\r\n filtersForm: FormArray,\r\n sortBy: { field: string; order: OrderByDirection }\r\n ): T[] {\r\n let filteredItems = [...items];\r\n\r\n const dateFiltersByProperty: DateFiltersByProperty = {};\r\n const otherFilters: ProcessedFilter[] = [];\r\n\r\n filtersForm.controls.forEach((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n if (!selectedFilter) return;\r\n\r\n const arrange = selectedFilter.arrange;\r\n\r\n if (arrange === 'filterByDate') {\r\n const initial = group.get('initialDate')?.value;\r\n const final = group.get('finalDate')?.value;\r\n\r\n if (initial && final && initial.trim() && final.trim()) {\r\n try {\r\n const datePattern = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/;\r\n if (!datePattern.test(initial) || !datePattern.test(final)) {\r\n return;\r\n }\r\n\r\n const [dayI, monthI, yearI] = initial.split('/');\r\n const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);\r\n const [dayF, monthF, yearF] = final.split('/');\r\n const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);\r\n finalDate.setHours(23, 59, 59);\r\n\r\n if (isNaN(initialDate.getTime()) || isNaN(finalDate.getTime())) {\r\n return;\r\n }\r\n\r\n const dateField = selectedFilter.property || sortBy.field;\r\n\r\n if (!dateFiltersByProperty[dateField]) {\r\n dateFiltersByProperty[dateField] = [];\r\n }\r\n\r\n dateFiltersByProperty[dateField].push({\r\n initial: initialDate,\r\n final: finalDate,\r\n });\r\n } catch (error) {\r\n console.warn('Erro ao processar datas do filtro:', error);\r\n }\r\n }\r\n } else {\r\n otherFilters.push({ group, selectedFilter, arrange });\r\n }\r\n });\r\n\r\n // Aplicar filtros de data\r\n Object.keys(dateFiltersByProperty).forEach((dateField) => {\r\n const intervals = dateFiltersByProperty[dateField];\r\n\r\n filteredItems = filteredItems.filter((item: any) => {\r\n try {\r\n const fieldValue = item[dateField];\r\n\r\n if (!fieldValue) {\r\n return false;\r\n }\r\n\r\n let itemDate: Date;\r\n if (typeof fieldValue.toDate === 'function') {\r\n itemDate = fieldValue.toDate();\r\n } else if (fieldValue instanceof Date) {\r\n itemDate = fieldValue;\r\n } else if (typeof fieldValue === 'string') {\r\n itemDate = new Date(fieldValue);\r\n if (isNaN(itemDate.getTime())) {\r\n return false;\r\n }\r\n } else if (typeof fieldValue === 'number') {\r\n itemDate = new Date(fieldValue);\r\n } else {\r\n return false;\r\n }\r\n\r\n return intervals.some(\r\n (interval) =>\r\n itemDate >= interval.initial && itemDate <= interval.final\r\n );\r\n } catch (error) {\r\n console.warn(\r\n 'Erro ao processar filtro de data para o item:',\r\n item.id,\r\n error\r\n );\r\n return false;\r\n }\r\n });\r\n });\r\n\r\n // Aplicar outros filtros\r\n otherFilters.forEach(({ group, selectedFilter, arrange }) => {\r\n if (arrange === 'filter') {\r\n const filterValue = group.get('typeFilter')?.value;\r\n if (filterValue && filterValue.trim()) {\r\n const property = selectedFilter.property;\r\n filteredItems = filteredItems.filter((item: any) => {\r\n const value = String(item[property] || '')\r\n .trim()\r\n .toLocaleLowerCase();\r\n return value.includes(filterValue.trim().toLocaleLowerCase());\r\n });\r\n }\r\n } else if (\r\n selectedFilter.hasOwnProperty('items') &&\r\n arrange === 'equals'\r\n ) {\r\n const selectedItems = group.get('selectItem')?.value;\r\n if (Array.isArray(selectedItems) && selectedItems.length > 0) {\r\n filteredItems = filteredItems.filter((item: any) => {\r\n return selectedItems.some((selectedItem: any) => {\r\n const itemValue = item[selectedItem.property];\r\n return itemValue === selectedItem.value;\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return filteredItems;\r\n }\r\n\r\n /**\r\n * Constrói o objeto Arrange a partir dos filtros ativos\r\n */\r\n buildArrangeFromFilters(\r\n filtersForm: FormArray,\r\n sortBy: { field: string; order: OrderByDirection }\r\n ): Arrange {\r\n const activeFilters = filtersForm.controls\r\n .flatMap((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n if (!selectedFilter) return [];\r\n\r\n const arrange = selectedFilter.arrange;\r\n\r\n if (arrange === 'filter') {\r\n const filterValue = group.get('typeFilter')?.value;\r\n if (!filterValue) return [];\r\n return {\r\n arrange,\r\n filter: {\r\n property: selectedFilter.property,\r\n filtering: filterValue,\r\n },\r\n dateFilter: undefined,\r\n };\r\n }\r\n\r\n if (arrange === 'filterByDate') {\r\n const initial = group.get('initialDate')?.value;\r\n const final = group.get('finalDate')?.value;\r\n if (initial && final) {\r\n try {\r\n const [dayI, monthI, yearI] = initial.split('/');\r\n const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);\r\n const [dayF, monthF, yearF] = final.split('/');\r\n const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);\r\n finalDate.setHours(23, 59, 59);\r\n return {\r\n arrange,\r\n filter: undefined,\r\n dateFilter: {\r\n initial: initialDate,\r\n final: finalDate,\r\n },\r\n };\r\n } catch (error) {\r\n return [];\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {\r\n const selectedItems = group.get('selectItem')?.value;\r\n if (Array.isArray(selectedItems) && selectedItems.length > 0) {\r\n return selectedItems.map((item) => ({\r\n arrange,\r\n filter: {\r\n property: item.property,\r\n filtering: item.value,\r\n },\r\n dateFilter: undefined,\r\n }));\r\n }\r\n }\r\n\r\n return [];\r\n })\r\n .filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));\r\n\r\n return {\r\n filters: activeFilters,\r\n sortBy: sortBy,\r\n };\r\n }\r\n\r\n /**\r\n * Extrai filtros ativos para paginação\r\n */\r\n extractActiveFilters(filtersForm: FormArray): any[] {\r\n return filtersForm.controls\r\n .flatMap((control) => {\r\n const group = control as FormGroup;\r\n const selectedFilter = group.get('selectFilter')?.value;\r\n if (!selectedFilter) return [];\r\n\r\n const arrange = selectedFilter.arrange;\r\n\r\n if (arrange === 'filter') {\r\n const filterValue = group.get('typeFilter')?.value;\r\n if (!filterValue) return [];\r\n return {\r\n arrange,\r\n filter: {\r\n property: selectedFilter.property,\r\n filtering: filterValue,\r\n },\r\n dateFilter: undefined,\r\n };\r\n }\r\n\r\n if (arrange === 'filterByDate') {\r\n const initial = group.get('initialDate')?.value;\r\n const final = group.get('finalDate')?.value;\r\n if (initial && final) {\r\n const [dayI, monthI, yearI] = initial.split('/');\r\n const initialDate = new Date(`${monthI}/${dayI}/${yearI}`);\r\n const [dayF, monthF, yearF] = final.split('/');\r\n const finalDate = new Date(`${monthF}/${dayF}/${yearF}`);\r\n finalDate.setHours(23, 59, 59);\r\n return {\r\n arrange,\r\n filter: undefined,\r\n dateFilter: {\r\n initial: initialDate,\r\n final: finalDate,\r\n },\r\n };\r\n }\r\n return [];\r\n }\r\n\r\n if (selectedFilter.hasOwnProperty('items') && arrange === 'equals') {\r\n const selectedItems = group.get('selectItem')?.value;\r\n if (Array.isArray(selectedItems) && selectedItems.length > 0) {\r\n return selectedItems.map((item) => ({\r\n arrange,\r\n filter: {\r\n property: item.property,\r\n filtering: item.value,\r\n },\r\n dateFilter: undefined,\r\n }));\r\n }\r\n }\r\n\r\n return [];\r\n })\r\n .filter((f) => f && (f.filter?.filtering !== undefined || f.dateFilter));\r\n }\r\n\r\n /**\r\n * Inicializa os dropdownItems baseado nas colunas\r\n */\r\n initializeDropdownItems(displayedColumns: Column[]): {\r\n dropdownItems: any[];\r\n sortableDropdownItems: any[];\r\n hasFilterableColumn: boolean;\r\n hasSortableColumn: boolean;\r\n } {\r\n const dropdownItems: any[] = [];\r\n const sortableDropdownItems: any[] = [];\r\n let hasFilterableColumn = false;\r\n let hasSortableColumn = false;\r\n\r\n displayedColumns.forEach((col) => {\r\n if (col.isFilterable) {\r\n hasFilterableColumn = true;\r\n dropdownItems.push({\r\n ...col,\r\n arrange: 'filter',\r\n title: col.title,\r\n });\r\n }\r\n if (col.isSortable) {\r\n hasSortableColumn = true;\r\n sortableDropdownItems.push({\r\n ...col,\r\n arrange: 'ascending',\r\n title: col.title + ': crescente',\r\n });\r\n sortableDropdownItems.push({\r\n ...col,\r\n arrange: 'descending',\r\n title: col.title + ': decrescente',\r\n });\r\n }\r\n if (col.isFilterableByDate) {\r\n dropdownItems.push({\r\n ...col,\r\n arrange: 'filterByDate',\r\n title: col.title + ': filtro por data',\r\n });\r\n }\r\n });\r\n\r\n return {\r\n dropdownItems,\r\n sortableDropdownItems,\r\n hasFilterableColumn,\r\n hasSortableColumn,\r\n };\r\n }\r\n\r\n /**\r\n * Adiciona opções de filtro customizadas\r\n */\r\n addFilterableOptions(dropdownItems: any[], filterableOptions: any[]): any[] {\r\n if (\r\n filterableOptions &&\r\n Array.isArray(filterableOptions) &&\r\n filterableOptions.length > 0\r\n ) {\r\n filterableOptions.forEach((option) =>\r\n dropdownItems.push({ ...option, arrange: 'equals' })\r\n );\r\n }\r\n return dropdownItems;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Column } from '../types/Table';\r\n\r\nexport interface TooltipState {\r\n hoveredCell: { row: any; col: any } | null;\r\n showTooltip: boolean;\r\n tooltipContent: string;\r\n tooltipPosition: { x: number; y: number };\r\n tooltipBgColor: string;\r\n tooltipBgStyle: { [key: string]: string } | null;\r\n tooltipTextColor: string;\r\n tooltipTextStyle: { [key: string]: string } | null;\r\n}\r\n\r\nexport interface TooltipConfig {\r\n color?: string;\r\n text?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TooltipService {\r\n private tooltipTimeout: any = null;\r\n\r\n /**\r\n * Cria um estado inicial para o tooltip\r\n */\r\n createInitialState(): TooltipState {\r\n return {\r\n hoveredCell: null,\r\n showTooltip: false,\r\n tooltipContent: '',\r\n tooltipPosition: { x: 0, y: 0 },\r\n tooltipBgColor: 'bg-gray-800',\r\n tooltipBgStyle: null,\r\n tooltipTextColor: 'text-white',\r\n tooltipTextStyle: null,\r\n };\r\n }\r\n\r\n /**\r\n * Processa as cores do tooltip\r\n */\r\n processTooltipColors(config?: TooltipConfig): {\r\n bgColor: string;\r\n bgStyle: { [key: string]: string } | null;\r\n textColor: string;\r\n textStyle: { [key: string]: string } | null;\r\n } {\r\n const result = {\r\n bgColor: 'bg-gray-800',\r\n bgStyle: null as { [key: string]: string } | null,\r\n textColor: 'text-white',\r\n textStyle: null as { [key: string]: string } | null,\r\n };\r\n\r\n const tooltipBgColor = config?.color || 'bg-gray-800';\r\n if (tooltipBgColor.startsWith('#') || tooltipBgColor.startsWith('rgb')) {\r\n result.bgColor = '';\r\n result.bgStyle = { 'background-color': tooltipBgColor };\r\n } else {\r\n result.bgColor = tooltipBgColor;\r\n result.bgStyle = null;\r\n }\r\n\r\n const tooltipTextColor = config?.text || 'text-white';\r\n if (\r\n tooltipTextColor.startsWith('#') ||\r\n tooltipTextColor.startsWith('rgb')\r\n ) {\r\n result.textColor = '';\r\n result.textStyle = { color: tooltipTextColor };\r\n } else {\r\n result.textColor = tooltipTextColor;\r\n result.textStyle = null;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Manipula o evento de mouse enter na célula\r\n */\r\n handleMouseEnter(\r\n event: MouseEvent,\r\n row: any,\r\n col: Column,\r\n getDisplayValue: (col: Column, row: any, withinLimit: boolean) => string,\r\n onShow: (state: Partial<TooltipState>) => void\r\n ): void {\r\n // Só mostrar tooltip se a coluna tiver charLimit definido\r\n if (!col.charLimit) {\r\n return;\r\n }\r\n\r\n const fullValue = getDisplayValue(col, row, true);\r\n\r\n // Só mostrar tooltip se o valor completo for maior que o limite\r\n if (fullValue.length <= col.charLimit) {\r\n return;\r\n }\r\n\r\n const colors = this.processTooltipColors(col.tooltip);\r\n\r\n const state: Partial<TooltipState> = {\r\n hoveredCell: { row, col },\r\n tooltipContent: fullValue,\r\n tooltipBgColor: colors.bgColor,\r\n tooltipBgStyle: colors.bgStyle,\r\n tooltipTextColor: colors.textColor,\r\n tooltipTextStyle: colors.textStyle,\r\n tooltipPosition: {\r\n x: event.clientX + 10,\r\n y: event.clientY - 10,\r\n },\r\n };\r\n\r\n onShow(state);\r\n\r\n // Limpar timeout anterior se existir\r\n if (this.tooltipTimeout) {\r\n clearTimeout(this.tooltipTimeout);\r\n }\r\n\r\n // Timeout para mostrar o tooltip\r\n this.tooltipTimeout = setTimeout(() => {\r\n onShow({ showTooltip: true });\r\n }, 500);\r\n }\r\n\r\n /**\r\n * Manipula o evento de mouse leave na célula\r\n */\r\n handleMouseLeave(onHide: (state: TooltipState) => void): void {\r\n if (this.tooltipTimeout) {\r\n clearTimeout(this.tooltipTimeout);\r\n this.tooltipTimeout = null;\r\n }\r\n\r\n onHide(this.createInitialState());\r\n }\r\n\r\n /**\r\n * Manipula o movimento do mouse\r\n */\r\n handleMouseMove(\r\n event: MouseEvent,\r\n showTooltip: boolean,\r\n onMove: (position: { x: number; y: number }) => void\r\n ): void {\r\n if (showTooltip) {\r\n onMove({\r\n x: event.clientX + 10,\r\n y: event.clientY - 10,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Combina estilos do tooltip para aplicação\r\n */\r\n getTooltipStyles(state: TooltipState): { [key: string]: string } {\r\n const styles: { [key: string]: string } = {};\r\n if (state.tooltipBgStyle) {\r\n Object.assign(styles, state.tooltipBgStyle);\r\n }\r\n if (state.tooltipTextStyle) {\r\n Object.assign(styles, state.tooltipTextStyle);\r\n }\r\n return styles;\r\n }\r\n\r\n /**\r\n * Limpa recursos ao destruir\r\n */\r\n destroy(): void {\r\n if (this.tooltipTimeout) {\r\n clearTimeout(this.tooltipTimeout);\r\n this.tooltipTimeout = null;\r\n }\r\n }\r\n}\r\n\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { PageEvent } from '@angular/material/paginator';\r\n\r\nexport interface PaginationState {\r\n currentPageNumber: number;\r\n currentClientPageIndex: number;\r\n pageSize: number;\r\n totalItems: number;\r\n hasNextPage: boolean;\r\n}\r\n\r\nexport interface NavigationResult {\r\n direction: 'forward' | 'backward' | 'reload';\r\n resetDocs: boolean;\r\n originalPageSize: number | null;\r\n shouldNavigate: boolean;\r\n newClientPageIndex: number;\r\n newPageNumber: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PaginationService {\r\n calculateNavigation(\r\n event: PageEvent,\r\n currentState: PaginationState\r\n ): NavigationResult {\r\n const previousPageIndex = event.previousPageIndex ?? 0;\r\n const pageIndex = event.pageIndex;\r\n const eventPageSize = event.pageSize;\r\n const totalItems = currentState.totalItems;\r\n const currentComponentPageSize = currentState.pageSize;\r\n\r\n let navigationDirection: 'forward' | 'backward' | 'reload' = 'reload';\r\n let resetDocs = false;\r\n let originalPageSize: number | null = null;\r\n let shouldNavigate = true;\r\n let newClientPageIndex = pageIndex;\r\n let newPageNumber = currentState.currentPageNumber;\r\n\r\n const lastPageIndex = Math.max(\r\n 0,\r\n Math.ceil(totalItems / eventPageSize) - 1\r\n );\r\n\r\n // Atualizar número da página\r\n if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {\r\n newPageNumber++;\r\n } else if (\r\n previousPageIndex !== undefined &&\r\n pageIndex < previousPageIndex\r\n ) {\r\n newPageNumber = Math.max(1, newPageNumber - 1);\r\n }\r\n\r\n // Mudança de tamanho de página\r\n if (eventPageSize !== currentComponentPageSize) {\r\n navigationDirection = 'forward';\r\n resetDocs = true;\r\n newClientPageIndex = 0;\r\n }\r\n // Indo para primeira página\r\n else if (\r\n pageIndex === 0 &&\r\n previousPageIndex !== undefined &&\r\n pageIndex < previousPageIndex\r\n ) {\r\n navigationDirection = 'forward';\r\n newPageNumber = 1;\r\n newClientPageIndex = 0;\r\n resetDocs = true;\r\n }\r\n // Indo para última página (salto)\r\n else if (\r\n pageIndex === lastPageIndex &&\r\n previousPageIndex !== undefined &&\r\n pageIndex > previousPageIndex &&\r\n pageIndex - previousPageIndex > 1\r\n ) {\r\n navigationDirection = 'backward';\r\n resetDocs = true;\r\n\r\n const itemsExpectedInLastPage =\r\n totalItems - lastPageIndex * eventPageSize;\r\n\r\n if (\r\n itemsExpectedInLastPage > 0 &&\r\n itemsExpectedInLastPage < eventPageSize\r\n ) {\r\n originalPageSize = currentComponentPageSize;\r\n }\r\n }\r\n // Próxima página\r\n else if (previousPageIndex !== undefined && pageIndex > previousPageIndex) {\r\n navigationDirection = 'forward';\r\n resetDocs = false;\r\n }\r\n // Página anterior\r\n else if (previousPageIndex !== undefined && pageIndex < previousPageIndex) {\r\n navigationDirection = 'backward';\r\n resetDocs = false;\r\n }\r\n // Mesma página (reload)\r\n else if (\r\n previousPageIndex !== undefined &&\r\n pageIndex === previousPageIndex\r\n ) {\r\n navigationDirection = 'reload';\r\n resetDocs = false;\r\n }\r\n // Caso inicial (primeira carga)\r\n else if (previousPageIndex === undefined && pageIndex === 0) {\r\n shouldNavigate = false;\r\n }\r\n // Caso não tratado\r\n else {\r\n console.warn('Condição de navegação não tratada:', event);\r\n shouldNavigate = false;\r\n }\r\n\r\n return {\r\n direction: navigationDirection,\r\n resetDocs,\r\n originalPageSize,\r\n shouldNavigate,\r\n newClientPageIndex,\r\n newPageNumber,\r\n };\r\n }\r\n\r\n /**\r\n * Calcula o número de itens esperados na última página\r\n */\r\n calculateLastPageItemCount(totalItems: number, pageSize: number): number {\r\n const lastPageIndex = Math.max(0, Math.ceil(totalItems / pageSize) - 1);\r\n return totalItems - lastPageIndex * pageSize;\r\n }\r\n\r\n /**\r\n * Calcula o índice da última página\r\n */\r\n calculateLastPageIndex(totalItems: number, pageSize: number): number {\r\n return Math.max(0, Math.ceil(totalItems / pageSize) - 1);\r\n }\r\n\r\n /**\r\n * Verifica se deve mostrar o botão de próxima página\r\n */\r\n shouldShowNextButton(hasNextPage: boolean, isPaginated: boolean): boolean {\r\n return hasNextPage || !isPaginated;\r\n }\r\n}\r\n","<div class=\"mx-auto flex flex-col\" *ngIf=\"tabsData && tabsData.length > 0\">\r\n <ng-container *ngFor=\"let groupIndex of getTabGroups(); let i = index\">\r\n <div class=\"mx-auto flex flex-row\">\r\n <ng-container *ngFor=\"let tab of getTabGroup(groupIndex); let j = index\">\r\n <button\r\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\r\n [ngClass]=\"\r\n isTabSelected(getRealTabIndex(i, j))\r\n ? 'border-b-0 brightness-110'\r\n : ''\r\n \"\r\n (click)=\"onTabSelected(i, j)\"\r\n >\r\n {{ tab.label }}\r\n <span\r\n *ngIf=\"tab.counter !== undefined\"\r\n class=\"ml-2 text-xs font-bold\"\r\n [ngClass]=\"tab.counterClass\"\r\n >\r\n {{ tab.counter }}\r\n </span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n\r\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { TabData } from '../../types/Table';\n\n@Component({\n selector: 'lib-table-tabs',\n standalone: false,\n templateUrl: './table-tabs.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableTabsComponent {\n @Input() tabsData: TabData[] = [];\n @Input() selectedTab: number = 0;\n @Output() tabSelected = new EventEmitter<{ tab: TabData; index: number }>();\n\n private readonly TABS_PER_GROUP = 6;\n\n /**\n * Retorna os índices dos grupos de tabs (invertidos para exibição vertical)\n */\n getTabGroups(): number[] {\n if (!this.tabsData || this.tabsData.length === 0) return [];\n\n const totalGroups = Math.ceil(this.tabsData.length / this.TABS_PER_GROUP);\n const groups: number[] = [];\n\n for (let i = totalGroups - 1; i >= 0; i--) {\n groups.push(i);\n }\n\n return groups;\n }\n\n /**\n * Retorna os tabs de um grupo específico\n */\n getTabGroup(groupIndex: number): TabData[] {\n if (!this.tabsData || this.tabsData.length === 0) return [];\n\n const startIndex = groupIndex * this.TABS_PER_GROUP;\n const endIndex = Math.min(\n startIndex + this.TABS_PER_GROUP,\n this.tabsData.length,\n );\n\n return this.tabsData.slice(startIndex, endIndex);\n }\n\n /**\n * Calcula o índice real do tab considerando a inversão vertical\n */\n getRealTabIndex(groupDisplayIndex: number, tabIndexInGroup: number): number {\n if (!this.tabsData) return 0;\n const totalGroups = Math.ceil(this.tabsData.length / this.TABS_PER_GROUP);\n const realGroupIndex = totalGroups - 1 - groupDisplayIndex;\n return realGroupIndex * this.TABS_PER_GROUP + tabIndexInGroup;\n }\n\n /**\n * Manipula a seleção de um tab\n */\n onTabSelected(groupDisplayIndex: number, tabIndexInGroup: number): void {\n const realIndex = this.getRealTabIndex(groupDisplayIndex, tabIndexInGroup);\n const tab = this.tabsData[realIndex];\n if (tab) {\n this.tabSelected.emit({ tab, index: realIndex });\n }\n }\n\n /**\n * Verifica se um tab está selecionado\n */\n isTabSelected(originalIndex: number): boolean {\n return this.selectedTab === originalIndex;\n }\n}\n","<div\r\n *ngIf=\"showTooltip\"\r\n class=\"fixed z-50 max-w-md break-words rounded-lg px-3 py-2 text-sm shadow-lg\"\r\n [ngClass]=\"\r\n (tooltipBgColor || 'bg-gray-800') + ' ' + (tooltipTextColor || 'text-white')\r\n \"\r\n [ngStyle]=\"styles\"\r\n [style.left.px]=\"tooltipPosition.x\"\r\n [style.top.px]=\"tooltipPosition.y\"\r\n [style.pointer-events]=\"'none'\"\r\n>\r\n {{ tooltipContent }}\r\n</div>\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { TooltipState } from '../../services/tooltip.service';\n\n@Component({\n selector: 'lib-table-tooltip',\n standalone: false,\n templateUrl: './table-tooltip.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableTooltipComponent {\n @Input() state!: TooltipState;\n @Input() styles: { [key: string]: string } = {};\n\n get showTooltip(): boolean {\n return this.state?.showTooltip ?? false;\n }\n\n get tooltipContent(): string {\n return this.state?.tooltipContent ?? '';\n }\n\n get tooltipPosition(): { x: number; y: number } {\n return this.state?.tooltipPosition ?? { x: 0, y: 0 };\n }\n\n get tooltipBgColor(): string {\n return this.state?.tooltipBgColor ?? 'bg-gray-800';\n }\n\n get tooltipTextColor(): string {\n return this.state?.tooltipTextColor ?? 'text-white';\n }\n}\n","<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e Ações</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"getActionButtonClass()\"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div class=\"flex flex-wrap items-center gap-3 p-2\">\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Action Buttons -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <!-- UNIFIED CONTROL PANEL (for non-paginated tables): SEARCH, SORT & FILTERS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === false &&\n (hasFilterableColumn === true ||\n dropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title and Custom Action -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e Ações</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"getActionButtonClass()\"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH -->\n <div\n class=\"mb-4\"\n *ngIf=\"hasFilterableColumn === true && data.showSimpleSearch !== false\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- FILTERS PANEL -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex items-start justify-between gap-4 border-t border-gray-200 pt-4\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\n *ngIf=\"\n this.hasFilterableColumn === true ||\n this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <!-- TABS COMPONENT -->\n <lib-table-tabs\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n [tabsData]=\"data.tabs.tabsData\"\n [selectedTab]=\"selectedTab\"\n (tabSelected)=\"onTabSelected($event)\"\n ></lib-table-tabs>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns; trackBy: trackByProperty\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <!-- Imagem com loading -->\n <div\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n\n <!-- Imagem com URL completa e loading -->\n <div\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n class=\"relative inline-block\"\n >\n <mat-spinner\n *ngIf=\"isImageLoading(row, col)\"\n [diameter]=\"32\"\n class=\"absolute inset-0 m-auto\"\n ></mat-spinner>\n <img\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n [class.opacity-0]=\"isImageLoading(row, col)\"\n alt=\"\"\n (load)=\"onImageLoad(row, col)\"\n (error)=\"onImageError($event, row, col, col.image.default)\"\n />\n </div>\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"getTableRowNgClass()\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!(isLoading$ | async)\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading$ | async\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"getPaginatorNgClass()\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !(isLoading$ | async) &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <lib-table-tooltip\n [state]=\"tooltipState\"\n [styles]=\"getTooltipStyles()\"\n ></lib-table-tooltip>\n</div>\n","import {\n Arrange,\n Condition,\n TabData,\n TableData,\n Column,\n TABLE_DEFAULTS,\n DropdownItem,\n FilterSelectItem,\n Pagination,\n} from '../../types/Table';\nimport {\n Component,\n Input,\n OnInit,\n ViewChild,\n AfterViewInit,\n OnChanges,\n SimpleChanges,\n ElementRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnDestroy,\n} from '@angular/core';\nimport {\n AngularFirestore,\n QueryDocumentSnapshot,\n} from '@angular/fire/compat/firestore';\nimport { MatPaginator, PageEvent } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { Router } from '@angular/router';\nimport { TableService } from '../../services/table.service';\nimport { FilterService } from '../../services/filter.service';\nimport { TooltipService, TooltipState } from '../../services/tooltip.service';\nimport { PaginationService } from '../../services/pagination.service';\nimport {\n getDisplayValue,\n getNestedValue,\n isString,\n trackByProperty,\n getImageKey,\n} from '../../utils/table.utils';\nimport {\n debounceTime,\n firstValueFrom,\n Subject,\n takeUntil,\n BehaviorSubject,\n} from 'rxjs';\nimport { OrderByDirection } from 'firebase/firestore';\nimport firebase from 'firebase/compat';\nimport WhereFilterOp = firebase.firestore.WhereFilterOp;\nimport firestore = firebase.firestore;\nimport { FormControl, FormArray, FormGroup } from '@angular/forms';\n\n@Component({\n selector: 'lib-table',\n standalone: false,\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableComponent<T = any>\n implements OnInit, AfterViewInit, OnChanges, OnDestroy\n{\n // INPUTS\n @Input() data!: TableData;\n @Input() downloadTable?: (arrange: Arrange, conditions: Condition[]) => void;\n arrange: Arrange | null = null;\n\n // VARIABLES\n dataSource!: MatTableDataSource<T>;\n currentPageNumber = 1;\n currentClientPageIndex = 0;\n\n public isLoading$ = new BehaviorSubject<boolean>(false);\n\n public items: T[] = [];\n public filteredItems: T[] = [];\n private lastDoc: QueryDocumentSnapshot<T> | null = null;\n private firstDoc: QueryDocumentSnapshot<T> | null = null;\n private sortBy: { field: string; order: OrderByDirection } = {\n field: TABLE_DEFAULTS.SORT_FIELD,\n order: TABLE_DEFAULTS.SORT_ORDER,\n };\n public columnProperties: string[] = [];\n\n filtersForm: FormArray;\n selectSort: FormControl = new FormControl('');\n currentArrange = '';\n\n hasNextPage: boolean = false;\n dropdownItems: DropdownItem[] = [];\n sortableDropdownItems: DropdownItem[] = [];\n pageSize = TABLE_DEFAULTS.PAGE_SIZE;\n totalItems = 0;\n pageEvent?: PageEvent;\n filterValue: string | null = null;\n\n hasFilterableColumn: boolean = false;\n hasSortableColumn: boolean = false;\n filterPredicate: ((data: T, filter: string) => boolean) | undefined;\n private filterSubject = new Subject<string>();\n private readonly debounceTimeMs = TABLE_DEFAULTS.DEBOUNCE_TIME_MS;\n\n selectedTab: number = 0;\n\n @ViewChild(MatPaginator) paginator!: MatPaginator;\n @ViewChild(MatSort) sort!: MatSort;\n\n // Propriedades para controle do tooltip\n tooltipState: TooltipState;\n\n // Controle de loading de imagens\n imageLoadingState = new Map<string, boolean>();\n\n private destroy$ = new Subject<void>();\n\n // CONSTRUCTOR\n constructor(\n private router: Router,\n private tableService: TableService,\n private filterService: FilterService,\n private tooltipService: TooltipService,\n private paginationService: PaginationService,\n private firestore: AngularFirestore,\n private el: ElementRef,\n private cdr: ChangeDetectorRef,\n ) {\n this.filtersForm = new FormArray([this.filterService.createFilterGroup()]);\n this.tooltipState = this.tooltipService.createInitialState();\n }\n\n getActionButtonClass(): string {\n return (\n (this.data?.actionButton?.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n );\n }\n\n getTableRowNgClass(): Record<string, boolean> {\n return {\n 'example-element-row': this.data?.isNotClickable === true,\n 'example-element-row cursor-pointer': !this.data?.isNotClickable,\n };\n }\n\n getPaginatorNgClass(): Record<string, boolean> {\n return {\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(this.currentArrange) ||\n !!this.data?.filterFn,\n 'hide-next-button':\n !this.hasNextPage && this.data?.pagination === true,\n 'hide-last-button':\n (!this.hasNextPage && this.data?.pagination === true) ||\n !!this.data?.filterFn,\n };\n }\n\n // FILTER METHODS (delegados ao FilterService)\n\n createFilterGroup(): FormGroup {\n return this.filterService.createFilterGroup();\n }\n\n addFilter(filterData?: {\n selectFilter: DropdownItem | null;\n typeFilter?: string;\n selectItem?: FilterSelectItem[];\n initialDate?: string;\n finalDate?: string;\n }): void {\n this.filterService.addFilter(\n this.filtersForm,\n this.data.pagination === true,\n filterData,\n );\n }\n\n hasActiveDateFilter(): boolean {\n return this.filterService.hasActiveDateFilter(this.filtersForm);\n }\n\n getAvailableFilterOptions(): DropdownItem[] {\n return this.filterService.getAvailableFilterOptions(\n this.dropdownItems,\n this.data.pagination === true,\n this.filtersForm,\n );\n }\n\n onSelectFilterChange(): void {\n const lastIndex = this.filtersForm.length - 1;\n const lastFilter = this.filtersForm.at(lastIndex);\n const selectedFilter = lastFilter.get('selectFilter')?.value;\n\n if (selectedFilter) {\n if (\n selectedFilter.arrange === 'filterByDate' &&\n this.data.pagination === true\n ) {\n return;\n }\n this.addFilter();\n }\n }\n\n removeFilter(index: number): void {\n this.filterService.removeFilter(this.filtersForm, index);\n }\n\n removeAllFilters(): void {\n this.filterService.removeAllFilters(this.filtersForm);\n this.resetFilter();\n }\n\n onDateInput(\n event: Event,\n controlName: 'initialDate' | 'finalDate',\n filterIndex: number,\n ): void {\n const filterGroup = this.filtersForm.at(filterIndex) as FormGroup;\n this.filterService.applyDateMask(event, controlName, filterGroup);\n }\n\n onDateFilterChange(): void {\n if (this.data.pagination === false) {\n this.arrange = this.filterService.buildArrangeFromFilters(\n this.filtersForm,\n this.sortBy,\n );\n this.applyFiltersToDataSource();\n this.cdr.markForCheck();\n }\n }\n\n private applyFiltersToDataSource(): void {\n if (!this.dataSource) return;\n\n let filteredItems = this.filterService.applyClientSideFilters<T>(\n [...this.items],\n this.filtersForm,\n this.sortBy,\n );\n this.dataSource.data = filteredItems;\n this.filteredItems = filteredItems;\n this.totalItems = filteredItems.length;\n\n this.cdr.markForCheck();\n }\n\n private applyClientSideFilters(items: T[]): T[] {\n return this.filterService.applyClientSideFilters<T>(\n items,\n this.filtersForm,\n this.sortBy,\n );\n }\n\n private buildArrangeFromFilters(): Arrange {\n return this.filterService.buildArrangeFromFilters(\n this.filtersForm,\n this.sortBy,\n );\n }\n\n // TOOLTIP METHODS (delegados ao TooltipService)\n\n getTooltipStyles(): { [key: string]: string } {\n return this.tooltipService.getTooltipStyles(this.tooltipState);\n }\n\n onCellMouseEnter(event: MouseEvent, row: T, col: Column): void {\n this.tooltipService.handleMouseEnter(\n event,\n row,\n col,\n (c, r, w) => this.getDisplayValue(c, r, w),\n (state) => {\n this.tooltipState = { ...this.tooltipState, ...state };\n this.cdr.markForCheck();\n },\n );\n }\n\n onCellMouseLeave(): void {\n this.tooltipService.handleMouseLeave((state) => {\n this.tooltipState = state;\n this.cdr.markForCheck();\n });\n }\n\n onCellMouseMove(event: MouseEvent): void {\n this.tooltipService.handleMouseMove(\n event,\n this.tooltipState.showTooltip,\n (position) => {\n this.tooltipState = { ...this.tooltipState, tooltipPosition: position };\n this.cdr.markForCheck();\n },\n );\n }\n\n // TAB METHODS\n\n onTabSelected(event: { tab: TabData; index: number }): void {\n if (!this.data.tabs?.method) return;\n this.selectedTab = event.index;\n this.data.tabs.method(event.tab, event.index);\n this.cdr.markForCheck();\n }\n\n // UTILITY METHODS (delegados aos utils)\n\n getDisplayValue(col: Column, row: T, withinLimit: boolean = false): string {\n return getDisplayValue(col, row, withinLimit);\n }\n\n getNestedValue(obj: unknown, path: string): unknown {\n return getNestedValue(obj, path);\n }\n\n isString(value: unknown): boolean {\n return isString(value);\n }\n\n trackByProperty(_index: number, col: Column): string {\n return trackByProperty(_index, col);\n }\n\n // IMAGE LOADING METHODS\n\n private getImageKey(row: T, col: Column): string {\n return getImageKey(row, col);\n }\n\n isImageLoading(row: T, col: Column): boolean {\n const key = this.getImageKey(row, col);\n return !this.imageLoadingState.has(key);\n }\n\n onImageLoad(row: T, col: Column): void {\n const key = this.getImageKey(row, col);\n this.imageLoadingState.set(key, true);\n this.cdr.markForCheck();\n }\n\n onImageError(event: Event, row: T, col: Column, defaultImage?: string): void {\n const key = this.getImageKey(row, col);\n this.imageLoadingState.set(key, true);\n\n const target = event.target as HTMLImageElement;\n if (target) {\n if (defaultImage) {\n target.src = defaultImage;\n target.onerror = null;\n } else {\n target.style.display = 'none';\n }\n }\n\n this.cdr.markForCheck();\n }\n\n // LIFECYCLE METHODS\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['data']) {\n setTimeout(() => this.applyCustomColors(), 0);\n }\n }\n\n ngAfterViewInit(): void {\n this.applyCustomColors();\n }\n\n ngOnDestroy(): void {\n this.tooltipService.destroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private applyCustomColors(): void {\n const hostElement = this.el?.nativeElement;\n if (!hostElement || !this.data) return;\n\n if (this.data.color?.bg) {\n hostElement.style.setProperty('--table-color', this.data.color.bg);\n hostElement.style.setProperty('--table-header-bg', this.data.color.bg);\n }\n if (this.data.color?.text) {\n hostElement.style.setProperty('--table-text-color', this.data.color.text);\n hostElement.style.setProperty(\n '--table-header-text',\n this.data.color.text,\n );\n }\n\n setTimeout(() => {\n const headerCells = hostElement.querySelectorAll(\n '.mat-header-cell, .mat-mdc-header-cell, th.mat-header-cell, th.mat-mdc-header-cell',\n );\n headerCells.forEach((cell: HTMLElement) => {\n if (this.data.color?.bg) {\n cell.style.backgroundColor = this.data.color.bg;\n }\n if (this.data.color?.text) {\n cell.style.color = this.data.color.text;\n }\n });\n }, 100);\n }\n\n public async ngOnInit(): Promise<void> {\n if (!this.data.color) {\n this.data.color = {\n bg: TABLE_DEFAULTS.DEFAULT_BG_COLOR,\n text: TABLE_DEFAULTS.DEFAULT_TEXT_COLOR,\n };\n }\n if (this.data.showSimpleSearch === undefined) {\n this.data.showSimpleSearch = true;\n }\n\n this.columnProperties = this.data.displayedColumns.map(\n (column) => column.property,\n );\n this.cdr.markForCheck();\n\n if (this.data.actionButton && !this.data.actionButton.condition) {\n this.data.actionButton.condition = (_row?: T) => true;\n }\n\n // Inicializar dropdownItems usando FilterService\n const filterConfig = this.filterService.initializeDropdownItems(\n this.data.displayedColumns,\n );\n this.dropdownItems = filterConfig.dropdownItems;\n this.sortableDropdownItems = filterConfig.sortableDropdownItems;\n this.hasFilterableColumn = filterConfig.hasFilterableColumn;\n this.hasSortableColumn = filterConfig.hasSortableColumn;\n\n if (this.data.filterableOptions) {\n this.dropdownItems = this.filterService.addFilterableOptions(\n this.dropdownItems,\n this.data.filterableOptions,\n );\n }\n\n // Sem paginação\n if (this.data.pagination === false) {\n await this.loadItems();\n this.cdr.markForCheck();\n }\n\n // Com paginação\n if (this.data.pagination === true) {\n if (this.data.sortBy) {\n this.sortBy = {\n field: this.data.sortBy.field,\n order: this.data.sortBy.order,\n };\n }\n this.filterSubject\n .pipe(debounceTime(this.debounceTimeMs), takeUntil(this.destroy$))\n .subscribe(() => {\n this.loadItemsPaginated('reload', true);\n });\n\n this.isLoading$.next(true);\n this.cdr.markForCheck();\n await this.loadItemsPaginated('reload', true);\n\n this.sort.active = 'createdAt';\n this.sort.direction = 'desc';\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n this.totalItems = 0;\n if (this.data.totalRef) {\n for (const totalRef of this.data.totalRef) {\n const totalRefDoc = await totalRef.ref.get();\n const docData = totalRefDoc.data() as\n | Record<string, unknown>\n | undefined;\n if (docData && docData[totalRef.field]) {\n const fieldValue = docData[totalRef.field];\n this.totalItems = (this.totalItems +\n (typeof fieldValue === 'number' ? fieldValue : 0)) as number;\n }\n }\n }\n this.isLoading$.next(false);\n this.cdr.markForCheck();\n }\n }\n\n // DATA LOADING METHODS\n\n private async loadItems(): Promise<void> {\n this.imageLoadingState.clear();\n this.items = (await this.tableService.getItems(\n this.data.collectionRef,\n )) as T[];\n if (this.data.conditions) {\n this.filterItems();\n }\n await this.loadRelations();\n await this.loadQueryLengths();\n this.totalItems = this.items.length;\n\n this.arrange = {\n filters: [],\n sortBy: this.data.sortBy || {\n field: TABLE_DEFAULTS.SORT_FIELD,\n order: TABLE_DEFAULTS.SORT_ORDER,\n },\n };\n this.sortBy = this.data.sortBy || {\n field: TABLE_DEFAULTS.SORT_FIELD,\n order: TABLE_DEFAULTS.SORT_ORDER,\n };\n\n let itemsToDisplay = [...this.items];\n itemsToDisplay = this.applyClientSideFilters(itemsToDisplay);\n this.filteredItems = itemsToDisplay;\n\n this.dataSource = new MatTableDataSource(itemsToDisplay);\n this.dataSource.paginator = this.paginator;\n this.dataSource.sort = this.sort;\n if (this.data.sortBy) {\n this.dataSource.sort.active = this.data.sortBy.field;\n this.dataSource.sort.direction = this.data.sortBy.order;\n this.dataSource.sort.sortChange.emit();\n }\n\n this.dataSource.filterPredicate = (data, filter: string) => {\n const item = data as Record<string, unknown>;\n return this.data.displayedColumns.some((col): boolean => {\n if (col.filterPredicates) {\n return col.filterPredicates.some((predicate): boolean => {\n const propertyValue = item[col.property];\n if (!propertyValue || typeof propertyValue !== 'object') {\n return false;\n }\n\n const propertyRecord = propertyValue as Record<string, unknown>;\n const predicateValue = propertyRecord[predicate];\n if (predicateValue === null || predicateValue === undefined) {\n return false;\n }\n\n return String(predicateValue)\n .trim()\n .toLocaleLowerCase()\n .includes(filter);\n });\n }\n\n if (col.property && col.isFilterable) {\n const propertyValue = item[col.property];\n if (propertyValue === null || propertyValue === undefined) {\n return false;\n }\n\n return String(propertyValue)\n .trim()\n .toLocaleLowerCase()\n .includes(filter);\n }\n return false;\n });\n };\n this.filterPredicate = this.dataSource.filterPredicate;\n this.cdr.markForCheck();\n }\n\n private async loadItemsPaginated(\n navigation: 'reload' | 'forward' | 'backward' = 'reload',\n reset: boolean = false,\n ): Promise<void> {\n this.imageLoadingState.clear();\n if (reset && ['forward', 'reload'].includes(navigation)) {\n this.lastDoc = null;\n this.currentClientPageIndex = 0;\n }\n if (reset && ['backward', 'reload'].includes(navigation)) {\n this.firstDoc = null;\n this.currentClientPageIndex = 0;\n }\n\n const activeFilters = this.filterService.extractActiveFilters(\n this.filtersForm,\n );\n\n this.arrange = {\n filters: activeFilters,\n sortBy: this.sortBy,\n };\n\n const paginated: Pagination = {\n batchSize: this.pageSize,\n collection: this.data.collection,\n doc: { lastDoc: this.lastDoc, firstDoc: this.firstDoc },\n navigation,\n arrange: this.arrange!,\n conditions: this.data.conditions,\n size: this.totalItems,\n filterFn: this.data.filterFn,\n clientPageIndex: this.currentClientPageIndex,\n };\n\n const result = await this.tableService.getPaginated(paginated);\n this.items = result.items as T[];\n await this.loadRelations();\n await this.loadQueryLengths();\n this.lastDoc = result.lastDoc as QueryDocumentSnapshot<T> | null;\n this.firstDoc = result.firstDoc as QueryDocumentSnapshot<T> | null;\n\n if (result.currentClientPageIndex !== undefined) {\n this.currentClientPageIndex = result.currentClientPageIndex;\n }\n\n let sum = 0;\n if (this.data.totalRef) {\n for (const totalRef of this.data.totalRef) {\n const totalRefDoc = await totalRef.ref.get();\n const docData = totalRefDoc.data() as\n | Record<string, unknown>\n | undefined;\n if (docData || result.filterLength) {\n const fieldValue = docData ? docData[totalRef.field] : undefined;\n const numericValue = typeof fieldValue === 'number' ? fieldValue : 0;\n sum = result.filterLength ?? ((sum + numericValue) as number);\n }\n }\n this.totalItems = sum;\n }\n\n this.hasNextPage = result.hasNextPage;\n this.dataSource = new MatTableDataSource(this.items);\n this.filterPredicate = this.dataSource.filterPredicate;\n this.cdr.markForCheck();\n }\n\n // PAGINATION METHODS\n\n async onPageChange(event?: PageEvent): Promise<void> {\n if (this.data.pagination !== true || !event) return;\n\n this.isLoading$.next(true);\n\n const currentState = {\n currentPageNumber: this.currentPageNumber,\n currentClientPageIndex: this.currentClientPageIndex,\n pageSize: this.pageSize,\n totalItems: this.totalItems,\n hasNextPage: this.hasNextPage,\n };\n\n const navigation = this.paginationService.calculateNavigation(\n event,\n currentState,\n );\n\n if (!navigation.shouldNavigate) {\n this.isLoading$.next(false);\n this.pageEvent = event;\n return;\n }\n\n // Atualizar estado local\n this.currentClientPageIndex = navigation.newClientPageIndex;\n this.currentPageNumber = navigation.newPageNumber;\n\n // Atualizar pageSize se mudou\n if (event.pageSize !== this.pageSize) {\n this.pageSize = event.pageSize;\n }\n\n // Ajustar pageSize temporariamente para última página se necessário\n const lastPageIndex = this.paginationService.calculateLastPageIndex(\n this.totalItems,\n event.pageSize,\n );\n let originalPageSize: number | null = null;\n\n if (\n event.pageIndex === lastPageIndex &&\n navigation.direction === 'backward' &&\n navigation.resetDocs\n ) {\n const itemsExpectedInLastPage =\n this.paginationService.calculateLastPageItemCount(\n this.totalItems,\n event.pageSize,\n );\n\n if (\n itemsExpectedInLastPage > 0 &&\n itemsExpectedInLastPage < event.pageSize\n ) {\n originalPageSize = this.pageSize;\n this.pageSize = itemsExpectedInLastPage;\n }\n }\n\n try {\n await this.loadItemsPaginated(navigation.direction, navigation.resetDocs);\n } catch (error) {\n console.error('Erro ao carregar itens paginados:', error);\n } finally {\n if (originalPageSize !== null) {\n this.pageSize = originalPageSize;\n }\n }\n\n this.pageEvent = event;\n this.isLoading$.next(false);\n this.cdr.markForCheck();\n }\n\n // FILTER/SEARCH METHODS\n\n applyFilter(value: string): void {\n if (this.data.pagination === false) {\n this.dataSource.filter = String(value).trim().toLowerCase();\n }\n if (this.data.pagination === true) {\n this.filterValue = value;\n this.filterSubject.next(this.filterValue);\n }\n }\n\n async search(event?: Event): Promise<void> {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n if (this.selectSort.value) {\n if (this.selectSort.value.arrange === 'ascending') {\n this.sortBy = {\n field: this.selectSort.value.property,\n order: 'asc',\n };\n }\n if (this.selectSort.value.arrange === 'descending') {\n this.sortBy = {\n field: this.selectSort.value.property,\n order: 'desc',\n };\n }\n }\n\n if (this.data.pagination === false) {\n this.arrange = this.buildArrangeFromFilters();\n this.applyFiltersToDataSource();\n this.currentArrange =\n this.filtersForm.length > 0\n ? (this.filtersForm.at(0).get('selectFilter')?.value?.arrange ?? '')\n : '';\n this.cdr.markForCheck();\n } else {\n await this.loadItemsPaginated('reload', true);\n this.currentArrange =\n this.filtersForm.length > 0\n ? (this.filtersForm.at(0).get('selectFilter')?.value?.arrange ?? '')\n : '';\n this.paginator.firstPage();\n this.cdr.markForCheck();\n }\n }\n\n async resetFilter(): Promise<void> {\n this.dataSource.filter = '';\n if (this.filterPredicate) {\n this.dataSource.filterPredicate = this.filterPredicate;\n }\n\n this.filtersForm.clear();\n this.addFilter();\n this.selectSort.patchValue('');\n this.sortBy = {\n order: this.data.sortBy ? this.data.sortBy.order : 'desc',\n field: this.data.sortBy ? this.data.sortBy.field : 'createdAt',\n };\n\n if (this.data.pagination === false) {\n this.arrange = {\n filters: [],\n sortBy: this.sortBy,\n };\n this.dataSource.data = [...this.items];\n this.totalItems = this.items.length;\n this.currentArrange = '';\n this.cdr.markForCheck();\n } else {\n await this.loadItemsPaginated('reload', true);\n this.currentArrange = '';\n this.paginator.firstPage();\n this.cdr.markForCheck();\n }\n }\n\n // NAVIGATION METHODS\n\n goToDetails(row: T): void {\n if (this.data.isNotClickable) {\n return;\n }\n const urlPath = this.data.url || this.data.name;\n const rowWithId = row as Record<string, unknown> & { id: string };\n const url = this.router.serializeUrl(\n this.router.createUrlTree([`/${urlPath}`, rowWithId.id]),\n );\n window.open(url, '_blank');\n }\n\n // RELATION METHODS\n\n async getRelation(params: {\n id: string;\n collection: string;\n newProperty: string;\n }): Promise<string> {\n try {\n let snapshot: firestore.DocumentSnapshot<unknown> | undefined;\n if (\n params.id !== '' &&\n params.id !== undefined &&\n params.collection !== undefined &&\n params.collection !== ''\n ) {\n snapshot = await firstValueFrom(\n this.firestore.collection(params.collection).doc(params.id).get(),\n );\n }\n if (snapshot && snapshot.exists) {\n const data = snapshot.data() as Record<string, unknown> | undefined;\n const value = data?.[params.newProperty];\n return typeof value === 'string' ? value : '';\n }\n return '';\n } catch (e) {\n console.error(e);\n return '';\n }\n }\n\n private async loadRelations(): Promise<void> {\n const relationPromises = this.data.displayedColumns\n .filter((col) => col.relation)\n .flatMap((col) =>\n this.items.map(async (item) => {\n if (col.relation) {\n const itemRecord = item as Record<string, unknown>;\n itemRecord[col.property] = await this.getRelation({\n id: String(itemRecord[col.relation.sourceProperty] ?? ''),\n collection: col.relation.targetedCollection,\n newProperty: col.relation.targetedProperty || col.property,\n });\n }\n }),\n );\n\n await Promise.all(relationPromises);\n }\n\n async getQueryLength(params: {\n item: T;\n relation: {\n collection: string;\n property: string;\n operator: WhereFilterOp;\n value: string;\n };\n }): Promise<number> {\n const itemRecord = params.item as Record<string, unknown>;\n const snapshot = await this.firestore\n .collection(params.relation.collection)\n .ref.where(\n params.relation.property,\n params.relation.operator,\n itemRecord[params.relation.value],\n )\n .get();\n return snapshot.size;\n }\n\n private async loadQueryLengths(): Promise<void> {\n const lengthPromises = this.data.displayedColumns\n .filter((col) => col.queryLength)\n .flatMap((col) =>\n this.items.map(async (item) => {\n if (col.queryLength) {\n const itemRecord = item as Record<string, unknown>;\n itemRecord[col.property] = await this.getQueryLength({\n item: item,\n relation: col.queryLength,\n });\n }\n }),\n );\n await Promise.all(lengthPromises);\n }\n\n private filterItems(): void {\n if (this.data.conditions) {\n this.data.conditions.forEach((cond) => {\n this.items = this.items.filter((item) => {\n const operatorFunction =\n this.tableService.operators[\n cond.operator as keyof typeof this.tableService.operators\n ];\n if (operatorFunction) {\n const itemRecord = item as Record<string, unknown>;\n return operatorFunction(\n itemRecord[cond.firestoreProperty],\n cond.dashProperty,\n );\n }\n return false;\n });\n });\n }\n }\n\n // PUBLIC METHODS\n\n async reloadTable(): Promise<void> {\n if (this.data.pagination) {\n await this.loadItemsPaginated('reload', true);\n this.paginator.firstPage();\n this.cdr.markForCheck();\n } else {\n await this.loadItems();\n }\n }\n\n updateDisplayedColumns(): void {\n if (this.dataSource) {\n this.dataSource = new MatTableDataSource<T>([]);\n }\n\n this.columnProperties = this.data.displayedColumns.map(\n (column) => column.property,\n );\n\n const filterConfig = this.filterService.initializeDropdownItems(\n this.data.displayedColumns,\n );\n this.dropdownItems = filterConfig.dropdownItems;\n this.sortableDropdownItems = filterConfig.sortableDropdownItems;\n\n if (this.data.filterableOptions) {\n this.dropdownItems = this.filterService.addFilterableOptions(\n this.dropdownItems,\n this.data.filterableOptions,\n );\n }\n this.cdr.markForCheck();\n }\n\n shouldShowActionButton(): boolean {\n if (!this.data?.actionButton) {\n return false;\n }\n\n if (!this.data.actionButton.condition) {\n return true;\n }\n\n try {\n return this.data.actionButton.condition(null) ?? true;\n } catch {\n return true;\n }\n }\n\n handleDownload(): void {\n if (!this.downloadTable) return;\n\n if (this.data.pagination === false) {\n if (this.dataSource && this.dataSource.filteredData) {\n this.filteredItems = [...this.dataSource.filteredData];\n }\n\n const arrange = this.buildArrangeFromFilters();\n this.downloadTable(arrange, this.data.conditions || []);\n } else {\n if (this.arrange) {\n this.downloadTable(this.arrange, this.data.conditions || []);\n }\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\n\n// Angular Material\nimport { MatTableModule } from '@angular/material/table';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDialogModule } from '@angular/material/dialog';\n\n// Components\nimport { NgFirebaseTableKxpComponent } from './ng-firebase-table-kxp.component';\nimport { TableComponent } from './components/table/table.component';\nimport { TableTabsComponent } from './components/table-tabs/table-tabs.component';\nimport { TableTooltipComponent } from './components/table-tooltip/table-tooltip.component';\n\n// Services\nimport { TableService } from './services/table.service';\nimport { FilterService } from './services/filter.service';\nimport { TooltipService } from './services/tooltip.service';\nimport { PaginationService } from './services/pagination.service';\n\n@NgModule({\n declarations: [\n NgFirebaseTableKxpComponent,\n TableComponent,\n TableTabsComponent,\n TableTooltipComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n RouterModule,\n MatTableModule,\n MatPaginatorModule,\n MatSortModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatTooltipModule,\n MatProgressSpinnerModule,\n MatIconModule,\n MatDialogModule,\n ],\n exports: [\n NgFirebaseTableKxpComponent,\n TableComponent,\n TableTabsComponent,\n TableTooltipComponent,\n ],\n providers: [TableService, FilterService, TooltipService, PaginationService],\n})\nexport class NgFirebaseTableKxpModule {}\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgFirebaseTableKxpService {\r\n constructor() {}\r\n}\r\n","/*\r\n * Public API Surface of ng-firebase-table-kxp\r\n */\r\n\r\n// Main module\r\nexport * from './lib/ng-firebase-table-kxp.module';\r\n\r\n// Legacy components (se existirem)\r\nexport * from './lib/ng-firebase-table-kxp.service';\r\nexport * from './lib/ng-firebase-table-kxp.component';\r\n\r\n// Components\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/table-tabs/table-tabs.component';\r\nexport * from './lib/components/table-tooltip/table-tooltip.component';\r\n\r\n// Services\r\nexport * from './lib/services/table.service';\r\nexport * from './lib/services/filter.service';\r\nexport * from './lib/services/tooltip.service';\r\nexport * from './lib/services/pagination.service';\r\n\r\n// Types\r\nexport * from './lib/types/Table';\r\n\r\n// Utils\r\nexport * from './lib/utils/table.utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TableService","i1","i2.TableService","i3.FilterService","i4.TooltipService","i5.PaginationService","i6"],"mappings":"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"}