feat: add connection management UI

Add TypeScript types, typed Tauri invoke wrappers, Zustand store,
TanStack Query hooks, and connection components: ConnectionDialog
(create/edit/test), ConnectionList (sheet panel), ConnectionSelector
(toolbar dropdown).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-11 19:06:35 +03:00
parent 9b675babd5
commit 734b84b525
10 changed files with 878 additions and 0 deletions

132
src/lib/tauri.ts Normal file
View File

@@ -0,0 +1,132 @@
import { invoke } from "@tauri-apps/api/core";
import type {
ConnectionConfig,
QueryResult,
PaginatedQueryResult,
SchemaObject,
ColumnInfo,
ConstraintInfo,
IndexInfo,
} from "@/types";
// Connections
export const getConnections = () =>
invoke<ConnectionConfig[]>("get_connections");
export const saveConnection = (config: ConnectionConfig) =>
invoke<void>("save_connection", { config });
export const deleteConnection = (id: string) =>
invoke<void>("delete_connection", { id });
export const testConnection = (config: ConnectionConfig) =>
invoke<string>("test_connection", { config });
export const connectDb = (config: ConnectionConfig) =>
invoke<void>("connect", { config });
export const disconnectDb = (id: string) =>
invoke<void>("disconnect", { id });
export const switchDatabase = (config: ConnectionConfig, database: string) =>
invoke<void>("switch_database", { config, database });
// Queries
export const executeQuery = (connectionId: string, sql: string) =>
invoke<QueryResult>("execute_query", { connectionId, sql });
// Schema
export const listDatabases = (connectionId: string) =>
invoke<string[]>("list_databases", { connectionId });
export const listSchemas = (connectionId: string) =>
invoke<string[]>("list_schemas", { connectionId });
export const listTables = (connectionId: string, schema: string) =>
invoke<SchemaObject[]>("list_tables", { connectionId, schema });
export const listViews = (connectionId: string, schema: string) =>
invoke<SchemaObject[]>("list_views", { connectionId, schema });
export const listFunctions = (connectionId: string, schema: string) =>
invoke<SchemaObject[]>("list_functions", { connectionId, schema });
export const listIndexes = (connectionId: string, schema: string) =>
invoke<SchemaObject[]>("list_indexes", { connectionId, schema });
export const listSequences = (connectionId: string, schema: string) =>
invoke<SchemaObject[]>("list_sequences", { connectionId, schema });
export const getTableColumns = (
connectionId: string,
schema: string,
table: string
) => invoke<ColumnInfo[]>("get_table_columns", { connectionId, schema, table });
export const getTableConstraints = (
connectionId: string,
schema: string,
table: string
) =>
invoke<ConstraintInfo[]>("get_table_constraints", {
connectionId,
schema,
table,
});
export const getTableIndexes = (
connectionId: string,
schema: string,
table: string
) => invoke<IndexInfo[]>("get_table_indexes", { connectionId, schema, table });
// Data
export const getTableData = (params: {
connectionId: string;
schema: string;
table: string;
page: number;
pageSize: number;
sortColumn?: string;
sortDirection?: string;
filter?: string;
}) => invoke<PaginatedQueryResult>("get_table_data", params);
export const updateRow = (params: {
connectionId: string;
schema: string;
table: string;
pkColumns: string[];
pkValues: unknown[];
column: string;
value: unknown;
}) => invoke<void>("update_row", params);
export const insertRow = (params: {
connectionId: string;
schema: string;
table: string;
columns: string[];
values: unknown[];
}) => invoke<void>("insert_row", params);
export const deleteRows = (params: {
connectionId: string;
schema: string;
table: string;
pkColumns: string[];
pkValuesList: unknown[][];
}) => invoke<number>("delete_rows", params);
// Export
export const exportCsv = (
path: string,
columns: string[],
rows: unknown[][]
) => invoke<void>("export_csv", { path, columns, rows });
export const exportJson = (
path: string,
columns: string[],
rows: unknown[][]
) => invoke<void>("export_json", { path, columns, rows });