'use client'; import React from "react"; import { useReactTable, getCoreRowModel, getSortedRowModel, getPaginationRowModel, flexRender, createColumnHelper, ColumnDef, } from "@tanstack/react-table"; import { UseFormReturn } from "react-hook-form"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/mutual/ui/form"; import { Button } from "@/components/mutual/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/mutual/ui/select"; import { API_BASE_URL } from "@/config/config"; import { useTableData } from "@/hooks/useTableData"; import { LanguageTypes } from "@/validations/mutual/language/validations"; import { Translations, TableHeaderProps, LoadingSpinnerProps, ErrorDisplayProps, MobilePaginationControlsProps, DashboardPageProps, TableDataItem, } from "@/validations/mutual/table/validations"; import LoadingContent from "@/components/mutual/loader/component"; interface DataTableProps { table: ReturnType; tableData: TableDataItem[]; isLoading: boolean; handleSortingChange: (columnId: string) => void; getSortingIcon: (columnId: string) => React.ReactNode; flexRender: typeof flexRender; t: Translations; } interface TableFormProps { form: UseFormReturn; handleFormSubmit: (e: React.FormEvent) => void; handleSelectChange: (value: string, field: { onChange: (value: number) => void }) => void; renderPageOptions: () => { key: string | number; value: string; label: string }[]; pageSizeOptions: number[]; apiPagination: { size: number; page: number; totalCount: number; totalPages: number; pageCount: number; }; handleFirstPage: () => void; handlePreviousPage: () => void; handleNextPage: () => void; isPreviousDisabled: () => boolean; isNextDisabled: () => boolean; t: Translations; } const translations: Record = { en: { dataTable: 'Data Table', tableWithApiData: 'Table with API Data', loading: 'Loading...', noDataAvailable: 'No data available', page: 'Page', size: 'Size', total: 'Total', items: 'items', first: 'First', previous: 'Previous', next: 'Next', selectPage: 'Select page', selectSize: 'Select size' }, tr: { dataTable: 'Veri Tablosu', tableWithApiData: 'API Verili Tablo', loading: 'Yükleniyor...', noDataAvailable: 'Veri bulunamadı', page: 'Sayfa', size: 'Boyut', total: 'Toplam', items: 'öğe', first: 'İlk', previous: 'Önceki', next: 'Sonraki', selectPage: 'Sayfa seç', selectSize: 'Boyut seç' } }; const DataTable: React.FC = React.memo(({ table, tableData, isLoading, handleSortingChange, getSortingIcon, flexRender, t }) => { return (
{/* Semi-transparent loading overlay that preserves interactivity */} {isLoading && (
{/* We don't put anything here as we already have the loading indicator in the header */}
)} {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( ))} ))} {tableData.length === 0 && !isLoading ? ( ) : ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} )) )}
{t.dataTable}
handleSortingChange(header.column.id)} aria-sort={header.column.getIsSorted() ? (header.column.getIsSorted() === 'desc' ? 'descending' : 'ascending') : undefined} scope="col" >
{flexRender(header.column.columnDef.header, header.getContext())} {getSortingIcon(header.column.id)}
{t.noDataAvailable}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
); }); const TableForm: React.FC = ({ form, handleFormSubmit, handleSelectChange, renderPageOptions, pageSizeOptions, apiPagination, handleFirstPage, handlePreviousPage, handleNextPage, isPreviousDisabled, isNextDisabled, t }) => { return (
( {t.page} )} />
( {t.size} )} />

{t.page}: {apiPagination.page}{" / "} {apiPagination.totalPages} · {t.size}: {apiPagination.pageCount}{" / "} {apiPagination.size} · {t.total}: {apiPagination.totalCount} {t.items}

{/* */}
); }; const MobilePaginationControls: React.FC = ({ handlePreviousPage, handleNextPage, isPreviousDisabled, isNextDisabled, t }) => { return (
); }; const TableHeader: React.FC = ({ title, description, isLoading, error, t }) => { return (

{title}

{description}

{/* {isLoading && } */} {error && }
); }; const ErrorDisplay: React.FC = ({ message }) => { return
{message}
; }; const TableCardComponentImproved: React.FC = React.memo((props) => { // Initialize translation with English as default const language = props.onlineData?.lang as LanguageTypes || 'en'; const t = translations[language]; const { form, tableData, sorting, isLoading, error, pagination, apiPagination, setSorting, handleSortingChange, handleSelectChange, handlePageChange, handleFirstPage, handlePreviousPage, handleNextPage, getSortingIcon, handleFormSubmit, // Disabled states isPreviousDisabled, isNextDisabled, pageSizeOptions, renderPageOptions, } = useTableData({ apiUrl: `${API_BASE_URL}/test` }); const columnHelper = createColumnHelper(); const columns = React.useMemo(() => [ columnHelper.accessor('uu_id', { cell: info => info.getValue(), header: () => UUID, footer: info => info.column.id }), columnHelper.accessor('process_name', { cell: info => info.getValue(), header: () => Name, footer: info => info.column.id }), columnHelper.accessor('bank_date', { header: () => Bank Date, cell: info => info.getValue(), footer: info => info.column.id }), columnHelper.accessor('currency_value', { header: () => Currency Value, cell: info => String(info.getValue()), footer: info => info.column.id }), ], [columnHelper]) as ColumnDef[]; const table = useReactTable({ data: tableData, columns, state: { sorting, pagination }, onSortingChange: setSorting, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), manualPagination: true, pageCount: apiPagination.totalPages || 1, }); return ( isLoading ? :
{/* Mobile pagination controls - only visible on small screens */}
); }); export default TableCardComponentImproved;