@iclips/ui 2.0.3 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/DESIGN.md +246 -0
  2. package/MIGRATION-v3.md +244 -0
  3. package/README.md +4 -0
  4. package/dist/alert-theme.css +20 -79
  5. package/dist/components/ui/charts/donut-chart.cjs +1 -1
  6. package/dist/components/ui/charts/donut-chart.cjs.map +1 -1
  7. package/dist/components/ui/charts/donut-chart.js +39 -60
  8. package/dist/components/ui/charts/donut-chart.js.map +1 -1
  9. package/dist/components/ui/charts/kpi-card.cjs +1 -1
  10. package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
  11. package/dist/components/ui/charts/kpi-card.js +19 -19
  12. package/dist/components/ui/charts/kpi-card.js.map +1 -1
  13. package/dist/components/ui/data/comment-system.cjs +1 -1
  14. package/dist/components/ui/data/comment-system.cjs.map +1 -1
  15. package/dist/components/ui/data/comment-system.js +67 -67
  16. package/dist/components/ui/data/comment-system.js.map +1 -1
  17. package/dist/components/ui/data/data-table.cjs +1 -1
  18. package/dist/components/ui/data/data-table.cjs.map +1 -1
  19. package/dist/components/ui/data/data-table.js +112 -101
  20. package/dist/components/ui/data/data-table.js.map +1 -1
  21. package/dist/components/ui/data/editorial-calendar.cjs +1 -1
  22. package/dist/components/ui/data/editorial-calendar.cjs.map +1 -1
  23. package/dist/components/ui/data/editorial-calendar.js +291 -291
  24. package/dist/components/ui/data/editorial-calendar.js.map +1 -1
  25. package/dist/components/ui/data/filter-builder.cjs +1 -1
  26. package/dist/components/ui/data/filter-builder.cjs.map +1 -1
  27. package/dist/components/ui/data/filter-builder.js +1 -1
  28. package/dist/components/ui/data/filter-builder.js.map +1 -1
  29. package/dist/components/ui/feedback/empty-state.cjs +1 -1
  30. package/dist/components/ui/feedback/empty-state.cjs.map +1 -1
  31. package/dist/components/ui/feedback/empty-state.js +14 -14
  32. package/dist/components/ui/feedback/empty-state.js.map +1 -1
  33. package/dist/components/ui/feedback/toast.cjs +1 -1
  34. package/dist/components/ui/feedback/toast.cjs.map +1 -1
  35. package/dist/components/ui/feedback/toast.js +53 -22
  36. package/dist/components/ui/feedback/toast.js.map +1 -1
  37. package/dist/components/ui/forms/calendar.cjs +1 -1
  38. package/dist/components/ui/forms/calendar.cjs.map +1 -1
  39. package/dist/components/ui/forms/calendar.js +16 -16
  40. package/dist/components/ui/forms/calendar.js.map +1 -1
  41. package/dist/components/ui/forms/combobox.cjs +1 -1
  42. package/dist/components/ui/forms/combobox.cjs.map +1 -1
  43. package/dist/components/ui/forms/combobox.js +78 -76
  44. package/dist/components/ui/forms/combobox.js.map +1 -1
  45. package/dist/components/ui/forms/file-attachment-list.cjs +1 -1
  46. package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -1
  47. package/dist/components/ui/forms/file-attachment-list.js +4 -4
  48. package/dist/components/ui/forms/file-attachment-list.js.map +1 -1
  49. package/dist/components/ui/forms/file-upload-zone.cjs +2 -2
  50. package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -1
  51. package/dist/components/ui/forms/file-upload-zone.js +55 -49
  52. package/dist/components/ui/forms/file-upload-zone.js.map +1 -1
  53. package/dist/components/ui/forms/form.cjs +1 -1
  54. package/dist/components/ui/forms/form.cjs.map +1 -1
  55. package/dist/components/ui/forms/form.js +11 -11
  56. package/dist/components/ui/forms/form.js.map +1 -1
  57. package/dist/components/ui/forms/input-validation.cjs +1 -1
  58. package/dist/components/ui/forms/input-validation.cjs.map +1 -1
  59. package/dist/components/ui/forms/input-validation.js +20 -20
  60. package/dist/components/ui/forms/input-validation.js.map +1 -1
  61. package/dist/components/ui/forms/multi-select.cjs +1 -1
  62. package/dist/components/ui/forms/multi-select.cjs.map +1 -1
  63. package/dist/components/ui/forms/multi-select.js +69 -67
  64. package/dist/components/ui/forms/multi-select.js.map +1 -1
  65. package/dist/components/ui/forms/radio-group.cjs +1 -1
  66. package/dist/components/ui/forms/radio-group.cjs.map +1 -1
  67. package/dist/components/ui/forms/radio-group.js +19 -19
  68. package/dist/components/ui/forms/radio-group.js.map +1 -1
  69. package/dist/components/ui/forms/social-button.cjs +1 -1
  70. package/dist/components/ui/forms/social-button.cjs.map +1 -1
  71. package/dist/components/ui/forms/social-button.js +6 -6
  72. package/dist/components/ui/forms/social-button.js.map +1 -1
  73. package/dist/components/ui/forms/toggle.cjs +1 -1
  74. package/dist/components/ui/forms/toggle.cjs.map +1 -1
  75. package/dist/components/ui/forms/toggle.js +7 -7
  76. package/dist/components/ui/forms/toggle.js.map +1 -1
  77. package/dist/components/ui/navigation/navigation-menu.cjs +1 -1
  78. package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -1
  79. package/dist/components/ui/navigation/navigation-menu.js +14 -14
  80. package/dist/components/ui/navigation/navigation-menu.js.map +1 -1
  81. package/dist/components/ui/navigation/sidebar.cjs +1 -1
  82. package/dist/components/ui/navigation/sidebar.cjs.map +1 -1
  83. package/dist/components/ui/navigation/sidebar.js +44 -44
  84. package/dist/components/ui/navigation/sidebar.js.map +1 -1
  85. package/dist/components/ui/overlays/context-menu.cjs +1 -1
  86. package/dist/components/ui/overlays/context-menu.cjs.map +1 -1
  87. package/dist/components/ui/overlays/context-menu.js +1 -1
  88. package/dist/components/ui/overlays/context-menu.js.map +1 -1
  89. package/dist/components/ui/overlays/dropdown-menu.cjs +1 -1
  90. package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -1
  91. package/dist/components/ui/overlays/dropdown-menu.js +5 -5
  92. package/dist/components/ui/overlays/dropdown-menu.js.map +1 -1
  93. package/dist/components/ui/overlays/menubar.cjs +1 -1
  94. package/dist/components/ui/overlays/menubar.cjs.map +1 -1
  95. package/dist/components/ui/overlays/menubar.js +29 -29
  96. package/dist/components/ui/overlays/menubar.js.map +1 -1
  97. package/dist/components/ui/overlays/tooltip.cjs +1 -1
  98. package/dist/components/ui/overlays/tooltip.cjs.map +1 -1
  99. package/dist/components/ui/overlays/tooltip.js +12 -12
  100. package/dist/components/ui/overlays/tooltip.js.map +1 -1
  101. package/dist/components/ui/primitives/avatar.cjs +1 -1
  102. package/dist/components/ui/primitives/avatar.cjs.map +1 -1
  103. package/dist/components/ui/primitives/avatar.js +20 -27
  104. package/dist/components/ui/primitives/avatar.js.map +1 -1
  105. package/dist/components/ui/primitives/badge.cjs +1 -1
  106. package/dist/components/ui/primitives/badge.cjs.map +1 -1
  107. package/dist/components/ui/primitives/badge.js +21 -18
  108. package/dist/components/ui/primitives/badge.js.map +1 -1
  109. package/dist/components/ui/primitives/button.cjs +1 -1
  110. package/dist/components/ui/primitives/button.cjs.map +1 -1
  111. package/dist/components/ui/primitives/button.js +11 -8
  112. package/dist/components/ui/primitives/button.js.map +1 -1
  113. package/dist/index.cjs +1 -1
  114. package/dist/index.css +1 -1
  115. package/dist/index.d.cts +6 -6
  116. package/dist/index.d.ts +6 -6
  117. package/dist/index.js +34 -35
  118. package/dist/index.js.map +1 -1
  119. package/dist/preset.css +1 -2
  120. package/dist/toast-theme.css +100 -64
  121. package/dist/tokens.css +59 -159
  122. package/docs/README.md +44 -0
  123. package/docs/acoes.md +103 -0
  124. package/docs/escolha.md +171 -0
  125. package/docs/formularios.md +137 -0
  126. package/docs/mensagens.md +114 -0
  127. package/docs/overlays.md +192 -0
  128. package/docs/status.md +71 -0
  129. package/package.json +7 -3
  130. package/scripts/check-colors.mjs +208 -0
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.cjs","sources":["../../../../src/components/ui/data/data-table.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\nimport { TablePagination } from \"./table-pagination\";\nimport { Skeleton } from \"../primitives/skeleton\";\nimport { ArrowUpDown } from \"lucide-react\";\nimport { useDataTable } from \"../../../hooks/use-data-table\";\nimport { useDataTableFilters } from \"../../../hooks/use-data-table-filters\";\nimport { ColumnDef, SortConfig, ServerSideConfig, EmptyStateConfig } from \"./table-types\";\nimport { cn } from \"../utils\";\nimport { FilterBar } from \"./filter-bar\";\nimport { FilterCondition, FilterField } from \"./filter-builder\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { DataTableEmptyState } from \"./data-table-empty-state\";\n\ninterface DataTableProps<T extends object> {\n data: T[];\n columns: ColumnDef<T>[];\n\n // Configuração de busca\n searchPlaceholder?: string;\n searchableColumns?: (keyof T)[]; // Colunas que podem ser pesquisadas\n enableSearch?: boolean;\n\n // Configuração de filtros\n filterFields?: FilterField[]; // Campos de filtro avançado\n enableFilters?: boolean;\n initialFilters?: FilterCondition[]; // Filtros iniciais/externos\n\n // Paginação\n pageSizeOptions?: number[];\n initialPageSize?: number;\n\n // Conteúdo adicional da barra de ferramentas\n toolbarActions?: React.ReactNode;\n\n // Configuração server-side\n serverConfig?: ServerSideConfig<T>;\n\n // Estado de carregamento e vazio\n isLoading?: boolean;\n /**\n * Configuração do empty state.\n * Suporta tanto config completo (EmptyStateConfig) quanto string simples (retrocompatibilidade).\n */\n emptyState?: EmptyStateConfig | string;\n /** @deprecated Use emptyState ao invés de emptyMessage */\n emptyMessage?: string;\n\n className?: string;\n}\n\nexport function DataTable<T extends object>({\n data,\n columns,\n searchPlaceholder = \"Buscar...\",\n searchableColumns,\n enableSearch = true,\n filterFields = [],\n enableFilters = false,\n initialFilters = [],\n pageSizeOptions = [5, 10, 20, 50],\n initialPageSize = 10,\n toolbarActions,\n serverConfig,\n isLoading = false,\n emptyState,\n emptyMessage, // deprecated\n className,\n}: DataTableProps<T>) {\n // Detectar se está em modo server-side\n const isServerMode = !!serverConfig;\n const {\n data: processedData,\n state,\n handlers,\n getSortDirection,\n } = useDataTable({\n data,\n initialPageSize,\n initialSort: { column: null, direction: null },\n serverMode: isServerMode,\n totalItems: serverConfig?.totalItems,\n serverCurrentPage: serverConfig?.currentPage,\n serverCurrentPageSize: serverConfig?.currentPageSize,\n });\n\n // Auto-detect searchable column\n const defaultSearchColumn = searchableColumns\n ? searchableColumns[0]\n : (columns.find(c => c.key === \"nome\" || c.key === \"name\" || c.key === \"title\" || c.key === \"titulo\")?.key || columns[0]?.key);\n\n const {\n searchQuery,\n handleSearchChange,\n advancedFilters,\n setAdvancedFilters,\n filterDialogOpen,\n setFilterDialogOpen,\n activeFilterChips,\n handleApplyFilters,\n handleClearAllFilters,\n clearSearchAndFilters,\n } = useDataTableFilters<T>({\n initialFilters,\n filterFields,\n isServerMode,\n serverConfig,\n handlers,\n defaultSearchColumn,\n });\n\n // Handle sort - server-side aware\n const handleSort = useCallback(async (column: keyof T) => {\n if (isServerMode && serverConfig?.onSortChange) {\n // Calcular novo sortConfig\n const currentSort = state.sort;\n let newDirection: 'asc' | 'desc' | null = 'asc';\n\n if (currentSort.column === column) {\n newDirection = currentSort.direction === 'asc' ? 'desc' :\n currentSort.direction === 'desc' ? null : 'asc';\n }\n\n const newSortConfig: SortConfig<T> = {\n column: newDirection ? column : null,\n direction: newDirection\n };\n\n // Atualizar estado interno primeiro para mostrar indicador visual\n handlers.onSort(column);\n\n // Depois chamar callback do servidor\n await serverConfig.onSortChange(newSortConfig);\n } else {\n // Client-side: usar handler padrão\n handlers.onSort(column);\n }\n }, [isServerMode, serverConfig, state.sort, handlers]);\n\n // Handle page change - server-side aware\n const handlePageChange = useCallback(async (page: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(page, state.pagination.pageSize);\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageChange) {\n state.pagination.onPageChange(page);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n // Handle page size change - server-side aware\n const handlePageSizeChange = useCallback(async (newSize: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(1, newSize); // Reset para página 1\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageSizeChange) {\n state.pagination.onPageSizeChange(newSize);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {/* Toolbar — only rendered when there is at least one visible element */}\n <DataTableToolbar\n enableSearch={enableSearch}\n searchPlaceholder={searchPlaceholder}\n searchQuery={searchQuery}\n onSearchChange={handleSearchChange}\n enableFilters={enableFilters}\n filterFields={filterFields}\n advancedFilters={advancedFilters}\n onAdvancedFiltersChange={setAdvancedFilters}\n filterDialogOpen={filterDialogOpen}\n onFilterDialogOpenChange={setFilterDialogOpen}\n onApplyFilters={handleApplyFilters}\n toolbarActions={toolbarActions}\n />\n\n {/* Active Filter Chips */}\n {advancedFilters.length > 0 && (\n <FilterBar\n activeFilters={activeFilterChips}\n onClearAll={handleClearAllFilters}\n />\n )}\n\n {/* Table */}\n <div className=\"rounded-md border overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={cn(\n column.headerClassName,\n column.sortable && \"cursor-pointer select-none hover:bg-muted/50 transition-colors\",\n column.sortable && getSortDirection(column.key) && \"text-primary\"\n )}\n style={{ width: column.width }}\n onClick={() => column.sortable && handleSort(column.key)}\n aria-sort={column.sortable ? (getSortDirection(column.key) === \"asc\" ? \"ascending\" : getSortDirection(column.key) === \"desc\" ? \"descending\" : \"none\") : undefined}\n >\n {column.header}\n {column.sortable && getSortDirection(column.key) && (\n <ArrowUpDown className=\"ml-2 h-4 w-4 inline\" />\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoading ? (\n // SKELETON ROWS - limitar a max 15 para performance\n Array.from({ length: Math.min(state.pagination.pageSize, 15) }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n {columns.map((col, j) => (\n <TableCell key={j} className={col.className}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : processedData.length > 0 ? (\n // DADOS NORMAIS\n processedData.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n className={cn(\n column.className,\n column.align ? `text-${column.align}` : \"text-left\",\n column.onCellClick && \"cursor-pointer hover:text-primary\"\n )}\n onClick={column.onCellClick\n ? () => column.onCellClick!(row[column.key], row, rowIndex)\n : undefined}\n >\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : (row[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n // EMPTY STATE\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"h-64\"\n >\n <DataTableEmptyState\n emptyState={emptyState}\n emptyMessage={emptyMessage}\n hasActiveFilters={advancedFilters.length > 0}\n hasSearch={searchQuery.trim().length > 0}\n onClearFilters={clearSearchAndFilters}\n />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n <TablePagination\n currentPage={state.pagination.currentPage}\n totalPages={Math.ceil(state.pagination.totalItems / state.pagination.pageSize)}\n pageSize={state.pagination.pageSize}\n totalItems={state.pagination.totalItems}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n pageSizeOptions={pageSizeOptions}\n />\n </div>\n );\n}\n"],"names":["DataTable","data","columns","searchPlaceholder","searchableColumns","enableSearch","filterFields","enableFilters","initialFilters","pageSizeOptions","initialPageSize","toolbarActions","serverConfig","isLoading","emptyState","emptyMessage","className","isServerMode","processedData","state","handlers","getSortDirection","useDataTable","defaultSearchColumn","_a","c","_b","searchQuery","handleSearchChange","advancedFilters","setAdvancedFilters","filterDialogOpen","setFilterDialogOpen","activeFilterChips","handleApplyFilters","handleClearAllFilters","clearSearchAndFilters","useDataTableFilters","handleSort","useCallback","column","currentSort","newDirection","newSortConfig","handlePageChange","page","handlePageSizeChange","newSize","cn","jsx","DataTableToolbar","FilterBar","Table","TableHeader","TableRow","jsxs","TableHead","ArrowUpDown","TableBody","_","i","col","j","TableCell","Skeleton","row","rowIndex","DataTableEmptyState","TablePagination"],"mappings":"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"}
1
+ {"version":3,"file":"data-table.cjs","sources":["../../../../src/components/ui/data/data-table.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\nimport { TablePagination } from \"./table-pagination\";\nimport { Skeleton } from \"../primitives/skeleton\";\nimport { ArrowUpDown } from \"lucide-react\";\nimport { useDataTable } from \"../../../hooks/use-data-table\";\nimport { useDataTableFilters } from \"../../../hooks/use-data-table-filters\";\nimport { ColumnDef, SortConfig, ServerSideConfig, EmptyStateConfig } from \"./table-types\";\nimport { cn } from \"../utils\";\nimport { FilterBar } from \"./filter-bar\";\nimport { FilterCondition, FilterField } from \"./filter-builder\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { DataTableEmptyState } from \"./data-table-empty-state\";\n\ninterface DataTableProps<T extends object> {\n data: T[];\n columns: ColumnDef<T>[];\n\n // Configuração de busca\n searchPlaceholder?: string;\n searchableColumns?: (keyof T)[]; // Colunas que podem ser pesquisadas\n enableSearch?: boolean;\n\n // Configuração de filtros\n filterFields?: FilterField[]; // Campos de filtro avançado\n enableFilters?: boolean;\n initialFilters?: FilterCondition[]; // Filtros iniciais/externos\n\n // Paginação\n pageSizeOptions?: number[];\n initialPageSize?: number;\n\n // Conteúdo adicional da barra de ferramentas\n toolbarActions?: React.ReactNode;\n\n // Configuração server-side\n serverConfig?: ServerSideConfig<T>;\n\n // Estado de carregamento e vazio\n isLoading?: boolean;\n /**\n * Configuração do empty state.\n * Suporta tanto config completo (EmptyStateConfig) quanto string simples (retrocompatibilidade).\n */\n emptyState?: EmptyStateConfig | string;\n /** @deprecated Use emptyState ao invés de emptyMessage */\n emptyMessage?: string;\n\n className?: string;\n}\n\nexport function DataTable<T extends object>({\n data,\n columns,\n searchPlaceholder = \"Buscar...\",\n searchableColumns,\n enableSearch = true,\n filterFields = [],\n enableFilters = false,\n initialFilters = [],\n pageSizeOptions = [5, 10, 20, 50],\n initialPageSize = 10,\n toolbarActions,\n serverConfig,\n isLoading = false,\n emptyState,\n emptyMessage, // deprecated\n className,\n}: DataTableProps<T>) {\n // Detectar se está em modo server-side\n const isServerMode = !!serverConfig;\n const {\n data: processedData,\n state,\n handlers,\n getSortDirection,\n } = useDataTable({\n data,\n initialPageSize,\n initialSort: { column: null, direction: null },\n serverMode: isServerMode,\n totalItems: serverConfig?.totalItems,\n serverCurrentPage: serverConfig?.currentPage,\n serverCurrentPageSize: serverConfig?.currentPageSize,\n });\n\n // Auto-detect searchable column\n const defaultSearchColumn = searchableColumns\n ? searchableColumns[0]\n : (columns.find(c => c.key === \"nome\" || c.key === \"name\" || c.key === \"title\" || c.key === \"titulo\")?.key || columns[0]?.key);\n\n const {\n searchQuery,\n handleSearchChange,\n advancedFilters,\n setAdvancedFilters,\n filterDialogOpen,\n setFilterDialogOpen,\n activeFilterChips,\n handleApplyFilters,\n handleClearAllFilters,\n clearSearchAndFilters,\n } = useDataTableFilters<T>({\n initialFilters,\n filterFields,\n isServerMode,\n serverConfig,\n handlers,\n defaultSearchColumn,\n });\n\n // Handle sort - server-side aware\n const handleSort = useCallback(async (column: keyof T) => {\n if (isServerMode && serverConfig?.onSortChange) {\n // Calcular novo sortConfig\n const currentSort = state.sort;\n let newDirection: 'asc' | 'desc' | null = 'asc';\n\n if (currentSort.column === column) {\n newDirection = currentSort.direction === 'asc' ? 'desc' :\n currentSort.direction === 'desc' ? null : 'asc';\n }\n\n const newSortConfig: SortConfig<T> = {\n column: newDirection ? column : null,\n direction: newDirection\n };\n\n // Atualizar estado interno primeiro para mostrar indicador visual\n handlers.onSort(column);\n\n // Depois chamar callback do servidor\n await serverConfig.onSortChange(newSortConfig);\n } else {\n // Client-side: usar handler padrão\n handlers.onSort(column);\n }\n }, [isServerMode, serverConfig, state.sort, handlers]);\n\n // Handle page change - server-side aware\n const handlePageChange = useCallback(async (page: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(page, state.pagination.pageSize);\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageChange) {\n state.pagination.onPageChange(page);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n // Handle page size change - server-side aware\n const handlePageSizeChange = useCallback(async (newSize: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(1, newSize); // Reset para página 1\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageSizeChange) {\n state.pagination.onPageSizeChange(newSize);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {/* Toolbar — only rendered when there is at least one visible element */}\n <DataTableToolbar\n enableSearch={enableSearch}\n searchPlaceholder={searchPlaceholder}\n searchQuery={searchQuery}\n onSearchChange={handleSearchChange}\n enableFilters={enableFilters}\n filterFields={filterFields}\n advancedFilters={advancedFilters}\n onAdvancedFiltersChange={setAdvancedFilters}\n filterDialogOpen={filterDialogOpen}\n onFilterDialogOpenChange={setFilterDialogOpen}\n onApplyFilters={handleApplyFilters}\n toolbarActions={toolbarActions}\n />\n\n {/* Active Filter Chips */}\n {advancedFilters.length > 0 && (\n <FilterBar\n activeFilters={activeFilterChips}\n onClearAll={handleClearAllFilters}\n />\n )}\n\n {/* Table */}\n <div className=\"rounded-md border overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={cn(\n column.sortable && \"select-none p-0\",\n column.sortable && getSortDirection(column.key) && \"text-primary\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n aria-sort={column.sortable ? (getSortDirection(column.key) === \"asc\" ? \"ascending\" : getSortDirection(column.key) === \"desc\" ? \"descending\" : \"none\") : undefined}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => handleSort(column.key)}\n className={cn(\n \"flex h-10 w-full items-center gap-2 px-2 text-left font-semibold whitespace-nowrap cursor-pointer hover:bg-muted/50 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n column.align === \"right\" && \"justify-end text-right\",\n column.align === \"center\" && \"justify-center text-center\"\n )}\n >\n {column.header}\n {getSortDirection(column.key) && <ArrowUpDown className=\"h-4 w-4 shrink-0\" />}\n </button>\n ) : (\n column.header\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoading ? (\n // SKELETON ROWS - limitar a max 15 para performance\n Array.from({ length: Math.min(state.pagination.pageSize, 15) }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n {columns.map((col, j) => (\n <TableCell key={j} className={col.className}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : processedData.length > 0 ? (\n // DADOS NORMAIS\n processedData.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n className={cn(\n column.className,\n column.align ? `text-${column.align}` : \"text-left\",\n column.onCellClick && \"cursor-pointer hover:text-primary\"\n )}\n onClick={column.onCellClick\n ? () => column.onCellClick!(row[column.key], row, rowIndex)\n : undefined}\n >\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : (row[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n // EMPTY STATE\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"h-64\"\n >\n <DataTableEmptyState\n emptyState={emptyState}\n emptyMessage={emptyMessage}\n hasActiveFilters={advancedFilters.length > 0}\n hasSearch={searchQuery.trim().length > 0}\n onClearFilters={clearSearchAndFilters}\n />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n <TablePagination\n currentPage={state.pagination.currentPage}\n totalPages={Math.ceil(state.pagination.totalItems / state.pagination.pageSize)}\n pageSize={state.pagination.pageSize}\n totalItems={state.pagination.totalItems}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n pageSizeOptions={pageSizeOptions}\n />\n </div>\n );\n}\n"],"names":["DataTable","data","columns","searchPlaceholder","searchableColumns","enableSearch","filterFields","enableFilters","initialFilters","pageSizeOptions","initialPageSize","toolbarActions","serverConfig","isLoading","emptyState","emptyMessage","className","isServerMode","processedData","state","handlers","getSortDirection","useDataTable","defaultSearchColumn","_a","c","_b","searchQuery","handleSearchChange","advancedFilters","setAdvancedFilters","filterDialogOpen","setFilterDialogOpen","activeFilterChips","handleApplyFilters","handleClearAllFilters","clearSearchAndFilters","useDataTableFilters","handleSort","useCallback","column","currentSort","newDirection","newSortConfig","handlePageChange","page","handlePageSizeChange","newSize","cn","jsx","DataTableToolbar","FilterBar","Table","TableHeader","TableRow","TableHead","jsxs","ArrowUpDown","TableBody","_","i","col","j","TableCell","Skeleton","row","rowIndex","DataTableEmptyState","TablePagination"],"mappings":"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"}
@@ -1,160 +1,171 @@
1
- import { jsxs as g, jsx as i } from "react/jsx-runtime";
1
+ import { jsxs as y, jsx as i } from "react/jsx-runtime";
2
2
  import { useCallback as S } from "react";
3
- import { Table as X, TableHeader as Y, TableRow as s, TableHead as Z, TableBody as C, TableCell as y } from "./table.js";
4
- import { TablePagination as u } from "./table-pagination.js";
5
- import { Skeleton as f } from "../primitives/skeleton.js";
3
+ import { Table as V, TableHeader as W, TableRow as d, TableHead as X, TableBody as Y, TableCell as m } from "./table.js";
4
+ import { TablePagination as Z } from "./table-pagination.js";
5
+ import { Skeleton as C } from "../primitives/skeleton.js";
6
6
  import { ArrowUpDown as v } from "lucide-react";
7
7
  import { useDataTable as aa } from "../../../hooks/use-data-table.js";
8
8
  import { useDataTableFilters as ea } from "../../../hooks/use-data-table-filters.js";
9
- import { cn as m } from "../utils.js";
9
+ import { cn as c } from "../utils.js";
10
10
  import { FilterBar as ta } from "./filter-bar.js";
11
11
  import { DataTableToolbar as ia } from "./data-table-toolbar.js";
12
- import { DataTableEmptyState as la } from "./data-table-empty-state.js";
13
- function ka({
12
+ import { DataTableEmptyState as na } from "./data-table-empty-state.js";
13
+ function ba({
14
14
  data: N,
15
15
  columns: o,
16
- searchPlaceholder: z = "Buscar...",
17
- searchableColumns: k,
18
- enableSearch: A = !0,
19
- filterFields: b = [],
20
- enableFilters: w = !1,
21
- initialFilters: x = [],
22
- pageSizeOptions: M = [5, 10, 20, 50],
23
- initialPageSize: B = 10,
24
- toolbarActions: I,
16
+ searchPlaceholder: x = "Buscar...",
17
+ searchableColumns: b,
18
+ enableSearch: z = !0,
19
+ filterFields: k = [],
20
+ enableFilters: A = !1,
21
+ initialFilters: w = [],
22
+ pageSizeOptions: u = [5, 10, 20, 50],
23
+ initialPageSize: j = 10,
24
+ toolbarActions: M,
25
25
  serverConfig: e,
26
- isLoading: O = !1,
27
- emptyState: j,
28
- emptyMessage: H,
26
+ isLoading: B = !1,
27
+ emptyState: I,
28
+ emptyMessage: O,
29
29
  // deprecated
30
- className: $
30
+ className: H
31
31
  }) {
32
32
  var T, D;
33
33
  const r = !!e, {
34
34
  data: P,
35
- state: l,
36
- handlers: h,
37
- getSortDirection: d
35
+ state: n,
36
+ handlers: s,
37
+ getSortDirection: h
38
38
  } = aa({
39
39
  data: N,
40
- initialPageSize: B,
40
+ initialPageSize: j,
41
41
  initialSort: { column: null, direction: null },
42
42
  serverMode: r,
43
43
  totalItems: e == null ? void 0 : e.totalItems,
44
44
  serverCurrentPage: e == null ? void 0 : e.currentPage,
45
45
  serverCurrentPageSize: e == null ? void 0 : e.currentPageSize
46
- }), E = k ? k[0] : ((T = o.find((a) => a.key === "nome" || a.key === "name" || a.key === "title" || a.key === "titulo")) == null ? void 0 : T.key) || ((D = o[0]) == null ? void 0 : D.key), {
46
+ }), $ = b ? b[0] : ((T = o.find((a) => a.key === "nome" || a.key === "name" || a.key === "title" || a.key === "titulo")) == null ? void 0 : T.key) || ((D = o[0]) == null ? void 0 : D.key), {
47
47
  searchQuery: F,
48
- handleSearchChange: Q,
49
- advancedFilters: c,
50
- setAdvancedFilters: R,
51
- filterDialogOpen: U,
52
- setFilterDialogOpen: _,
53
- activeFilterChips: q,
54
- handleApplyFilters: G,
55
- handleClearAllFilters: J,
56
- clearSearchAndFilters: K
48
+ handleSearchChange: f,
49
+ advancedFilters: p,
50
+ setAdvancedFilters: E,
51
+ filterDialogOpen: Q,
52
+ setFilterDialogOpen: R,
53
+ activeFilterChips: U,
54
+ handleApplyFilters: _,
55
+ handleClearAllFilters: q,
56
+ clearSearchAndFilters: G
57
57
  } = ea({
58
- initialFilters: x,
59
- filterFields: b,
58
+ initialFilters: w,
59
+ filterFields: k,
60
60
  isServerMode: r,
61
61
  serverConfig: e,
62
- handlers: h,
63
- defaultSearchColumn: E
64
- }), L = S(async (a) => {
62
+ handlers: s,
63
+ defaultSearchColumn: $
64
+ }), J = S(async (a) => {
65
65
  if (r && (e != null && e.onSortChange)) {
66
- const n = l.sort;
66
+ const l = n.sort;
67
67
  let t = "asc";
68
- n.column === a && (t = n.direction === "asc" ? "desc" : n.direction === "desc" ? null : "asc");
69
- const p = {
68
+ l.column === a && (t = l.direction === "asc" ? "desc" : l.direction === "desc" ? null : "asc");
69
+ const g = {
70
70
  column: t ? a : null,
71
71
  direction: t
72
72
  };
73
- h.onSort(a), await e.onSortChange(p);
73
+ s.onSort(a), await e.onSortChange(g);
74
74
  } else
75
- h.onSort(a);
76
- }, [r, e, l.sort, h]), V = S(async (a) => {
77
- r && (e != null && e.onPageChange) ? await e.onPageChange(a, l.pagination.pageSize) : l.pagination.onPageChange && l.pagination.onPageChange(a);
78
- }, [r, e, l.pagination]), W = S(async (a) => {
79
- r && (e != null && e.onPageChange) ? await e.onPageChange(1, a) : l.pagination.onPageSizeChange && l.pagination.onPageSizeChange(a);
80
- }, [r, e, l.pagination]);
81
- return /* @__PURE__ */ g("div", { className: m("space-y-4", $), children: [
75
+ s.onSort(a);
76
+ }, [r, e, n.sort, s]), K = S(async (a) => {
77
+ r && (e != null && e.onPageChange) ? await e.onPageChange(a, n.pagination.pageSize) : n.pagination.onPageChange && n.pagination.onPageChange(a);
78
+ }, [r, e, n.pagination]), L = S(async (a) => {
79
+ r && (e != null && e.onPageChange) ? await e.onPageChange(1, a) : n.pagination.onPageSizeChange && n.pagination.onPageSizeChange(a);
80
+ }, [r, e, n.pagination]);
81
+ return /* @__PURE__ */ y("div", { className: c("space-y-4", H), children: [
82
82
  /* @__PURE__ */ i(
83
83
  ia,
84
84
  {
85
- enableSearch: A,
86
- searchPlaceholder: z,
85
+ enableSearch: z,
86
+ searchPlaceholder: x,
87
87
  searchQuery: F,
88
- onSearchChange: Q,
89
- enableFilters: w,
90
- filterFields: b,
91
- advancedFilters: c,
92
- onAdvancedFiltersChange: R,
93
- filterDialogOpen: U,
94
- onFilterDialogOpenChange: _,
95
- onApplyFilters: G,
96
- toolbarActions: I
88
+ onSearchChange: f,
89
+ enableFilters: A,
90
+ filterFields: k,
91
+ advancedFilters: p,
92
+ onAdvancedFiltersChange: E,
93
+ filterDialogOpen: Q,
94
+ onFilterDialogOpenChange: R,
95
+ onApplyFilters: _,
96
+ toolbarActions: M
97
97
  }
98
98
  ),
99
- c.length > 0 && /* @__PURE__ */ i(
99
+ p.length > 0 && /* @__PURE__ */ i(
100
100
  ta,
101
101
  {
102
- activeFilters: q,
103
- onClearAll: J
102
+ activeFilters: U,
103
+ onClearAll: q
104
104
  }
105
105
  ),
106
- /* @__PURE__ */ i("div", { className: "rounded-md border overflow-x-auto", children: /* @__PURE__ */ g(X, { children: [
107
- /* @__PURE__ */ i(Y, { children: /* @__PURE__ */ i(s, { children: o.map((a) => /* @__PURE__ */ g(
108
- Z,
106
+ /* @__PURE__ */ i("div", { className: "rounded-md border overflow-x-auto", children: /* @__PURE__ */ y(V, { children: [
107
+ /* @__PURE__ */ i(W, { children: /* @__PURE__ */ i(d, { children: o.map((a) => /* @__PURE__ */ i(
108
+ X,
109
109
  {
110
- className: m(
111
- a.headerClassName,
112
- a.sortable && "cursor-pointer select-none hover:bg-muted/50 transition-colors",
113
- a.sortable && d(a.key) && "text-primary"
110
+ className: c(
111
+ a.sortable && "select-none p-0",
112
+ a.sortable && h(a.key) && "text-primary",
113
+ a.headerClassName
114
114
  ),
115
115
  style: { width: a.width },
116
- onClick: () => a.sortable && L(a.key),
117
- "aria-sort": a.sortable ? d(a.key) === "asc" ? "ascending" : d(a.key) === "desc" ? "descending" : "none" : void 0,
118
- children: [
119
- a.header,
120
- a.sortable && d(a.key) && /* @__PURE__ */ i(v, { className: "ml-2 h-4 w-4 inline" })
121
- ]
116
+ "aria-sort": a.sortable ? h(a.key) === "asc" ? "ascending" : h(a.key) === "desc" ? "descending" : "none" : void 0,
117
+ children: a.sortable ? /* @__PURE__ */ y(
118
+ "button",
119
+ {
120
+ type: "button",
121
+ onClick: () => J(a.key),
122
+ className: c(
123
+ "flex h-10 w-full items-center gap-2 px-2 text-left font-semibold whitespace-nowrap cursor-pointer hover:bg-muted/50 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset",
124
+ a.align === "right" && "justify-end text-right",
125
+ a.align === "center" && "justify-center text-center"
126
+ ),
127
+ children: [
128
+ a.header,
129
+ h(a.key) && /* @__PURE__ */ i(v, { className: "h-4 w-4 shrink-0" })
130
+ ]
131
+ }
132
+ ) : a.header
122
133
  },
123
134
  String(a.key)
124
135
  )) }) }),
125
- /* @__PURE__ */ i(C, { children: O ? (
136
+ /* @__PURE__ */ i(Y, { children: B ? (
126
137
  // SKELETON ROWS - limitar a max 15 para performance
127
- Array.from({ length: Math.min(l.pagination.pageSize, 15) }).map((a, n) => /* @__PURE__ */ i(s, { children: o.map((t, p) => /* @__PURE__ */ i(y, { className: t.className, children: /* @__PURE__ */ i(f, { className: "h-4 w-full" }) }, p)) }, `skeleton-${n}`))
138
+ Array.from({ length: Math.min(n.pagination.pageSize, 15) }).map((a, l) => /* @__PURE__ */ i(d, { children: o.map((t, g) => /* @__PURE__ */ i(m, { className: t.className, children: /* @__PURE__ */ i(C, { className: "h-4 w-full" }) }, g)) }, `skeleton-${l}`))
128
139
  ) : P.length > 0 ? (
129
140
  // DADOS NORMAIS
130
- P.map((a, n) => /* @__PURE__ */ i(s, { children: o.map((t) => /* @__PURE__ */ i(
131
- y,
141
+ P.map((a, l) => /* @__PURE__ */ i(d, { children: o.map((t) => /* @__PURE__ */ i(
142
+ m,
132
143
  {
133
- className: m(
144
+ className: c(
134
145
  t.className,
135
146
  t.align ? `text-${t.align}` : "text-left",
136
147
  t.onCellClick && "cursor-pointer hover:text-primary"
137
148
  ),
138
- onClick: t.onCellClick ? () => t.onCellClick(a[t.key], a, n) : void 0,
139
- children: t.render ? t.render(a[t.key], a, n) : a[t.key]
149
+ onClick: t.onCellClick ? () => t.onCellClick(a[t.key], a, l) : void 0,
150
+ children: t.render ? t.render(a[t.key], a, l) : a[t.key]
140
151
  },
141
152
  String(t.key)
142
- )) }, n))
153
+ )) }, l))
143
154
  ) : (
144
155
  // EMPTY STATE
145
- /* @__PURE__ */ i(s, { children: /* @__PURE__ */ i(
146
- y,
156
+ /* @__PURE__ */ i(d, { children: /* @__PURE__ */ i(
157
+ m,
147
158
  {
148
159
  colSpan: o.length,
149
160
  className: "h-64",
150
161
  children: /* @__PURE__ */ i(
151
- la,
162
+ na,
152
163
  {
153
- emptyState: j,
154
- emptyMessage: H,
155
- hasActiveFilters: c.length > 0,
164
+ emptyState: I,
165
+ emptyMessage: O,
166
+ hasActiveFilters: p.length > 0,
156
167
  hasSearch: F.trim().length > 0,
157
- onClearFilters: K
168
+ onClearFilters: G
158
169
  }
159
170
  )
160
171
  }
@@ -162,20 +173,20 @@ function ka({
162
173
  ) })
163
174
  ] }) }),
164
175
  /* @__PURE__ */ i(
165
- u,
176
+ Z,
166
177
  {
167
- currentPage: l.pagination.currentPage,
168
- totalPages: Math.ceil(l.pagination.totalItems / l.pagination.pageSize),
169
- pageSize: l.pagination.pageSize,
170
- totalItems: l.pagination.totalItems,
171
- onPageChange: V,
172
- onPageSizeChange: W,
173
- pageSizeOptions: M
178
+ currentPage: n.pagination.currentPage,
179
+ totalPages: Math.ceil(n.pagination.totalItems / n.pagination.pageSize),
180
+ pageSize: n.pagination.pageSize,
181
+ totalItems: n.pagination.totalItems,
182
+ onPageChange: K,
183
+ onPageSizeChange: L,
184
+ pageSizeOptions: u
174
185
  }
175
186
  )
176
187
  ] });
177
188
  }
178
189
  export {
179
- ka as DataTable
190
+ ba as DataTable
180
191
  };
181
192
  //# sourceMappingURL=data-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","sources":["../../../../src/components/ui/data/data-table.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\nimport { TablePagination } from \"./table-pagination\";\nimport { Skeleton } from \"../primitives/skeleton\";\nimport { ArrowUpDown } from \"lucide-react\";\nimport { useDataTable } from \"../../../hooks/use-data-table\";\nimport { useDataTableFilters } from \"../../../hooks/use-data-table-filters\";\nimport { ColumnDef, SortConfig, ServerSideConfig, EmptyStateConfig } from \"./table-types\";\nimport { cn } from \"../utils\";\nimport { FilterBar } from \"./filter-bar\";\nimport { FilterCondition, FilterField } from \"./filter-builder\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { DataTableEmptyState } from \"./data-table-empty-state\";\n\ninterface DataTableProps<T extends object> {\n data: T[];\n columns: ColumnDef<T>[];\n\n // Configuração de busca\n searchPlaceholder?: string;\n searchableColumns?: (keyof T)[]; // Colunas que podem ser pesquisadas\n enableSearch?: boolean;\n\n // Configuração de filtros\n filterFields?: FilterField[]; // Campos de filtro avançado\n enableFilters?: boolean;\n initialFilters?: FilterCondition[]; // Filtros iniciais/externos\n\n // Paginação\n pageSizeOptions?: number[];\n initialPageSize?: number;\n\n // Conteúdo adicional da barra de ferramentas\n toolbarActions?: React.ReactNode;\n\n // Configuração server-side\n serverConfig?: ServerSideConfig<T>;\n\n // Estado de carregamento e vazio\n isLoading?: boolean;\n /**\n * Configuração do empty state.\n * Suporta tanto config completo (EmptyStateConfig) quanto string simples (retrocompatibilidade).\n */\n emptyState?: EmptyStateConfig | string;\n /** @deprecated Use emptyState ao invés de emptyMessage */\n emptyMessage?: string;\n\n className?: string;\n}\n\nexport function DataTable<T extends object>({\n data,\n columns,\n searchPlaceholder = \"Buscar...\",\n searchableColumns,\n enableSearch = true,\n filterFields = [],\n enableFilters = false,\n initialFilters = [],\n pageSizeOptions = [5, 10, 20, 50],\n initialPageSize = 10,\n toolbarActions,\n serverConfig,\n isLoading = false,\n emptyState,\n emptyMessage, // deprecated\n className,\n}: DataTableProps<T>) {\n // Detectar se está em modo server-side\n const isServerMode = !!serverConfig;\n const {\n data: processedData,\n state,\n handlers,\n getSortDirection,\n } = useDataTable({\n data,\n initialPageSize,\n initialSort: { column: null, direction: null },\n serverMode: isServerMode,\n totalItems: serverConfig?.totalItems,\n serverCurrentPage: serverConfig?.currentPage,\n serverCurrentPageSize: serverConfig?.currentPageSize,\n });\n\n // Auto-detect searchable column\n const defaultSearchColumn = searchableColumns\n ? searchableColumns[0]\n : (columns.find(c => c.key === \"nome\" || c.key === \"name\" || c.key === \"title\" || c.key === \"titulo\")?.key || columns[0]?.key);\n\n const {\n searchQuery,\n handleSearchChange,\n advancedFilters,\n setAdvancedFilters,\n filterDialogOpen,\n setFilterDialogOpen,\n activeFilterChips,\n handleApplyFilters,\n handleClearAllFilters,\n clearSearchAndFilters,\n } = useDataTableFilters<T>({\n initialFilters,\n filterFields,\n isServerMode,\n serverConfig,\n handlers,\n defaultSearchColumn,\n });\n\n // Handle sort - server-side aware\n const handleSort = useCallback(async (column: keyof T) => {\n if (isServerMode && serverConfig?.onSortChange) {\n // Calcular novo sortConfig\n const currentSort = state.sort;\n let newDirection: 'asc' | 'desc' | null = 'asc';\n\n if (currentSort.column === column) {\n newDirection = currentSort.direction === 'asc' ? 'desc' :\n currentSort.direction === 'desc' ? null : 'asc';\n }\n\n const newSortConfig: SortConfig<T> = {\n column: newDirection ? column : null,\n direction: newDirection\n };\n\n // Atualizar estado interno primeiro para mostrar indicador visual\n handlers.onSort(column);\n\n // Depois chamar callback do servidor\n await serverConfig.onSortChange(newSortConfig);\n } else {\n // Client-side: usar handler padrão\n handlers.onSort(column);\n }\n }, [isServerMode, serverConfig, state.sort, handlers]);\n\n // Handle page change - server-side aware\n const handlePageChange = useCallback(async (page: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(page, state.pagination.pageSize);\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageChange) {\n state.pagination.onPageChange(page);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n // Handle page size change - server-side aware\n const handlePageSizeChange = useCallback(async (newSize: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(1, newSize); // Reset para página 1\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageSizeChange) {\n state.pagination.onPageSizeChange(newSize);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {/* Toolbar — only rendered when there is at least one visible element */}\n <DataTableToolbar\n enableSearch={enableSearch}\n searchPlaceholder={searchPlaceholder}\n searchQuery={searchQuery}\n onSearchChange={handleSearchChange}\n enableFilters={enableFilters}\n filterFields={filterFields}\n advancedFilters={advancedFilters}\n onAdvancedFiltersChange={setAdvancedFilters}\n filterDialogOpen={filterDialogOpen}\n onFilterDialogOpenChange={setFilterDialogOpen}\n onApplyFilters={handleApplyFilters}\n toolbarActions={toolbarActions}\n />\n\n {/* Active Filter Chips */}\n {advancedFilters.length > 0 && (\n <FilterBar\n activeFilters={activeFilterChips}\n onClearAll={handleClearAllFilters}\n />\n )}\n\n {/* Table */}\n <div className=\"rounded-md border overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={cn(\n column.headerClassName,\n column.sortable && \"cursor-pointer select-none hover:bg-muted/50 transition-colors\",\n column.sortable && getSortDirection(column.key) && \"text-primary\"\n )}\n style={{ width: column.width }}\n onClick={() => column.sortable && handleSort(column.key)}\n aria-sort={column.sortable ? (getSortDirection(column.key) === \"asc\" ? \"ascending\" : getSortDirection(column.key) === \"desc\" ? \"descending\" : \"none\") : undefined}\n >\n {column.header}\n {column.sortable && getSortDirection(column.key) && (\n <ArrowUpDown className=\"ml-2 h-4 w-4 inline\" />\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoading ? (\n // SKELETON ROWS - limitar a max 15 para performance\n Array.from({ length: Math.min(state.pagination.pageSize, 15) }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n {columns.map((col, j) => (\n <TableCell key={j} className={col.className}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : processedData.length > 0 ? (\n // DADOS NORMAIS\n processedData.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n className={cn(\n column.className,\n column.align ? `text-${column.align}` : \"text-left\",\n column.onCellClick && \"cursor-pointer hover:text-primary\"\n )}\n onClick={column.onCellClick\n ? () => column.onCellClick!(row[column.key], row, rowIndex)\n : undefined}\n >\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : (row[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n // EMPTY STATE\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"h-64\"\n >\n <DataTableEmptyState\n emptyState={emptyState}\n emptyMessage={emptyMessage}\n hasActiveFilters={advancedFilters.length > 0}\n hasSearch={searchQuery.trim().length > 0}\n onClearFilters={clearSearchAndFilters}\n />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n <TablePagination\n currentPage={state.pagination.currentPage}\n totalPages={Math.ceil(state.pagination.totalItems / state.pagination.pageSize)}\n pageSize={state.pagination.pageSize}\n totalItems={state.pagination.totalItems}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n pageSizeOptions={pageSizeOptions}\n />\n </div>\n );\n}\n"],"names":["DataTable","data","columns","searchPlaceholder","searchableColumns","enableSearch","filterFields","enableFilters","initialFilters","pageSizeOptions","initialPageSize","toolbarActions","serverConfig","isLoading","emptyState","emptyMessage","className","isServerMode","processedData","state","handlers","getSortDirection","useDataTable","defaultSearchColumn","_a","c","_b","searchQuery","handleSearchChange","advancedFilters","setAdvancedFilters","filterDialogOpen","setFilterDialogOpen","activeFilterChips","handleApplyFilters","handleClearAllFilters","clearSearchAndFilters","useDataTableFilters","handleSort","useCallback","column","currentSort","newDirection","newSortConfig","handlePageChange","page","handlePageSizeChange","newSize","cn","jsx","DataTableToolbar","FilterBar","Table","TableHeader","TableRow","jsxs","TableHead","ArrowUpDown","TableBody","_","i","col","j","TableCell","Skeleton","row","rowIndex","DataTableEmptyState","TablePagination"],"mappings":";;;;;;;;;;;;AA0DO,SAASA,GAA4B;AAAA,EACxC,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,mBAAAC,IAAoB;AAAA,EACpB,mBAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,cAAAC,IAAe,CAAA;AAAA,EACf,eAAAC,IAAgB;AAAA,EAChB,gBAAAC,IAAiB,CAAA;AAAA,EACjB,iBAAAC,IAAkB,CAAC,GAAG,IAAI,IAAI,EAAE;AAAA,EAChC,iBAAAC,IAAkB;AAAA,EAClB,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,YAAAC;AAAA,EACA,cAAAC;AAAA;AAAA,EACA,WAAAC;AACJ,GAAsB;;AAElB,QAAMC,IAAe,CAAC,CAACL,GACjB;AAAA,IACF,MAAMM;AAAA,IACN,OAAAC;AAAA,IACA,UAAAC;AAAA,IACA,kBAAAC;AAAA,EAAA,IACAC,GAAa;AAAA,IACb,MAAArB;AAAA,IACA,iBAAAS;AAAA,IACA,aAAa,EAAE,QAAQ,MAAM,WAAW,KAAA;AAAA,IACxC,YAAYO;AAAA,IACZ,YAAYL,KAAA,gBAAAA,EAAc;AAAA,IAC1B,mBAAmBA,KAAA,gBAAAA,EAAc;AAAA,IACjC,uBAAuBA,KAAA,gBAAAA,EAAc;AAAA,EAAA,CACxC,GAGKW,IAAsBnB,IACtBA,EAAkB,CAAC,MAClBoB,IAAAtB,EAAQ,KAAK,CAAAuB,MAAKA,EAAE,QAAQ,UAAUA,EAAE,QAAQ,UAAUA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,QAAQ,MAAjG,gBAAAD,EAAoG,UAAOE,IAAAxB,EAAQ,CAAC,MAAT,gBAAAwB,EAAY,MAExH;AAAA,IACF,aAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,qBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,uBAAAC;AAAA,EAAA,IACAC,GAAuB;AAAA,IACvB,gBAAA7B;AAAA,IACA,cAAAF;AAAA,IACA,cAAAW;AAAA,IACA,cAAAL;AAAA,IACA,UAAAQ;AAAA,IACA,qBAAAG;AAAA,EAAA,CACH,GAGKe,IAAaC,EAAY,OAAOC,MAAoB;AACtD,QAAIvB,MAAgBL,KAAA,QAAAA,EAAc,eAAc;AAE5C,YAAM6B,IAActB,EAAM;AAC1B,UAAIuB,IAAsC;AAE1C,MAAID,EAAY,WAAWD,MACvBE,IAAeD,EAAY,cAAc,QAAQ,SAClCA,EAAY,cAAc,SAAS,OAAO;AAG7D,YAAME,IAA+B;AAAA,QACjC,QAAQD,IAAeF,IAAS;AAAA,QAChC,WAAWE;AAAA,MAAA;AAIf,MAAAtB,EAAS,OAAOoB,CAAM,GAGtB,MAAM5B,EAAa,aAAa+B,CAAa;AAAA,IACjD;AAEI,MAAAvB,EAAS,OAAOoB,CAAM;AAAA,EAE9B,GAAG,CAACvB,GAAcL,GAAcO,EAAM,MAAMC,CAAQ,CAAC,GAG/CwB,IAAmBL,EAAY,OAAOM,MAAiB;AACzD,IAAI5B,MAAgBL,KAAA,QAAAA,EAAc,gBAC9B,MAAMA,EAAa,aAAaiC,GAAM1B,EAAM,WAAW,QAAQ,IAG3DA,EAAM,WAAW,gBACjBA,EAAM,WAAW,aAAa0B,CAAI;AAAA,EAG9C,GAAG,CAAC5B,GAAcL,GAAcO,EAAM,UAAU,CAAC,GAG3C2B,IAAuBP,EAAY,OAAOQ,MAAoB;AAChE,IAAI9B,MAAgBL,KAAA,QAAAA,EAAc,gBAC9B,MAAMA,EAAa,aAAa,GAAGmC,CAAO,IAGtC5B,EAAM,WAAW,oBACjBA,EAAM,WAAW,iBAAiB4B,CAAO;AAAA,EAGrD,GAAG,CAAC9B,GAAcL,GAAcO,EAAM,UAAU,CAAC;AAEjD,2BACK,OAAA,EAAI,WAAW6B,EAAG,aAAahC,CAAS,GAErC,UAAA;AAAA,IAAA,gBAAAiC;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,cAAA7C;AAAA,QACA,mBAAAF;AAAA,QACA,aAAAwB;AAAA,QACA,gBAAgBC;AAAA,QAChB,eAAArB;AAAA,QACA,cAAAD;AAAA,QACA,iBAAAuB;AAAA,QACA,yBAAyBC;AAAA,QACzB,kBAAAC;AAAA,QACA,0BAA0BC;AAAA,QAC1B,gBAAgBE;AAAA,QAChB,gBAAAvB;AAAA,MAAA;AAAA,IAAA;AAAA,IAIHkB,EAAgB,SAAS,KACtB,gBAAAoB;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,eAAelB;AAAA,QACf,YAAYE;AAAA,MAAA;AAAA,IAAA;AAAA,IAKpB,gBAAAc,EAAC,OAAA,EAAI,WAAU,qCACX,4BAACG,GAAA,EACG,UAAA;AAAA,MAAA,gBAAAH,EAACI,KACG,UAAA,gBAAAJ,EAACK,GAAA,EACI,UAAApD,EAAQ,IAAI,CAACsC,MACV,gBAAAe;AAAA,QAACC;AAAA,QAAA;AAAA,UAEG,WAAWR;AAAA,YACPR,EAAO;AAAA,YACPA,EAAO,YAAY;AAAA,YACnBA,EAAO,YAAYnB,EAAiBmB,EAAO,GAAG,KAAK;AAAA,UAAA;AAAA,UAEvD,OAAO,EAAE,OAAOA,EAAO,MAAA;AAAA,UACvB,SAAS,MAAMA,EAAO,YAAYF,EAAWE,EAAO,GAAG;AAAA,UACvD,aAAWA,EAAO,WAAYnB,EAAiBmB,EAAO,GAAG,MAAM,QAAQ,cAAcnB,EAAiBmB,EAAO,GAAG,MAAM,SAAS,eAAe,SAAU;AAAA,UAEvJ,UAAA;AAAA,YAAAA,EAAO;AAAA,YACPA,EAAO,YAAYnB,EAAiBmB,EAAO,GAAG,KAC3C,gBAAAS,EAACQ,GAAA,EAAY,WAAU,sBAAA,CAAsB;AAAA,UAAA;AAAA,QAAA;AAAA,QAZ5C,OAAOjB,EAAO,GAAG;AAAA,MAAA,CAe7B,GACL,EAAA,CACJ;AAAA,wBACCkB,GAAA,EACI,UAAA7C;AAAA;AAAA,QAEG,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAIM,EAAM,WAAW,UAAU,EAAE,EAAA,CAAG,EAAE,IAAI,CAACwC,GAAGC,wBACnEN,GAAA,EACI,UAAApD,EAAQ,IAAI,CAAC2D,GAAKC,MACf,gBAAAb,EAACc,KAAkB,WAAWF,EAAI,WAC9B,UAAA,gBAAAZ,EAACe,GAAA,EAAS,WAAU,cAAa,KADrBF,CAEhB,CACH,KALU,YAAYF,CAAC,EAM5B,CACH;AAAA,UACD1C,EAAc,SAAS;AAAA;AAAA,QAEvBA,EAAc,IAAI,CAAC+C,GAAKC,wBACnBZ,GAAA,EACI,UAAApD,EAAQ,IAAI,CAACsC,MACV,gBAAAS;AAAA,UAACc;AAAA,UAAA;AAAA,YAEG,WAAWf;AAAA,cACPR,EAAO;AAAA,cACPA,EAAO,QAAQ,QAAQA,EAAO,KAAK,KAAK;AAAA,cACxCA,EAAO,eAAe;AAAA,YAAA;AAAA,YAE1B,SAASA,EAAO,cACV,MAAMA,EAAO,YAAayB,EAAIzB,EAAO,GAAG,GAAGyB,GAAKC,CAAQ,IACxD;AAAA,YAEL,UAAA1B,EAAO,SACFA,EAAO,OAAOyB,EAAIzB,EAAO,GAAG,GAAGyB,GAAKC,CAAQ,IAC3CD,EAAIzB,EAAO,GAAG;AAAA,UAAA;AAAA,UAZhB,OAAOA,EAAO,GAAG;AAAA,QAAA,CAc7B,EAAA,GAjBU0B,CAkBf,CACH;AAAA;AAAA;AAAA,0BAGAZ,GAAA,EACG,UAAA,gBAAAL;AAAA,UAACc;AAAA,UAAA;AAAA,YACG,SAAS7D,EAAQ;AAAA,YACjB,WAAU;AAAA,YAEV,UAAA,gBAAA+C;AAAA,cAACkB;AAAA,cAAA;AAAA,gBACG,YAAArD;AAAA,gBACA,cAAAC;AAAA,gBACA,kBAAkBc,EAAgB,SAAS;AAAA,gBAC3C,WAAWF,EAAY,KAAA,EAAO,SAAS;AAAA,gBACvC,gBAAgBS;AAAA,cAAA;AAAA,YAAA;AAAA,UACpB;AAAA,QAAA,EACJ,CACJ;AAAA,QAAA,CAER;AAAA,IAAA,EAAA,CACJ,EAAA,CACJ;AAAA,IAGA,gBAAAa;AAAA,MAACmB;AAAA,MAAA;AAAA,QACG,aAAajD,EAAM,WAAW;AAAA,QAC9B,YAAY,KAAK,KAAKA,EAAM,WAAW,aAAaA,EAAM,WAAW,QAAQ;AAAA,QAC7E,UAAUA,EAAM,WAAW;AAAA,QAC3B,YAAYA,EAAM,WAAW;AAAA,QAC7B,cAAcyB;AAAA,QACd,kBAAkBE;AAAA,QAClB,iBAAArC;AAAA,MAAA;AAAA,IAAA;AAAA,EACJ,GACJ;AAER;"}
1
+ {"version":3,"file":"data-table.js","sources":["../../../../src/components/ui/data/data-table.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\nimport { TablePagination } from \"./table-pagination\";\nimport { Skeleton } from \"../primitives/skeleton\";\nimport { ArrowUpDown } from \"lucide-react\";\nimport { useDataTable } from \"../../../hooks/use-data-table\";\nimport { useDataTableFilters } from \"../../../hooks/use-data-table-filters\";\nimport { ColumnDef, SortConfig, ServerSideConfig, EmptyStateConfig } from \"./table-types\";\nimport { cn } from \"../utils\";\nimport { FilterBar } from \"./filter-bar\";\nimport { FilterCondition, FilterField } from \"./filter-builder\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { DataTableEmptyState } from \"./data-table-empty-state\";\n\ninterface DataTableProps<T extends object> {\n data: T[];\n columns: ColumnDef<T>[];\n\n // Configuração de busca\n searchPlaceholder?: string;\n searchableColumns?: (keyof T)[]; // Colunas que podem ser pesquisadas\n enableSearch?: boolean;\n\n // Configuração de filtros\n filterFields?: FilterField[]; // Campos de filtro avançado\n enableFilters?: boolean;\n initialFilters?: FilterCondition[]; // Filtros iniciais/externos\n\n // Paginação\n pageSizeOptions?: number[];\n initialPageSize?: number;\n\n // Conteúdo adicional da barra de ferramentas\n toolbarActions?: React.ReactNode;\n\n // Configuração server-side\n serverConfig?: ServerSideConfig<T>;\n\n // Estado de carregamento e vazio\n isLoading?: boolean;\n /**\n * Configuração do empty state.\n * Suporta tanto config completo (EmptyStateConfig) quanto string simples (retrocompatibilidade).\n */\n emptyState?: EmptyStateConfig | string;\n /** @deprecated Use emptyState ao invés de emptyMessage */\n emptyMessage?: string;\n\n className?: string;\n}\n\nexport function DataTable<T extends object>({\n data,\n columns,\n searchPlaceholder = \"Buscar...\",\n searchableColumns,\n enableSearch = true,\n filterFields = [],\n enableFilters = false,\n initialFilters = [],\n pageSizeOptions = [5, 10, 20, 50],\n initialPageSize = 10,\n toolbarActions,\n serverConfig,\n isLoading = false,\n emptyState,\n emptyMessage, // deprecated\n className,\n}: DataTableProps<T>) {\n // Detectar se está em modo server-side\n const isServerMode = !!serverConfig;\n const {\n data: processedData,\n state,\n handlers,\n getSortDirection,\n } = useDataTable({\n data,\n initialPageSize,\n initialSort: { column: null, direction: null },\n serverMode: isServerMode,\n totalItems: serverConfig?.totalItems,\n serverCurrentPage: serverConfig?.currentPage,\n serverCurrentPageSize: serverConfig?.currentPageSize,\n });\n\n // Auto-detect searchable column\n const defaultSearchColumn = searchableColumns\n ? searchableColumns[0]\n : (columns.find(c => c.key === \"nome\" || c.key === \"name\" || c.key === \"title\" || c.key === \"titulo\")?.key || columns[0]?.key);\n\n const {\n searchQuery,\n handleSearchChange,\n advancedFilters,\n setAdvancedFilters,\n filterDialogOpen,\n setFilterDialogOpen,\n activeFilterChips,\n handleApplyFilters,\n handleClearAllFilters,\n clearSearchAndFilters,\n } = useDataTableFilters<T>({\n initialFilters,\n filterFields,\n isServerMode,\n serverConfig,\n handlers,\n defaultSearchColumn,\n });\n\n // Handle sort - server-side aware\n const handleSort = useCallback(async (column: keyof T) => {\n if (isServerMode && serverConfig?.onSortChange) {\n // Calcular novo sortConfig\n const currentSort = state.sort;\n let newDirection: 'asc' | 'desc' | null = 'asc';\n\n if (currentSort.column === column) {\n newDirection = currentSort.direction === 'asc' ? 'desc' :\n currentSort.direction === 'desc' ? null : 'asc';\n }\n\n const newSortConfig: SortConfig<T> = {\n column: newDirection ? column : null,\n direction: newDirection\n };\n\n // Atualizar estado interno primeiro para mostrar indicador visual\n handlers.onSort(column);\n\n // Depois chamar callback do servidor\n await serverConfig.onSortChange(newSortConfig);\n } else {\n // Client-side: usar handler padrão\n handlers.onSort(column);\n }\n }, [isServerMode, serverConfig, state.sort, handlers]);\n\n // Handle page change - server-side aware\n const handlePageChange = useCallback(async (page: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(page, state.pagination.pageSize);\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageChange) {\n state.pagination.onPageChange(page);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n // Handle page size change - server-side aware\n const handlePageSizeChange = useCallback(async (newSize: number) => {\n if (isServerMode && serverConfig?.onPageChange) {\n await serverConfig.onPageChange(1, newSize); // Reset para página 1\n } else {\n // Client-side: usar handler padrão\n if (state.pagination.onPageSizeChange) {\n state.pagination.onPageSizeChange(newSize);\n }\n }\n }, [isServerMode, serverConfig, state.pagination]);\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n {/* Toolbar — only rendered when there is at least one visible element */}\n <DataTableToolbar\n enableSearch={enableSearch}\n searchPlaceholder={searchPlaceholder}\n searchQuery={searchQuery}\n onSearchChange={handleSearchChange}\n enableFilters={enableFilters}\n filterFields={filterFields}\n advancedFilters={advancedFilters}\n onAdvancedFiltersChange={setAdvancedFilters}\n filterDialogOpen={filterDialogOpen}\n onFilterDialogOpenChange={setFilterDialogOpen}\n onApplyFilters={handleApplyFilters}\n toolbarActions={toolbarActions}\n />\n\n {/* Active Filter Chips */}\n {advancedFilters.length > 0 && (\n <FilterBar\n activeFilters={activeFilterChips}\n onClearAll={handleClearAllFilters}\n />\n )}\n\n {/* Table */}\n <div className=\"rounded-md border overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={cn(\n column.sortable && \"select-none p-0\",\n column.sortable && getSortDirection(column.key) && \"text-primary\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n aria-sort={column.sortable ? (getSortDirection(column.key) === \"asc\" ? \"ascending\" : getSortDirection(column.key) === \"desc\" ? \"descending\" : \"none\") : undefined}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => handleSort(column.key)}\n className={cn(\n \"flex h-10 w-full items-center gap-2 px-2 text-left font-semibold whitespace-nowrap cursor-pointer hover:bg-muted/50 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n column.align === \"right\" && \"justify-end text-right\",\n column.align === \"center\" && \"justify-center text-center\"\n )}\n >\n {column.header}\n {getSortDirection(column.key) && <ArrowUpDown className=\"h-4 w-4 shrink-0\" />}\n </button>\n ) : (\n column.header\n )}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {isLoading ? (\n // SKELETON ROWS - limitar a max 15 para performance\n Array.from({ length: Math.min(state.pagination.pageSize, 15) }).map((_, i) => (\n <TableRow key={`skeleton-${i}`}>\n {columns.map((col, j) => (\n <TableCell key={j} className={col.className}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : processedData.length > 0 ? (\n // DADOS NORMAIS\n processedData.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n className={cn(\n column.className,\n column.align ? `text-${column.align}` : \"text-left\",\n column.onCellClick && \"cursor-pointer hover:text-primary\"\n )}\n onClick={column.onCellClick\n ? () => column.onCellClick!(row[column.key], row, rowIndex)\n : undefined}\n >\n {column.render\n ? column.render(row[column.key], row, rowIndex)\n : (row[column.key] as React.ReactNode)}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n // EMPTY STATE\n <TableRow>\n <TableCell\n colSpan={columns.length}\n className=\"h-64\"\n >\n <DataTableEmptyState\n emptyState={emptyState}\n emptyMessage={emptyMessage}\n hasActiveFilters={advancedFilters.length > 0}\n hasSearch={searchQuery.trim().length > 0}\n onClearFilters={clearSearchAndFilters}\n />\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination */}\n <TablePagination\n currentPage={state.pagination.currentPage}\n totalPages={Math.ceil(state.pagination.totalItems / state.pagination.pageSize)}\n pageSize={state.pagination.pageSize}\n totalItems={state.pagination.totalItems}\n onPageChange={handlePageChange}\n onPageSizeChange={handlePageSizeChange}\n pageSizeOptions={pageSizeOptions}\n />\n </div>\n );\n}\n"],"names":["DataTable","data","columns","searchPlaceholder","searchableColumns","enableSearch","filterFields","enableFilters","initialFilters","pageSizeOptions","initialPageSize","toolbarActions","serverConfig","isLoading","emptyState","emptyMessage","className","isServerMode","processedData","state","handlers","getSortDirection","useDataTable","defaultSearchColumn","_a","c","_b","searchQuery","handleSearchChange","advancedFilters","setAdvancedFilters","filterDialogOpen","setFilterDialogOpen","activeFilterChips","handleApplyFilters","handleClearAllFilters","clearSearchAndFilters","useDataTableFilters","handleSort","useCallback","column","currentSort","newDirection","newSortConfig","handlePageChange","page","handlePageSizeChange","newSize","cn","jsx","DataTableToolbar","FilterBar","Table","TableHeader","TableRow","TableHead","jsxs","ArrowUpDown","TableBody","_","i","col","j","TableCell","Skeleton","row","rowIndex","DataTableEmptyState","TablePagination"],"mappings":"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"}