diff --git a/api/bun.lockb b/api/bun.lockb old mode 100644 new mode 100755 index f005dde..664ae2f Binary files a/api/bun.lockb and b/api/bun.lockb differ diff --git a/frontend/bun.lockb b/frontend/bun.lockb old mode 100644 new mode 100755 index ab4ef86..7e6c3a1 Binary files a/frontend/bun.lockb and b/frontend/bun.lockb differ diff --git a/frontend/src/components/db-table-view/data-table-prime.tsx b/frontend/src/components/db-table-view/data-table-prime.tsx index 076baf3..9e1c0ad 100644 --- a/frontend/src/components/db-table-view/data-table-prime.tsx +++ b/frontend/src/components/db-table-view/data-table-prime.tsx @@ -1,36 +1,71 @@ -import { - Button, - DataTablePagination, - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuTrigger, - ScrollArea, - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui"; import { cn, isImageUrl, isUrl } from "@/lib/utils"; import { useTableColumnsQuery, useTableDataQuery } from "@/services/db"; import { useSettingsStore } from "@/state"; -import { - type ColumnDef, - type OnChangeFn, - type PaginationState, - type SortingState, - type VisibilityState, - flexRender, - getCoreRowModel, - useReactTable, -} from "@tanstack/react-table"; -import { ArrowUp, Rows3 } from "lucide-react"; +import type { SortingState, VisibilityState } from "@tanstack/react-table"; +import { Rows3 } from "lucide-react"; import { Column } from "primereact/column"; import { DataTable } from "primereact/datatable"; -import { usePassThrough } from "primereact/passthrough"; -import { useMemo, useState } from "react"; +import { useState } from "react"; + +const columnTemplate = + ({ + columnName, + formatDates, + showImagesPreview, + udt_name, + data_type, + }: { + columnName: string; + formatDates: boolean; + showImagesPreview: boolean; + udt_name: string; + data_type: string; + }) => + (item: Record) => { + const value = item[columnName] as any; + + let finalValue = value; + if ( + formatDates && + ["timestamp", "datetime"].includes(udt_name.toLowerCase()) + ) { + finalValue = new Date(value as string).toLocaleString(); + } + if (showImagesPreview && typeof value === "string" && isUrl(value)) { + const isImage = isImageUrl(value); + return ( + +
+ {value} + {isImage && ( + {"preview"} + )} +
+
+ ); + } + return ( +
+ {finalValue} +
+ ); + }; + export const DataTablePrime = ({ tableName, dbName, @@ -53,7 +88,7 @@ export const DataTablePrime = ({ const [columnVisibility, setColumnVisibility] = useState({}); const { data: columns } = useTableColumnsQuery({ dbName, tableName }); - const { data } = useTableDataQuery({ + const { data, isFetching } = useTableDataQuery({ tableName, dbName, perPage: pageSize, @@ -96,12 +131,20 @@ export const DataTablePrime = ({ tableStyle={{ minWidth: "100%" }} scrollable scrollHeight="flex" + loading={isFetching} > {columns?.map((col) => ( ))} diff --git a/frontend/src/styles/datatable.tsx b/frontend/src/styles/datatable.tsx index bab2952..178ef65 100644 --- a/frontend/src/styles/datatable.tsx +++ b/frontend/src/styles/datatable.tsx @@ -24,7 +24,7 @@ export const datatable: DataTablePassThroughOptions = { className: cn( "fixed w-full h-full t-0 l-0 bg-gray-100/40", "transition duration-200", - "absolute flex items-center justify-center z-2", + "absolute flex items-center justify-center z-10", "dark:bg-gray-950/40", // Dark Mode ), },