@libredb/studio 0.9.12 → 0.9.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -4
- package/dist/{chunk-VWVRUCQO.mjs → chunk-CPF7XWV5.mjs} +77 -77
- package/dist/chunk-CPF7XWV5.mjs.map +1 -0
- package/dist/{chunk-DZ2UB3C6.mjs → chunk-G3S66G64.mjs} +259 -265
- package/dist/chunk-G3S66G64.mjs.map +1 -0
- package/dist/{chunk-JOGLIOFO.js → chunk-HGPD6PWV.js} +129 -129
- package/dist/chunk-HGPD6PWV.js.map +1 -0
- package/dist/{chunk-RBVDMLFV.js → chunk-Y52UIFEX.js} +259 -265
- package/dist/chunk-Y52UIFEX.js.map +1 -0
- package/dist/components.js +14 -14
- package/dist/components.mjs +2 -2
- package/dist/index.js +14 -14
- package/dist/index.mjs +2 -2
- package/dist/workspace.js +350 -358
- package/dist/workspace.js.map +1 -1
- package/dist/workspace.mjs +220 -228
- package/dist/workspace.mjs.map +1 -1
- package/package.json +10 -5
- package/dist/chunk-DZ2UB3C6.mjs.map +0 -1
- package/dist/chunk-JOGLIOFO.js.map +0 -1
- package/dist/chunk-RBVDMLFV.js.map +0 -1
- package/dist/chunk-VWVRUCQO.mjs.map +0 -1
package/dist/workspace.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getDBIcon, cn, ENVIRONMENT_LABELS,
|
|
1
|
+
import { getDBIcon, cn, ENVIRONMENT_LABELS, SchemaDiagram, SchemaExplorer, QueryEditor, QuerySafetyDialog, DataProfiler, CodeGenerator, TestDataGenerator, isDangerousQuery, ScrollArea, Button, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, NL2SQLPanel, DataCharts, VisualExplain, ResultsGrid, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Label, Input, DialogFooter, buttonVariants, storage, Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-G3S66G64.mjs';
|
|
2
2
|
import './chunk-6DRZXXNT.mjs';
|
|
3
3
|
import { __spreadValues, __spreadProps, __objRest } from './chunk-4LVB3K53.mjs';
|
|
4
4
|
import React, { useRef, useMemo, useEffect, useState, useCallback } from 'react';
|
|
@@ -25,7 +25,7 @@ var ConnectionItem = React.memo(function ConnectionItem2({
|
|
|
25
25
|
{
|
|
26
26
|
initial: false,
|
|
27
27
|
className: cn(
|
|
28
|
-
"group flex items-center gap-2.5 px-3 py-2 rounded-lg cursor-pointer transition-all duration-200 text-
|
|
28
|
+
"group flex items-center gap-2.5 px-3 py-2 rounded-lg cursor-pointer transition-all duration-200 text-xs relative overflow-hidden",
|
|
29
29
|
isActive ? "bg-blue-600/10 text-blue-400" : "hover:bg-accent/50 text-muted-foreground hover:text-foreground"
|
|
30
30
|
),
|
|
31
31
|
onClick: () => onSelect(conn),
|
|
@@ -49,11 +49,11 @@ var ConnectionItem = React.memo(function ConnectionItem2({
|
|
|
49
49
|
}
|
|
50
50
|
),
|
|
51
51
|
/* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
52
|
-
/* @__PURE__ */ jsx("span", { className: "truncate block font-medium text-
|
|
52
|
+
/* @__PURE__ */ jsx("span", { className: "truncate block font-medium text-xs", children: conn.name }),
|
|
53
53
|
conn.environment && conn.environment !== "other" && /* @__PURE__ */ jsx(
|
|
54
54
|
"span",
|
|
55
55
|
{
|
|
56
|
-
className: "text-
|
|
56
|
+
className: "text-[0.5rem] font-medium px-1.5 py-0.5 rounded-sm shrink-0",
|
|
57
57
|
style: {
|
|
58
58
|
color: conn.color || "#6b7280",
|
|
59
59
|
backgroundColor: `${conn.color || "#6b7280"}15`
|
|
@@ -67,35 +67,31 @@ var ConnectionItem = React.memo(function ConnectionItem2({
|
|
|
67
67
|
"div",
|
|
68
68
|
{
|
|
69
69
|
"data-testid": `managed-lock-${conn.seedId || conn.id}`,
|
|
70
|
-
className: "
|
|
70
|
+
className: "flex items-center justify-center text-amber-500/60",
|
|
71
71
|
title: "Managed by administrator",
|
|
72
|
-
children: /* @__PURE__ */ jsx(Lock, { className: "w-3 h-3" })
|
|
72
|
+
children: /* @__PURE__ */ jsx(Lock, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
73
73
|
}
|
|
74
74
|
),
|
|
75
75
|
!conn.managed && onEdit && /* @__PURE__ */ jsx(
|
|
76
|
-
|
|
76
|
+
"button",
|
|
77
77
|
{
|
|
78
|
-
|
|
79
|
-
size: "icon",
|
|
80
|
-
className: "w-6 h-6 opacity-0 group-hover:opacity-100 transition-opacity hover:bg-blue-500/20 hover:text-blue-400",
|
|
78
|
+
className: "p-1 rounded opacity-0 group-hover:opacity-100 transition-opacity hover:bg-blue-500/20 hover:text-blue-400",
|
|
81
79
|
onClick: (e) => {
|
|
82
80
|
e.stopPropagation();
|
|
83
81
|
onEdit(conn);
|
|
84
82
|
},
|
|
85
|
-
children: /* @__PURE__ */ jsx(Pencil, { className: "w-3 h-3" })
|
|
83
|
+
children: /* @__PURE__ */ jsx(Pencil, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
86
84
|
}
|
|
87
85
|
),
|
|
88
86
|
!conn.managed && /* @__PURE__ */ jsx(
|
|
89
|
-
|
|
87
|
+
"button",
|
|
90
88
|
{
|
|
91
|
-
|
|
92
|
-
size: "icon",
|
|
93
|
-
className: "w-6 h-6 opacity-0 group-hover:opacity-100 transition-opacity hover:bg-red-500/20 hover:text-red-400",
|
|
89
|
+
className: "p-1 rounded opacity-0 group-hover:opacity-100 transition-opacity hover:bg-red-500/20 hover:text-red-400",
|
|
94
90
|
onClick: (e) => {
|
|
95
91
|
e.stopPropagation();
|
|
96
92
|
onDelete(conn.id);
|
|
97
93
|
},
|
|
98
|
-
children: /* @__PURE__ */ jsx(Trash2, { className: "w-3 h-3" })
|
|
94
|
+
children: /* @__PURE__ */ jsx(Trash2, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
99
95
|
}
|
|
100
96
|
)
|
|
101
97
|
] })
|
|
@@ -113,11 +109,11 @@ function ConnectionsList({
|
|
|
113
109
|
}) {
|
|
114
110
|
return /* @__PURE__ */ jsxs("section", { children: [
|
|
115
111
|
/* @__PURE__ */ jsxs("div", { className: "px-3 mb-2 flex items-center justify-between", children: [
|
|
116
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
112
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Connections" }),
|
|
117
113
|
/* @__PURE__ */ jsx("div", { className: "h-[1px] flex-1 bg-border/30 ml-3" })
|
|
118
114
|
] }),
|
|
119
115
|
/* @__PURE__ */ jsx("div", { className: "space-y-0.5", children: connections.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "px-3 py-6 text-center border border-dashed border-border/50 rounded-lg mx-2", children: [
|
|
120
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
116
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mb-3 leading-relaxed", children: "No database connections established yet." }),
|
|
121
117
|
/* @__PURE__ */ jsx(
|
|
122
118
|
Button,
|
|
123
119
|
{
|
|
@@ -165,29 +161,25 @@ function Sidebar({
|
|
|
165
161
|
return /* @__PURE__ */ jsxs("div", { className: "flex w-full h-full border-r border-border flex-col bg-background select-none", children: [
|
|
166
162
|
/* @__PURE__ */ jsxs("div", { className: "h-14 px-4 flex items-center justify-between border-b border-border", children: [
|
|
167
163
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
168
|
-
/* @__PURE__ */ jsx("div", { className: "w-
|
|
169
|
-
/* @__PURE__ */ jsx("span", { className: "font-
|
|
164
|
+
/* @__PURE__ */ jsx("div", { className: "w-5 h-5 bg-blue-600 rounded flex items-center justify-center", children: /* @__PURE__ */ jsx(Zap, { strokeWidth: 1.5, className: "w-3 h-3 text-white fill-current" }) }),
|
|
165
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-xs tracking-tight bg-gradient-to-r from-foreground to-muted-foreground bg-clip-text text-transparent", children: "LibreDB Studio" })
|
|
170
166
|
] }),
|
|
171
167
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
172
168
|
activeConnection && /* @__PURE__ */ jsx(
|
|
173
|
-
|
|
169
|
+
"button",
|
|
174
170
|
{
|
|
175
|
-
|
|
176
|
-
size: "icon",
|
|
177
|
-
className: "h-8 w-8 hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",
|
|
171
|
+
className: "p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",
|
|
178
172
|
onClick: onShowDiagram,
|
|
179
173
|
title: "Show ERD Diagram",
|
|
180
|
-
children: /* @__PURE__ */ jsx(Layers, { className: "w-
|
|
174
|
+
children: /* @__PURE__ */ jsx(Layers, { strokeWidth: 1.5, className: "w-3.5 h-3.5" })
|
|
181
175
|
}
|
|
182
176
|
),
|
|
183
177
|
/* @__PURE__ */ jsx(
|
|
184
|
-
|
|
178
|
+
"button",
|
|
185
179
|
{
|
|
186
|
-
|
|
187
|
-
size: "icon",
|
|
188
|
-
className: "h-8 w-8 hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",
|
|
180
|
+
className: "p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground transition-colors",
|
|
189
181
|
onClick: onAddConnection,
|
|
190
|
-
children: /* @__PURE__ */ jsx(Plus, { className: "w-
|
|
182
|
+
children: /* @__PURE__ */ jsx(Plus, { strokeWidth: 1.5, className: "w-3.5 h-3.5" })
|
|
191
183
|
}
|
|
192
184
|
)
|
|
193
185
|
] })
|
|
@@ -410,22 +402,22 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
410
402
|
};
|
|
411
403
|
return /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(DialogContent, { className: "bg-[#0a0a0a] border-white/10 text-zinc-100 max-w-2xl max-h-[85vh] overflow-hidden flex flex-col", children: [
|
|
412
404
|
/* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
|
|
413
|
-
/* @__PURE__ */ jsx(Upload, { className: "w-5 h-5 text-blue-400" }),
|
|
405
|
+
/* @__PURE__ */ jsx(Upload, { strokeWidth: 1.5, className: "w-5 h-5 text-blue-400" }),
|
|
414
406
|
"Import Data",
|
|
415
407
|
fileName && /* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-normal ml-2", children: fileName })
|
|
416
408
|
] }) }),
|
|
417
409
|
/* @__PURE__ */ jsx("div", { className: "flex items-center gap-2 px-1 py-2", children: ["upload", "preview", "configure", "ready"].map((s, idx) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
418
410
|
/* @__PURE__ */ jsxs("div", { className: cn(
|
|
419
|
-
"flex items-center gap-1.5 text-xs font-
|
|
411
|
+
"flex items-center gap-1.5 text-xs font-mediumr",
|
|
420
412
|
step === s ? "text-blue-400" : idx < ["upload", "preview", "configure", "ready"].indexOf(step) ? "text-emerald-400" : "text-zinc-600"
|
|
421
413
|
), children: [
|
|
422
414
|
/* @__PURE__ */ jsx("div", { className: cn(
|
|
423
|
-
"w-5 h-5 rounded-full flex items-center justify-center text-
|
|
415
|
+
"w-5 h-5 rounded-full flex items-center justify-center text-[0.625rem]",
|
|
424
416
|
step === s ? "bg-blue-500/20 border border-blue-500/40" : idx < ["upload", "preview", "configure", "ready"].indexOf(step) ? "bg-emerald-500/20 border border-emerald-500/40" : "bg-white/5 border border-white/10"
|
|
425
|
-
), children: idx < ["upload", "preview", "configure", "ready"].indexOf(step) ? /* @__PURE__ */ jsx(Check, { className: "w-3 h-3" }) : idx + 1 }),
|
|
417
|
+
), children: idx < ["upload", "preview", "configure", "ready"].indexOf(step) ? /* @__PURE__ */ jsx(Check, { strokeWidth: 1.5, className: "w-3 h-3" }) : idx + 1 }),
|
|
426
418
|
/* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: s === "upload" ? "Upload" : s === "preview" ? "Preview" : s === "configure" ? "Configure" : "Import" })
|
|
427
419
|
] }),
|
|
428
|
-
idx < 3 && /* @__PURE__ */ jsx(ArrowRight, { className: "w-3 h-3 text-zinc-700" })
|
|
420
|
+
idx < 3 && /* @__PURE__ */ jsx(ArrowRight, { strokeWidth: 1.5, className: "w-3 h-3 text-zinc-700" })
|
|
429
421
|
] }, s)) }),
|
|
430
422
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-auto min-h-0", children: [
|
|
431
423
|
step === "upload" && /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
|
|
@@ -440,16 +432,16 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
440
432
|
},
|
|
441
433
|
className: "border-2 border-dashed border-white/10 rounded-xl p-12 text-center cursor-pointer hover:border-blue-500/30 hover:bg-blue-500/5 transition-all",
|
|
442
434
|
children: [
|
|
443
|
-
/* @__PURE__ */ jsx(Upload, { className: "w-10 h-10 text-zinc-600 mx-auto mb-4" }),
|
|
444
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
435
|
+
/* @__PURE__ */ jsx(Upload, { strokeWidth: 1.5, className: "w-10 h-10 text-zinc-600 mx-auto mb-4" }),
|
|
436
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-400 mb-1", children: "Drop a file here or click to browse" }),
|
|
445
437
|
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-600", children: "Supports CSV and JSON files" }),
|
|
446
438
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-4 mt-4", children: [
|
|
447
439
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-zinc-500", children: [
|
|
448
|
-
/* @__PURE__ */ jsx(FileSpreadsheet, { className: "w-
|
|
440
|
+
/* @__PURE__ */ jsx(FileSpreadsheet, { strokeWidth: 1.5, className: "w-3.5 h-3.5" }),
|
|
449
441
|
/* @__PURE__ */ jsx("span", { className: "text-xs", children: "CSV" })
|
|
450
442
|
] }),
|
|
451
443
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-zinc-500", children: [
|
|
452
|
-
/* @__PURE__ */ jsx(FileJson, { className: "w-
|
|
444
|
+
/* @__PURE__ */ jsx(FileJson, { strokeWidth: 1.5, className: "w-3.5 h-3.5" }),
|
|
453
445
|
/* @__PURE__ */ jsx("span", { className: "text-xs", children: "JSON" })
|
|
454
446
|
] })
|
|
455
447
|
] })
|
|
@@ -471,16 +463,16 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
471
463
|
}
|
|
472
464
|
),
|
|
473
465
|
error && /* @__PURE__ */ jsxs("div", { className: "mt-4 p-3 rounded-lg bg-red-500/10 border border-red-500/20 flex items-center gap-2", children: [
|
|
474
|
-
/* @__PURE__ */ jsx(AlertTriangle, { className: "w-
|
|
466
|
+
/* @__PURE__ */ jsx(AlertTriangle, { strokeWidth: 1.5, className: "w-3.5 h-3.5 text-red-400 shrink-0" }),
|
|
475
467
|
/* @__PURE__ */ jsx("span", { className: "text-xs text-red-400", children: error })
|
|
476
468
|
] })
|
|
477
469
|
] }),
|
|
478
470
|
step === "preview" && parsedData && /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-4", children: [
|
|
479
471
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
480
472
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
481
|
-
fileType === "json" ? /* @__PURE__ */ jsx(FileJson, { className: "w-5 h-5 text-amber-400" }) : /* @__PURE__ */ jsx(FileText, { className: "w-5 h-5 text-emerald-400" }),
|
|
473
|
+
fileType === "json" ? /* @__PURE__ */ jsx(FileJson, { strokeWidth: 1.5, className: "w-5 h-5 text-amber-400" }) : /* @__PURE__ */ jsx(FileText, { strokeWidth: 1.5, className: "w-5 h-5 text-emerald-400" }),
|
|
482
474
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
483
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
475
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: fileName }),
|
|
484
476
|
/* @__PURE__ */ jsxs("p", { className: "text-xs text-zinc-500", children: [
|
|
485
477
|
parsedData.totalRows,
|
|
486
478
|
" rows, ",
|
|
@@ -499,7 +491,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
499
491
|
resetState();
|
|
500
492
|
},
|
|
501
493
|
children: [
|
|
502
|
-
/* @__PURE__ */ jsx(X, { className: "w-3 h-3 mr-1" }),
|
|
494
|
+
/* @__PURE__ */ jsx(X, { strokeWidth: 1.5, className: "w-3 h-3 mr-1" }),
|
|
503
495
|
" Reset"
|
|
504
496
|
]
|
|
505
497
|
}
|
|
@@ -507,7 +499,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
507
499
|
] }),
|
|
508
500
|
/* @__PURE__ */ jsxs("div", { className: "border border-white/5 rounded-lg overflow-auto max-h-60", children: [
|
|
509
501
|
/* @__PURE__ */ jsxs("table", { className: "w-full text-xs", children: [
|
|
510
|
-
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: "bg-[#0d0d0d]", children: parsedData.headers.map((h) => /* @__PURE__ */ jsx("th", { className: "px-3 py-2 text-left text-xs uppercase
|
|
502
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: "bg-[#0d0d0d]", children: parsedData.headers.map((h) => /* @__PURE__ */ jsx("th", { className: "px-3 py-2 text-left text-xs uppercase text-zinc-500 font-mono border-b border-white/5 whitespace-nowrap", children: h }, h)) }) }),
|
|
511
503
|
/* @__PURE__ */ jsx("tbody", { children: parsedData.rows.slice(0, 10).map((row, idx) => /* @__PURE__ */ jsx("tr", { className: "border-b border-white/5 hover:bg-white/[0.02]", children: row.map((cell, cidx) => /* @__PURE__ */ jsx("td", { className: "px-3 py-1.5 text-zinc-300 font-mono whitespace-nowrap max-w-[200px] truncate", children: cell || /* @__PURE__ */ jsx("span", { className: "text-zinc-600 italic", children: "NULL" }) }, cidx)) }, idx)) })
|
|
512
504
|
] }),
|
|
513
505
|
parsedData.totalRows > 10 && /* @__PURE__ */ jsxs("div", { className: "text-center py-2 text-xs text-zinc-600 bg-[#0d0d0d]", children: [
|
|
@@ -524,7 +516,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
524
516
|
onClick: () => setStep("configure"),
|
|
525
517
|
children: [
|
|
526
518
|
"Configure Import ",
|
|
527
|
-
/* @__PURE__ */ jsx(ArrowRight, { className: "w-3 h-3" })
|
|
519
|
+
/* @__PURE__ */ jsx(ArrowRight, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
528
520
|
]
|
|
529
521
|
}
|
|
530
522
|
) })
|
|
@@ -542,7 +534,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
542
534
|
),
|
|
543
535
|
onClick: () => setCreateNewTable(false),
|
|
544
536
|
children: [
|
|
545
|
-
/* @__PURE__ */ jsx(Table2, { className: "w-
|
|
537
|
+
/* @__PURE__ */ jsx(Table2, { strokeWidth: 1.5, className: "w-3.5 h-3.5 mb-1" }),
|
|
546
538
|
"Existing Table"
|
|
547
539
|
]
|
|
548
540
|
}
|
|
@@ -556,7 +548,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
556
548
|
),
|
|
557
549
|
onClick: () => setCreateNewTable(true),
|
|
558
550
|
children: [
|
|
559
|
-
/* @__PURE__ */ jsx(FileSpreadsheet, { className: "w-
|
|
551
|
+
/* @__PURE__ */ jsx(FileSpreadsheet, { strokeWidth: 1.5, className: "w-3.5 h-3.5 mb-1" }),
|
|
560
552
|
"New Table"
|
|
561
553
|
]
|
|
562
554
|
}
|
|
@@ -571,7 +563,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
571
563
|
value: newTableName,
|
|
572
564
|
onChange: (e) => setNewTableName(e.target.value),
|
|
573
565
|
placeholder: "imported_data",
|
|
574
|
-
className: "mt-1 bg-[#111] border-white/10 text-
|
|
566
|
+
className: "mt-1 bg-[#111] border-white/10 text-xs h-9"
|
|
575
567
|
}
|
|
576
568
|
)
|
|
577
569
|
] }) : /* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -581,7 +573,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
581
573
|
{
|
|
582
574
|
value: targetTable,
|
|
583
575
|
onChange: (e) => setTargetTable(e.target.value),
|
|
584
|
-
className: "w-full mt-1 bg-[#111] border border-white/10 rounded-md px-3 py-2 text-
|
|
576
|
+
className: "w-full mt-1 bg-[#111] border border-white/10 rounded-md px-3 py-2 text-xs text-zinc-300 outline-none focus:border-blue-500/40",
|
|
585
577
|
children: [
|
|
586
578
|
/* @__PURE__ */ jsx("option", { value: "", children: "-- Select a table --" }),
|
|
587
579
|
tables.map((t) => /* @__PURE__ */ jsx("option", { value: t.name, children: t.name }, t.name))
|
|
@@ -592,14 +584,14 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
592
584
|
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
593
585
|
/* @__PURE__ */ jsx("label", { className: "text-xs text-zinc-400 font-medium", children: "Column Mapping" }),
|
|
594
586
|
/* @__PURE__ */ jsxs("div", { className: "border border-white/5 rounded-lg overflow-hidden", children: [
|
|
595
|
-
/* @__PURE__ */ jsxs("div", { className: "bg-[#0d0d0d] grid grid-cols-[1fr,auto,1fr] gap-2 px-3 py-1.5 text-xs
|
|
587
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-[#0d0d0d] grid grid-cols-[1fr,auto,1fr] gap-2 px-3 py-1.5 text-xs text-zinc-500 border-b border-white/5", children: [
|
|
596
588
|
/* @__PURE__ */ jsx("span", { children: "Source Column" }),
|
|
597
589
|
/* @__PURE__ */ jsx("span", {}),
|
|
598
590
|
/* @__PURE__ */ jsx("span", { children: "Target Column" })
|
|
599
591
|
] }),
|
|
600
592
|
/* @__PURE__ */ jsx("div", { className: "max-h-40 overflow-auto", children: parsedData.headers.map((header) => /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[1fr,auto,1fr] gap-2 items-center px-3 py-1.5 border-b border-white/5", children: [
|
|
601
593
|
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-300 font-mono truncate", children: header }),
|
|
602
|
-
/* @__PURE__ */ jsx(ArrowRight, { className: "w-3 h-3 text-zinc-600" }),
|
|
594
|
+
/* @__PURE__ */ jsx(ArrowRight, { strokeWidth: 1.5, className: "w-3 h-3 text-zinc-600" }),
|
|
603
595
|
/* @__PURE__ */ jsx(
|
|
604
596
|
Input,
|
|
605
597
|
{
|
|
@@ -632,7 +624,7 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
632
624
|
disabled: !createNewTable && !targetTable,
|
|
633
625
|
children: [
|
|
634
626
|
"Review SQL ",
|
|
635
|
-
/* @__PURE__ */ jsx(ArrowRight, { className: "w-3 h-3" })
|
|
627
|
+
/* @__PURE__ */ jsx(ArrowRight, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
636
628
|
]
|
|
637
629
|
}
|
|
638
630
|
)
|
|
@@ -641,14 +633,14 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
641
633
|
step === "ready" && /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-4", children: [
|
|
642
634
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
643
635
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
644
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
636
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "Ready to Import" }),
|
|
645
637
|
/* @__PURE__ */ jsxs("p", { className: "text-xs text-zinc-500 mt-0.5", children: [
|
|
646
638
|
parsedData == null ? void 0 : parsedData.totalRows,
|
|
647
639
|
" rows into ",
|
|
648
640
|
createNewTable ? newTableName || "imported_data" : targetTable
|
|
649
641
|
] })
|
|
650
642
|
] }),
|
|
651
|
-
databaseType && /* @__PURE__ */ jsx("span", { className: "text-xs
|
|
643
|
+
databaseType && /* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 bg-white/5 px-2 py-1 rounded", children: databaseType })
|
|
652
644
|
] }),
|
|
653
645
|
/* @__PURE__ */ jsx("div", { className: "border border-white/5 rounded-lg bg-[#0d0d0d] overflow-auto max-h-60", children: /* @__PURE__ */ jsxs("pre", { className: "p-3 text-xs text-zinc-400 font-mono whitespace-pre-wrap", children: [
|
|
654
646
|
generatedSQL.substring(0, 3e3),
|
|
@@ -686,10 +678,10 @@ function DataImportModal({ isOpen, onClose, onImport, tables, databaseType }) {
|
|
|
686
678
|
onClick: handleImport,
|
|
687
679
|
disabled: isImporting,
|
|
688
680
|
children: isImporting ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
689
|
-
/* @__PURE__ */ jsx(Loader2, { className: "w-3 h-3 animate-spin" }),
|
|
681
|
+
/* @__PURE__ */ jsx(Loader2, { strokeWidth: 1.5, className: "w-3 h-3 animate-spin" }),
|
|
690
682
|
" Importing..."
|
|
691
683
|
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
692
|
-
/* @__PURE__ */ jsx(Upload, { className: "w-3 h-3" }),
|
|
684
|
+
/* @__PURE__ */ jsx(Upload, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
693
685
|
" Execute Import"
|
|
694
686
|
] })
|
|
695
687
|
}
|
|
@@ -729,14 +721,14 @@ function SaveQueryModal({ isOpen, onClose, onSave, defaultQuery }) {
|
|
|
729
721
|
return /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: onClose, children: /* @__PURE__ */ jsxs(DialogContent, { className: "bg-[#0d0d0d] border-white/10 text-zinc-300 sm:max-w-[425px]", children: [
|
|
730
722
|
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
731
723
|
/* @__PURE__ */ jsxs(DialogTitle, { className: "text-white flex items-center gap-2", children: [
|
|
732
|
-
/* @__PURE__ */ jsx(Bookmark, { className: "w-5 h-5 text-blue-500" }),
|
|
724
|
+
/* @__PURE__ */ jsx(Bookmark, { strokeWidth: 1.5, className: "w-5 h-5 text-blue-500" }),
|
|
733
725
|
" Save Query"
|
|
734
726
|
] }),
|
|
735
727
|
/* @__PURE__ */ jsx(DialogDescription, { className: "text-zinc-500", children: "Give your query a name and description to find it easily later." })
|
|
736
728
|
] }),
|
|
737
729
|
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 py-4", children: [
|
|
738
730
|
/* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
|
|
739
|
-
/* @__PURE__ */ jsx(Label, { htmlFor: "name", className: "text-xs font-
|
|
731
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "name", className: "text-xs font-medium text-zinc-500", children: "Name" }),
|
|
740
732
|
/* @__PURE__ */ jsx(
|
|
741
733
|
Input,
|
|
742
734
|
{
|
|
@@ -749,7 +741,7 @@ function SaveQueryModal({ isOpen, onClose, onSave, defaultQuery }) {
|
|
|
749
741
|
)
|
|
750
742
|
] }),
|
|
751
743
|
/* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
|
|
752
|
-
/* @__PURE__ */ jsx(Label, { htmlFor: "description", className: "text-xs font-
|
|
744
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "description", className: "text-xs font-medium text-zinc-500", children: "Description" }),
|
|
753
745
|
/* @__PURE__ */ jsx(
|
|
754
746
|
Textarea,
|
|
755
747
|
{
|
|
@@ -762,8 +754,8 @@ function SaveQueryModal({ isOpen, onClose, onSave, defaultQuery }) {
|
|
|
762
754
|
)
|
|
763
755
|
] }),
|
|
764
756
|
/* @__PURE__ */ jsxs("div", { className: "grid gap-2", children: [
|
|
765
|
-
/* @__PURE__ */ jsxs(Label, { htmlFor: "tags", className: "text-xs font-
|
|
766
|
-
/* @__PURE__ */ jsx(Tag, { className: "w-3 h-3" }),
|
|
757
|
+
/* @__PURE__ */ jsxs(Label, { htmlFor: "tags", className: "text-xs font-medium text-zinc-500 flex items-center gap-2", children: [
|
|
758
|
+
/* @__PURE__ */ jsx(Tag, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
767
759
|
" Tags (comma separated)"
|
|
768
760
|
] }),
|
|
769
761
|
/* @__PURE__ */ jsx(
|
|
@@ -778,7 +770,7 @@ function SaveQueryModal({ isOpen, onClose, onSave, defaultQuery }) {
|
|
|
778
770
|
)
|
|
779
771
|
] }),
|
|
780
772
|
/* @__PURE__ */ jsxs("div", { className: "mt-2", children: [
|
|
781
|
-
/* @__PURE__ */ jsx(Label, { className: "text-xs font-
|
|
773
|
+
/* @__PURE__ */ jsx(Label, { className: "text-xs font-medium text-zinc-500 mb-2 block", children: "Preview" }),
|
|
782
774
|
/* @__PURE__ */ jsx("div", { className: "bg-[#050505] p-3 rounded-md border border-white/5 max-h-[100px] overflow-y-auto", children: /* @__PURE__ */ jsx("pre", { className: "text-xs font-mono text-zinc-500 italic whitespace-pre-wrap break-words", children: defaultQuery }) })
|
|
783
775
|
] })
|
|
784
776
|
] }),
|
|
@@ -789,7 +781,7 @@ function SaveQueryModal({ isOpen, onClose, onSave, defaultQuery }) {
|
|
|
789
781
|
{
|
|
790
782
|
onClick: handleSave,
|
|
791
783
|
disabled: !name,
|
|
792
|
-
className: "bg-blue-600 hover:bg-blue-500 text-white font-
|
|
784
|
+
className: "bg-blue-600 hover:bg-blue-500 text-white font-medium",
|
|
793
785
|
children: "Save Query"
|
|
794
786
|
}
|
|
795
787
|
)
|
|
@@ -822,7 +814,7 @@ function StudioTabBar({
|
|
|
822
814
|
activeTabId === tab.id ? "bg-[#141414] text-zinc-100 border-blue-500" : "text-zinc-500 hover:bg-white/5 border-transparent"
|
|
823
815
|
),
|
|
824
816
|
children: [
|
|
825
|
-
tab.type === "sql" ? /* @__PURE__ */ jsx(Hash, { className: "w-3 h-3" }) : /* @__PURE__ */ jsx(FileJson, { className: "w-3 h-3" }),
|
|
817
|
+
tab.type === "sql" ? /* @__PURE__ */ jsx(Hash, { strokeWidth: 1.5, className: "w-3 h-3" }) : /* @__PURE__ */ jsx(FileJson, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
826
818
|
editingTabId === tab.id ? /* @__PURE__ */ jsx(
|
|
827
819
|
"input",
|
|
828
820
|
{
|
|
@@ -849,12 +841,12 @@ function StudioTabBar({
|
|
|
849
841
|
className: "text-xs font-medium bg-transparent border-b border-blue-500 outline-none w-full text-zinc-100"
|
|
850
842
|
}
|
|
851
843
|
) : /* @__PURE__ */ jsx("span", { className: "text-xs truncate font-medium", children: tab.name }),
|
|
852
|
-
tabs.length > 1 && /* @__PURE__ */ jsx(X, { className: "w-3 h-3 ml-auto opacity-0 group-hover:opacity-100 hover:text-white shrink-0", onClick: (e) => onCloseTab(tab.id, e) })
|
|
844
|
+
tabs.length > 1 && /* @__PURE__ */ jsx(X, { strokeWidth: 1.5, className: "w-3 h-3 ml-auto opacity-0 group-hover:opacity-100 hover:text-white shrink-0", onClick: (e) => onCloseTab(tab.id, e) })
|
|
853
845
|
]
|
|
854
846
|
},
|
|
855
847
|
tab.id
|
|
856
848
|
)),
|
|
857
|
-
/* @__PURE__ */ jsx(Plus, { className: "w-
|
|
849
|
+
/* @__PURE__ */ jsx(Plus, { strokeWidth: 1.5, className: "w-3.5 h-3.5 text-zinc-500 cursor-pointer hover:text-white mx-2", onClick: onAddTab })
|
|
858
850
|
] });
|
|
859
851
|
}
|
|
860
852
|
function QueryToolbar({
|
|
@@ -876,14 +868,14 @@ function QueryToolbar({
|
|
|
876
868
|
}) {
|
|
877
869
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
878
870
|
playgroundMode && /* @__PURE__ */ jsxs("div", { className: "hidden md:flex items-center justify-center gap-2 px-4 py-1 bg-emerald-500/10 border-b border-emerald-500/20 text-emerald-400", children: [
|
|
879
|
-
/* @__PURE__ */ jsx(FlaskConical, { className: "w-3 h-3" }),
|
|
880
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
871
|
+
/* @__PURE__ */ jsx(FlaskConical, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
872
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-mediumr", children: "Sandbox Mode \u2014 All changes will be auto-rolled back" })
|
|
881
873
|
] }),
|
|
882
874
|
/* @__PURE__ */ jsxs("div", { className: "hidden md:flex items-center justify-between px-4 py-1.5 bg-[#0a0a0a] border-b border-white/5", children: [
|
|
883
875
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
|
|
884
876
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-2 py-0.5 rounded bg-blue-500/5 border border-blue-500/10", children: [
|
|
885
|
-
/* @__PURE__ */ jsx(Terminal, { className: "w-3 h-3 text-blue-400" }),
|
|
886
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
877
|
+
/* @__PURE__ */ jsx(Terminal, { strokeWidth: 1.5, className: "w-3 h-3 text-blue-400" }),
|
|
878
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-blue-400", children: "Query" })
|
|
887
879
|
] }),
|
|
888
880
|
/* @__PURE__ */ jsx("div", { className: "h-4 w-px bg-white/5" }),
|
|
889
881
|
/* @__PURE__ */ jsxs(
|
|
@@ -891,10 +883,10 @@ function QueryToolbar({
|
|
|
891
883
|
{
|
|
892
884
|
variant: "ghost",
|
|
893
885
|
size: "sm",
|
|
894
|
-
className: "h-7 text-xs font-
|
|
886
|
+
className: "h-7 text-xs font-medium text-zinc-500 hover:text-white gap-2",
|
|
895
887
|
onClick: onSaveQuery,
|
|
896
888
|
children: [
|
|
897
|
-
/* @__PURE__ */ jsx(Save, { className: "w-3 h-3" }),
|
|
889
|
+
/* @__PURE__ */ jsx(Save, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
898
890
|
" Save"
|
|
899
891
|
]
|
|
900
892
|
}
|
|
@@ -904,10 +896,10 @@ function QueryToolbar({
|
|
|
904
896
|
Button,
|
|
905
897
|
{
|
|
906
898
|
size: "sm",
|
|
907
|
-
className: "bg-red-600 hover:bg-red-500 text-white font-
|
|
899
|
+
className: "bg-red-600 hover:bg-red-500 text-white font-medium text-xs h-7 px-4 gap-2",
|
|
908
900
|
onClick: onCancelQuery,
|
|
909
901
|
children: [
|
|
910
|
-
/* @__PURE__ */ jsx(Square, { className: "w-3 h-3 fill-current" }),
|
|
902
|
+
/* @__PURE__ */ jsx(Square, { strokeWidth: 1.5, className: "w-3 h-3 fill-current" }),
|
|
911
903
|
"CANCEL"
|
|
912
904
|
]
|
|
913
905
|
}
|
|
@@ -915,24 +907,24 @@ function QueryToolbar({
|
|
|
915
907
|
Button,
|
|
916
908
|
{
|
|
917
909
|
size: "sm",
|
|
918
|
-
className: "bg-blue-600 hover:bg-blue-500 text-white font-
|
|
910
|
+
className: "bg-blue-600 hover:bg-blue-500 text-white font-medium text-xs h-7 px-4 gap-2",
|
|
919
911
|
onClick: onExecuteQuery,
|
|
920
912
|
disabled: !activeConnection,
|
|
921
913
|
children: [
|
|
922
|
-
/* @__PURE__ */ jsx(Play, { className: "w-3 h-3 fill-current" }),
|
|
914
|
+
/* @__PURE__ */ jsx(Play, { strokeWidth: 1.5, className: "w-3 h-3 fill-current" }),
|
|
923
915
|
"RUN"
|
|
924
916
|
]
|
|
925
917
|
}
|
|
926
918
|
),
|
|
927
919
|
activeConnection && (metadata == null ? void 0 : metadata.capabilities.queryLanguage) === "sql" && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 ml-2 pl-2 border-l border-white/10", children: [
|
|
928
920
|
transactionActive ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
929
|
-
/* @__PURE__ */ jsx("span", { className: "text-
|
|
921
|
+
/* @__PURE__ */ jsx("span", { className: "text-[0.625rem] font-medium text-amber-400 px-1.5 py-0.5 bg-amber-500/10 rounded border border-amber-500/20 mr-1", children: "TXN" }),
|
|
930
922
|
/* @__PURE__ */ jsx(
|
|
931
923
|
Button,
|
|
932
924
|
{
|
|
933
925
|
size: "sm",
|
|
934
926
|
variant: "ghost",
|
|
935
|
-
className: "h-7 text-xs font-
|
|
927
|
+
className: "h-7 text-xs font-medium text-emerald-400 hover:text-emerald-300 hover:bg-emerald-500/10 gap-1",
|
|
936
928
|
onClick: onCommitTransaction,
|
|
937
929
|
children: "COMMIT"
|
|
938
930
|
}
|
|
@@ -942,7 +934,7 @@ function QueryToolbar({
|
|
|
942
934
|
{
|
|
943
935
|
size: "sm",
|
|
944
936
|
variant: "ghost",
|
|
945
|
-
className: "h-7 text-xs font-
|
|
937
|
+
className: "h-7 text-xs font-medium text-red-400 hover:text-red-300 hover:bg-red-500/10 gap-1",
|
|
946
938
|
onClick: onRollbackTransaction,
|
|
947
939
|
children: "ROLLBACK"
|
|
948
940
|
}
|
|
@@ -952,7 +944,7 @@ function QueryToolbar({
|
|
|
952
944
|
{
|
|
953
945
|
size: "sm",
|
|
954
946
|
variant: "ghost",
|
|
955
|
-
className: "h-7 text-xs font-
|
|
947
|
+
className: "h-7 text-xs font-medium text-zinc-500 hover:text-white gap-1",
|
|
956
948
|
onClick: onBeginTransaction,
|
|
957
949
|
disabled: playgroundMode,
|
|
958
950
|
children: "BEGIN"
|
|
@@ -964,14 +956,14 @@ function QueryToolbar({
|
|
|
964
956
|
size: "sm",
|
|
965
957
|
variant: "ghost",
|
|
966
958
|
className: cn(
|
|
967
|
-
"h-7 text-xs font-
|
|
959
|
+
"h-7 text-xs font-medium gap-1",
|
|
968
960
|
playgroundMode ? "text-emerald-400 bg-emerald-500/10 hover:bg-emerald-500/20" : "text-zinc-500 hover:text-white"
|
|
969
961
|
),
|
|
970
962
|
onClick: onTogglePlayground,
|
|
971
963
|
disabled: transactionActive,
|
|
972
964
|
title: "Playground mode: queries are auto-rolled back",
|
|
973
965
|
children: [
|
|
974
|
-
/* @__PURE__ */ jsx(FlaskConical, { className: "w-3 h-3" }),
|
|
966
|
+
/* @__PURE__ */ jsx(FlaskConical, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
975
967
|
"SANDBOX"
|
|
976
968
|
]
|
|
977
969
|
}
|
|
@@ -982,13 +974,13 @@ function QueryToolbar({
|
|
|
982
974
|
size: "sm",
|
|
983
975
|
variant: "ghost",
|
|
984
976
|
className: cn(
|
|
985
|
-
"h-7 text-xs font-
|
|
977
|
+
"h-7 text-xs font-medium gap-1",
|
|
986
978
|
editingEnabled ? "text-amber-400 bg-amber-500/10 hover:bg-amber-500/20" : "text-zinc-500 hover:text-white"
|
|
987
979
|
),
|
|
988
980
|
onClick: onToggleEditing,
|
|
989
981
|
title: "Enable inline data editing",
|
|
990
982
|
children: [
|
|
991
|
-
/* @__PURE__ */ jsx(Pencil, { className: "w-3 h-3" }),
|
|
983
|
+
/* @__PURE__ */ jsx(Pencil, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
992
984
|
"EDIT"
|
|
993
985
|
]
|
|
994
986
|
}
|
|
@@ -998,11 +990,11 @@ function QueryToolbar({
|
|
|
998
990
|
{
|
|
999
991
|
size: "sm",
|
|
1000
992
|
variant: "ghost",
|
|
1001
|
-
className: "h-7 text-xs font-
|
|
993
|
+
className: "h-7 text-xs font-medium text-zinc-500 hover:text-white gap-1",
|
|
1002
994
|
onClick: onImport,
|
|
1003
995
|
title: "Import data from CSV/JSON",
|
|
1004
996
|
children: [
|
|
1005
|
-
/* @__PURE__ */ jsx(Upload, { className: "w-3 h-3" }),
|
|
997
|
+
/* @__PURE__ */ jsx(Upload, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
1006
998
|
"IMPORT"
|
|
1007
999
|
]
|
|
1008
1000
|
}
|
|
@@ -1106,7 +1098,7 @@ function AIAutopilotPanel({ connection, schemaContext, onExecuteQuery }) {
|
|
|
1106
1098
|
const sql = codeContent.trim();
|
|
1107
1099
|
elements.push(
|
|
1108
1100
|
/* @__PURE__ */ jsxs("div", { className: "relative group my-2", children: [
|
|
1109
|
-
/* @__PURE__ */ jsx("pre", { className: "bg-[#050505] rounded-lg p-3 text-
|
|
1101
|
+
/* @__PURE__ */ jsx("pre", { className: "bg-[#050505] rounded-lg p-3 text-xs font-mono text-blue-300 overflow-x-auto whitespace-pre-wrap border border-white/5", children: sql }),
|
|
1110
1102
|
/* @__PURE__ */ jsxs("div", { className: "absolute top-1.5 right-1.5 flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity", children: [
|
|
1111
1103
|
/* @__PURE__ */ jsx(
|
|
1112
1104
|
"button",
|
|
@@ -1114,7 +1106,7 @@ function AIAutopilotPanel({ connection, schemaContext, onExecuteQuery }) {
|
|
|
1114
1106
|
onClick: () => copyToClipboard(sql, blockIndex),
|
|
1115
1107
|
className: "p-1 rounded bg-white/10 hover:bg-white/20 text-zinc-400",
|
|
1116
1108
|
title: "Copy",
|
|
1117
|
-
children: copiedIndex === blockIndex ? /* @__PURE__ */ jsx(Check, { className: "w-3 h-3 text-emerald-400" }) : /* @__PURE__ */ jsx(Copy, { className: "w-3 h-3" })
|
|
1109
|
+
children: copiedIndex === blockIndex ? /* @__PURE__ */ jsx(Check, { strokeWidth: 1.5, className: "w-3 h-3 text-emerald-400" }) : /* @__PURE__ */ jsx(Copy, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
1118
1110
|
}
|
|
1119
1111
|
),
|
|
1120
1112
|
onExecuteQuery && /* @__PURE__ */ jsx(
|
|
@@ -1123,7 +1115,7 @@ function AIAutopilotPanel({ connection, schemaContext, onExecuteQuery }) {
|
|
|
1123
1115
|
onClick: () => onExecuteQuery(sql),
|
|
1124
1116
|
className: "p-1 rounded bg-blue-600/20 hover:bg-blue-600/30 text-blue-400",
|
|
1125
1117
|
title: "Execute",
|
|
1126
|
-
children: /* @__PURE__ */ jsx(Play, { className: "w-3 h-3 fill-current" })
|
|
1118
|
+
children: /* @__PURE__ */ jsx(Play, { strokeWidth: 1.5, className: "w-3 h-3 fill-current" })
|
|
1127
1119
|
}
|
|
1128
1120
|
)
|
|
1129
1121
|
] })
|
|
@@ -1141,9 +1133,9 @@ function AIAutopilotPanel({ connection, schemaContext, onExecuteQuery }) {
|
|
|
1141
1133
|
continue;
|
|
1142
1134
|
}
|
|
1143
1135
|
if (line.startsWith("## ")) {
|
|
1144
|
-
elements.push(/* @__PURE__ */ jsx("h2", { className: "text-
|
|
1136
|
+
elements.push(/* @__PURE__ */ jsx("h2", { className: "text-xs font-medium text-zinc-200 mt-4 mb-2", children: line.slice(3) }, i));
|
|
1145
1137
|
} else if (line.startsWith("### ")) {
|
|
1146
|
-
elements.push(/* @__PURE__ */ jsx("h3", { className: "text-xs font-
|
|
1138
|
+
elements.push(/* @__PURE__ */ jsx("h3", { className: "text-xs font-medium text-zinc-300 mt-3 mb-1", children: line.slice(4) }, i));
|
|
1147
1139
|
} else if (line.startsWith("- ")) {
|
|
1148
1140
|
const content = line.slice(2).replace(/\*\*(.*?)\*\*/g, '<strong class="text-zinc-200">$1</strong>');
|
|
1149
1141
|
elements.push(/* @__PURE__ */ jsx("li", { className: "text-xs text-zinc-400 ml-4 leading-relaxed", dangerouslySetInnerHTML: { __html: content } }, i));
|
|
@@ -1162,8 +1154,8 @@ function AIAutopilotPanel({ connection, schemaContext, onExecuteQuery }) {
|
|
|
1162
1154
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col bg-[#080808]", children: [
|
|
1163
1155
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-b border-white/5 bg-[#0a0a0a]", children: [
|
|
1164
1156
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1165
|
-
/* @__PURE__ */ jsx("div", { className: "p-1 rounded bg-cyan-500/10", children: /* @__PURE__ */ jsx(Sparkles, { className: "w-3
|
|
1166
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
1157
|
+
/* @__PURE__ */ jsx("div", { className: "p-1 rounded bg-cyan-500/10", children: /* @__PURE__ */ jsx(Sparkles, { strokeWidth: 1.5, className: "w-3 h-3 text-cyan-400" }) }),
|
|
1158
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-cyan-400", children: "AI Performance Autopilot" })
|
|
1167
1159
|
] }),
|
|
1168
1160
|
/* @__PURE__ */ jsx(
|
|
1169
1161
|
"button",
|
|
@@ -1171,14 +1163,14 @@ function AIAutopilotPanel({ connection, schemaContext, onExecuteQuery }) {
|
|
|
1171
1163
|
onClick: runAutopilot,
|
|
1172
1164
|
disabled: isLoading || !connection,
|
|
1173
1165
|
className: cn(
|
|
1174
|
-
"flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-
|
|
1166
|
+
"flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-xs font-medium transition-colors",
|
|
1175
1167
|
isLoading ? "bg-cyan-600/20 text-cyan-400 cursor-wait" : "bg-cyan-600 hover:bg-cyan-500 text-white"
|
|
1176
1168
|
),
|
|
1177
1169
|
children: isLoading ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1178
|
-
/* @__PURE__ */ jsx(Loader2, { className: "w-3 h-3 animate-spin" }),
|
|
1170
|
+
/* @__PURE__ */ jsx(Loader2, { strokeWidth: 1.5, className: "w-3 h-3 animate-spin" }),
|
|
1179
1171
|
" Analyzing..."
|
|
1180
1172
|
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1181
|
-
/* @__PURE__ */ jsx(RefreshCw, { className: "w-3 h-3" }),
|
|
1173
|
+
/* @__PURE__ */ jsx(RefreshCw, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
1182
1174
|
" ",
|
|
1183
1175
|
report ? "Re-analyze" : "Run Analysis"
|
|
1184
1176
|
] })
|
|
@@ -1187,8 +1179,8 @@ function AIAutopilotPanel({ connection, schemaContext, onExecuteQuery }) {
|
|
|
1187
1179
|
] }),
|
|
1188
1180
|
/* @__PURE__ */ jsxs("div", { ref: reportRef, className: "flex-1 overflow-auto p-4", children: [
|
|
1189
1181
|
!report && !isLoading && !error && /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full opacity-40", children: [
|
|
1190
|
-
/* @__PURE__ */ jsx(Sparkles, { className: "w-8 h-8 mb-3" }),
|
|
1191
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
1182
|
+
/* @__PURE__ */ jsx(Sparkles, { strokeWidth: 1.5, className: "w-8 h-8 mb-3" }),
|
|
1183
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "AI Performance Autopilot" }),
|
|
1192
1184
|
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-500 mt-1", children: 'Click "Run Analysis" to get AI-powered optimization recommendations' })
|
|
1193
1185
|
] }),
|
|
1194
1186
|
error && /* @__PURE__ */ jsx("div", { className: "bg-red-500/10 border border-red-500/20 rounded-lg p-3 text-xs text-red-400", children: error }),
|
|
@@ -1294,21 +1286,21 @@ ORDER BY ${groupBy.join(", ")};`;
|
|
|
1294
1286
|
}, [rowField, colField, valueField, aggFunction, pivotData]);
|
|
1295
1287
|
if (!result || rows.length === 0) {
|
|
1296
1288
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col items-center justify-center opacity-30", children: [
|
|
1297
|
-
/* @__PURE__ */ jsx(Columns3, { className: "w-8 h-8 mb-3" }),
|
|
1298
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
1289
|
+
/* @__PURE__ */ jsx(Columns3, { strokeWidth: 1.5, className: "w-8 h-8 mb-3" }),
|
|
1290
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "Pivot Table" }),
|
|
1299
1291
|
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-500 mt-1", children: "Execute a query to create pivot tables" })
|
|
1300
1292
|
] });
|
|
1301
1293
|
}
|
|
1302
1294
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col bg-[#080808]", children: [
|
|
1303
1295
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-4 py-2 border-b border-white/5 bg-[#0a0a0a] flex-wrap", children: [
|
|
1304
1296
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1305
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-
|
|
1297
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-medium", children: "Rows:" }),
|
|
1306
1298
|
/* @__PURE__ */ jsxs(
|
|
1307
1299
|
"select",
|
|
1308
1300
|
{
|
|
1309
1301
|
value: rowField || "",
|
|
1310
1302
|
onChange: (e) => setRowField(e.target.value || null),
|
|
1311
|
-
className: "bg-[#111] border border-white/10 rounded px-2 py-1 text-
|
|
1303
|
+
className: "bg-[#111] border border-white/10 rounded px-2 py-1 text-xs text-zinc-300 outline-none",
|
|
1312
1304
|
children: [
|
|
1313
1305
|
/* @__PURE__ */ jsx("option", { value: "", children: "Select..." }),
|
|
1314
1306
|
fields.map((f) => /* @__PURE__ */ jsx("option", { value: f, children: f }, f))
|
|
@@ -1317,13 +1309,13 @@ ORDER BY ${groupBy.join(", ")};`;
|
|
|
1317
1309
|
)
|
|
1318
1310
|
] }),
|
|
1319
1311
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1320
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-
|
|
1312
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-medium", children: "Columns:" }),
|
|
1321
1313
|
/* @__PURE__ */ jsxs(
|
|
1322
1314
|
"select",
|
|
1323
1315
|
{
|
|
1324
1316
|
value: colField || "",
|
|
1325
1317
|
onChange: (e) => setColField(e.target.value || null),
|
|
1326
|
-
className: "bg-[#111] border border-white/10 rounded px-2 py-1 text-
|
|
1318
|
+
className: "bg-[#111] border border-white/10 rounded px-2 py-1 text-xs text-zinc-300 outline-none",
|
|
1327
1319
|
children: [
|
|
1328
1320
|
/* @__PURE__ */ jsx("option", { value: "", children: "None" }),
|
|
1329
1321
|
fields.filter((f) => f !== rowField).map((f) => /* @__PURE__ */ jsx("option", { value: f, children: f }, f))
|
|
@@ -1332,13 +1324,13 @@ ORDER BY ${groupBy.join(", ")};`;
|
|
|
1332
1324
|
)
|
|
1333
1325
|
] }),
|
|
1334
1326
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
1335
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-
|
|
1327
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-medium", children: "Values:" }),
|
|
1336
1328
|
/* @__PURE__ */ jsxs(
|
|
1337
1329
|
"select",
|
|
1338
1330
|
{
|
|
1339
1331
|
value: valueField || "",
|
|
1340
1332
|
onChange: (e) => setValueField(e.target.value || null),
|
|
1341
|
-
className: "bg-[#111] border border-white/10 rounded px-2 py-1 text-
|
|
1333
|
+
className: "bg-[#111] border border-white/10 rounded px-2 py-1 text-xs text-zinc-300 outline-none",
|
|
1342
1334
|
children: [
|
|
1343
1335
|
/* @__PURE__ */ jsx("option", { value: "", children: "Count" }),
|
|
1344
1336
|
fields.filter((f) => f !== rowField && f !== colField).map((f) => /* @__PURE__ */ jsx("option", { value: f, children: f }, f))
|
|
@@ -1351,7 +1343,7 @@ ORDER BY ${groupBy.join(", ")};`;
|
|
|
1351
1343
|
{
|
|
1352
1344
|
onClick: () => setAggFunction(fn),
|
|
1353
1345
|
className: cn(
|
|
1354
|
-
"px-1.5 py-0.5 rounded text-xs font-
|
|
1346
|
+
"px-1.5 py-0.5 rounded text-xs font-medium transition-colors",
|
|
1355
1347
|
aggFunction === fn ? "bg-blue-500/20 text-blue-400 border border-blue-500/20" : "text-zinc-600 hover:text-zinc-400"
|
|
1356
1348
|
),
|
|
1357
1349
|
children: AGG_LABELS[fn]
|
|
@@ -1365,25 +1357,25 @@ ORDER BY ${groupBy.join(", ")};`;
|
|
|
1365
1357
|
const sql = generateSQL();
|
|
1366
1358
|
if (sql) onLoadQuery(sql);
|
|
1367
1359
|
},
|
|
1368
|
-
className: "ml-auto flex items-center gap-1 px-2 py-1 rounded text-xs font-
|
|
1360
|
+
className: "ml-auto flex items-center gap-1 px-2 py-1 rounded text-xs font-medium text-zinc-500 hover:text-blue-400 hover:bg-blue-500/10 transition-colors",
|
|
1369
1361
|
children: [
|
|
1370
|
-
/* @__PURE__ */ jsx(ArrowRight, { className: "w-3 h-3" }),
|
|
1362
|
+
/* @__PURE__ */ jsx(ArrowRight, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
1371
1363
|
" Generate SQL"
|
|
1372
1364
|
]
|
|
1373
1365
|
}
|
|
1374
1366
|
)
|
|
1375
1367
|
] }),
|
|
1376
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto", children: pivotData && pivotData.pivotRows.length > 0 ? /* @__PURE__ */ jsxs("table", { className: "w-full text-
|
|
1368
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto", children: pivotData && pivotData.pivotRows.length > 0 ? /* @__PURE__ */ jsxs("table", { className: "w-full text-xs font-mono", children: [
|
|
1377
1369
|
/* @__PURE__ */ jsx("thead", { className: "sticky top-0 z-10 bg-[#0d0d0d]", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
1378
|
-
/* @__PURE__ */ jsx("th", { className: "text-left px-3 py-2 text-zinc-500 border-b border-r border-white/5 font-
|
|
1379
|
-
pivotData.colKeys.map((ck) => /* @__PURE__ */ jsx("th", { className: "text-right px-3 py-2 text-zinc-500 border-b border-r border-white/5 font-
|
|
1370
|
+
/* @__PURE__ */ jsx("th", { className: "text-left px-3 py-2 text-zinc-500 border-b border-r border-white/5 font-mediumr", children: rowField }),
|
|
1371
|
+
pivotData.colKeys.map((ck) => /* @__PURE__ */ jsx("th", { className: "text-right px-3 py-2 text-zinc-500 border-b border-r border-white/5 font-medium", children: ck === "__all__" ? `${AGG_LABELS[aggFunction]}(${valueField || "*"})` : ck }, ck))
|
|
1380
1372
|
] }) }),
|
|
1381
1373
|
/* @__PURE__ */ jsx("tbody", { children: pivotData.pivotRows.map((row, i) => /* @__PURE__ */ jsxs("tr", { className: "hover:bg-blue-500/[0.03] border-b border-white/5", children: [
|
|
1382
1374
|
/* @__PURE__ */ jsx("td", { className: "px-3 py-1.5 text-zinc-300 border-r border-white/5 font-medium", children: row.rowKey }),
|
|
1383
1375
|
pivotData.colKeys.map((ck) => /* @__PURE__ */ jsx("td", { className: "px-3 py-1.5 text-right text-amber-500/90 border-r border-white/5", children: row.values.get(ck) || "0" }, ck))
|
|
1384
1376
|
] }, i)) })
|
|
1385
1377
|
] }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full opacity-30", children: [
|
|
1386
|
-
/* @__PURE__ */ jsx(GripVertical, { className: "w-6 h-6 mb-2" }),
|
|
1378
|
+
/* @__PURE__ */ jsx(GripVertical, { strokeWidth: 1.5, className: "w-6 h-6 mb-2" }),
|
|
1387
1379
|
/* @__PURE__ */ jsx("p", { className: "text-xs", children: "Select row and value fields to build pivot" })
|
|
1388
1380
|
] }) }),
|
|
1389
1381
|
pivotData && /* @__PURE__ */ jsxs("div", { className: "px-4 py-1.5 border-t border-white/5 bg-[#0a0a0a] text-xs text-zinc-500 font-mono", children: [
|
|
@@ -1506,8 +1498,8 @@ ${aiDocs}
|
|
|
1506
1498
|
};
|
|
1507
1499
|
const renderMarkdown = (text) => {
|
|
1508
1500
|
return text.split("\n").map((line, i) => {
|
|
1509
|
-
if (line.startsWith("## ")) return /* @__PURE__ */ jsx("h2", { className: "text-
|
|
1510
|
-
if (line.startsWith("### ")) return /* @__PURE__ */ jsx("h3", { className: "text-xs font-
|
|
1501
|
+
if (line.startsWith("## ")) return /* @__PURE__ */ jsx("h2", { className: "text-xs font-medium text-zinc-200 mt-4 mb-2", children: line.slice(3) }, i);
|
|
1502
|
+
if (line.startsWith("### ")) return /* @__PURE__ */ jsx("h3", { className: "text-xs font-medium text-zinc-300 mt-3 mb-1", children: line.slice(4) }, i);
|
|
1511
1503
|
if (line.startsWith("- ")) {
|
|
1512
1504
|
const content = line.slice(2).replace(/\*\*(.*?)\*\*/g, '<strong class="text-zinc-200">$1</strong>');
|
|
1513
1505
|
return /* @__PURE__ */ jsx("li", { className: "text-xs text-zinc-400 ml-4 leading-relaxed", dangerouslySetInnerHTML: { __html: content } }, i);
|
|
@@ -1526,9 +1518,9 @@ ${aiDocs}
|
|
|
1526
1518
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col bg-[#080808]", children: [
|
|
1527
1519
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-2 border-b border-white/5 bg-[#0a0a0a]", children: [
|
|
1528
1520
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1529
|
-
/* @__PURE__ */ jsx("div", { className: "p-1 rounded bg-teal-500/10", children: /* @__PURE__ */ jsx(FileText, { className: "w-3
|
|
1530
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
1531
|
-
/* @__PURE__ */ jsxs("span", { className: "text-
|
|
1521
|
+
/* @__PURE__ */ jsx("div", { className: "p-1 rounded bg-teal-500/10", children: /* @__PURE__ */ jsx(FileText, { strokeWidth: 1.5, className: "w-3 h-3 text-teal-400" }) }),
|
|
1522
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-teal-400", children: "Database Docs" }),
|
|
1523
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[0.625rem] text-zinc-500 font-mono", children: [
|
|
1532
1524
|
schema.length,
|
|
1533
1525
|
" tables"
|
|
1534
1526
|
] })
|
|
@@ -1540,11 +1532,11 @@ ${aiDocs}
|
|
|
1540
1532
|
onClick: generateAiDocs,
|
|
1541
1533
|
disabled: isAiLoading,
|
|
1542
1534
|
className: cn(
|
|
1543
|
-
"flex items-center gap-1 px-2.5 py-1 rounded-lg text-xs font-
|
|
1535
|
+
"flex items-center gap-1 px-2.5 py-1 rounded-lg text-xs font-medium transition-colors",
|
|
1544
1536
|
isAiLoading ? "bg-teal-600/20 text-teal-400 cursor-wait" : "bg-teal-600 hover:bg-teal-500 text-white"
|
|
1545
1537
|
),
|
|
1546
1538
|
children: [
|
|
1547
|
-
isAiLoading ? /* @__PURE__ */ jsx(Loader2, { className: "w-3 h-3 animate-spin" }) : /* @__PURE__ */ jsx(Sparkles, { className: "w-3 h-3" }),
|
|
1539
|
+
isAiLoading ? /* @__PURE__ */ jsx(Loader2, { strokeWidth: 1.5, className: "w-3 h-3 animate-spin" }) : /* @__PURE__ */ jsx(Sparkles, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
1548
1540
|
aiDocs ? "Regenerate" : "AI Describe"
|
|
1549
1541
|
]
|
|
1550
1542
|
}
|
|
@@ -1553,9 +1545,9 @@ ${aiDocs}
|
|
|
1553
1545
|
"button",
|
|
1554
1546
|
{
|
|
1555
1547
|
onClick: exportMarkdown,
|
|
1556
|
-
className: "flex items-center gap-1 px-2.5 py-1 rounded-lg bg-white/5 text-zinc-400 text-xs font-
|
|
1548
|
+
className: "flex items-center gap-1 px-2.5 py-1 rounded-lg bg-white/5 text-zinc-400 text-xs font-medium hover:bg-white/10 transition-colors",
|
|
1557
1549
|
children: [
|
|
1558
|
-
/* @__PURE__ */ jsx(Download, { className: "w-3 h-3" }),
|
|
1550
|
+
/* @__PURE__ */ jsx(Download, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
1559
1551
|
" Export MD"
|
|
1560
1552
|
]
|
|
1561
1553
|
}
|
|
@@ -1563,7 +1555,7 @@ ${aiDocs}
|
|
|
1563
1555
|
] })
|
|
1564
1556
|
] }),
|
|
1565
1557
|
/* @__PURE__ */ jsx("div", { className: "px-4 py-2 border-b border-white/5 bg-[#0a0a0a]", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
1566
|
-
/* @__PURE__ */ jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-zinc-500" }),
|
|
1558
|
+
/* @__PURE__ */ jsx(Search, { strokeWidth: 1.5, className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-zinc-500" }),
|
|
1567
1559
|
/* @__PURE__ */ jsx(
|
|
1568
1560
|
"input",
|
|
1569
1561
|
{
|
|
@@ -1578,19 +1570,19 @@ ${aiDocs}
|
|
|
1578
1570
|
error && /* @__PURE__ */ jsx("div", { className: "bg-red-500/10 border border-red-500/20 rounded-lg p-3 text-xs text-red-400", children: error }),
|
|
1579
1571
|
(aiDocs || isAiLoading) && /* @__PURE__ */ jsxs("div", { className: "bg-teal-500/5 border border-teal-500/10 rounded-lg p-4 mb-4", children: [
|
|
1580
1572
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-3", children: [
|
|
1581
|
-
/* @__PURE__ */ jsx(Sparkles, { className: "w-3
|
|
1582
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
1583
|
-
isAiLoading && /* @__PURE__ */ jsx(Loader2, { className: "w-3 h-3 animate-spin text-teal-400" })
|
|
1573
|
+
/* @__PURE__ */ jsx(Sparkles, { strokeWidth: 1.5, className: "w-3 h-3 text-teal-400" }),
|
|
1574
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-teal-400", children: "AI-Generated Documentation" }),
|
|
1575
|
+
isAiLoading && /* @__PURE__ */ jsx(Loader2, { strokeWidth: 1.5, className: "w-3 h-3 animate-spin text-teal-400" })
|
|
1584
1576
|
] }),
|
|
1585
1577
|
aiDocs && /* @__PURE__ */ jsx("div", { className: "prose prose-invert prose-xs max-w-none", children: renderMarkdown(aiDocs) })
|
|
1586
1578
|
] }),
|
|
1587
|
-
/* @__PURE__ */ jsx("h3", { className: "text-xs font-
|
|
1579
|
+
/* @__PURE__ */ jsx("h3", { className: "text-xs font-medium text-zinc-400", children: "Table Reference" }),
|
|
1588
1580
|
filteredSchema.map((table) => {
|
|
1589
1581
|
var _a;
|
|
1590
1582
|
return /* @__PURE__ */ jsxs("div", { className: "bg-[#0a0a0a] border border-white/5 rounded-lg overflow-hidden", children: [
|
|
1591
1583
|
/* @__PURE__ */ jsxs("div", { className: "px-3 py-2 flex items-center justify-between", children: [
|
|
1592
1584
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1593
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
1585
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-zinc-200", children: table.name }),
|
|
1594
1586
|
table.rowCount !== void 0 && /* @__PURE__ */ jsxs("span", { className: "text-xs text-zinc-500 font-mono", children: [
|
|
1595
1587
|
table.rowCount.toLocaleString(),
|
|
1596
1588
|
" rows"
|
|
@@ -1601,7 +1593,7 @@ ${aiDocs}
|
|
|
1601
1593
|
" columns"
|
|
1602
1594
|
] })
|
|
1603
1595
|
] }),
|
|
1604
|
-
table.columns && table.columns.length > 0 && /* @__PURE__ */ jsx("div", { className: "border-t border-white/5", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-
|
|
1596
|
+
table.columns && table.columns.length > 0 && /* @__PURE__ */ jsx("div", { className: "border-t border-white/5", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-xs", children: [
|
|
1605
1597
|
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "text-zinc-500", children: [
|
|
1606
1598
|
/* @__PURE__ */ jsx("th", { className: "text-left px-3 py-1 font-normal", children: "Column" }),
|
|
1607
1599
|
/* @__PURE__ */ jsx("th", { className: "text-left px-3 py-1 font-normal", children: "Type" }),
|
|
@@ -1611,7 +1603,7 @@ ${aiDocs}
|
|
|
1611
1603
|
/* @__PURE__ */ jsx("tbody", { children: table.columns.map((col) => /* @__PURE__ */ jsxs("tr", { className: "border-t border-white/[0.03] hover:bg-white/[0.02]", children: [
|
|
1612
1604
|
/* @__PURE__ */ jsx("td", { className: "px-3 py-1 text-zinc-300 font-mono", children: col.name }),
|
|
1613
1605
|
/* @__PURE__ */ jsx("td", { className: "px-3 py-1 text-zinc-500 font-mono", children: col.type }),
|
|
1614
|
-
/* @__PURE__ */ jsx("td", { className: "px-3 py-1", children: col.isPrimary && /* @__PURE__ */ jsx("span", { className: "text-amber-400 text-
|
|
1606
|
+
/* @__PURE__ */ jsx("td", { className: "px-3 py-1", children: col.isPrimary && /* @__PURE__ */ jsx("span", { className: "text-amber-400 text-[0.625rem] font-medium", children: "PK" }) }),
|
|
1615
1607
|
/* @__PURE__ */ jsx("td", { className: "px-3 py-1 text-zinc-600", children: col.nullable !== false ? "Yes" : "No" })
|
|
1616
1608
|
] }, col.name)) })
|
|
1617
1609
|
] }) })
|
|
@@ -1699,9 +1691,9 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1699
1691
|
/* @__PURE__ */ jsxs("div", { className: "p-4 border-b border-white/5 bg-[#0a0a0a]/50 backdrop-blur-sm sticky top-0 z-10 space-y-4", children: [
|
|
1700
1692
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
1701
1693
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
1702
|
-
/* @__PURE__ */ jsx("div", { className: "p-2 rounded-lg bg-emerald-500/10 border border-emerald-500/20", children: /* @__PURE__ */ jsx(History, { className: "w-
|
|
1694
|
+
/* @__PURE__ */ jsx("div", { className: "p-2 rounded-lg bg-emerald-500/10 border border-emerald-500/20", children: /* @__PURE__ */ jsx(History, { strokeWidth: 1.5, className: "w-3.5 h-3.5 text-emerald-400" }) }),
|
|
1703
1695
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1704
|
-
/* @__PURE__ */ jsx("h3", { className: "text-
|
|
1696
|
+
/* @__PURE__ */ jsx("h3", { className: "text-xs font-medium text-zinc-100 flex items-center gap-2", children: "Query History" }),
|
|
1705
1697
|
/* @__PURE__ */ jsxs("p", { className: "text-xs text-zinc-500 font-medium", children: [
|
|
1706
1698
|
"Showing ",
|
|
1707
1699
|
filteredHistory.length,
|
|
@@ -1711,8 +1703,8 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1711
1703
|
] }),
|
|
1712
1704
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1713
1705
|
/* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
1714
|
-
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", className: "h-8 text-xs font-
|
|
1715
|
-
/* @__PURE__ */ jsx(Download, { className: "w-3
|
|
1706
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", className: "h-8 text-xs font-medium text-zinc-400 hover:text-white gap-2", children: [
|
|
1707
|
+
/* @__PURE__ */ jsx(Download, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
1716
1708
|
" Export"
|
|
1717
1709
|
] }) }),
|
|
1718
1710
|
/* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: "bg-[#0d0d0d] border-white/10 text-zinc-300", children: [
|
|
@@ -1726,9 +1718,9 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1726
1718
|
variant: "ghost",
|
|
1727
1719
|
size: "sm",
|
|
1728
1720
|
onClick: handleClearHistory,
|
|
1729
|
-
className: "h-8 text-xs font-
|
|
1721
|
+
className: "h-8 text-xs font-medium text-red-400/70 hover:text-red-400 hover:bg-red-400/10",
|
|
1730
1722
|
children: [
|
|
1731
|
-
/* @__PURE__ */ jsx(Trash2, { className: "w-3
|
|
1723
|
+
/* @__PURE__ */ jsx(Trash2, { strokeWidth: 1.5, className: "w-3 h-3 mr-2" }),
|
|
1732
1724
|
" Clear"
|
|
1733
1725
|
]
|
|
1734
1726
|
}
|
|
@@ -1737,7 +1729,7 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1737
1729
|
] }),
|
|
1738
1730
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
1739
1731
|
/* @__PURE__ */ jsxs("div", { className: "relative flex-1 min-w-[240px]", children: [
|
|
1740
|
-
/* @__PURE__ */ jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-3
|
|
1732
|
+
/* @__PURE__ */ jsx(Search, { strokeWidth: 1.5, className: "absolute left-3 top-1/2 -translate-y-1/2 w-3 h-3 text-zinc-500" }),
|
|
1741
1733
|
/* @__PURE__ */ jsx(
|
|
1742
1734
|
Input,
|
|
1743
1735
|
{
|
|
@@ -1752,7 +1744,7 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1752
1744
|
{
|
|
1753
1745
|
onClick: () => setSearch(""),
|
|
1754
1746
|
className: "absolute right-3 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-white",
|
|
1755
|
-
children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
|
|
1747
|
+
children: /* @__PURE__ */ jsx(X, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
1756
1748
|
}
|
|
1757
1749
|
)
|
|
1758
1750
|
] }),
|
|
@@ -1762,7 +1754,7 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1762
1754
|
{
|
|
1763
1755
|
onClick: () => setIsGlobal(false),
|
|
1764
1756
|
className: cn(
|
|
1765
|
-
"px-3 py-1.5 text-xs font-
|
|
1757
|
+
"px-3 py-1.5 text-xs font-medium rounded-md transition-all",
|
|
1766
1758
|
!isGlobal ? "bg-emerald-600 text-white shadow-lg shadow-emerald-600/20" : "text-zinc-500 hover:text-zinc-300"
|
|
1767
1759
|
),
|
|
1768
1760
|
children: "Active Conn"
|
|
@@ -1773,7 +1765,7 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1773
1765
|
{
|
|
1774
1766
|
onClick: () => setIsGlobal(true),
|
|
1775
1767
|
className: cn(
|
|
1776
|
-
"px-3 py-1.5 text-xs font-
|
|
1768
|
+
"px-3 py-1.5 text-xs font-medium rounded-md transition-all",
|
|
1777
1769
|
isGlobal ? "bg-emerald-600 text-white shadow-lg shadow-emerald-600/20" : "text-zinc-500 hover:text-zinc-300"
|
|
1778
1770
|
),
|
|
1779
1771
|
children: "All Connections"
|
|
@@ -1785,7 +1777,7 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1785
1777
|
{
|
|
1786
1778
|
onClick: () => setFilterStatus(status),
|
|
1787
1779
|
className: cn(
|
|
1788
|
-
"px-3 py-1.5 text-xs font-
|
|
1780
|
+
"px-3 py-1.5 text-xs font-medium rounded-md transition-all",
|
|
1789
1781
|
filterStatus === status ? "bg-white/10 text-white" : "text-zinc-500 hover:text-zinc-300"
|
|
1790
1782
|
),
|
|
1791
1783
|
children: status
|
|
@@ -1795,11 +1787,11 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1795
1787
|
] })
|
|
1796
1788
|
] }),
|
|
1797
1789
|
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto custom-scrollbar", children: filteredHistory.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col items-center justify-center opacity-20 p-8 text-center", children: [
|
|
1798
|
-
/* @__PURE__ */ jsx(History, { className: "w-16 h-16 mb-4 text-zinc-600" }),
|
|
1799
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
1800
|
-
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-500 mt-
|
|
1790
|
+
/* @__PURE__ */ jsx(History, { strokeWidth: 1.5, className: "w-16 h-16 mb-4 text-zinc-600" }),
|
|
1791
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "No history items found" }),
|
|
1792
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-500 mt-1r", children: "Run some queries to see them here" })
|
|
1801
1793
|
] }) : /* @__PURE__ */ jsx("div", { className: "min-w-[800px]", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left border-collapse", children: [
|
|
1802
|
-
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "bg-white/[0.02] border-b border-white/5 text-xs font-
|
|
1794
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "bg-white/[0.02] border-b border-white/5 text-xs font-medium text-zinc-500", children: [
|
|
1803
1795
|
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 w-10 text-center", children: "Status" }),
|
|
1804
1796
|
/* @__PURE__ */ jsx("th", { className: "px-4 py-3 cursor-pointer hover:text-zinc-300 transition-colors group", onClick: () => handleSort("executedAt"), children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1805
1797
|
"Executed At",
|
|
@@ -1822,27 +1814,27 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1822
1814
|
{
|
|
1823
1815
|
className: "hover:bg-white/[0.03] transition-colors group text-xs border-b border-white/5",
|
|
1824
1816
|
children: [
|
|
1825
|
-
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-center", children: /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: item.status === "success" ? /* @__PURE__ */ jsx("div", { className: "w-5 h-5 rounded-full bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20", children: /* @__PURE__ */ jsx(CheckCircle2, { className: "w-3 h-3 text-emerald-500" }) }) : /* @__PURE__ */ jsx("div", { className: "w-5 h-5 rounded-full bg-red-500/10 flex items-center justify-center border border-red-500/20", children: /* @__PURE__ */ jsx(AlertCircle, { className: "w-3 h-3 text-red-500" }) }) }) }),
|
|
1817
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 text-center", children: /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: item.status === "success" ? /* @__PURE__ */ jsx("div", { className: "w-5 h-5 rounded-full bg-emerald-500/10 flex items-center justify-center border border-emerald-500/20", children: /* @__PURE__ */ jsx(CheckCircle2, { strokeWidth: 1.5, className: "w-3 h-3 text-emerald-500" }) }) : /* @__PURE__ */ jsx("div", { className: "w-5 h-5 rounded-full bg-red-500/10 flex items-center justify-center border border-red-500/20", children: /* @__PURE__ */ jsx(AlertCircle, { strokeWidth: 1.5, className: "w-3 h-3 text-red-500" }) }) }) }),
|
|
1826
1818
|
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 whitespace-nowrap", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
1827
1819
|
/* @__PURE__ */ jsx("span", { className: "text-zinc-200 font-medium", children: item.executedAt ? format(new Date(item.executedAt), "MMM d, HH:mm:ss") : "-" }),
|
|
1828
1820
|
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-mono mt-0.5", children: item.executedAt ? format(new Date(item.executedAt), "yyyy") : "" })
|
|
1829
1821
|
] }) }),
|
|
1830
1822
|
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 whitespace-nowrap", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
1831
1823
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-zinc-300", children: [
|
|
1832
|
-
/* @__PURE__ */ jsx(Database, { className: "w-3 h-3 text-blue-400" }),
|
|
1833
|
-
/* @__PURE__ */ jsx("span", { className: "font-
|
|
1824
|
+
/* @__PURE__ */ jsx(Database, { strokeWidth: 1.5, className: "w-3 h-3 text-blue-400" }),
|
|
1825
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: item.connectionName || "Unknown" })
|
|
1834
1826
|
] }),
|
|
1835
1827
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 text-zinc-500 text-xs", children: [
|
|
1836
|
-
/* @__PURE__ */ jsx(Hash, { className: "w-2.5 h-2.5" }),
|
|
1828
|
+
/* @__PURE__ */ jsx(Hash, { strokeWidth: 1.5, className: "w-2.5 h-2.5" }),
|
|
1837
1829
|
/* @__PURE__ */ jsx("span", { children: item.tabName || "Default Tab" })
|
|
1838
1830
|
] })
|
|
1839
1831
|
] }) }),
|
|
1840
1832
|
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 max-w-md", children: /* @__PURE__ */ jsxs("div", { className: "bg-[#050505] border border-white/5 rounded-md p-2 relative group-hover:border-white/10 transition-colors", children: [
|
|
1841
|
-
/* @__PURE__ */ jsx("pre", { className: "text-
|
|
1833
|
+
/* @__PURE__ */ jsx("pre", { className: "text-xs font-mono text-zinc-400 line-clamp-2 break-all whitespace-pre-wrap leading-relaxed", children: item.query }),
|
|
1842
1834
|
item.errorMessage && /* @__PURE__ */ jsx("div", { className: "mt-2 pt-2 border-t border-red-500/10 text-xs text-red-400/80 font-mono italic", children: item.errorMessage })
|
|
1843
1835
|
] }) }),
|
|
1844
1836
|
/* @__PURE__ */ jsx("td", { className: "px-4 py-4 whitespace-nowrap", children: /* @__PURE__ */ jsxs("span", { className: cn(
|
|
1845
|
-
"px-2 py-0.5 rounded text-xs font-mono font-
|
|
1837
|
+
"px-2 py-0.5 rounded text-xs font-mono font-medium",
|
|
1846
1838
|
item.executionTime > 500 ? "text-amber-400 bg-amber-400/10" : "text-zinc-400 bg-white/5"
|
|
1847
1839
|
), children: [
|
|
1848
1840
|
item.executionTime,
|
|
@@ -1857,7 +1849,7 @@ function QueryHistory({ onSelectQuery, activeConnectionId, refreshTrigger }) {
|
|
|
1857
1849
|
className: "h-8 w-8 p-0 hover:bg-emerald-500/10 hover:text-emerald-400",
|
|
1858
1850
|
onClick: () => onSelectQuery(item.query),
|
|
1859
1851
|
title: "Restore Query",
|
|
1860
|
-
children: /* @__PURE__ */ jsx(RotateCcw, { className: "w-3
|
|
1852
|
+
children: /* @__PURE__ */ jsx(RotateCcw, { className: "w-3 h-3" })
|
|
1861
1853
|
}
|
|
1862
1854
|
) })
|
|
1863
1855
|
]
|
|
@@ -1887,12 +1879,12 @@ function SavedQueries({ onSelectQuery, connectionType, refreshTrigger }) {
|
|
|
1887
1879
|
};
|
|
1888
1880
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col bg-[#0a0a0a]", children: [
|
|
1889
1881
|
/* @__PURE__ */ jsxs("div", { className: "p-4 border-b border-white/5 flex flex-col gap-4", children: [
|
|
1890
|
-
/* @__PURE__ */ jsxs("h3", { className: "text-
|
|
1891
|
-
/* @__PURE__ */ jsx(Bookmark, { className: "w-
|
|
1882
|
+
/* @__PURE__ */ jsxs("h3", { className: "text-xs font-medium text-zinc-400 flex items-center gap-2", children: [
|
|
1883
|
+
/* @__PURE__ */ jsx(Bookmark, { strokeWidth: 1.5, className: "w-3.5 h-3.5" }),
|
|
1892
1884
|
" Saved Queries"
|
|
1893
1885
|
] }),
|
|
1894
1886
|
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
1895
|
-
/* @__PURE__ */ jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3
|
|
1887
|
+
/* @__PURE__ */ jsx(Search, { strokeWidth: 1.5, className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-zinc-500" }),
|
|
1896
1888
|
/* @__PURE__ */ jsx(
|
|
1897
1889
|
Input,
|
|
1898
1890
|
{
|
|
@@ -1905,8 +1897,8 @@ function SavedQueries({ onSelectQuery, connectionType, refreshTrigger }) {
|
|
|
1905
1897
|
] })
|
|
1906
1898
|
] }),
|
|
1907
1899
|
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto custom-scrollbar", children: filteredQueries.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col items-center justify-center opacity-20 p-8 text-center", children: [
|
|
1908
|
-
/* @__PURE__ */ jsx(Bookmark, { className: "w-12 h-12 mb-4" }),
|
|
1909
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
1900
|
+
/* @__PURE__ */ jsx(Bookmark, { strokeWidth: 1.5, className: "w-12 h-12 mb-4" }),
|
|
1901
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs italic", children: "No saved queries found" })
|
|
1910
1902
|
] }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-px bg-white/5", children: filteredQueries.map((q) => {
|
|
1911
1903
|
var _a;
|
|
1912
1904
|
return /* @__PURE__ */ jsxs(
|
|
@@ -1917,11 +1909,11 @@ function SavedQueries({ onSelectQuery, connectionType, refreshTrigger }) {
|
|
|
1917
1909
|
children: [
|
|
1918
1910
|
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between mb-2", children: [
|
|
1919
1911
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1920
|
-
/* @__PURE__ */ jsx("h4", { className: "text-xs font-
|
|
1912
|
+
/* @__PURE__ */ jsx("h4", { className: "text-xs font-medium text-blue-400 mb-1 group-hover:text-blue-300 transition-colors", children: q.name }),
|
|
1921
1913
|
q.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-500 line-clamp-1", children: q.description })
|
|
1922
1914
|
] }),
|
|
1923
1915
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity", children: [
|
|
1924
|
-
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-zinc-500 hover:text-white", children: /* @__PURE__ */ jsx(Edit3, { className: "w-3 h-3" }) }),
|
|
1916
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", className: "h-6 w-6 text-zinc-500 hover:text-white", children: /* @__PURE__ */ jsx(Edit3, { strokeWidth: 1.5, className: "w-3 h-3" }) }),
|
|
1925
1917
|
/* @__PURE__ */ jsx(
|
|
1926
1918
|
Button,
|
|
1927
1919
|
{
|
|
@@ -1929,7 +1921,7 @@ function SavedQueries({ onSelectQuery, connectionType, refreshTrigger }) {
|
|
|
1929
1921
|
size: "icon",
|
|
1930
1922
|
className: "h-6 w-6 text-zinc-500 hover:text-red-400",
|
|
1931
1923
|
onClick: (e) => handleDelete(q.id, e),
|
|
1932
|
-
children: /* @__PURE__ */ jsx(Trash2, { className: "w-3 h-3" })
|
|
1924
|
+
children: /* @__PURE__ */ jsx(Trash2, { strokeWidth: 1.5, className: "w-3 h-3" })
|
|
1933
1925
|
}
|
|
1934
1926
|
)
|
|
1935
1927
|
] })
|
|
@@ -1937,14 +1929,14 @@ function SavedQueries({ onSelectQuery, connectionType, refreshTrigger }) {
|
|
|
1937
1929
|
/* @__PURE__ */ jsx("div", { className: "bg-[#050505] border border-white/5 rounded-md p-2 mb-3", children: /* @__PURE__ */ jsx("pre", { className: "text-xs font-mono text-zinc-400 line-clamp-3", children: q.query }) }),
|
|
1938
1930
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
1939
1931
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1940
|
-
/* @__PURE__ */ jsx("span", { className: "px-1.5 py-0.5 rounded bg-blue-500/10 border border-blue-500/20 text-
|
|
1941
|
-
(_a = q.tags) == null ? void 0 : _a.map((tag) => /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-
|
|
1942
|
-
/* @__PURE__ */ jsx(Tag, { className: "w-2.5 h-2.5" }),
|
|
1932
|
+
/* @__PURE__ */ jsx("span", { className: "px-1.5 py-0.5 rounded bg-blue-500/10 border border-blue-500/20 text-[0.625rem] font-medium text-blue-400er", children: q.connectionType }),
|
|
1933
|
+
(_a = q.tags) == null ? void 0 : _a.map((tag) => /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-[0.625rem] text-zinc-500", children: [
|
|
1934
|
+
/* @__PURE__ */ jsx(Tag, { strokeWidth: 1.5, className: "w-2.5 h-2.5" }),
|
|
1943
1935
|
" ",
|
|
1944
1936
|
tag
|
|
1945
1937
|
] }, tag))
|
|
1946
1938
|
] }),
|
|
1947
|
-
/* @__PURE__ */ jsxs("span", { className: "text-
|
|
1939
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[0.625rem] text-zinc-600 flex items-center gap-1 font-mono", children: [
|
|
1948
1940
|
/* @__PURE__ */ jsx(Calendar, { className: "w-2.5 h-2.5" }),
|
|
1949
1941
|
" ",
|
|
1950
1942
|
format(q.updatedAt, "MMM d, yyyy")
|
|
@@ -2464,7 +2456,7 @@ function SnapshotTimeline({ snapshots, onCompare, onDelete }) {
|
|
|
2464
2456
|
);
|
|
2465
2457
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
2466
2458
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-2", children: [
|
|
2467
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs
|
|
2459
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-500 font-medium", children: "Timeline" }),
|
|
2468
2460
|
canCompare && /* @__PURE__ */ jsx("span", { className: "text-xs text-blue-400", children: "Comparing 2 snapshots" })
|
|
2469
2461
|
] }),
|
|
2470
2462
|
/* @__PURE__ */ jsxs("div", { className: "relative flex items-center overflow-x-auto pb-2 px-2 gap-0", children: [
|
|
@@ -2479,7 +2471,7 @@ function SnapshotTimeline({ snapshots, onCompare, onDelete }) {
|
|
|
2479
2471
|
onClick: () => handleClick(snapshot.id),
|
|
2480
2472
|
children: [
|
|
2481
2473
|
/* @__PURE__ */ jsx("div", { className: cn(
|
|
2482
|
-
"w-
|
|
2474
|
+
"w-3.5 h-3.5 rounded-full border-2 z-10 transition-all",
|
|
2483
2475
|
isSelected ? "bg-blue-500 border-blue-400 scale-125" : "bg-[#0d0d0d] border-white/20 hover:border-white/40"
|
|
2484
2476
|
) }),
|
|
2485
2477
|
idx < sorted.length - 1 && /* @__PURE__ */ jsx("div", { className: "absolute top-[7px] left-[50%] w-full h-[2px] bg-white/10" }),
|
|
@@ -2488,12 +2480,12 @@ function SnapshotTimeline({ snapshots, onCompare, onDelete }) {
|
|
|
2488
2480
|
isSelected ? "text-blue-400" : "text-zinc-500 group-hover:text-zinc-300"
|
|
2489
2481
|
), children: [
|
|
2490
2482
|
/* @__PURE__ */ jsx("div", { className: "text-xs font-medium truncate max-w-[90px]", children: snapshot.label || snapshot.connectionName }),
|
|
2491
|
-
/* @__PURE__ */ jsxs("div", { className: "text-
|
|
2483
|
+
/* @__PURE__ */ jsxs("div", { className: "text-[0.625rem] text-zinc-600", children: [
|
|
2492
2484
|
date.toLocaleDateString(),
|
|
2493
2485
|
" ",
|
|
2494
2486
|
date.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })
|
|
2495
2487
|
] }),
|
|
2496
|
-
/* @__PURE__ */ jsxs(Badge, { variant: "secondary", className: "text-
|
|
2488
|
+
/* @__PURE__ */ jsxs(Badge, { variant: "secondary", className: "text-[0.625rem] mt-1", children: [
|
|
2497
2489
|
snapshot.schema.length,
|
|
2498
2490
|
" tables"
|
|
2499
2491
|
] })
|
|
@@ -2506,7 +2498,7 @@ function SnapshotTimeline({ snapshots, onCompare, onDelete }) {
|
|
|
2506
2498
|
onDelete(snapshot.id);
|
|
2507
2499
|
},
|
|
2508
2500
|
className: "absolute -top-2 -right-1 p-0.5 text-zinc-600 hover:text-red-400 opacity-0 group-hover:opacity-100 transition-opacity",
|
|
2509
|
-
children: /* @__PURE__ */ jsx(Trash2, { className: "w-2.5 h-2.5" })
|
|
2501
|
+
children: /* @__PURE__ */ jsx(Trash2, { strokeWidth: 1.5, className: "w-2.5 h-2.5" })
|
|
2510
2502
|
}
|
|
2511
2503
|
)
|
|
2512
2504
|
]
|
|
@@ -2600,7 +2592,7 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2600
2592
|
switch (action) {
|
|
2601
2593
|
case "added":
|
|
2602
2594
|
return /* @__PURE__ */ jsxs(Badge, { className: "bg-green-500/20 text-green-400 border-green-500/30 text-xs", children: [
|
|
2603
|
-
/* @__PURE__ */ jsx(Plus, { className: "w-2.5 h-2.5 mr-0.5" }),
|
|
2595
|
+
/* @__PURE__ */ jsx(Plus, { strokeWidth: 1.5, className: "w-2.5 h-2.5 mr-0.5" }),
|
|
2604
2596
|
"Added"
|
|
2605
2597
|
] });
|
|
2606
2598
|
case "removed":
|
|
@@ -2610,7 +2602,7 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2610
2602
|
] });
|
|
2611
2603
|
case "modified":
|
|
2612
2604
|
return /* @__PURE__ */ jsxs(Badge, { className: "bg-yellow-500/20 text-yellow-400 border-yellow-500/30 text-xs", children: [
|
|
2613
|
-
/* @__PURE__ */ jsx(Edit3, { className: "w-2.5 h-2.5 mr-0.5" }),
|
|
2605
|
+
/* @__PURE__ */ jsx(Edit3, { strokeWidth: 1.5, className: "w-2.5 h-2.5 mr-0.5" }),
|
|
2614
2606
|
"Modified"
|
|
2615
2607
|
] });
|
|
2616
2608
|
default:
|
|
@@ -2623,20 +2615,20 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2623
2615
|
};
|
|
2624
2616
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col bg-[#080808]", children: [
|
|
2625
2617
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-white/5 bg-[#0a0a0a] flex-wrap", children: [
|
|
2626
|
-
/* @__PURE__ */ jsx(GitCompare, { className: "w-
|
|
2627
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
2618
|
+
/* @__PURE__ */ jsx(GitCompare, { strokeWidth: 1.5, className: "w-3.5 h-3.5 text-rose-400" }),
|
|
2619
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-zinc-400r", children: "Schema Diff" }),
|
|
2628
2620
|
/* @__PURE__ */ jsx("div", { className: "h-4 w-px bg-white/10" }),
|
|
2629
2621
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2630
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-600
|
|
2622
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-600", children: "Source" }),
|
|
2631
2623
|
/* @__PURE__ */ jsxs(Select, { value: sourceId, onValueChange: setSourceId, children: [
|
|
2632
2624
|
/* @__PURE__ */ jsx(SelectTrigger, { className: "h-7 w-[180px] text-xs bg-white/5 border-white/10", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select source" }) }),
|
|
2633
2625
|
/* @__PURE__ */ jsxs(SelectContent, { className: "bg-[#111] border-white/10", children: [
|
|
2634
2626
|
/* @__PURE__ */ jsx(SelectItem, { value: "current", className: "text-xs", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2635
|
-
/* @__PURE__ */ jsx(Database, { className: "w-3 h-3" }),
|
|
2627
|
+
/* @__PURE__ */ jsx(Database, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
2636
2628
|
" Current Schema"
|
|
2637
2629
|
] }) }),
|
|
2638
2630
|
snapshots.map((s) => /* @__PURE__ */ jsx(SelectItem, { value: s.id, className: "text-xs", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2639
|
-
/* @__PURE__ */ jsx(Clock, { className: "w-3 h-3" }),
|
|
2631
|
+
/* @__PURE__ */ jsx(Clock, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
2640
2632
|
" ",
|
|
2641
2633
|
formatSnapshotLabel(s)
|
|
2642
2634
|
] }) }, s.id))
|
|
@@ -2645,7 +2637,7 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2645
2637
|
] }),
|
|
2646
2638
|
/* @__PURE__ */ jsx("span", { className: "text-zinc-600 text-xs", children: "vs" }),
|
|
2647
2639
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2648
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-600
|
|
2640
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-600", children: "Target" }),
|
|
2649
2641
|
/* @__PURE__ */ jsxs(Select, { value: targetId, onValueChange: (v) => {
|
|
2650
2642
|
if (v.startsWith("conn:")) {
|
|
2651
2643
|
fetchRemoteSchema(v.replace("conn:", ""));
|
|
@@ -2656,21 +2648,21 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2656
2648
|
/* @__PURE__ */ jsx(SelectTrigger, { className: "h-7 w-[180px] text-xs bg-white/5 border-white/10", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select target" }) }),
|
|
2657
2649
|
/* @__PURE__ */ jsxs(SelectContent, { className: "bg-[#111] border-white/10", children: [
|
|
2658
2650
|
/* @__PURE__ */ jsx(SelectItem, { value: "current", className: "text-xs", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2659
|
-
/* @__PURE__ */ jsx(Database, { className: "w-3 h-3" }),
|
|
2651
|
+
/* @__PURE__ */ jsx(Database, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
2660
2652
|
" Current Schema"
|
|
2661
2653
|
] }) }),
|
|
2662
2654
|
snapshots.map((s) => /* @__PURE__ */ jsx(SelectItem, { value: s.id, className: "text-xs", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2663
|
-
/* @__PURE__ */ jsx(Clock, { className: "w-3 h-3" }),
|
|
2655
|
+
/* @__PURE__ */ jsx(Clock, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
2664
2656
|
" ",
|
|
2665
2657
|
formatSnapshotLabel(s)
|
|
2666
2658
|
] }) }, s.id)),
|
|
2667
2659
|
allConnections.filter((c) => c.id !== (connection == null ? void 0 : connection.id)).length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
2668
|
-
/* @__PURE__ */ jsx("div", { className: "px-2 py-1 text-
|
|
2660
|
+
/* @__PURE__ */ jsx("div", { className: "px-2 py-1 text-[0.625rem] text-zinc-600 border-t border-white/5 mt-1", children: "Fetch from connection" }),
|
|
2669
2661
|
allConnections.filter((c) => c.id !== (connection == null ? void 0 : connection.id)).map((c) => /* @__PURE__ */ jsx(SelectItem, { value: `conn:${c.id}`, className: "text-xs", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2670
|
-
/* @__PURE__ */ jsx(Database, { className: "w-3 h-3 text-blue-400" }),
|
|
2662
|
+
/* @__PURE__ */ jsx(Database, { strokeWidth: 1.5, className: "w-3 h-3 text-blue-400" }),
|
|
2671
2663
|
" ",
|
|
2672
2664
|
c.name,
|
|
2673
|
-
c.environment === "production" && /* @__PURE__ */ jsx(AlertTriangle, { className: "w-3 h-3 text-red-400" })
|
|
2665
|
+
c.environment === "production" && /* @__PURE__ */ jsx(AlertTriangle, { strokeWidth: 1.5, className: "w-3 h-3 text-red-400" })
|
|
2674
2666
|
] }) }, `conn:${c.id}`))
|
|
2675
2667
|
] })
|
|
2676
2668
|
] })
|
|
@@ -2698,7 +2690,7 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2698
2690
|
{
|
|
2699
2691
|
variant: "ghost",
|
|
2700
2692
|
size: "sm",
|
|
2701
|
-
className: "h-7 text-xs font-
|
|
2693
|
+
className: "h-7 text-xs font-medium text-zinc-500 hover:text-white gap-1",
|
|
2702
2694
|
onClick: () => setShowLabelInput(true),
|
|
2703
2695
|
disabled: !connection,
|
|
2704
2696
|
children: [
|
|
@@ -2712,7 +2704,7 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2712
2704
|
{
|
|
2713
2705
|
variant: "ghost",
|
|
2714
2706
|
size: "sm",
|
|
2715
|
-
className: "h-7 text-xs font-
|
|
2707
|
+
className: "h-7 text-xs font-medium text-zinc-500 hover:text-white gap-1",
|
|
2716
2708
|
onClick: () => setShowMigration(!showMigration),
|
|
2717
2709
|
children: [
|
|
2718
2710
|
/* @__PURE__ */ jsx(FileCode, { className: "w-3 h-3" }),
|
|
@@ -2723,8 +2715,8 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2723
2715
|
)
|
|
2724
2716
|
] }),
|
|
2725
2717
|
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-hidden flex", children: !targetId ? /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col items-center justify-center text-zinc-600 gap-3", children: [
|
|
2726
|
-
/* @__PURE__ */ jsx(GitCompare, { className: "w-10 h-10 opacity-30" }),
|
|
2727
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
2718
|
+
/* @__PURE__ */ jsx(GitCompare, { strokeWidth: 1.5, className: "w-10 h-10 opacity-30" }),
|
|
2719
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs", children: "Select source and target to compare schemas" }),
|
|
2728
2720
|
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-700", children: "Take a snapshot first, then compare with the current schema" }),
|
|
2729
2721
|
snapshots.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-4 w-full max-w-2xl px-4", children: /* @__PURE__ */ jsx(
|
|
2730
2722
|
SnapshotTimeline,
|
|
@@ -2739,7 +2731,7 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2739
2731
|
) })
|
|
2740
2732
|
] }) : showMigration && migrationSQL ? /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto p-4", children: /* @__PURE__ */ jsx("pre", { className: "text-xs font-mono text-zinc-300 bg-[#0d0d0d] border border-white/10 rounded-lg p-4 overflow-auto whitespace-pre-wrap", children: migrationSQL }) }) : diff && diff.hasChanges ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
2741
2733
|
/* @__PURE__ */ jsxs("div", { className: "w-64 border-r border-white/5 overflow-auto", children: [
|
|
2742
|
-
/* @__PURE__ */ jsx("div", { className: "p-2 border-b border-white/5", children: /* @__PURE__ */ jsxs("div", { className: "text-xs text-zinc-500
|
|
2734
|
+
/* @__PURE__ */ jsx("div", { className: "p-2 border-b border-white/5", children: /* @__PURE__ */ jsxs("div", { className: "text-xs text-zinc-500 px-2 mb-1", children: [
|
|
2743
2735
|
diff.summary.added,
|
|
2744
2736
|
" added, ",
|
|
2745
2737
|
diff.summary.removed,
|
|
@@ -2756,7 +2748,7 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2756
2748
|
selectedTable === table.tableName && "bg-white/10"
|
|
2757
2749
|
),
|
|
2758
2750
|
children: [
|
|
2759
|
-
selectedTable === table.tableName ? /* @__PURE__ */ jsx(ChevronDown, { className: "w-3 h-3 text-zinc-500" }) : /* @__PURE__ */ jsx(ChevronRight, { className: "w-3 h-3 text-zinc-500" }),
|
|
2751
|
+
selectedTable === table.tableName ? /* @__PURE__ */ jsx(ChevronDown, { strokeWidth: 1.5, className: "w-3 h-3 text-zinc-500" }) : /* @__PURE__ */ jsx(ChevronRight, { strokeWidth: 1.5, className: "w-3 h-3 text-zinc-500" }),
|
|
2760
2752
|
/* @__PURE__ */ jsx("span", { className: "text-zinc-300", children: table.tableName }),
|
|
2761
2753
|
/* @__PURE__ */ jsx("span", { className: "ml-auto", children: getActionBadge(table.action) })
|
|
2762
2754
|
]
|
|
@@ -2764,18 +2756,18 @@ function SchemaDiff({ schema, connection }) {
|
|
|
2764
2756
|
table.tableName
|
|
2765
2757
|
))
|
|
2766
2758
|
] }),
|
|
2767
|
-
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto p-4", children: selectedTable ? /* @__PURE__ */ jsx(TableDiffDetail, { diff: diff.tables.find((t) => t.tableName === selectedTable) }) : /* @__PURE__ */ jsx("div", { className: "h-full flex items-center justify-center text-zinc-600 text-
|
|
2768
|
-
] }) : diff && !diff.hasChanges ? /* @__PURE__ */ jsx("div", { className: "flex-1 flex items-center justify-center text-zinc-600 gap-2", children: /* @__PURE__ */ jsx("span", { className: "text-
|
|
2769
|
-
/* @__PURE__ */ jsx(AlertTriangle, { className: "w-
|
|
2770
|
-
/* @__PURE__ */ jsx("span", { className: "text-
|
|
2759
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto p-4", children: selectedTable ? /* @__PURE__ */ jsx(TableDiffDetail, { diff: diff.tables.find((t) => t.tableName === selectedTable) }) : /* @__PURE__ */ jsx("div", { className: "h-full flex items-center justify-center text-zinc-600 text-xs", children: "Select a table to view diff details" }) })
|
|
2760
|
+
] }) : diff && !diff.hasChanges ? /* @__PURE__ */ jsx("div", { className: "flex-1 flex items-center justify-center text-zinc-600 gap-2", children: /* @__PURE__ */ jsx("span", { className: "text-xs", children: "No differences found between source and target" }) }) : /* @__PURE__ */ jsxs("div", { className: "flex-1 flex items-center justify-center text-zinc-600 gap-2", children: [
|
|
2761
|
+
/* @__PURE__ */ jsx(AlertTriangle, { strokeWidth: 1.5, className: "w-3.5 h-3.5" }),
|
|
2762
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs", children: "Cannot compare same schema with itself" })
|
|
2771
2763
|
] }) })
|
|
2772
2764
|
] });
|
|
2773
2765
|
}
|
|
2774
2766
|
function TableDiffDetail({ diff }) {
|
|
2775
2767
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
2776
2768
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
2777
|
-
/* @__PURE__ */ jsx(Database, { className: "w-
|
|
2778
|
-
/* @__PURE__ */ jsx("h3", { className: "text-
|
|
2769
|
+
/* @__PURE__ */ jsx(Database, { strokeWidth: 1.5, className: "w-3.5 h-3.5 text-zinc-400" }),
|
|
2770
|
+
/* @__PURE__ */ jsx("h3", { className: "text-xs font-medium text-zinc-200", children: diff.tableName }),
|
|
2779
2771
|
/* @__PURE__ */ jsx(Badge, { className: cn(
|
|
2780
2772
|
"text-xs",
|
|
2781
2773
|
diff.action === "added" && "bg-green-500/20 text-green-400",
|
|
@@ -2784,7 +2776,7 @@ function TableDiffDetail({ diff }) {
|
|
|
2784
2776
|
), children: diff.action })
|
|
2785
2777
|
] }),
|
|
2786
2778
|
diff.columns.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
|
|
2787
|
-
/* @__PURE__ */ jsx("h4", { className: "text-xs
|
|
2779
|
+
/* @__PURE__ */ jsx("h4", { className: "text-xs text-zinc-500 mb-2 font-medium", children: "Columns" }),
|
|
2788
2780
|
/* @__PURE__ */ jsx("div", { className: "space-y-1", children: diff.columns.map((col, i) => /* @__PURE__ */ jsxs("div", { className: cn(
|
|
2789
2781
|
"px-3 py-2 rounded text-xs flex items-center gap-2",
|
|
2790
2782
|
col.action === "added" && "bg-green-500/5 border border-green-500/10",
|
|
@@ -2799,7 +2791,7 @@ function TableDiffDetail({ diff }) {
|
|
|
2799
2791
|
] }, i)) })
|
|
2800
2792
|
] }),
|
|
2801
2793
|
diff.indexes.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
|
|
2802
|
-
/* @__PURE__ */ jsx("h4", { className: "text-xs
|
|
2794
|
+
/* @__PURE__ */ jsx("h4", { className: "text-xs text-zinc-500 mb-2 font-medium", children: "Indexes" }),
|
|
2803
2795
|
/* @__PURE__ */ jsx("div", { className: "space-y-1", children: diff.indexes.map((idx, i) => /* @__PURE__ */ jsxs("div", { className: cn(
|
|
2804
2796
|
"px-3 py-2 rounded text-xs flex items-center gap-2",
|
|
2805
2797
|
idx.action === "added" && "bg-green-500/5 border border-green-500/10",
|
|
@@ -2812,7 +2804,7 @@ function TableDiffDetail({ diff }) {
|
|
|
2812
2804
|
] }, i)) })
|
|
2813
2805
|
] }),
|
|
2814
2806
|
diff.foreignKeys.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
|
|
2815
|
-
/* @__PURE__ */ jsx("h4", { className: "text-xs
|
|
2807
|
+
/* @__PURE__ */ jsx("h4", { className: "text-xs text-zinc-500 mb-2 font-medium", children: "Foreign Keys" }),
|
|
2816
2808
|
/* @__PURE__ */ jsx("div", { className: "space-y-1", children: diff.foreignKeys.map((fk, i) => /* @__PURE__ */ jsxs("div", { className: cn(
|
|
2817
2809
|
"px-3 py-2 rounded text-xs flex items-center gap-2",
|
|
2818
2810
|
fk.action === "added" && "bg-green-500/5 border border-green-500/10",
|
|
@@ -2828,11 +2820,11 @@ function TableDiffDetail({ diff }) {
|
|
|
2828
2820
|
function getActionIcon(action) {
|
|
2829
2821
|
switch (action) {
|
|
2830
2822
|
case "added":
|
|
2831
|
-
return /* @__PURE__ */ jsx(Plus, { className: "w-3 h-3 text-green-400" });
|
|
2823
|
+
return /* @__PURE__ */ jsx(Plus, { strokeWidth: 1.5, className: "w-3 h-3 text-green-400" });
|
|
2832
2824
|
case "removed":
|
|
2833
2825
|
return /* @__PURE__ */ jsx(Minus, { className: "w-3 h-3 text-red-400" });
|
|
2834
2826
|
case "modified":
|
|
2835
|
-
return /* @__PURE__ */ jsx(Edit3, { className: "w-3 h-3 text-yellow-400" });
|
|
2827
|
+
return /* @__PURE__ */ jsx(Edit3, { strokeWidth: 1.5, className: "w-3 h-3 text-yellow-400" });
|
|
2836
2828
|
default:
|
|
2837
2829
|
return null;
|
|
2838
2830
|
}
|
|
@@ -2845,8 +2837,8 @@ function ChartDashboardLazy({ result }) {
|
|
|
2845
2837
|
}, []);
|
|
2846
2838
|
if (savedCharts.length === 0) {
|
|
2847
2839
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col items-center justify-center bg-[#080808] text-zinc-500 gap-2", children: [
|
|
2848
|
-
/* @__PURE__ */ jsx(LayoutDashboard, { className: "w-10 h-10 opacity-30" }),
|
|
2849
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
2840
|
+
/* @__PURE__ */ jsx(LayoutDashboard, { strokeWidth: 1.5, className: "w-10 h-10 opacity-30" }),
|
|
2841
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs", children: "No saved charts yet" }),
|
|
2850
2842
|
/* @__PURE__ */ jsx("p", { className: "text-xs text-zinc-600", children: "Save charts from the Charts tab to display them here" })
|
|
2851
2843
|
] });
|
|
2852
2844
|
}
|
|
@@ -2854,8 +2846,8 @@ function ChartDashboardLazy({ result }) {
|
|
|
2854
2846
|
var _a;
|
|
2855
2847
|
return /* @__PURE__ */ jsxs("div", { className: "bg-[#0d0d0d] border border-white/10 rounded-lg p-3", children: [
|
|
2856
2848
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-2", children: [
|
|
2857
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs font-
|
|
2858
|
-
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-600
|
|
2849
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-zinc-300", children: chart.name }),
|
|
2850
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-zinc-600", children: chart.chartType })
|
|
2859
2851
|
] }),
|
|
2860
2852
|
/* @__PURE__ */ jsxs("div", { className: "text-xs text-zinc-500", children: [
|
|
2861
2853
|
chart.xAxis && /* @__PURE__ */ jsxs("span", { children: [
|
|
@@ -2899,17 +2891,17 @@ function BottomPanel({
|
|
|
2899
2891
|
onExportResults
|
|
2900
2892
|
}) {
|
|
2901
2893
|
const tabs = [
|
|
2902
|
-
{ key: "results", label: "Results", icon: /* @__PURE__ */ jsx(LayoutGrid, { className: "w-3 h-3" }), activeClass: "text-blue-400 border-blue-500 bg-white/5" },
|
|
2903
|
-
{ key: "explain", label: "Explain", icon: /* @__PURE__ */ jsx(Zap, { className: "w-3 h-3" }), activeClass: "text-amber-400 border-amber-500 bg-white/5" },
|
|
2904
|
-
{ key: "history", label: "History", icon: /* @__PURE__ */ jsx(Clock, { className: "w-3 h-3" }), activeClass: "text-emerald-400 border-emerald-500 bg-white/5" },
|
|
2905
|
-
{ key: "saved", label: "Saved", icon: /* @__PURE__ */ jsx(Bookmark, { className: "w-3 h-3" }), activeClass: "text-purple-400 border-purple-500 bg-white/5" },
|
|
2906
|
-
{ key: "charts", label: "Charts", icon: /* @__PURE__ */ jsx(BarChart3, { className: "w-3 h-3" }), activeClass: "text-cyan-400 border-cyan-500 bg-white/5" },
|
|
2907
|
-
{ key: "nl2sql", label: "NL2SQL", icon: /* @__PURE__ */ jsx(Sparkles, { className: "w-3 h-3" }), activeClass: "text-violet-400 border-violet-500 bg-white/5" },
|
|
2908
|
-
{ key: "autopilot", label: "Autopilot", icon: /* @__PURE__ */ jsx(Zap, { className: "w-3 h-3" }), activeClass: "text-cyan-400 border-cyan-500 bg-white/5" },
|
|
2909
|
-
{ key: "pivot", label: "Pivot", icon: /* @__PURE__ */ jsx(Columns3, { className: "w-3 h-3" }), activeClass: "text-orange-400 border-orange-500 bg-white/5" },
|
|
2910
|
-
{ key: "docs", label: "Docs", icon: /* @__PURE__ */ jsx(FileText, { className: "w-3 h-3" }), activeClass: "text-teal-400 border-teal-500 bg-white/5" },
|
|
2911
|
-
{ key: "schemadiff", label: "Diff", icon: /* @__PURE__ */ jsx(GitCompare, { className: "w-3 h-3" }), activeClass: "text-rose-400 border-rose-500 bg-white/5" },
|
|
2912
|
-
{ key: "dashboard", label: "Dashboard", icon: /* @__PURE__ */ jsx(LayoutDashboard, { className: "w-3 h-3" }), activeClass: "text-indigo-400 border-indigo-500 bg-white/5" }
|
|
2894
|
+
{ key: "results", label: "Results", icon: /* @__PURE__ */ jsx(LayoutGrid, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-blue-400 border-blue-500 bg-white/5" },
|
|
2895
|
+
{ key: "explain", label: "Explain", icon: /* @__PURE__ */ jsx(Zap, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-amber-400 border-amber-500 bg-white/5" },
|
|
2896
|
+
{ key: "history", label: "History", icon: /* @__PURE__ */ jsx(Clock, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-emerald-400 border-emerald-500 bg-white/5" },
|
|
2897
|
+
{ key: "saved", label: "Saved", icon: /* @__PURE__ */ jsx(Bookmark, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-purple-400 border-purple-500 bg-white/5" },
|
|
2898
|
+
{ key: "charts", label: "Charts", icon: /* @__PURE__ */ jsx(BarChart3, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-cyan-400 border-cyan-500 bg-white/5" },
|
|
2899
|
+
{ key: "nl2sql", label: "NL2SQL", icon: /* @__PURE__ */ jsx(Sparkles, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-violet-400 border-violet-500 bg-white/5" },
|
|
2900
|
+
{ key: "autopilot", label: "Autopilot", icon: /* @__PURE__ */ jsx(Zap, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-cyan-400 border-cyan-500 bg-white/5" },
|
|
2901
|
+
{ key: "pivot", label: "Pivot", icon: /* @__PURE__ */ jsx(Columns3, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-orange-400 border-orange-500 bg-white/5" },
|
|
2902
|
+
{ key: "docs", label: "Docs", icon: /* @__PURE__ */ jsx(FileText, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-teal-400 border-teal-500 bg-white/5" },
|
|
2903
|
+
{ key: "schemadiff", label: "Diff", icon: /* @__PURE__ */ jsx(GitCompare, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-rose-400 border-rose-500 bg-white/5" },
|
|
2904
|
+
{ key: "dashboard", label: "Dashboard", icon: /* @__PURE__ */ jsx(LayoutDashboard, { strokeWidth: 1.5, className: "w-3 h-3" }), activeClass: "text-indigo-400 border-indigo-500 bg-white/5" }
|
|
2913
2905
|
];
|
|
2914
2906
|
return /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col bg-[#080808]", children: [
|
|
2915
2907
|
/* @__PURE__ */ jsxs("div", { className: "h-9 bg-[#0a0a0a] border-b border-white/5 flex items-center justify-between px-2", children: [
|
|
@@ -2921,7 +2913,7 @@ function BottomPanel({
|
|
|
2921
2913
|
if (tab.key === "nl2sql") onSetIsNL2SQLOpen(true);
|
|
2922
2914
|
},
|
|
2923
2915
|
className: cn(
|
|
2924
|
-
"h-full px-3 text-xs font-
|
|
2916
|
+
"h-full px-3 text-xs font-medium transition-all border-b-2 flex items-center gap-2",
|
|
2925
2917
|
mode === tab.key ? tab.activeClass : "text-zinc-500 border-transparent hover:text-zinc-300"
|
|
2926
2918
|
),
|
|
2927
2919
|
children: [
|
|
@@ -2940,8 +2932,8 @@ function BottomPanel({
|
|
|
2940
2932
|
"ms"
|
|
2941
2933
|
] }),
|
|
2942
2934
|
/* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
2943
|
-
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", className: "h-7 text-xs font-
|
|
2944
|
-
/* @__PURE__ */ jsx(Download, { className: "w-3 h-3" }),
|
|
2935
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "sm", className: "h-7 text-xs font-medium text-zinc-500 hover:text-white gap-2", children: [
|
|
2936
|
+
/* @__PURE__ */ jsx(Download, { strokeWidth: 1.5, className: "w-3 h-3" }),
|
|
2945
2937
|
" Export"
|
|
2946
2938
|
] }) }),
|
|
2947
2939
|
/* @__PURE__ */ jsxs(DropdownMenuContent, { align: "end", className: "bg-[#0d0d0d] border-white/10 text-zinc-300", children: [
|
|
@@ -3042,9 +3034,9 @@ function BottomPanel({
|
|
|
3042
3034
|
onDiscardChanges
|
|
3043
3035
|
}
|
|
3044
3036
|
) : /* @__PURE__ */ jsxs("div", { className: "h-full flex flex-col items-center justify-center opacity-20 bg-[#0a0a0a]", children: [
|
|
3045
|
-
/* @__PURE__ */ jsx(Terminal, { className: "w-12 h-12 mb-4" }),
|
|
3046
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
3047
|
-
/* @__PURE__ */ jsx("p", { className: "text-xs
|
|
3037
|
+
/* @__PURE__ */ jsx(Terminal, { strokeWidth: 1.5, className: "w-12 h-12 mb-4" }),
|
|
3038
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "Execute a query or check history" }),
|
|
3039
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs mt-2", children: "Ready to query" })
|
|
3048
3040
|
] }) })
|
|
3049
3041
|
] });
|
|
3050
3042
|
}
|
|
@@ -3927,7 +3919,7 @@ ${colDefs.join(",\n")}
|
|
|
3927
3919
|
/* @__PURE__ */ jsxs("main", { className: "flex-1 overflow-hidden relative", children: [
|
|
3928
3920
|
features.schemaDiagram && /* @__PURE__ */ jsx(AnimatePresence, { children: showDiagram && /* @__PURE__ */ jsx(SchemaDiagram, { schema: conn.schema, onClose: () => setShowDiagram(false) }) }),
|
|
3929
3921
|
activeMobileTab === "database" && /* @__PURE__ */ jsxs("div", { className: "md:hidden h-full bg-[#080808] overflow-auto p-4", children: [
|
|
3930
|
-
/* @__PURE__ */ jsx("div", { className: "mb-4 flex items-center justify-between", children: /* @__PURE__ */ jsx("h2", { className: "text-
|
|
3922
|
+
/* @__PURE__ */ jsx("div", { className: "mb-4 flex items-center justify-between", children: /* @__PURE__ */ jsx("h2", { className: "text-xs font-medium text-zinc-300", children: "Connections" }) }),
|
|
3931
3923
|
/* @__PURE__ */ jsx(
|
|
3932
3924
|
ConnectionsList,
|
|
3933
3925
|
{
|
|
@@ -3965,8 +3957,8 @@ ${colDefs.join(",\n")}
|
|
|
3965
3957
|
onGenerateTestData: features.testDataGenerator ? (name) => setTestDataTable(name) : void 0
|
|
3966
3958
|
}
|
|
3967
3959
|
) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center h-full text-zinc-500", children: [
|
|
3968
|
-
/* @__PURE__ */ jsx(Database, { className: "w-12 h-12 mb-4 opacity-30" }),
|
|
3969
|
-
/* @__PURE__ */ jsx("p", { className: "text-
|
|
3960
|
+
/* @__PURE__ */ jsx(Database, { strokeWidth: 1.5, className: "w-12 h-12 mb-4 opacity-30" }),
|
|
3961
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs", children: "Select a connection first" })
|
|
3970
3962
|
] }) }),
|
|
3971
3963
|
/* @__PURE__ */ jsx("div", { className: cn(
|
|
3972
3964
|
"h-full",
|
|
@@ -4123,10 +4115,10 @@ ${colDefs.join(",\n")}
|
|
|
4123
4115
|
),
|
|
4124
4116
|
/* @__PURE__ */ jsx(AlertDialog, { open: queryExec.unlimitedWarningOpen, onOpenChange: queryExec.setUnlimitedWarningOpen, children: /* @__PURE__ */ jsxs(AlertDialogContent, { className: "bg-[#111] border-white/5 max-w-sm p-0 gap-0 overflow-hidden", children: [
|
|
4125
4117
|
/* @__PURE__ */ jsx("div", { className: "px-6 pt-6 pb-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
|
|
4126
|
-
/* @__PURE__ */ jsx("div", { className: "w-10 h-10 rounded-xl bg-gradient-to-br from-amber-500/20 to-red-500/10 flex items-center justify-center shrink-0", children: /* @__PURE__ */ jsx(AlertTriangle, { className: "w-5 h-5 text-amber-400" }) }),
|
|
4118
|
+
/* @__PURE__ */ jsx("div", { className: "w-10 h-10 rounded-xl bg-gradient-to-br from-amber-500/20 to-red-500/10 flex items-center justify-center shrink-0", children: /* @__PURE__ */ jsx(AlertTriangle, { strokeWidth: 1.5, className: "w-5 h-5 text-amber-400" }) }),
|
|
4127
4119
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
|
|
4128
|
-
/* @__PURE__ */ jsx(AlertDialogTitle, { className: "text-
|
|
4129
|
-
/* @__PURE__ */ jsxs(AlertDialogDescription, { className: "text-
|
|
4120
|
+
/* @__PURE__ */ jsx(AlertDialogTitle, { className: "text-xs font-medium text-zinc-100 mb-1", children: "Load all results?" }),
|
|
4121
|
+
/* @__PURE__ */ jsxs(AlertDialogDescription, { className: "text-xs text-zinc-500 leading-relaxed", children: [
|
|
4130
4122
|
"This may slow down your browser. Max ",
|
|
4131
4123
|
/* @__PURE__ */ jsx("span", { className: "text-zinc-400", children: "100K" }),
|
|
4132
4124
|
" rows will be loaded."
|
|
@@ -4134,12 +4126,12 @@ ${colDefs.join(",\n")}
|
|
|
4134
4126
|
] })
|
|
4135
4127
|
] }) }),
|
|
4136
4128
|
/* @__PURE__ */ jsxs("div", { className: "px-6 pb-6 flex gap-2", children: [
|
|
4137
|
-
/* @__PURE__ */ jsx(AlertDialogCancel, { className: "flex-1 h-9 bg-white/5 border-0 text-zinc-400 text-
|
|
4129
|
+
/* @__PURE__ */ jsx(AlertDialogCancel, { className: "flex-1 h-9 bg-white/5 border-0 text-zinc-400 text-xs font-medium hover:bg-white/10 hover:text-zinc-200", children: "Cancel" }),
|
|
4138
4130
|
/* @__PURE__ */ jsx(
|
|
4139
4131
|
AlertDialogAction,
|
|
4140
4132
|
{
|
|
4141
4133
|
onClick: queryExec.handleUnlimitedQuery,
|
|
4142
|
-
className: "flex-1 h-9 bg-amber-600 border-0 text-white text-
|
|
4134
|
+
className: "flex-1 h-9 bg-amber-600 border-0 text-white text-xs font-medium hover:bg-amber-500",
|
|
4143
4135
|
children: "Load All"
|
|
4144
4136
|
}
|
|
4145
4137
|
)
|