Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions messages/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,16 @@
"query_copy_cell": "نسخ قيمة الخلية",
"query_copy_row": "نسخ الصف كـ JSON",
"query_copy_column": "نسخ قيم العمود",
"query_statements_count": "{count} عبارات",
"query_error": "خطأ",
"query_statement_n": "العبارة {n}",
"query_result_rows_time": "({rows} صفوف، {time}مللي ثانية)",
"query_result_affected_time": "({affected} متأثرة، {time}مللي ثانية)",
"query_result_time": "({time}مللي ثانية)",
"query_result_error": "(خطأ)",
"query_statement_failed": "فشلت العبارة {n}",
"query_show_sql": "عرض SQL",
"query_no_executable_statements": "لم يتم العثور على عبارات قابلة للتنفيذ (تعليقات فقط)",
"history_title": "الاستعلامات",
"history_stats": "{executed} منفذة • {saved} محفوظة",
"history_search_placeholder": "البحث في الاستعلامات...",
Expand Down
10 changes: 10 additions & 0 deletions messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,16 @@
"query_copy_cell": "Zellwert kopieren",
"query_copy_row": "Zeile als JSON kopieren",
"query_copy_column": "Spaltenwerte kopieren",
"query_statements_count": "{count} Anweisungen",
"query_error": "Fehler",
"query_statement_n": "Anweisung {n}",
"query_result_rows_time": "({rows} Zeilen, {time}ms)",
"query_result_affected_time": "({affected} betroffen, {time}ms)",
"query_result_time": "({time}ms)",
"query_result_error": "(Fehler)",
"query_statement_failed": "Anweisung {n} fehlgeschlagen",
"query_show_sql": "SQL anzeigen",
"query_no_executable_statements": "Keine ausführbaren Anweisungen gefunden (nur Kommentare)",
"history_title": "Abfragen",
"history_stats": "{executed} ausgeführt • {saved} gespeichert",
"history_search_placeholder": "Abfragen suchen...",
Expand Down
10 changes: 10 additions & 0 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,16 @@
"query_copy_cell": "Copy Cell Value",
"query_copy_row": "Copy Row as JSON",
"query_copy_column": "Copy Column Values",
"query_statements_count": "{count} statements",
"query_error": "Error",
"query_statement_n": "Statement {n}",
"query_result_rows_time": "({rows} rows, {time}ms)",
"query_result_affected_time": "({affected} affected, {time}ms)",
"query_result_time": "({time}ms)",
"query_result_error": "(error)",
"query_statement_failed": "Statement {n} failed",
"query_show_sql": "Show SQL",
"query_no_executable_statements": "No executable statements found (only comments)",
"history_title": "Queries",
"history_stats": "{executed} executed • {saved} saved",
"history_search_placeholder": "Search queries...",
Expand Down
10 changes: 10 additions & 0 deletions messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,16 @@
"query_copy_cell": "Copiar valor de celda",
"query_copy_row": "Copiar fila como JSON",
"query_copy_column": "Copiar valores de columna",
"query_statements_count": "{count} sentencias",
"query_error": "Error",
"query_statement_n": "Sentencia {n}",
"query_result_rows_time": "({rows} filas, {time}ms)",
"query_result_affected_time": "({affected} afectadas, {time}ms)",
"query_result_time": "({time}ms)",
"query_result_error": "(error)",
"query_statement_failed": "Sentencia {n} falló",
"query_show_sql": "Mostrar SQL",
"query_no_executable_statements": "No se encontraron sentencias ejecutables (solo comentarios)",
"history_title": "Consultas",
"history_stats": "{executed} ejecutadas • {saved} guardadas",
"history_search_placeholder": "Buscar consultas...",
Expand Down
10 changes: 10 additions & 0 deletions messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,16 @@
"query_copy_cell": "Copier la valeur de la cellule",
"query_copy_row": "Copier la ligne en JSON",
"query_copy_column": "Copier les valeurs de la colonne",
"query_statements_count": "{count} instructions",
"query_error": "Erreur",
"query_statement_n": "Instruction {n}",
"query_result_rows_time": "({rows} lignes, {time}ms)",
"query_result_affected_time": "({affected} affectées, {time}ms)",
"query_result_time": "({time}ms)",
"query_result_error": "(erreur)",
"query_statement_failed": "Instruction {n} échouée",
"query_show_sql": "Afficher SQL",
"query_no_executable_statements": "Aucune instruction exécutable trouvée (seulement des commentaires)",
"history_title": "Requêtes",
"history_stats": "{executed} exécutées • {saved} enregistrées",
"history_search_placeholder": "Rechercher des requêtes...",
Expand Down
10 changes: 10 additions & 0 deletions messages/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,16 @@
"query_copy_cell": "셀 값 복사",
"query_copy_row": "행을 JSON으로 복사",
"query_copy_column": "열 값 복사",
"query_statements_count": "{count}개 문장",
"query_error": "오류",
"query_statement_n": "문장 {n}",
"query_result_rows_time": "({rows}행, {time}ms)",
"query_result_affected_time": "({affected}개 영향, {time}ms)",
"query_result_time": "({time}ms)",
"query_result_error": "(오류)",
"query_statement_failed": "문장 {n} 실패",
"query_show_sql": "SQL 보기",
"query_no_executable_statements": "실행 가능한 문장이 없습니다 (주석만 있음)",
"history_title": "쿼리",
"history_stats": "{executed}개 실행됨 • {saved}개 저장됨",
"history_search_placeholder": "쿼리 검색...",
Expand Down
23 changes: 11 additions & 12 deletions src/lib/components/command-palette.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
const savedQueries = $derived(db.state.activeConnectionSavedQueries);
const recentHistory = $derived(db.state.activeConnectionQueryHistory?.slice(0, 10) || []);
const openTabs = $derived(db.tabs.ordered);
const hasResults = $derived((db.state.activeQueryTab?.results?.rows?.length ?? 0) > 0);
const activeResult = $derived(db.state.activeQueryResult);
const hasResults = $derived((activeResult?.rows?.length ?? 0) > 0);
const isConnected = $derived(!!db.state.activeConnectionId && !!db.state.activeConnection?.database);
const hasActiveQueryTab = $derived(isConnected && !!db.state.activeQueryTab);
const hasQueryContent = $derived(hasActiveQueryTab && !!db.state.activeQueryTab?.query?.trim());
Expand Down Expand Up @@ -166,19 +167,18 @@
}

function exportResults(format: "csv" | "json") {
const results = db.state.activeQueryTab?.results;
if (!results) return;
if (!activeResult) return;

let content: string;
let filename: string;
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");

if (format === "csv") {
const headers = results.columns.join(",");
const rows = results.rows
.map((row) =>
results.columns
.map((col) => {
const headers = activeResult.columns.join(",");
const rows = activeResult.rows
.map((row: Record<string, unknown>) =>
activeResult.columns
.map((col: string) => {
const val = row[col];
if (val === null || val === undefined) return "";
const str = String(val);
Expand All @@ -192,7 +192,7 @@
content = `${headers}\n${rows}`;
filename = `query-results-${timestamp}.csv`;
} else {
content = JSON.stringify(results.rows, null, 2);
content = JSON.stringify(activeResult.rows, null, 2);
filename = `query-results-${timestamp}.json`;
}

Expand All @@ -208,10 +208,9 @@
}

function copyResults() {
const results = db.state.activeQueryTab?.results;
if (!results) return;
if (!activeResult) return;

const content = JSON.stringify(results.rows, null, 2);
const content = JSON.stringify(activeResult.rows, null, 2);
navigator.clipboard.writeText(content);
open = false;
}
Expand Down
18 changes: 18 additions & 0 deletions src/lib/components/monaco-editor.svelte
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
<script lang="ts" module>
export interface MonacoEditorRef {
getCursorOffset: () => number;
}
</script>

<script lang="ts">
import { onMount, onDestroy } from "svelte";
import { mode } from "mode-watcher";
Expand All @@ -6,12 +12,14 @@

let {
value = $bindable(""),
ref = $bindable<MonacoEditorRef | null>(null),
schema = [] as SchemaTable[],
onExecute = () => {},
onChange = (_value: string) => {},
class: className = ""
}: {
value?: string;
ref?: MonacoEditorRef | null;
schema?: SchemaTable[];
onExecute?: () => void;
onChange?: (value: string) => void;
Expand Down Expand Up @@ -69,6 +77,16 @@
editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, () => {
onExecute();
});

// Expose ref for external access
ref = {
getCursorOffset: () => {
if (!editor) return 0;
const position = editor.getPosition();
if (!position) return 0;
return editor.getModel()?.getOffsetAt(position) ?? 0;
}
};
});

onDestroy(() => {
Expand Down
Loading
Loading