import { IconDatabase } from "@tabler/icons-react"; import { useState } from "react"; import { Badge, Button, Card, Col, Container, Nav, Row, Table } from "react-bootstrap"; import CodeEditor from "@uiw/react-textarea-code-editor"; import { useQuery } from "@tanstack/react-query"; import { executeQuery, getTables, getTableData } from "src/api/backend"; import { HasPermission, Loading } from "src/components"; import { showError, showSuccess } from "src/notifications"; import { ADMIN, VIEW } from "src/modules/Permissions"; export default function DatabaseManager() { const [activeTab, setActiveTab] = useState<"tables" | "query">("tables"); const [activeTable, setActiveTable] = useState(null); const [query, setQuery] = useState("SELECT * FROM user LIMIT 10;"); const [queryResult, setQueryResult] = useState(null); const [queryLoading, setQueryLoading] = useState(false); const { data: tables, isLoading: tablesLoading } = useQuery({ queryKey: ["database-tables"], queryFn: getTables, }); const { data: tableData, isLoading: tableDataLoading } = useQuery({ queryKey: ["database-table", activeTable, 0, 50], queryFn: () => getTableData(activeTable as string, 0, 50), enabled: !!activeTable && activeTab === "tables", }); // Select the first table by default when tables are loaded if (tables && tables.length > 0 && !activeTable) { setActiveTable(tables[0]); } const handleExecuteQuery = async () => { try { setQueryLoading(true); const res = await executeQuery(query); setQueryResult(res.result); showSuccess("Query executed successfully"); } catch (err: any) { showError(err.message || "Failed to execute query"); } finally { setQueryLoading(false); } }; const renderTableData = (data: any[], schema?: any[]) => { if (!data || data.length === 0) return
No data
; const columns = schema ? schema.map((s: any) => s.name || s.Field) : Object.keys(data[0]); return (
{columns.map((col: string) => ( ))} {data.map((row: any, i: number) => ( {columns.map((col: string) => ( ))} ))}
{col}
{row[col] === null ? ( NULL ) : typeof row[col] === "object" ? ( JSON.stringify(row[col]) ) : ( String(row[col]) )}
); }; return (

Database Manager

Super Admin Only
{activeTab === "tables" && ( Tables
{tablesLoading &&
} {tables?.map((table: string) => ( ))}
{activeTable || "Select a table"}
{tableData && {tableData.total} rows}
{tableDataLoading ? (
) : ( tableData && renderTableData(tableData.rows, tableData.schema) )}
)} {activeTab === "query" && ( Execute SQL Query
setQuery(ev.target.value)} padding={15} style={{ fontSize: 14, backgroundColor: "#f8f9fa", fontFamily: "ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace", minHeight: "200px" }} />
{queryResult && (
Results
{Array.isArray(queryResult) ? renderTableData(queryResult) : (
											{JSON.stringify(queryResult, null, 2)}
										
)}
)}
)}
); }