@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.
- package/DESIGN.md +246 -0
- package/MIGRATION-v3.md +244 -0
- package/README.md +4 -0
- package/dist/alert-theme.css +20 -79
- package/dist/components/ui/charts/donut-chart.cjs +1 -1
- package/dist/components/ui/charts/donut-chart.cjs.map +1 -1
- package/dist/components/ui/charts/donut-chart.js +39 -60
- package/dist/components/ui/charts/donut-chart.js.map +1 -1
- package/dist/components/ui/charts/kpi-card.cjs +1 -1
- package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
- package/dist/components/ui/charts/kpi-card.js +19 -19
- package/dist/components/ui/charts/kpi-card.js.map +1 -1
- package/dist/components/ui/data/comment-system.cjs +1 -1
- package/dist/components/ui/data/comment-system.cjs.map +1 -1
- package/dist/components/ui/data/comment-system.js +67 -67
- package/dist/components/ui/data/comment-system.js.map +1 -1
- package/dist/components/ui/data/data-table.cjs +1 -1
- package/dist/components/ui/data/data-table.cjs.map +1 -1
- package/dist/components/ui/data/data-table.js +112 -101
- package/dist/components/ui/data/data-table.js.map +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs.map +1 -1
- package/dist/components/ui/data/editorial-calendar.js +291 -291
- package/dist/components/ui/data/editorial-calendar.js.map +1 -1
- package/dist/components/ui/data/filter-builder.cjs +1 -1
- package/dist/components/ui/data/filter-builder.cjs.map +1 -1
- package/dist/components/ui/data/filter-builder.js +1 -1
- package/dist/components/ui/data/filter-builder.js.map +1 -1
- package/dist/components/ui/feedback/empty-state.cjs +1 -1
- package/dist/components/ui/feedback/empty-state.cjs.map +1 -1
- package/dist/components/ui/feedback/empty-state.js +14 -14
- package/dist/components/ui/feedback/empty-state.js.map +1 -1
- package/dist/components/ui/feedback/toast.cjs +1 -1
- package/dist/components/ui/feedback/toast.cjs.map +1 -1
- package/dist/components/ui/feedback/toast.js +53 -22
- package/dist/components/ui/feedback/toast.js.map +1 -1
- package/dist/components/ui/forms/calendar.cjs +1 -1
- package/dist/components/ui/forms/calendar.cjs.map +1 -1
- package/dist/components/ui/forms/calendar.js +16 -16
- package/dist/components/ui/forms/calendar.js.map +1 -1
- package/dist/components/ui/forms/combobox.cjs +1 -1
- package/dist/components/ui/forms/combobox.cjs.map +1 -1
- package/dist/components/ui/forms/combobox.js +78 -76
- package/dist/components/ui/forms/combobox.js.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.js +4 -4
- package/dist/components/ui/forms/file-attachment-list.js.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.cjs +2 -2
- package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.js +55 -49
- package/dist/components/ui/forms/file-upload-zone.js.map +1 -1
- package/dist/components/ui/forms/form.cjs +1 -1
- package/dist/components/ui/forms/form.cjs.map +1 -1
- package/dist/components/ui/forms/form.js +11 -11
- package/dist/components/ui/forms/form.js.map +1 -1
- package/dist/components/ui/forms/input-validation.cjs +1 -1
- package/dist/components/ui/forms/input-validation.cjs.map +1 -1
- package/dist/components/ui/forms/input-validation.js +20 -20
- package/dist/components/ui/forms/input-validation.js.map +1 -1
- package/dist/components/ui/forms/multi-select.cjs +1 -1
- package/dist/components/ui/forms/multi-select.cjs.map +1 -1
- package/dist/components/ui/forms/multi-select.js +69 -67
- package/dist/components/ui/forms/multi-select.js.map +1 -1
- package/dist/components/ui/forms/radio-group.cjs +1 -1
- package/dist/components/ui/forms/radio-group.cjs.map +1 -1
- package/dist/components/ui/forms/radio-group.js +19 -19
- package/dist/components/ui/forms/radio-group.js.map +1 -1
- package/dist/components/ui/forms/social-button.cjs +1 -1
- package/dist/components/ui/forms/social-button.cjs.map +1 -1
- package/dist/components/ui/forms/social-button.js +6 -6
- package/dist/components/ui/forms/social-button.js.map +1 -1
- package/dist/components/ui/forms/toggle.cjs +1 -1
- package/dist/components/ui/forms/toggle.cjs.map +1 -1
- package/dist/components/ui/forms/toggle.js +7 -7
- package/dist/components/ui/forms/toggle.js.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.js +14 -14
- package/dist/components/ui/navigation/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation/sidebar.cjs +1 -1
- package/dist/components/ui/navigation/sidebar.cjs.map +1 -1
- package/dist/components/ui/navigation/sidebar.js +44 -44
- package/dist/components/ui/navigation/sidebar.js.map +1 -1
- package/dist/components/ui/overlays/context-menu.cjs +1 -1
- package/dist/components/ui/overlays/context-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/context-menu.js +1 -1
- package/dist/components/ui/overlays/context-menu.js.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.js +5 -5
- package/dist/components/ui/overlays/dropdown-menu.js.map +1 -1
- package/dist/components/ui/overlays/menubar.cjs +1 -1
- package/dist/components/ui/overlays/menubar.cjs.map +1 -1
- package/dist/components/ui/overlays/menubar.js +29 -29
- package/dist/components/ui/overlays/menubar.js.map +1 -1
- package/dist/components/ui/overlays/tooltip.cjs +1 -1
- package/dist/components/ui/overlays/tooltip.cjs.map +1 -1
- package/dist/components/ui/overlays/tooltip.js +12 -12
- package/dist/components/ui/overlays/tooltip.js.map +1 -1
- package/dist/components/ui/primitives/avatar.cjs +1 -1
- package/dist/components/ui/primitives/avatar.cjs.map +1 -1
- package/dist/components/ui/primitives/avatar.js +20 -27
- package/dist/components/ui/primitives/avatar.js.map +1 -1
- package/dist/components/ui/primitives/badge.cjs +1 -1
- package/dist/components/ui/primitives/badge.cjs.map +1 -1
- package/dist/components/ui/primitives/badge.js +21 -18
- package/dist/components/ui/primitives/badge.js.map +1 -1
- package/dist/components/ui/primitives/button.cjs +1 -1
- package/dist/components/ui/primitives/button.cjs.map +1 -1
- package/dist/components/ui/primitives/button.js +11 -8
- package/dist/components/ui/primitives/button.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +34 -35
- package/dist/index.js.map +1 -1
- package/dist/preset.css +1 -2
- package/dist/toast-theme.css +100 -64
- package/dist/tokens.css +59 -159
- package/docs/README.md +44 -0
- package/docs/acoes.md +103 -0
- package/docs/escolha.md +171 -0
- package/docs/formularios.md +137 -0
- package/docs/mensagens.md +114 -0
- package/docs/overlays.md +192 -0
- package/docs/status.md +71 -0
- package/package.json +7 -3
- 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
|
|
1
|
+
import { jsxs as y, jsx as i } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback as S } from "react";
|
|
3
|
-
import { Table as
|
|
4
|
-
import { TablePagination as
|
|
5
|
-
import { Skeleton as
|
|
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
|
|
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
|
|
13
|
-
function
|
|
12
|
+
import { DataTableEmptyState as na } from "./data-table-empty-state.js";
|
|
13
|
+
function ba({
|
|
14
14
|
data: N,
|
|
15
15
|
columns: o,
|
|
16
|
-
searchPlaceholder:
|
|
17
|
-
searchableColumns:
|
|
18
|
-
enableSearch:
|
|
19
|
-
filterFields:
|
|
20
|
-
enableFilters:
|
|
21
|
-
initialFilters:
|
|
22
|
-
pageSizeOptions:
|
|
23
|
-
initialPageSize:
|
|
24
|
-
toolbarActions:
|
|
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:
|
|
27
|
-
emptyState:
|
|
28
|
-
emptyMessage:
|
|
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:
|
|
36
|
-
handlers:
|
|
37
|
-
getSortDirection:
|
|
35
|
+
state: n,
|
|
36
|
+
handlers: s,
|
|
37
|
+
getSortDirection: h
|
|
38
38
|
} = aa({
|
|
39
39
|
data: N,
|
|
40
|
-
initialPageSize:
|
|
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
|
-
}),
|
|
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:
|
|
49
|
-
advancedFilters:
|
|
50
|
-
setAdvancedFilters:
|
|
51
|
-
filterDialogOpen:
|
|
52
|
-
setFilterDialogOpen:
|
|
53
|
-
activeFilterChips:
|
|
54
|
-
handleApplyFilters:
|
|
55
|
-
handleClearAllFilters:
|
|
56
|
-
clearSearchAndFilters:
|
|
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:
|
|
59
|
-
filterFields:
|
|
58
|
+
initialFilters: w,
|
|
59
|
+
filterFields: k,
|
|
60
60
|
isServerMode: r,
|
|
61
61
|
serverConfig: e,
|
|
62
|
-
handlers:
|
|
63
|
-
defaultSearchColumn:
|
|
64
|
-
}),
|
|
62
|
+
handlers: s,
|
|
63
|
+
defaultSearchColumn: $
|
|
64
|
+
}), J = S(async (a) => {
|
|
65
65
|
if (r && (e != null && e.onSortChange)) {
|
|
66
|
-
const
|
|
66
|
+
const l = n.sort;
|
|
67
67
|
let t = "asc";
|
|
68
|
-
|
|
69
|
-
const
|
|
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
|
-
|
|
73
|
+
s.onSort(a), await e.onSortChange(g);
|
|
74
74
|
} else
|
|
75
|
-
|
|
76
|
-
}, [r, e,
|
|
77
|
-
r && (e != null && e.onPageChange) ? await e.onPageChange(a,
|
|
78
|
-
}, [r, e,
|
|
79
|
-
r && (e != null && e.onPageChange) ? await e.onPageChange(1, a) :
|
|
80
|
-
}, [r, e,
|
|
81
|
-
return /* @__PURE__ */
|
|
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:
|
|
86
|
-
searchPlaceholder:
|
|
85
|
+
enableSearch: z,
|
|
86
|
+
searchPlaceholder: x,
|
|
87
87
|
searchQuery: F,
|
|
88
|
-
onSearchChange:
|
|
89
|
-
enableFilters:
|
|
90
|
-
filterFields:
|
|
91
|
-
advancedFilters:
|
|
92
|
-
onAdvancedFiltersChange:
|
|
93
|
-
filterDialogOpen:
|
|
94
|
-
onFilterDialogOpenChange:
|
|
95
|
-
onApplyFilters:
|
|
96
|
-
toolbarActions:
|
|
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
|
-
|
|
99
|
+
p.length > 0 && /* @__PURE__ */ i(
|
|
100
100
|
ta,
|
|
101
101
|
{
|
|
102
|
-
activeFilters:
|
|
103
|
-
onClearAll:
|
|
102
|
+
activeFilters: U,
|
|
103
|
+
onClearAll: q
|
|
104
104
|
}
|
|
105
105
|
),
|
|
106
|
-
/* @__PURE__ */ i("div", { className: "rounded-md border overflow-x-auto", children: /* @__PURE__ */
|
|
107
|
-
/* @__PURE__ */ i(
|
|
108
|
-
|
|
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:
|
|
111
|
-
a.
|
|
112
|
-
a.sortable &&
|
|
113
|
-
a.
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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(
|
|
136
|
+
/* @__PURE__ */ i(Y, { children: B ? (
|
|
126
137
|
// SKELETON ROWS - limitar a max 15 para performance
|
|
127
|
-
Array.from({ length: Math.min(
|
|
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,
|
|
131
|
-
|
|
141
|
+
P.map((a, l) => /* @__PURE__ */ i(d, { children: o.map((t) => /* @__PURE__ */ i(
|
|
142
|
+
m,
|
|
132
143
|
{
|
|
133
|
-
className:
|
|
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,
|
|
139
|
-
children: t.render ? t.render(a[t.key], a,
|
|
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
|
-
)) },
|
|
153
|
+
)) }, l))
|
|
143
154
|
) : (
|
|
144
155
|
// EMPTY STATE
|
|
145
|
-
/* @__PURE__ */ i(
|
|
146
|
-
|
|
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
|
-
|
|
162
|
+
na,
|
|
152
163
|
{
|
|
153
|
-
emptyState:
|
|
154
|
-
emptyMessage:
|
|
155
|
-
hasActiveFilters:
|
|
164
|
+
emptyState: I,
|
|
165
|
+
emptyMessage: O,
|
|
166
|
+
hasActiveFilters: p.length > 0,
|
|
156
167
|
hasSearch: F.trim().length > 0,
|
|
157
|
-
onClearFilters:
|
|
168
|
+
onClearFilters: G
|
|
158
169
|
}
|
|
159
170
|
)
|
|
160
171
|
}
|
|
@@ -162,20 +173,20 @@ function ka({
|
|
|
162
173
|
) })
|
|
163
174
|
] }) }),
|
|
164
175
|
/* @__PURE__ */ i(
|
|
165
|
-
|
|
176
|
+
Z,
|
|
166
177
|
{
|
|
167
|
-
currentPage:
|
|
168
|
-
totalPages: Math.ceil(
|
|
169
|
-
pageSize:
|
|
170
|
-
totalItems:
|
|
171
|
-
onPageChange:
|
|
172
|
-
onPageSizeChange:
|
|
173
|
-
pageSizeOptions:
|
|
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
|
-
|
|
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":"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"}
|
|
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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"}
|