import { FC, useState } from "react"; import { Button, DataTableViewOptions } from "@marzneshin/components"; import { useTranslation } from "react-i18next"; import { useQuery } from "@tanstack/react-query"; import { EntityTableContext } from "./entity-table-provider"; import { EntityDataTable } from "./table" import { DataTablePagination } from "./table-pagination" import { TableFiltering } from "./table-filtering"; import { UseRowSelectionReturn, UseDialogProps, useFiltering, useDialog, usePagination, FetchEntityReturn, EntityQueryKeyType, useEntityTable, useVisibility, useSorting } from "./hooks"; interface EntityTableProps { fetchEntity: ({ queryKey }: EntityQueryKeyType) => FetchEntityReturn; MutationDialog: FC>; DeleteConfirmationDialog: FC>; SettingsDialog: FC>; columnsFn: any; filteredColumn: string; entityKey: string rowSelection?: UseRowSelectionReturn } export function EntityTable({ fetchEntity, MutationDialog, DeleteConfirmationDialog, SettingsDialog, columnsFn, filteredColumn, rowSelection, entityKey, }: EntityTableProps) { const [mutationDialogOpen, setMutationDialogOpen] = useDialog(); const [deleteDialogOpen, setDeleteDialogOpen] = useDialog(); const [settingsDialogOpen, setSettingsDialogOpen] = useDialog(); const [selectedEntity, selectEntity] = useState(null); const onEdit = (entity: T) => { selectEntity(entity); setMutationDialogOpen(true); }; const onDelete = (entity: T) => { selectEntity(entity); setDeleteDialogOpen(true); }; const onCreate = () => { selectEntity(null); setMutationDialogOpen(true); }; const onOpen = (entity: T) => { selectEntity(entity); setSettingsDialogOpen(true); }; const { t } = useTranslation() const filtering = useFiltering({ column: filteredColumn }) const sorting = useSorting() const visibility = useVisibility() const { onPaginationChange, pageIndex, pageSize } = usePagination(); const { data } = useQuery({ queryFn: fetchEntity, queryKey: [entityKey, pageIndex, pageSize], initialData: { entity: [], pageCount: 1 } }); const columns = columnsFn({ onEdit, onDelete, onOpen }) const table = useEntityTable({ data, filtering, columns, pageSize, pageIndex, rowSelection, visibility, sorting, onPaginationChange }) // TODO: Move the selectedEntity to context return (
{onCreate && ( )}
); } export * from './hooks'