@hienlh/ppm 0.13.8 → 0.13.9

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/http-api.md +1 -1
  4. package/dist/web/assets/ai-settings-section-CLNBWLS4.js +1 -0
  5. package/dist/web/assets/{audio-preview-DQbX8gfL.js → audio-preview-C1p-Q5XZ.js} +1 -1
  6. package/dist/web/assets/{chat-tab-BJQT9kie.js → chat-tab-BSJUkgxB.js} +8 -8
  7. package/dist/web/assets/code-editor-rNw5_pXh.js +8 -0
  8. package/dist/web/assets/{conflict-editor-BKwJLX0D.js → conflict-editor-Dcn3HuLD.js} +1 -1
  9. package/dist/web/assets/data-grid-nZfSIop5.js +5 -0
  10. package/dist/web/assets/database-DOWH9-Vv.js +1 -0
  11. package/dist/web/assets/database-viewer-CNoq5Uxp.js +1 -0
  12. package/dist/web/assets/{diff-viewer-SAtaBwNI.js → diff-viewer-NMLD4V8q.js} +1 -1
  13. package/dist/web/assets/{extension-webview-PiV4bKJ1.js → extension-webview-DW2dBswj.js} +1 -1
  14. package/dist/web/assets/{image-preview-CbFFD9BS.js → image-preview-Dqp1KSus.js} +1 -1
  15. package/dist/web/assets/index-CoMWx5VS.js +27 -0
  16. package/dist/web/assets/index-Dzb3OtrX.css +2 -0
  17. package/dist/web/assets/{input-BMvRUOr7.js → input-DYWhyaze.js} +1 -1
  18. package/dist/web/assets/keybindings-store-B7nlHmDh.js +1 -0
  19. package/dist/web/assets/{markdown-renderer-CHWA0KAo.js → markdown-renderer-DNIXdY0d.js} +1 -1
  20. package/dist/web/assets/{pdf-preview-DQMdjqa2.js → pdf-preview-ChC1gaaZ.js} +1 -1
  21. package/dist/web/assets/{port-forwarding-tab-9BpNC9_7.js → port-forwarding-tab-dLhH_g2l.js} +1 -1
  22. package/dist/web/assets/{postgres-viewer-Bm5T51n6.js → postgres-viewer-De0pzd1C.js} +2 -2
  23. package/dist/web/assets/{settings-tab-BUstSDLR.js → settings-tab-Mrs9uzCZ.js} +1 -1
  24. package/dist/web/assets/sqlite-viewer-BqtIjvil.js +1 -0
  25. package/dist/web/assets/{terminal-tab-Xtj6RN0d.js → terminal-tab-CeHEtoE2.js} +1 -1
  26. package/dist/web/assets/{video-preview-BLI_RruT.js → video-preview-CHPVrMtx.js} +1 -1
  27. package/dist/web/assets/x-OGGXhtlb.js +1 -0
  28. package/dist/web/index.html +8 -8
  29. package/dist/web/sw.js +1 -1
  30. package/package.json +2 -1
  31. package/src/web/components/database/data-grid.tsx +18 -2
  32. package/src/web/components/database/glide-grid-theme.ts +82 -0
  33. package/src/web/components/database/glide-grid-types.ts +79 -0
  34. package/src/web/components/database/use-glide-cell-content.ts +124 -0
  35. package/src/web/components/database/use-glide-columns.ts +61 -0
  36. package/src/web/components/database/use-glide-selection.ts +48 -0
  37. package/src/web/components/editor/code-editor.tsx +124 -7
  38. package/src/web/index.html +1 -0
  39. package/test.sql +1 -0
  40. package/dist/web/assets/ai-settings-section-CHgpQ_OP.js +0 -1
  41. package/dist/web/assets/code-editor-CeKTvfyz.js +0 -8
  42. package/dist/web/assets/database-DCT0OjgQ.js +0 -1
  43. package/dist/web/assets/database-viewer-DixWWvjx.js +0 -5
  44. package/dist/web/assets/index-C1RBJe0a.css +0 -2
  45. package/dist/web/assets/index-ZFyltHwi.js +0 -27
  46. package/dist/web/assets/keybindings-store-D0C-Pq2o.js +0 -1
  47. package/dist/web/assets/plus-51UQ45rf.js +0 -1
  48. package/dist/web/assets/sqlite-viewer-C7rhO4bn.js +0 -1
  49. package/dist/web/assets/x-BtqbfkR7.js +0 -1
  50. /package/dist/web/assets/{chevron-right-BzAdxJRG.js → chevron-right-DnHIvvcy.js} +0 -0
  51. /package/dist/web/assets/{code-CuravVys.js → code-DGBecc50.js} +0 -0
@@ -8,13 +8,15 @@ import { usePanelStore } from "@/stores/panel-store";
8
8
  import { useSettingsStore } from "@/stores/settings-store";
9
9
  import { basename } from "@/lib/utils";
10
10
  import { useMonacoTheme } from "@/lib/use-monaco-theme";
11
- import { Loader2, FileWarning, Play, Database } from "lucide-react";
11
+ import { Loader2, FileWarning, Play, Database, ExternalLink, X, GripHorizontal } from "lucide-react";
12
12
  import { EditorBreadcrumb } from "./editor-breadcrumb";
13
13
  import { EditorToolbar } from "./editor-toolbar";
14
14
  import { SaveAsDialog } from "./save-as-dialog";
15
15
  import { EditorMobileToolbar } from "./editor-mobile-toolbar";
16
16
  import { createSqlCompletionProvider, clearCompletionCache, type SchemaInfo } from "../database/sql-completion-provider";
17
17
  import { useConnections, type Connection } from "../database/use-connections";
18
+ import { DataGrid } from "../database/data-grid";
19
+ import type { DbQueryResult, DbColumnInfo } from "../database/use-database";
18
20
 
19
21
  const MarkdownRenderer = lazy(() =>
20
22
  import("@/components/shared/markdown-renderer").then((m) => ({ default: m.MarkdownRenderer }))
@@ -170,18 +172,37 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
170
172
  return () => { completionDisposable.current?.dispose(); };
171
173
  }, [sqlSchemaInfo]);
172
174
 
173
- // Run in DB Viewer
175
+ // Run SQL inline — execute query and show results in bottom panel
174
176
  const openTab = useTabStore((s) => s.openTab);
175
- const runSqlInViewer = useCallback((sqlText: string) => {
177
+ const [sqlResult, setSqlResult] = useState<DbQueryResult | null>(null);
178
+ const [sqlError, setSqlError] = useState<string | null>(null);
179
+ const [sqlLoading, setSqlLoading] = useState(false);
180
+ const [sqlResultSql, setSqlResultSql] = useState<string>("");
181
+ const runSqlInViewer = useCallback(async (sqlText: string) => {
176
182
  if (!selectedSqlConn) return;
183
+ setSqlLoading(true);
184
+ setSqlError(null);
185
+ setSqlResultSql(sqlText);
186
+ try {
187
+ const result = await api.post<DbQueryResult>(`/api/db/connections/${selectedSqlConn.id}/query`, { sql: sqlText });
188
+ setSqlResult(result);
189
+ } catch (e) {
190
+ setSqlError((e as Error).message);
191
+ setSqlResult(null);
192
+ } finally {
193
+ setSqlLoading(false);
194
+ }
195
+ }, [selectedSqlConn]);
196
+ const openSqlResultInTab = useCallback(() => {
197
+ if (!selectedSqlConn || !sqlResultSql) return;
177
198
  openTab({
178
199
  type: "database",
179
200
  title: `${selectedSqlConn.name} · Query`,
180
201
  projectId: null,
181
202
  closable: true,
182
- metadata: { connectionId: selectedSqlConn.id, connectionName: selectedSqlConn.name, dbType: selectedSqlConn.type, initialSql: sqlText },
203
+ metadata: { connectionId: selectedSqlConn.id, connectionName: selectedSqlConn.name, dbType: selectedSqlConn.type, initialSql: sqlResultSql },
183
204
  });
184
- }, [selectedSqlConn, openTab]);
205
+ }, [selectedSqlConn, openTab, sqlResultSql]);
185
206
 
186
207
  const handleRunInDbViewer = useCallback(() => {
187
208
  if (!editorRef.current || !selectedSqlConn) return;
@@ -520,7 +541,7 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
520
541
  onClick={handleRunInDbViewer}
521
542
  disabled={!selectedSqlConn}
522
543
  className="p-0.5 rounded text-muted-foreground hover:text-primary disabled:opacity-30 transition-colors"
523
- title="Run all in DB Viewer"
544
+ title="Run SQL"
524
545
  >
525
546
  <Play className="size-3.5" />
526
547
  </button>
@@ -583,7 +604,7 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
583
604
  ) : isMarkdown && mdMode === "preview" ? (
584
605
  <MarkdownPreview content={content ?? ""} />
585
606
  ) : (
586
- <div className="flex-1 overflow-hidden">
607
+ <div className="flex-1 overflow-hidden min-h-0">
587
608
  <Editor
588
609
  height="100%"
589
610
  language={inlineLanguage ?? getMonacoLanguage(filePath ?? "")}
@@ -608,6 +629,16 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
608
629
  </div>
609
630
  )}
610
631
 
632
+ {/* Inline SQL result panel */}
633
+ {isSql && (sqlResult || sqlError || sqlLoading) && (
634
+ <SqlResultPanel
635
+ result={sqlResult} error={sqlError} loading={sqlLoading}
636
+ connName={selectedSqlConn?.name}
637
+ onClose={() => { setSqlResult(null); setSqlError(null); setSqlLoading(false); }}
638
+ onOpenInTab={openSqlResultInTab}
639
+ />
640
+ )}
641
+
611
642
  {/* Mobile toolbar — bottom, like terminal */}
612
643
  {isMobile && <EditorMobileToolbar editorRef={editorRef} readOnly={inlineContent != null} />}
613
644
 
@@ -625,6 +656,92 @@ export const CodeEditor = memo(function CodeEditor({ metadata, tabId }: CodeEdit
625
656
  );
626
657
  });
627
658
 
659
+ const NOOP = () => {};
660
+
661
+ /** Inline SQL result panel — shows query results below the editor */
662
+ function SqlResultPanel({ result, error, loading, connName, onClose, onOpenInTab }: {
663
+ result: DbQueryResult | null;
664
+ error: string | null;
665
+ loading: boolean;
666
+ connName?: string;
667
+ onClose: () => void;
668
+ onOpenInTab: () => void;
669
+ }) {
670
+ const tableData = useMemo(() => (
671
+ result?.changeType === "select" && result.rows.length > 0
672
+ ? { columns: result.columns, rows: result.rows, total: result.rows.length, limit: result.rows.length }
673
+ : null
674
+ ), [result]);
675
+
676
+ const querySchema = useMemo<DbColumnInfo[]>(() => (
677
+ (result?.columns ?? []).map((c) => ({ name: c, type: "text", nullable: true, pk: false, defaultValue: null }))
678
+ ), [result?.columns]);
679
+
680
+ const [panelHeight, setPanelHeight] = useState(250);
681
+ const handleDrag = useCallback((e: React.MouseEvent) => {
682
+ e.preventDefault();
683
+ const startY = e.clientY;
684
+ const startH = panelHeight;
685
+ const onMove = (ev: MouseEvent) => setPanelHeight(Math.max(80, startH + (startY - ev.clientY)));
686
+ const onUp = () => { document.removeEventListener("mousemove", onMove); document.removeEventListener("mouseup", onUp); };
687
+ document.addEventListener("mousemove", onMove);
688
+ document.addEventListener("mouseup", onUp);
689
+ }, [panelHeight]);
690
+
691
+ return (
692
+ <div className="shrink-0 border-t border-border flex flex-col" style={{ height: panelHeight }}>
693
+ {/* Resize handle */}
694
+ <div onMouseDown={handleDrag}
695
+ className="shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors">
696
+ <GripHorizontal className="size-3 text-muted-foreground/50" />
697
+ </div>
698
+ {/* Title bar */}
699
+ <div className="flex items-center gap-2 px-2 py-1 bg-muted/50 border-b border-border shrink-0">
700
+ <Database className="size-3 text-muted-foreground" />
701
+ <span className="text-xs font-medium text-foreground truncate flex-1">
702
+ {connName ? `${connName} · Results` : "Query Results"}
703
+ {result?.executionTimeMs != null && <span className="text-muted-foreground ml-1.5 font-normal">{result.executionTimeMs}ms</span>}
704
+ </span>
705
+ <button type="button" onClick={onOpenInTab} title="Open in DB Viewer tab"
706
+ className="flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted transition-colors">
707
+ <ExternalLink className="size-3" />
708
+ <span className="hidden sm:inline">Open in Tab</span>
709
+ </button>
710
+ <button type="button" onClick={onClose} title="Close results"
711
+ className="p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors">
712
+ <X className="size-3" />
713
+ </button>
714
+ </div>
715
+
716
+ {/* Content */}
717
+ <div className="flex-1 overflow-hidden min-h-0">
718
+ {loading && (
719
+ <div className="flex items-center justify-center h-full">
720
+ <Loader2 className="size-4 animate-spin text-muted-foreground" />
721
+ </div>
722
+ )}
723
+ {error && <div className="px-3 py-2 text-xs text-destructive bg-destructive/5">{error}</div>}
724
+ {result?.changeType === "modify" && (
725
+ <div className="px-3 py-2 text-xs text-green-500">
726
+ {result.rowsAffected} row(s) affected
727
+ </div>
728
+ )}
729
+ {tableData && (
730
+ <DataGrid
731
+ tableData={tableData} schema={querySchema} loading={false}
732
+ page={1} onPageChange={NOOP} onCellUpdate={NOOP}
733
+ orderBy={null} orderDir="ASC" onToggleSort={NOOP}
734
+ connectionName={connName}
735
+ />
736
+ )}
737
+ {result?.changeType === "select" && result.rows.length === 0 && (
738
+ <div className="px-3 py-2 text-xs text-muted-foreground">No results</div>
739
+ )}
740
+ </div>
741
+ </div>
742
+ );
743
+ }
744
+
628
745
  function LoadingSpinner() {
629
746
  return <div className="flex items-center justify-center h-full"><Loader2 className="size-5 animate-spin text-text-subtle" /></div>;
630
747
  }
@@ -11,6 +11,7 @@
11
11
  <link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600;700&family=Geist:wght@400;500;600;700&display=swap" rel="stylesheet" />
12
12
  </head>
13
13
  <body class="bg-[#0f1419] text-[#e5e7eb] font-sans antialiased">
14
+ <div id="portal" style="position: fixed; left: 0; top: 0; z-index: 9999;" /></div>
14
15
  <div id="root"></div>
15
16
  <script type="module" src="./main.tsx"></script>
16
17
  </body>
package/test.sql ADDED
@@ -0,0 +1 @@
1
+ select * from config;
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{D as r,_ as i,b as a,c as o,d as s,f as c,g as l,h as u,m as d,p as f,s as p,u as m,v as h,x as g,y as _}from"./vendor-ui-B-89Uj8i.js";import{t as v}from"./createLucideIcon-BjHrJDVb.js";import{i as y}from"./dist-D7KGU7Vl.js";import{n as b,r as x}from"./plus-51UQ45rf.js";import{t as S}from"./input-BMvRUOr7.js";import{t as C}from"./refresh-cw-CSFrDtiu.js";import{t as w}from"./trash-2-CJYoLw7Q.js";import{i as T,t as E}from"./api-client-Dvzcc_EO.js";import{n as D}from"./utils-CTg5uAYR.js";import{a as O,h as k}from"./api-settings-D0_eiIYv.js";var A=v(`bell-off`,[[`path`,{d:`M10.268 21a2 2 0 0 0 3.464 0`,key:`vwvbt9`}],[`path`,{d:`M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742`,key:`178tsu`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05`,key:`1hqiys`}]]),j=v(`bot`,[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]),M=v(`bug`,[[`path`,{d:`M12 20v-9`,key:`1qisl0`}],[`path`,{d:`M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z`,key:`uouzyp`}],[`path`,{d:`M14.12 3.88 16 2`,key:`qol33r`}],[`path`,{d:`M21 21a4 4 0 0 0-3.81-4`,key:`1b0z45`}],[`path`,{d:`M21 5a4 4 0 0 1-3.55 3.97`,key:`5cxbf6`}],[`path`,{d:`M22 13h-4`,key:`1jl80f`}],[`path`,{d:`M3 21a4 4 0 0 1 3.81-4`,key:`1fjd4g`}],[`path`,{d:`M3 5a4 4 0 0 0 3.55 3.97`,key:`1d7oge`}],[`path`,{d:`M6 13H2`,key:`82j7cp`}],[`path`,{d:`m8 2 1.88 1.88`,key:`fmnt4t`}],[`path`,{d:`M9 7.13V6a3 3 0 1 1 6 0v1.13`,key:`1vgav8`}]]),N=v(`lock`,[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`,key:`fwvmzm`}]]),P=v(`pencil`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),F=e(n(),1),I=t();function L({className:e,...t}){return(0,I.jsx)(r,{"data-slot":`label`,className:D(`flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,e),...t})}var R=F.forwardRef(({className:e,...t},n)=>(0,I.jsx)(p,{className:D(`peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input`,e),...t,ref:n,children:(0,I.jsx)(o,{className:D(`pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0`)})}));R.displayName=p.displayName;function z({...e}){return(0,I.jsx)(l,{"data-slot":`select`,...e})}function B({...e}){return(0,I.jsx)(a,{"data-slot":`select-value`,...e})}function V({className:e,size:t=`default`,children:n,...r}){return(0,I.jsxs)(_,{"data-slot":`select-trigger`,"data-size":t,className:D(`flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`,e),...r,children:[n,(0,I.jsx)(s,{asChild:!0,children:(0,I.jsx)(x,{className:`size-4 opacity-50`})})]})}function H({className:e,children:t,position:n=`item-aligned`,align:r=`center`,...i}){return(0,I.jsx)(u,{children:(0,I.jsxs)(m,{"data-slot":`select-content`,className:D(`relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:n,align:r,...i,children:[(0,I.jsx)(W,{}),(0,I.jsx)(g,{className:D(`p-1`,n===`popper`&&`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1`),children:t}),(0,I.jsx)(G,{})]})})}function U({className:e,children:t,...n}){return(0,I.jsxs)(c,{"data-slot":`select-item`,className:D(`relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...n,children:[(0,I.jsx)(`span`,{"data-slot":`select-item-indicator`,className:`absolute right-2 flex size-3.5 items-center justify-center`,children:(0,I.jsx)(f,{children:(0,I.jsx)(y,{className:`size-4`})})}),(0,I.jsx)(d,{children:t})]})}function W({className:e,...t}){return(0,I.jsx)(h,{"data-slot":`select-scroll-up-button`,className:D(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,I.jsx)(b,{className:`size-4`})})}function G({className:e,...t}){return(0,I.jsx)(i,{"data-slot":`select-scroll-down-button`,className:D(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,I.jsx)(x,{className:`size-4`})})}var K={claude:`C`,cursor:`▶`,codex:`◆`,gemini:`G`};function q({value:e,onChange:t,projectName:n}){let[r,i]=(0,F.useState)([]),[a,o]=(0,F.useState)(!1),s=(0,F.useRef)(null),c=(0,F.useRef)(0);(0,F.useEffect)(()=>{n&&E.get(`${T(n)}/chat/providers`).then(i).catch(()=>{})},[n]),(0,F.useEffect)(()=>{if(!a)return;let e=e=>{s.current&&!s.current.contains(e.target)&&o(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[a]),(0,F.useEffect)(()=>{a&&(c.current=Math.max(0,r.findIndex(t=>t.id===e)))},[a,e,r]);let l=(0,F.useCallback)(e=>{if(e.key===`Escape`){o(!1);return}if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;c.current=(c.current+t+r.length)%r.length,(s.current?.querySelector(`[data-idx="${c.current}"]`))?.focus()}if(e.key===`Enter`){e.preventDefault();let n=r[c.current];n&&(t(n.id),o(!1))}},[t,r]);if(r.length<=1)return null;let u=r.find(t=>t.id===e),d=K[e]||`?`;return(0,I.jsxs)(`div`,{className:`relative`,children:[(0,I.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),o(e=>!e)},className:`inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] text-text-subtle hover:text-text-primary hover:bg-surface-elevated transition-colors border border-transparent hover:border-border`,"aria-label":`AI Provider: ${u?.name??e}`,children:[(0,I.jsx)(`span`,{className:`inline-flex h-3.5 w-3.5 items-center justify-center rounded text-[9px] font-bold bg-surface-elevated shrink-0`,children:d}),(0,I.jsx)(`span`,{className:`max-w-[80px] truncate capitalize`,children:u?.name??e})]}),a&&(0,I.jsxs)(`div`,{ref:s,role:`listbox`,"aria-label":`AI Providers`,onKeyDown:l,onMouseDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:`absolute bottom-full left-0 mb-1 z-50 w-56 rounded-lg border border-border bg-surface shadow-lg`,children:[(0,I.jsx)(`div`,{className:`px-3 py-2 border-b border-border`,children:(0,I.jsx)(`span`,{className:`text-xs font-medium text-text-secondary`,children:`Provider`})}),(0,I.jsx)(`div`,{className:`py-1`,children:r.map((n,r)=>{let i=K[n.id]||`?`,a=n.id===e;return(0,I.jsxs)(`button`,{"data-idx":r,role:`option`,"aria-selected":a,tabIndex:0,onClick:()=>{t(n.id),o(!1)},className:`w-full flex items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-surface-elevated focus:bg-surface-elevated focus:outline-none ${a?`bg-surface-elevated`:``}`,children:[(0,I.jsx)(`span`,{className:`inline-flex h-5 w-5 items-center justify-center rounded text-[11px] font-bold bg-surface-elevated text-text-subtle shrink-0`,children:i}),(0,I.jsx)(`span`,{className:`flex-1 text-sm font-medium text-text-primary capitalize`,children:n.name}),a&&(0,I.jsx)(y,{className:`size-4 shrink-0 text-primary`})]},n.id)})})]})]})}function J({providerId:e}){return(0,I.jsx)(`span`,{className:`inline-flex h-4 w-4 items-center justify-center rounded text-[10px] font-bold bg-surface-elevated text-text-subtle shrink-0`,title:e,children:K[e]||`?`})}var Y=[{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`}],X=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],Z={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function Q({compact:e}={}){let[t,n]=(0,F.useState)(null),[r,i]=(0,F.useState)(``),[a,o]=(0,F.useState)([]),[s,c]=(0,F.useState)(!1),[l,u]=(0,F.useState)(!1),[d,f]=(0,F.useState)(null),[p,m]=(0,F.useState)(0);(0,F.useEffect)(()=>{O().then(e=>{n(e),i(e.default_provider??`claude`)}).catch(e=>f(e.message))},[]),(0,F.useEffect)(()=>{r&&(c(!0),E.get(`/api/settings/ai/providers/${r}/models`).then(o).catch(()=>o([])).finally(()=>c(!1)))},[r]);let h=t?Object.keys(t.providers).filter(e=>e!==`mock`).map(e=>({id:e,name:Z[e]??e})):[],g=t?.providers[r],_=g?.type===`agent-sdk`||!g?.type&&r===`claude`,v=async(e,i)=>{if(t){u(!0),f(null);try{n(await k({providers:{[r]:{[e]:i}}})),m(e=>e+1)}catch(e){f(e.message)}finally{u(!1)}}},y=e?`text-[11px]`:`text-sm`,b=e?`text-xs`:`text-sm`,x=e?`space-y-2`:`space-y-4`,C=e?`space-y-1.5`:`space-y-3`,w=e?`space-y-1`:`space-y-1.5`;if(!t)return(0,I.jsxs)(`div`,{className:C,children:[(0,I.jsx)(`h3`,{className:`${b} font-medium text-text-secondary`,children:`AI Settings`}),(0,I.jsx)(`p`,{className:`${y} text-text-subtle`,children:d?`Error: ${d}`:`Loading...`})]});let T=_?a:[{value:`__default__`,label:`Auto (default)`},...a];return(0,I.jsxs)(`div`,{className:x,children:[(0,I.jsx)(`h3`,{className:`${b} font-medium text-text-secondary`,children:`AI Settings`}),h.length>1&&(0,I.jsx)(`div`,{className:`flex gap-0.5 border-b border-border/50 -mx-1 px-1`,children:h.map(e=>(0,I.jsxs)(`button`,{onClick:()=>i(e.id),className:`flex items-center gap-1 px-2 py-1 text-[11px] rounded-t transition-colors ${r===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,I.jsx)(J,{providerId:e.id}),(0,I.jsx)(`span`,{className:`capitalize`,children:e.name})]},e.id))}),(0,I.jsxs)(`div`,{className:C,children:[a.length>0&&(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-model`,className:e?y:void 0,children:`Model`}),(0,I.jsxs)(z,{value:_?g?.model??a[0]?.value:g?.model||`__default__`,onValueChange:e=>v(`model`,e===`__default__`?void 0:e),disabled:s,children:[(0,I.jsx)(V,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,I.jsx)(B,{placeholder:s?`Loading models...`:`Select model`})}),(0,I.jsx)(H,{className:`max-h-[300px]`,children:T.map(e=>(0,I.jsx)(U,{value:e.value,children:e.label},e.value))})]})]}),_&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-base-url`,className:e?y:void 0,children:`Base URL`}),(0,I.jsx)(S,{id:`ai-base-url`,type:`url`,defaultValue:g?.base_url??``,placeholder:`https://api.anthropic.com (default)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{v(`base_url`,e.target.value.trim()||void 0)}},`baseurl-${r}-${p}`)]}),(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-api-key`,className:e?y:void 0,children:`API Key / Token`}),(0,I.jsx)(S,{id:`ai-api-key`,type:`password`,defaultValue:g?.api_key??``,placeholder:`sk-ant-... (optional, overrides accounts)`,className:e?`h-7 text-[11px] font-mono`:`font-mono`,onBlur:e=>{let t=e.target.value.trim();t.startsWith(`••••`)||v(`api_key`,t||void 0)}},`apikey-${r}-${p}`),(0,I.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Direct API key or OAuth token. Leave empty to use connected accounts.`})]}),(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-effort`,className:e?y:void 0,children:`Effort`}),(0,I.jsxs)(z,{value:g?.effort??`high`,onValueChange:e=>v(`effort`,e),children:[(0,I.jsx)(V,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,I.jsx)(B,{})}),(0,I.jsx)(H,{children:Y.map(e=>(0,I.jsx)(U,{value:e.value,children:e.label},e.value))})]})]}),(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-max-turns`,className:e?y:void 0,children:`Max Turns (1-500)`}),(0,I.jsx)(S,{id:`ai-max-turns`,type:`number`,min:1,max:500,defaultValue:g?.max_turns??100,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);isNaN(t)||v(`max_turns`,t)}},`turns-${r}-${p}`)]}),(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-budget`,className:e?y:void 0,children:`Max Budget (USD)`}),(0,I.jsx)(S,{id:`ai-budget`,type:`number`,step:.1,min:.01,max:50,defaultValue:g?.max_budget_usd??``,placeholder:`No limit`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseFloat(e.target.value);v(`max_budget_usd`,isNaN(t)?void 0:t)}},`budget-${r}-${p}`)]}),(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-thinking`,className:e?y:void 0,children:`Thinking Budget (tokens)`}),(0,I.jsx)(S,{id:`ai-thinking`,type:`number`,min:0,defaultValue:g?.thinking_budget_tokens??``,placeholder:`Disabled`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);v(`thinking_budget_tokens`,isNaN(t)?void 0:t)}},`thinking-${r}-${p}`)]}),(0,I.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,I.jsxs)(`div`,{children:[(0,I.jsx)(L,{htmlFor:`ai-agent-teams`,className:e?y:void 0,children:`Agent Teams`}),(0,I.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Experimental. Enables multi-agent collaboration with shared tasks and messaging. Uses ~7x more tokens.`})]}),(0,I.jsx)(R,{id:`ai-agent-teams`,checked:g?.agent_teams??!1,onCheckedChange:e=>v(`agent_teams`,e)})]}),g?.agent_teams&&(0,I.jsx)($,{compact:e})]}),(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-permission-mode`,className:e?y:void 0,children:`Default Permission Mode`}),(0,I.jsxs)(z,{value:g?.permission_mode??`bypassPermissions`,onValueChange:e=>v(`permission_mode`,e),children:[(0,I.jsx)(V,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,I.jsx)(B,{})}),(0,I.jsx)(H,{children:X.map(e=>(0,I.jsx)(U,{value:e.value,children:e.label},e.value))})]})]}),(0,I.jsxs)(`div`,{className:w,children:[(0,I.jsx)(L,{htmlFor:`ai-system-prompt`,className:e?y:void 0,children:`Additional Instructions`}),(0,I.jsx)(`textarea`,{id:`ai-system-prompt`,rows:e?3:4,defaultValue:g?.system_prompt??``,placeholder:`Enter additional instructions for ${r}...`,className:`w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${e?`text-[11px]`:`text-sm`}`,onBlur:e=>{v(`system_prompt`,e.target.value.trim()||void 0)}},`sysprompt-${r}-${p}`)]})]}),l&&(0,I.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`Saving...`}),d&&(0,I.jsx)(`p`,{className:`text-xs text-red-500`,children:d})]})}function $({compact:e}){let[t,n]=(0,F.useState)([]),[r,i]=(0,F.useState)(!1),[a,o]=(0,F.useState)(null),s=(0,F.useCallback)(async()=>{i(!0);try{n(await E.get(`/api/teams`)??[])}catch{}i(!1)},[]);(0,F.useEffect)(()=>{s()},[s]);let c=async e=>{try{await E.del(`/api/teams/${encodeURIComponent(e)}`),n(t=>t.filter(t=>t.name!==e)),o(null)}catch{}};return t.length===0&&!r?null:(0,I.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,I.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,I.jsxs)(L,{className:e?`text-[11px]`:void 0,children:[`Teams (`,t.length,`)`]}),(0,I.jsx)(`button`,{onClick:s,className:`text-text-subtle hover:text-foreground p-1`,"aria-label":`Refresh teams`,children:(0,I.jsx)(C,{className:`size-3 ${r?`animate-spin`:``}`})})]}),t.map(e=>(0,I.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded bg-surface-elevated text-xs`,children:[(0,I.jsxs)(`div`,{className:`min-w-0`,children:[(0,I.jsx)(`div`,{className:`font-medium truncate`,children:e.name}),e.description&&(0,I.jsx)(`div`,{className:`text-text-subtle truncate`,children:e.description}),(0,I.jsxs)(`div`,{className:`text-text-subtle`,children:[e.members?.length??e.memberCount??0,` members`,e.createdAt?` · ${new Date(e.createdAt).toLocaleDateString()}`:``]})]}),a===e.name?(0,I.jsxs)(`div`,{className:`flex gap-1 shrink-0 ml-2`,children:[(0,I.jsx)(`button`,{onClick:()=>c(e.name),className:`px-2 py-1 bg-red-600 text-white rounded text-[10px]`,children:`Delete`}),(0,I.jsx)(`button`,{onClick:()=>o(null),className:`px-2 py-1 bg-zinc-600 text-white rounded text-[10px]`,children:`Cancel`})]}):(0,I.jsx)(`button`,{onClick:()=>o(e.name),className:`shrink-0 text-text-subtle hover:text-red-500 p-1 ml-2`,"aria-label":`Delete team ${e.name}`,children:(0,I.jsx)(w,{className:`size-3.5`})})]},e.name))]})}export{H as a,B as c,P as d,N as f,A as h,z as i,R as l,j as m,J as n,U as o,M as p,q as r,V as s,Q as t,L as u};
@@ -1,8 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/markdown-renderer-CHWA0KAo.js","assets/rolldown-runtime-FhOqtrmT.js","assets/index-ZFyltHwi.js","assets/vendor-mermaid-CMiurk2b.js","assets/vendor-ui-B-89Uj8i.js","assets/vendor-markdown-0Mxgxy0L.js","assets/input-BMvRUOr7.js","assets/utils-CTg5uAYR.js","assets/createLucideIcon-BjHrJDVb.js","assets/x-BtqbfkR7.js","assets/settings-store-BHBb62gq.js","assets/react-GqWghJ-L.js","assets/api-client-Dvzcc_EO.js","assets/scroll-area-BEllam7_.js","assets/ai-settings-section-CHgpQ_OP.js","assets/dist-D7KGU7Vl.js","assets/plus-51UQ45rf.js","assets/refresh-cw-CSFrDtiu.js","assets/trash-2-CJYoLw7Q.js","assets/api-settings-D0_eiIYv.js","assets/chevron-right-BzAdxJRG.js","assets/database-DCT0OjgQ.js","assets/file-store-BrbCNyLm.js","assets/tab-store-0rGchMXr.js","assets/index-C1RBJe0a.css","assets/csv-preview-D5lmgVEy.js","assets/lib-D_kRA9p6.js","assets/arrow-up-Dtrfv490.js","assets/csv-parser-DO0dz4x_.js","assets/image-preview-CbFFD9BS.js","assets/file-exclamation-point-Baz81y5z.js","assets/use-blob-url-Hn6n1730.js","assets/pdf-preview-DQMdjqa2.js","assets/video-preview-BLI_RruT.js","assets/audio-preview-DQbX8gfL.js"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import"./vendor-ui-B-89Uj8i.js";import{t as r}from"./createLucideIcon-BjHrJDVb.js";import"./scroll-area-BEllam7_.js";import{t as i}from"./chevron-right-BzAdxJRG.js";import{a,l as o,n as s,o as c,r as l,s as u,t as d}from"./input-BMvRUOr7.js";import{t as f}from"./code-CuravVys.js";import{t as ee}from"./database-DCT0OjgQ.js";import{n as p,r as m,t as h}from"./x-BtqbfkR7.js";import{t as g}from"./file-exclamation-point-Baz81y5z.js";import{t as _}from"./table-Dq575bPF.js";import{t as v}from"./text-wrap-Cn6BNQfq.js";import{i as y,t as b}from"./api-client-Dvzcc_EO.js";import{n as te}from"./settings-store-BHBb62gq.js";import{G as x}from"./vendor-mermaid-CMiurk2b.js";import{t as S}from"./utils-CTg5uAYR.js";import{n as ne,t as re}from"./tab-store-0rGchMXr.js";import{r as ie,t as C}from"./file-store-BrbCNyLm.js";import{G as w,J as T,Q as ae,X as E,Y as D,Z as O,a as oe,c as se,d as k,f as A,g as j,h as ce,j as M,l as N,m as P,nt as F,o as I,p as le,q as ue,u as L,z as de}from"./index-ZFyltHwi.js";import{n as fe,t as pe}from"./use-monaco-theme-CP-vyTF8.js";import{n as me,t as he}from"./sql-completion-provider-tCzZfqWs.js";var ge=r(`redo-2`,[[`path`,{d:`m15 14 5-5-5-5`,key:`12vg1m`}],[`path`,{d:`M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13`,key:`6uklza`}]]),R=e(n(),1),z=t(),_e={ts:O,tsx:O,js:O,jsx:O,py:O,rs:O,go:O,html:O,css:O,scss:O,json:ae,md:E,txt:E,yaml:D,yml:D};function ve(e,t){return t?ue:_e[e.split(`.`).pop()?.toLowerCase()??``]??T}function ye(e,t){let n=[],r=e;for(let e=0;e<t.length;e++){let i=t[e],a=t.slice(0,e+1).join(`/`),o=r.find(e=>e.name===i);if(n.push({name:i,fullPath:a,node:o??null,siblings:r}),o?.children)r=o.children;else{for(let r=e+1;r<t.length;r++)n.push({name:t[r],fullPath:t.slice(0,r+1).join(`/`),node:null,siblings:[]});break}}return n}function B(e){return[...e].sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1)}function be({filePath:e,projectName:t,tabId:n,className:r}){let a=C(e=>e.tree),{updateTab:o,openTab:s}=re(ce(e=>({updateTab:e.updateTab,openTab:e.openTab}))),c=(0,R.useRef)(null),l=(0,R.useMemo)(()=>ye(a,e.split(`/`).filter(Boolean)),[a,e]);(0,R.useEffect)(()=>{c.current&&(c.current.scrollLeft=c.current.scrollWidth)},[l]);function u(e,r){let i=S(e);r.metaKey||r.ctrlKey?s({type:`editor`,title:i,metadata:{filePath:e,projectName:t},projectId:t,closable:!0}):o(n,{title:i,metadata:{filePath:e,projectName:t}})}return(0,z.jsx)(`div`,{ref:c,className:r,children:l.map((e,n)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[n>0&&(0,z.jsx)(i,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),e.siblings.length>0?(0,z.jsx)(xe,{segment:e,isLast:n===l.length-1,projectName:t,onFileClick:u}):(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e.name})]},e.fullPath))})}function xe({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=(0,R.useMemo)(()=>B(e.siblings),[e.siblings]);return(0,z.jsxs)(se,{children:[(0,z.jsx)(P,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,z.jsx)(N,{align:`start`,className:`max-h-[300px] p-1`,children:i.map(t=>(0,z.jsx)(V,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function V({node:e,projectName:t,activePath:n,onFileClick:r}){let i=ve(e.name,e.type===`directory`),a=e.path===n;return e.type===`directory`&&e.children&&e.children.length>0?(0,z.jsxs)(k,{children:[(0,z.jsxs)(le,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,z.jsx)(A,{className:`max-h-[300px] overflow-y-auto p-1`,children:B(e.children).map(e=>(0,z.jsx)(V,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]}):(0,z.jsxs)(L,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{e.type!==`directory`&&r(e.path,t)},children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]})}function H({active:e,onClick:t,icon:n,label:r}){return(0,z.jsxs)(`button`,{type:`button`,onClick:t,className:`flex items-center gap-1 px-2 py-1 rounded text-xs transition-colors ${e?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:[(0,z.jsx)(n,{className:`size-3`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:r})]})}function Se({ext:e,mdMode:t,onMdModeChange:n,csvMode:r,onCsvModeChange:i,wordWrap:a,onToggleWordWrap:o,filePath:s,projectName:c,className:l}){return(0,z.jsxs)(`div`,{className:l,children:[(e===`md`||e===`mdx`)&&n&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(H,{active:t===`edit`,onClick:()=>n(`edit`),icon:f,label:`Edit`}),(0,z.jsx)(H,{active:t===`preview`,onClick:()=>n(`preview`),icon:p,label:`Preview`})]}),e===`csv`&&i&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(H,{active:r===`table`,onClick:()=>i(`table`),icon:_,label:`Table`}),(0,z.jsx)(H,{active:r===`raw`,onClick:()=>i(`raw`),icon:f,label:`Raw`})]}),(0,z.jsx)(H,{active:a,onClick:o,icon:v,label:`Wrap`}),s&&c&&(0,z.jsx)(H,{active:!1,onClick:()=>j(c,s),icon:m,label:`Download`})]})}function Ce({open:e,defaultName:t,content:n,onSave:r,onCancel:i}){let[f,ee]=(0,R.useState)(t),[p,m]=(0,R.useState)(!1),[h,g]=(0,R.useState)(``),_=ie(e=>e.activeProject),v=(0,R.useCallback)(()=>{let e=f.trim();if(!e){g(`Filename cannot be empty`);return}if(/[/\\]/.test(e)){g(`Filename cannot contain / or \\`);return}g(``),m(!0)},[f]),y=(0,R.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${f.trim()}`:`${e}${t}${f.trim()}`,n)},[f,n,r]);return p?(0,z.jsx)(I,{open:!0,mode:`folder`,root:_?.path,title:`Save "${f.trim()}" to...`,onSelect:y,onCancel:()=>m(!1)}):(0,z.jsx)(s,{open:e,onOpenChange:e=>{e||i()},children:(0,z.jsxs)(l,{className:`sm:max-w-md`,children:[(0,z.jsx)(c,{children:(0,z.jsx)(u,{children:`Save As`})}),(0,z.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,z.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,z.jsx)(d,{value:f,onChange:e=>{ee(e.target.value),g(``)},onKeyDown:e=>{e.key===`Enter`&&v()},placeholder:`e.g. my-file.ts`,autoFocus:!0}),h&&(0,z.jsx)(`p`,{className:`text-xs text-destructive`,children:h})]}),(0,z.jsxs)(a,{children:[(0,z.jsx)(o,{variant:`outline`,onClick:i,children:`Cancel`}),(0,z.jsx)(o,{onClick:v,children:`Choose Folder...`})]})]})})}var we=typeof window<`u`&&window.isSecureContext,U=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],W=`px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,G=`px-3 py-1.5 rounded text-xs font-mono min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,Te=`w-px h-5 bg-border mx-0.5 shrink-0`;function Ee({editorRef:e,readOnly:t}){let n=(0,R.useCallback)(()=>e.current,[e]),r=(0,R.useCallback)(e=>{let t=n();if(!t)return;t.focus();let r=t.getSelection();r&&t.executeEdits(`mobile-toolbar`,[{range:r,text:e}])},[n]),[i,a]=(0,R.useState)(!1),o=(0,R.useRef)(null),s=(0,R.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&r(e)}catch{}},[r]),c=(0,R.useCallback)(()=>{a(!0),requestAnimationFrame(()=>o.current?.focus())},[]),l=(0,R.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(a(!1),r(t))},[r]),u=(0,R.useCallback)(()=>{let e=n();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[n]),d=(0,R.useCallback)(()=>{let e=n();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[n]),f=(0,R.useCallback)(()=>{let e=n();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[n]);return t?null:(0,z.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!we&&i&&(0,z.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,z.jsx)(`textarea`,{ref:o,onPaste:l,placeholder:`Long-press here → Paste`,className:`flex-1 h-8 rounded border border-border bg-background text-foreground text-xs px-2 py-1.5 resize-none focus:outline-none focus:ring-1 focus:ring-primary`}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>a(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,z.jsx)(h,{size:14})})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,z.jsx)(`button`,{type:`button`,onClick:we?s:c,className:W,title:`Paste`,children:(0,z.jsx)(F,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:u,className:W,title:`Undo`,children:(0,z.jsx)(M,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:d,className:W,title:`Redo`,children:(0,z.jsx)(ge,{size:14})}),(0,z.jsx)(`div`,{className:Te}),(0,z.jsx)(`button`,{type:`button`,onClick:f,className:G,children:`Tab`}),(0,z.jsx)(`div`,{className:Te}),U.map(e=>(0,z.jsx)(`button`,{type:`button`,onClick:()=>r(e),className:G,children:e},e))]})]})}var K=(0,R.lazy)(()=>x(()=>import(`./markdown-renderer-CHWA0KAo.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]))),De=(0,R.lazy)(()=>x(()=>import(`./csv-preview-D5lmgVEy.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([25,1,4,5,26,8,27,28]))),Oe=(0,R.lazy)(()=>x(()=>import(`./image-preview-CbFFD9BS.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([29,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,30,31]))),ke=(0,R.lazy)(()=>x(()=>import(`./pdf-preview-DQMdjqa2.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,30,31]))),Ae=(0,R.lazy)(()=>x(()=>import(`./video-preview-BLI_RruT.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([33,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,30,31]))),je=(0,R.lazy)(()=>x(()=>import(`./audio-preview-DQbX8gfL.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([34,2,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,30,31]))),Me=new Set([`png`,`jpg`,`jpeg`,`gif`,`webp`,`svg`,`ico`]),Ne=new Set([`mp4`,`webm`,`mov`,`ogg`,`avi`,`mkv`]),Pe=new Set([`mp3`,`wav`,`flac`,`aac`,`m4a`,`wma`]),Fe=new Set([`db`,`sqlite`,`sqlite3`]);function Ie(e){return e.split(`.`).pop()?.toLowerCase()??``}function Le(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,sql:`sql`}[Ie(e)]??`plaintext`}var q=(0,R.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,s]=(0,R.useState)(i??null),[c,l]=(0,R.useState)(`utf-8`),[u,d]=(0,R.useState)(!0),[f,p]=(0,R.useState)(null),[m,h]=(0,R.useState)(!1),_=(0,R.useRef)(null),v=(0,R.useRef)(``),x=(0,R.useRef)(null),{tabs:ie,updateTab:C}=re(ce(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:T,toggleWordWrap:ae}=te(ce(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap}))),E=pe(),D=e?.isUntitled===!0,O=e?.unsavedContent,[se,k]=(0,R.useState)(!1),A=ie.find(e=>e.id===t),j=n?Ie(n):``,M=Me.has(j),N=j===`pdf`,P=Ne.has(j),F=Pe.has(j),I=Fe.has(j),le=j===`md`||j===`mdx`,ue=j===`csv`,L=j===`sql`,[ge,_e]=(0,R.useState)(`preview`),[ve,ye]=(0,R.useState)(`table`),{connections:B,cachedTables:xe,refreshTables:V}=oe(),[H,we]=(0,R.useState)(()=>{if(!L||!n)return null;let e=localStorage.getItem(`ppm:sql-conn:${n}`);return e?Number(e):null}),U=(0,R.useRef)(null),W=(0,R.useRef)(null),G=(0,R.useMemo)(()=>B.find(e=>e.id===H)??null,[B,H]),Te=i!=null&&(a===`json`||a===`xml`),[K,q]=(0,R.useState)(!1),ze=(0,R.useCallback)(()=>{if(i)if(K)s(i),q(!1);else{let e=i.trimStart();if(a===`json`)try{s(JSON.stringify(JSON.parse(e),null,2)),q(!0)}catch{}else if(a===`xml`){let t=0;s(e.replace(/(>)(<)(\/*)/g,`$1
3
- $2$3`).split(`
4
- `).map(e=>{let n=e.trim();n.startsWith(`</`)&&(t=Math.max(0,t-1));let r=` `.repeat(t)+n;return n.startsWith(`<`)&&!n.startsWith(`</`)&&!n.endsWith(`/>`)&&!n.includes(`</`)&&t++,r}).join(`
5
- `)),q(!0)}}},[i,a,K]),Be=(0,R.useCallback)(e=>{we(e),n&&localStorage.setItem(`ppm:sql-conn:${n}`,String(e)),V(e).catch(()=>{})},[n,V]),Y=(0,R.useMemo)(()=>{if(!L||!H)return;let e=(xe.get(H)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>b.get(`/api/db/connections/${H}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[L,H,xe]);(0,R.useEffect)(()=>{if(!(!U.current||!Y))return W.current?.dispose(),he(),W.current=U.current.languages.registerCompletionItemProvider(`sql`,me(U.current,Y)),()=>{W.current?.dispose()}},[Y]);let Ve=re(e=>e.openTab),X=(0,R.useCallback)(e=>{G&&Ve({type:`database`,title:`${G.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:G.id,connectionName:G.name,dbType:G.type,initialSql:e}})},[G,Ve]),He=(0,R.useCallback)(()=>{if(!x.current||!G)return;let e=x.current,t=e.getSelection();X(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[G,X]),Ue=typeof window<`u`&&`ontouchstart`in window,We=(0,R.useRef)(null),[Ge,Ke]=(0,R.useState)(null);(0,R.useEffect)(()=>{if(!Ue)return;let e=window.visualViewport;if(!e)return;let t=()=>{let t=We.current;if(!t)return;let n=t.getBoundingClientRect().top;Ke(e.height-Math.max(0,n))};return e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[Ue]);let Z=(0,R.useRef)([]),qe=(0,R.useRef)(X);qe.current=X,(0,R.useEffect)(()=>()=>{Z.current.forEach(e=>e.dispose()),Z.current=[]},[]),(0,R.useEffect)(()=>{I&&t&&C(t,{type:`sqlite`})},[I,t,C]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,R.useEffect)(()=>{if(i!=null){d(!1);return}if(D){s(O??``),v.current=O??``,d(!1),O&&h(!0);return}if(!n||!Q&&!r)return;if(M||N||P||F){d(!1);return}d(!0),p(null);let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${y(r)}/files/read?path=${encodeURIComponent(n)}`;return b.get(e).then(e=>{s(e.content),e.encoding&&l(e.encoding),v.current=e.content,d(!1)}).catch(e=>{p(e instanceof Error?e.message:`Failed to load file`),d(!1)}),()=>{_.current&&clearTimeout(_.current)}},[n,r,M,N,Q,D]);let Je=(0,R.useRef)(m);Je.current=m,(0,R.useEffect)(()=>{if(!n||!r||i!=null||D)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||Je.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${y(r)}/files/read?path=${encodeURIComponent(n)}`;b.get(i).then(e=>{e.content!==v.current&&(s(e.content),v.current=e.content,e.encoding&&l(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,D]),(0,R.useEffect)(()=>{if(!A||i!=null)return;let t=D?`Untitled-${e?.untitledNumber??1}`:n?S(n):`Untitled`,r=m?`${t} \u25CF`:t;A.title!==r&&C(A.id,{title:r})},[m]);let Ye=(0,R.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await b.put(`/api/fs/write`,{path:n,content:e}):await b.put(`${y(r)}/files/write`,{path:n,content:e}),h(!1)}catch{}},[n,r,Q]);function Xe(n){let r=n??``;s(r),v.current=r,h(!0),_.current&&clearTimeout(_.current),D?_.current=setTimeout(()=>{t&&C(t,{metadata:{...e,unsavedContent:v.current}})},2e3):_.current=setTimeout(()=>Ye(v.current),1e3)}let Ze=(0,R.useCallback)(async(e,n)=>{try{if(_.current&&clearTimeout(_.current),await b.put(`/api/fs/write`,{path:e,content:n}),t){let{closeTab:n,openTab:r}=ne.getState();n(t),r({type:`editor`,title:S(e),projectId:null,metadata:{filePath:e},closable:!0})}h(!1),k(!1)}catch{}},[t]),$=e?.lineNumber,Qe=(0,R.useCallback)((e,t)=>{if(x.current=e,U.current=t,$&&$>0&&setTimeout(()=>{e.revealLineInCenter($),e.setPosition({lineNumber:$,column:1}),e.focus()},100),D&&e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>k(!0)),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyZ,()=>te.getState().toggleWordWrap()),t.languages.typescript.typescriptDefaults.setDiagnosticsOptions({noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0}),t.languages.typescript.javascriptDefaults.setDiagnosticsOptions({noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0}),Y&&(W.current?.dispose(),W.current=t.languages.registerCompletionItemProvider(`sql`,me(t,Y))),L){Z.current.forEach(e=>e.dispose()),Z.current=[];let n=e.getModel(),r=e.addCommand(0,(e,t)=>{t&&qe.current(t)});if(r&&n){let e=t.languages.registerCodeLensProvider(`sql`,{provideCodeLenses:e=>{if(e!==n)return{lenses:[],dispose:()=>{}};let t=[],i=e.getValue().split(`
6
- `),a=-1,o=[],s=!1,c=(e,n)=>{let i=n.trim();!i||i.startsWith(`--`)||t.push({range:{startLineNumber:e,startColumn:1,endLineNumber:e,endColumn:1},command:{id:r,title:`▷ Run`,arguments:[i]}})};for(let e=0;e<i.length;e++){let t=i[e].trim();if(a===-1){if(!t||t.startsWith(`--`))continue;a=e+1,o=[]}o.push(i[e]),(t.match(/\$\$/g)||[]).length%2==1&&(s=!s),!s&&t.endsWith(`;`)&&(c(a,o.join(`
7
- `)),a=-1,o=[])}return a>0&&o.join(``).trim()&&c(a,o.join(`
8
- `)),{lenses:t,dispose:()=>{}}}});Z.current.push(e)}}},[Y]);if(!i&&!D&&(!n||!Q&&!r))return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full text-text-secondary text-sm`,children:`No file selected.`});if(u)return(0,z.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-text-secondary`,children:[(0,z.jsx)(w,{className:`size-5 animate-spin`}),(0,z.jsx)(`span`,{className:`text-sm`,children:`Loading file...`})]});if(f)return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full text-error text-sm`,children:f});if(M)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(J,{}),children:(0,z.jsx)(Oe,{filePath:n,projectName:r})});if(N)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(J,{}),children:(0,z.jsx)(ke,{filePath:n,projectName:r})});if(P)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(J,{}),children:(0,z.jsx)(Ae,{filePath:n,projectName:r})});if(F)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(J,{}),children:(0,z.jsx)(je,{filePath:n,projectName:r})});if(c===`base64`)return(0,z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,z.jsx)(g,{className:`size-10 text-text-subtle`}),(0,z.jsx)(`p`,{className:`text-sm`,children:`This file is a binary format and cannot be displayed.`}),(0,z.jsx)(`p`,{className:`text-xs text-text-subtle`,children:n})]});let $e=L?(0,z.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,z.jsx)(ee,{className:`size-3 text-muted-foreground`}),(0,z.jsxs)(`select`,{value:H??``,onChange:e=>{let t=Number(e.target.value);t&&Be(t)},className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[140px]`,title:`Select connection for autocomplete`,children:[(0,z.jsx)(`option`,{value:``,children:`Connection…`}),B.map(e=>(0,z.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,z.jsx)(`button`,{type:`button`,onClick:He,disabled:!G,className:`p-0.5 rounded text-muted-foreground hover:text-primary disabled:opacity-30 transition-colors`,title:`Run all in DB Viewer`,children:(0,z.jsx)(de,{className:`size-3.5`})})]}):null;return(0,z.jsxs)(`div`,{ref:We,className:`flex flex-col h-full w-full overflow-hidden`,style:Ge?{height:`${Ge}px`,maxHeight:`${Ge}px`}:void 0,children:[i!=null&&Te&&(0,z.jsx)(`div`,{className:`flex items-center h-7 border-b border-border bg-background shrink-0 px-2 gap-2`,children:(0,z.jsx)(`button`,{type:`button`,onClick:ze,className:`text-[10px] px-2 py-0.5 rounded border border-border hover:bg-muted transition-colors text-foreground`,children:K?`Raw`:`Beautify`})}),n&&r&&t&&(0,z.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0`,children:[(0,z.jsx)(be,{filePath:n,projectName:r,tabId:t,className:`flex items-center flex-1 min-w-0 overflow-x-auto scrollbar-none px-2 gap-0.5`}),$e,(0,z.jsx)(Se,{ext:j,mdMode:ge,onMdModeChange:_e,csvMode:ve,onCsvModeChange:ye,wordWrap:T,onToggleWordWrap:ae,filePath:n,projectName:r,className:`shrink-0 flex items-center gap-1 px-2`})]}),L&&(!r||!t)&&(0,z.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0 px-2`,children:[(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground truncate flex-1`,children:n?S(n):`SQL`}),$e]}),ue&&ve===`table`?(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(w,{className:`size-5 animate-spin text-text-subtle`})}),children:(0,z.jsx)(De,{content:o??``,onContentChange:Xe,wordWrap:T})}):le&&ge===`preview`?(0,z.jsx)(Re,{content:o??``}):(0,z.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:(0,z.jsx)(fe,{height:`100%`,language:a??Le(n??``),value:o??``,onChange:i==null?Xe:void 0,onMount:Qe,theme:E,options:{fontSize:13,fontFamily:`Menlo, Monaco, Consolas, monospace`,wordWrap:T?`on`:`off`,minimap:{enabled:!1},scrollBeyondLastLine:!1,automaticLayout:!0,lineNumbers:`on`,folding:!0,bracketPairColorization:{enabled:!0},readOnly:i!=null},loading:(0,z.jsx)(w,{className:`size-5 animate-spin text-text-subtle`})})}),Ue&&(0,z.jsx)(Ee,{editorRef:x,readOnly:i!=null}),se&&(0,z.jsx)(Ce,{open:se,defaultName:`Untitled-${e?.untitledNumber??1}`,content:v.current,onSave:Ze,onCancel:()=>k(!1)})]})});function J(){return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(w,{className:`size-5 animate-spin text-text-subtle`})})}function Re({content:e}){return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`div`,{className:`animate-pulse h-4 bg-muted rounded m-4`}),children:(0,z.jsx)(K,{content:e,className:`flex-1 overflow-auto p-4`})})}export{q as CodeEditor};
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-BjHrJDVb.js";var t=e(`database`,[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]);export{t};
@@ -1,5 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{t as r}from"./createLucideIcon-BjHrJDVb.js";import{n as i,r as a,t as o}from"./plus-51UQ45rf.js";import{t as s}from"./chevron-right-BzAdxJRG.js";import{t as c}from"./database-DCT0OjgQ.js";import{n as l,r as u,t as d}from"./x-BtqbfkR7.js";import{t as f}from"./refresh-cw-CSFrDtiu.js";import{t as p}from"./sparkles-B0mRBy_j.js";import{t as m}from"./text-wrap-Cn6BNQfq.js";import{t as h}from"./trash-2-CJYoLw7Q.js";import{t as g}from"./api-client-Dvzcc_EO.js";import"./settings-store-BHBb62gq.js";import"./vendor-mermaid-CMiurk2b.js";import{t as _}from"./tab-store-0rGchMXr.js";import{$ as v,B as y,G as b,K as x,L as S,V as C,at as ee,h as w}from"./index-ZFyltHwi.js";import{n as T,t as E}from"./use-monaco-theme-CP-vyTF8.js";import{t as D}from"./sql-query-editor-CMQpaOjA.js";import{n as O}from"./csv-parser-DO0dz4x_.js";var k=r(`columns-3`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]]),A=r(`funnel`,[[`path`,{d:`M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z`,key:`sc7q7i`}]]),j=e(n(),1);function M(e,t,n,r){return`ppm-db-${e}-${n}.${t}-p${r}`}function N(e,t,n,r){try{let i=sessionStorage.getItem(M(e,t,n,r));return i?JSON.parse(i):null}catch{return null}}function P(e,t,n,r,i,a){try{sessionStorage.setItem(M(e,t,n,r),JSON.stringify({data:i,cols:a}))}catch{}}function F(e){let t=`/api/db/connections/${e}`,[n,r]=(0,j.useState)(null),[i,a]=(0,j.useState)(`public`),[o,s]=(0,j.useState)(null),[c,l]=(0,j.useState)([]),[u,d]=(0,j.useState)(!1),[f,p]=(0,j.useState)(null),[m,h]=(0,j.useState)(1),[_,v]=(0,j.useState)(null),[y,b]=(0,j.useState)(null),[x,S]=(0,j.useState)(!1),[C,ee]=(0,j.useState)(null),[w,T]=(0,j.useState)(`ASC`),E=(0,j.useCallback)(async(r,a,o,c,u)=>{let f=r??n,h=a??i;if(!f)return;d(!0);let _=c===void 0?C:c,v=u??w;try{let n=_?`&orderBy=${encodeURIComponent(_)}&orderDir=${v}`:``,[r,i]=await Promise.all([g.get(`${t}/data?table=${encodeURIComponent(f)}&schema=${h}&page=${o??m}&limit=100${n}`),g.get(`${t}/schema?table=${encodeURIComponent(f)}&schema=${h}`)]);s(r),l(i),P(e,f,h,o??m,r,i)}catch(e){p(e.message)}finally{d(!1)}},[t,e,n,i,m,C,w]),D=(0,j.useCallback)((t,n=`public`)=>{r(t),a(n),h(1),v(null);let i=N(e,t,n,1);i?(s(i.data),l(i.cols),d(!1),E(t,n,1)):E(t,n,1)},[e,E]),O=(0,j.useCallback)(e=>{h(e),E(void 0,void 0,e)},[E]),k=(0,j.useCallback)(async e=>{S(!0),b(null);try{let r=await g.post(`${t}/query`,{sql:e});v(r),r.changeType===`modify`&&E(n??void 0,i)}catch(e){b(e.message)}finally{S(!1)}},[t,n,i,E]),A=(0,j.useCallback)(async(e,r,a,o)=>{if(!n)return;let s=n,c=i;try{await g.put(`${t}/cell`,{table:s,schema:c,pkColumn:e,pkValue:r,column:a,value:o}),E(s,c)}catch(e){p(e.message)}},[t,n,i,E]),M=(0,j.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await g.del(`${t}/row`,{table:a,schema:o,pkColumn:e,pkValue:r}),E(a,o)}catch(e){p(e.message)}},[t,n,i,E]);return{selectedTable:n,selectedSchema:i,selectTable:D,tableData:o,schema:c,loading:u,error:f,page:m,setPage:O,orderBy:C,orderDir:w,toggleSort:(0,j.useCallback)(e=>{let t,n=`ASC`;C===e?w===`ASC`?(t=e,n=`DESC`):(t=null,n=`ASC`):(t=e,n=`ASC`),ee(t),T(n),h(1),E(void 0,void 0,1,t,n)},[C,w,E]),queryResult:_,queryError:y,queryLoading:x,executeQuery:k,updateCell:A,deleteRow:M,bulkDelete:(0,j.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await g.post(`${t}/rows/delete`,{table:a,schema:o,pkColumn:e,pkValues:r}),E(a,o)}catch(e){p(e.message)}},[t,n,i,E]),insertRow:(0,j.useCallback)(async e=>{if(!n)return;let r=n,a=i;try{await g.post(`${t}/row`,{table:r,schema:a,values:e}),E(r,a)}catch(e){throw p(e.message),e}},[t,n,i,E]),refreshData:E,queryAsTable:(0,j.useCallback)(async e=>{d(!0);try{let n=await g.post(`${t}/query`,{sql:e});n.changeType===`select`&&s({columns:n.columns,rows:n.rows,total:n.rows.length,page:1,limit:n.rows.length})}catch(e){p(e.message)}finally{d(!1)}},[t])}}var I=t();function L(e,t,n){let r=new Blob([t],{type:n}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=e,a.click(),URL.revokeObjectURL(i)}function te({columns:e,rows:t,filename:n=`export`,exportAllUrl:r}){let[i,a]=(0,j.useState)(!1),[o,s]=(0,j.useState)(!1),c=(0,j.useRef)(null);(0,j.useEffect)(()=>{if(!i)return;let e=e=>{c.current&&!c.current.contains(e.target)&&a(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[i]);let l=()=>{let r=O(e,t.map(t=>e.map(e=>String(t[e]??``))));L(`${n}.csv`,r,`text/csv`),a(!1)},d=()=>{let e=JSON.stringify(t,null,2);L(`${n}.json`,e,`application/json`),a(!1)},f=async e=>{if(r){s(!0);try{let t=await(await fetch(`${r}&format=${e}&limit=10000`)).text(),i=e===`csv`?`text/csv`:`application/json`;L(`${n}-all.${e}`,t,i)}catch{}s(!1),a(!1)}};return e.length===0||t.length===0?null:(0,I.jsxs)(`div`,{className:`relative`,ref:c,children:[(0,I.jsx)(`button`,{type:`button`,onClick:()=>a(e=>!e),className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,title:`Export`,children:(0,I.jsx)(u,{className:`size-3.5`})}),i&&(0,I.jsxs)(`div`,{className:`absolute right-0 top-full mt-1 z-50 bg-popover border border-border rounded-md shadow-md py-1 min-w-[160px] text-xs`,children:[(0,I.jsx)(`button`,{onClick:l,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors`,children:`Export Page (CSV)`}),(0,I.jsx)(`button`,{onClick:d,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors`,children:`Export Page (JSON)`}),r&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(`div`,{className:`border-t border-border my-1`}),(0,I.jsx)(`button`,{onClick:()=>f(`csv`),disabled:o,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors disabled:opacity-50`,children:o?`Exporting…`:`Export All (CSV)`}),(0,I.jsx)(`button`,{onClick:()=>f(`json`),disabled:o,className:`w-full text-left px-3 py-1.5 hover:bg-muted transition-colors disabled:opacity-50`,children:o?`Exporting…`:`Export All (JSON)`})]})]})]})}function R({tableData:e,schema:t,loading:n,page:r,onPageChange:c,onCellUpdate:l,onRowDelete:u,orderBy:f,orderDir:p,onToggleSort:m,onBulkDelete:g,onInsertRow:v,connectionId:x,selectedTable:T,selectedSchema:E,connectionName:D,columnFilters:O={},onColumnFilter:M}){let[N,P]=(0,j.useState)(null),[F,L]=(0,j.useState)(``),[R,z]=(0,j.useState)(null),[B,ne]=(0,j.useState)(``),[V,H]=(0,j.useState)(new Set),[U,se]=(0,j.useState)(!1),[ce,le]=(0,j.useState)({}),[ue,de]=(0,j.useState)(null),[fe,pe]=(0,j.useState)(!1),{openTab:me}=_(w(e=>({openTab:e.openTab}))),[W,G]=(0,j.useState)(null),he=(0,j.useCallback)(e=>{let t=T??``,n=re(e.value),r=`${x??`local`}:${t}:${e.col}:${e.pkVal}`;G({title:t?`${e.col} #${e.pkVal} — ${t}`:`${e.col} #${e.pkVal}`,content:e.value,language:n,viewerKey:r})},[x,T]),[K,ge]=(0,j.useState)(new Set),[_e,ve]=(0,j.useState)(new Set),[ye,be]=(0,j.useState)(null),[xe,q]=(0,j.useState)(!1),Se=(0,j.useRef)(null),J=(0,j.useMemo)(()=>t.find(e=>e.pk)?.name||(t.find(e=>e.name.toLowerCase()===`id`)?.name??null),[t]),Ce=(0,j.useCallback)(e=>{let t=JSON.stringify(e,null,2),n=J?String(e[J]??``):``,r=T??``,i=`${x??`local`}:${r}:row:${n||`unknown`}`;G({title:n?`Row #${n}${r?` — ${r}`:``}`:`Row${r?` — ${r}`:``}`,content:t,language:`json`,viewerKey:i})},[J,x,T]),we=(0,j.useCallback)(()=>{W&&me({type:`editor`,title:W.title,projectId:null,closable:!0,metadata:{inlineContent:W.content,inlineLanguage:W.language,viewerKey:W.viewerKey}})},[me,W]),Te=(0,j.useRef)(N);Te.current=N;let Y=(0,j.useRef)(F);Y.current=F;let Ee=(0,j.useRef)(V);Ee.current=V;let De=(0,j.useRef)(R);De.current=R;let Oe=(0,j.useCallback)((e,t,n)=>{P({rowIdx:e,col:t}),L(n==null?``:typeof n==`object`?JSON.stringify(n):String(n))},[]),ke=(0,j.useCallback)(()=>{let t=Te.current;if(!t||!e||!J)return;let n=e.rows[t.rowIdx];if(!n)return;let r=n[t.col];String(r??``)!==Y.current&&l(J,n[J],t.col,Y.current===``?null:Y.current),P(null)},[e,J,l]),Ae=(0,j.useCallback)(()=>P(null),[]),je=(0,j.useCallback)(t=>{if(!e||!J||!u)return;let n=e.rows[t];n&&(u(J,n[J]),z(null))},[e,J,u]),Me=(0,j.useCallback)(e=>{ge(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Ne=(0,j.useCallback)(e=>{ve(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Pe=(0,j.useCallback)((e,t)=>{let n={...O};t?n[e]=t:delete n[e],M?.(n)},[O,M]),Fe=(0,j.useCallback)(e=>{H(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),Ie=(0,j.useCallback)(()=>{e&&H(t=>t.size===e.rows.length?new Set:new Set(e.rows.map((e,t)=>t)))},[e]),Le=(0,j.useCallback)(()=>{!e||!J||!g||(g(J,Array.from(V).map(t=>e.rows[t]?.[J]).filter(e=>e!=null)),H(new Set),pe(!1))},[e,J,g,V]),Re=(0,j.useCallback)(async()=>{if(v){de(null);try{let e={};for(let[t,n]of Object.entries(ce))n!==``&&(e[t]=n);await v(e),se(!1),le({})}catch(e){de(e.message)}}},[v,ce]),ze=(0,j.useMemo)(()=>{if(!e||!B)return e?.rows??[];let t=B.toLowerCase();return e.rows.filter(n=>e.columns.some(e=>String(n[e]??``).toLowerCase().includes(t)))},[e,B]),Be=(0,j.useRef)(null);(0,j.useEffect)(()=>{let t=Be.current;if(!t)return;let n=t=>{if(t.key===`Escape`){q(!1),G(null);return}let n=t.target?.tagName;if(!(n===`INPUT`||n===`TEXTAREA`)){if(t.key===`/`){t.preventDefault(),q(!0);return}if(!(!(t.metaKey||t.ctrlKey)||!e)&&(t.key===`a`&&(t.preventDefault(),H(new Set(e.rows.map((e,t)=>t)))),t.key===`c`&&V.size>0)){t.preventDefault();let n=e.columns,r=n.join(` `),i=Array.from(V).sort((e,t)=>e-t).map(t=>n.map(n=>{let r=e.rows[t]?.[n];return r==null?``:typeof r==`object`?JSON.stringify(r):String(r)}).join(` `));navigator.clipboard.writeText([r,...i].join(`
2
- `))}}};return t.addEventListener(`keydown`,n),()=>t.removeEventListener(`keydown`,n)},[e,V]);let X=(0,j.useMemo)(()=>{if(!e)return[];let t=e.columns.filter(e=>K.has(e)),n=e.columns.filter(e=>!K.has(e));return[...t,...n]},[e?.columns,K]),Ve=(0,j.useRef)(null),[He,Ue]=(0,j.useState)(0),[Z,We]=(0,j.useState)(new Map);(0,j.useEffect)(()=>{let e=Ve.current;if(!e)return;let t=()=>{Ue(e.offsetHeight);let t=new Map;e.querySelectorAll(`th[data-col]`).forEach(e=>{t.set(e.dataset.col,e.offsetWidth)});let n=e.querySelector(`th[data-col='_cb']`);n&&t.set(`_cb`,n.offsetWidth),We(t)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[e?.columns,K]);let Q=(0,j.useMemo)(()=>{let e=new Map,t=Z.get(`_cb`)??(J?40:0);for(let n of X){if(!K.has(n))break;e.set(n,t),t+=Z.get(n)??100}return e},[X,K,J,Z]),$=(0,j.useMemo)(()=>Array.from(_e).sort((e,t)=>e-t).map(e=>({idx:e,row:ze[e]})).filter(e=>e.row),[_e,ze]),Ge=(0,j.useRef)(new Map),[Ke,qe]=(0,j.useState)(new Map),Je=(0,j.useCallback)((e,t)=>{t?Ge.current.set(e,t):Ge.current.delete(e)},[]);(0,j.useEffect)(()=>{if($.length===0){Ke.size>0&&qe(new Map);return}let e=requestAnimationFrame(()=>{let e=new Map;for(let{idx:t}of $){let n=Ge.current.get(t);n&&e.set(t,n.offsetHeight)}qe(e)});return()=>cancelAnimationFrame(e)},[$,e]);let Ye=(0,j.useMemo)(()=>{let e=new Map,t=He;for(let{idx:n}of $)e.set(n,t),t+=Ke.get(n)??28;return e},[He,$,Ke]),Xe=(0,j.useCallback)(e=>{let t=Se.current,n=t?.querySelector(`th[data-col="${e}"]`);if(!t||!n)return;let r=0,i=t.querySelector(`th[data-col="_cb"]`);i&&(r+=i.offsetWidth);for(let[t,n]of Q)t!==e&&(r=Math.max(r,n+(Z.get(t)??0)));let a=n.offsetLeft-r;t.scrollTo({left:a,behavior:`instant`}),q(!1)},[Q,Z]);if(!e)return(0,I.jsx)(`div`,{className:`flex items-center justify-center h-full text-xs text-muted-foreground`,children:n?(0,I.jsx)(b,{className:`size-4 animate-spin`}):`Select a table`});let Ze=Math.ceil(e.total/e.limit)||1,Qe=V.size>0,$e=V.size===e.rows.length&&e.rows.length>0;return(0,I.jsxs)(`div`,{ref:Be,tabIndex:0,className:`flex flex-col h-full overflow-hidden outline-none`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1 border-b border-border bg-background shrink-0`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-1 flex-1`,children:[(0,I.jsx)(S,{className:`size-3 text-muted-foreground`}),(0,I.jsx)(`input`,{type:`text`,value:B,onChange:e=>ne(e.target.value),placeholder:`Search current page…`,className:`flex-1 text-xs bg-transparent outline-none text-foreground placeholder:text-muted-foreground`}),B&&(0,I.jsx)(`button`,{type:`button`,onClick:()=>ne(``),className:`text-muted-foreground hover:text-foreground`,children:(0,I.jsx)(d,{className:`size-3`})})]}),(0,I.jsxs)(`div`,{className:`relative`,children:[(0,I.jsx)(`button`,{type:`button`,onClick:()=>q(!xe),className:`p-0.5 rounded transition-colors ${xe?`text-primary`:`text-muted-foreground hover:text-foreground`}`,title:`Jump to column ( / )`,children:(0,I.jsx)(k,{className:`size-3.5`})}),xe&&(0,I.jsx)(ae,{columns:e.columns,onSelect:Xe,onClose:()=>q(!1)})]}),Qe&&(0,I.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,I.jsxs)(`span`,{className:`text-muted-foreground`,children:[V.size,` selected`]}),g&&J&&(fe?(0,I.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,I.jsxs)(`button`,{type:`button`,onClick:Le,className:`text-destructive text-[10px] font-medium hover:underline`,children:[`Delete `,V.size,`?`]}),(0,I.jsx)(`button`,{type:`button`,onClick:()=>pe(!1),className:`text-muted-foreground text-[10px] hover:underline`,children:`Cancel`})]}):(0,I.jsx)(`button`,{type:`button`,onClick:()=>pe(!0),className:`p-0.5 text-muted-foreground hover:text-destructive`,children:(0,I.jsx)(h,{className:`size-3`})})),(0,I.jsx)(te,{columns:e.columns,rows:Array.from(V).map(t=>e.rows[t]).filter(Boolean),filename:`${D??`db`}-selected`})]}),v&&(0,I.jsx)(`button`,{type:`button`,onClick:()=>{se(!0),le({}),de(null)},className:`p-0.5 rounded text-muted-foreground hover:text-primary transition-colors`,title:`Insert row`,children:(0,I.jsx)(o,{className:`size-3.5`})})]}),U&&(0,I.jsxs)(`div`,{className:`px-2 py-1.5 border-b border-border bg-muted/30 text-xs space-y-1`,children:[(0,I.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.filter(e=>!e.pk).map(e=>(0,I.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,I.jsx)(`label`,{className:`text-muted-foreground text-[10px] w-16 truncate`,title:e.name,children:e.name}),(0,I.jsx)(`input`,{value:ce[e.name]??``,onChange:t=>le(n=>({...n,[e.name]:t.target.value})),placeholder:e.defaultValue??(e.nullable?`NULL`:``),className:`h-5 w-24 text-[11px] px-1 rounded border border-border bg-background outline-none focus:border-primary`})]},e.name))}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(`button`,{type:`button`,onClick:Re,className:`text-[10px] px-2 py-0.5 rounded bg-primary text-primary-foreground hover:bg-primary/90`,children:`Save`}),(0,I.jsx)(`button`,{type:`button`,onClick:()=>se(!1),className:`text-[10px] text-muted-foreground hover:underline`,children:`Cancel`}),ue&&(0,I.jsx)(`span`,{className:`text-[10px] text-destructive`,children:ue})]})]}),(0,I.jsxs)(`div`,{ref:Se,className:`flex-1 overflow-auto relative min-h-0`,children:[n&&(0,I.jsx)(`div`,{className:`absolute inset-0 z-30 flex items-center justify-center bg-background/60`,children:(0,I.jsx)(b,{className:`size-5 animate-spin text-primary`})}),(0,I.jsxs)(`table`,{className:`w-full text-xs`,style:{borderCollapse:`separate`,borderSpacing:0},children:[(0,I.jsx)(`thead`,{ref:Ve,className:`sticky top-0 z-20 bg-muted`,children:(0,I.jsxs)(`tr`,{children:[J&&(0,I.jsx)(`th`,{"data-col":`_cb`,className:`px-2 py-1.5 text-left font-medium text-muted-foreground border-b border-border w-10 bg-muted`,style:{position:`sticky`,left:0,zIndex:30},children:(0,I.jsx)(`input`,{type:`checkbox`,checked:$e,onChange:Ie,className:`size-3 accent-primary`})}),X.map(e=>{let n=t.find(t=>t.name===e)?.pk,r=f===e,o=K.has(e),s=!!O[e],c=ye===e,l=Q.get(e);return(0,I.jsxs)(`th`,{"data-col":e,className:`group/th px-2 py-1.5 text-left font-medium text-muted-foreground border-b border-border whitespace-nowrap bg-muted ${o?`border-r border-r-primary/20`:``}`,style:l==null?void 0:{position:`sticky`,left:l,zIndex:25},children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-0.5`,children:[(0,I.jsxs)(`button`,{type:`button`,onClick:()=>m(e),className:`flex items-center gap-0.5 ${n?`font-bold`:``} hover:text-foreground transition-colors`,children:[e,r&&p===`ASC`&&(0,I.jsx)(i,{className:`size-3`}),r&&p===`DESC`&&(0,I.jsx)(a,{className:`size-3`})]}),M&&(0,I.jsx)(`button`,{type:`button`,title:`Filter column`,onClick:()=>be(c?null:e),className:`p-0.5 rounded transition-colors ${s||c?`text-primary`:`text-muted-foreground/40 md:opacity-0 md:group-hover/th:opacity-100 hover:text-foreground`}`,children:(0,I.jsx)(A,{className:`size-2.5`})}),(0,I.jsx)(`button`,{type:`button`,title:o?`Unpin column`:`Pin column`,onClick:()=>Me(e),className:`p-0.5 rounded transition-colors ${o?`text-primary`:`text-muted-foreground/40 md:opacity-0 md:group-hover/th:opacity-100 hover:text-foreground`}`,children:o?(0,I.jsx)(C,{className:`size-2.5`}):(0,I.jsx)(y,{className:`size-2.5`})})]}),c&&(0,I.jsxs)(`div`,{className:`mt-1 flex items-center gap-1`,children:[(0,I.jsx)(`input`,{autoFocus:!0,type:`text`,value:O[e]??``,placeholder:`ILIKE filter…`,onChange:t=>Pe(e,t.target.value),onKeyDown:e=>{e.key===`Escape`&&be(null)},className:`w-full h-5 text-[10px] px-1 rounded border border-border bg-background outline-none focus:border-primary`}),s&&(0,I.jsx)(`button`,{type:`button`,onClick:()=>Pe(e,``),className:`text-muted-foreground hover:text-foreground`,children:(0,I.jsx)(d,{className:`size-2.5`})})]})]},e)}),u&&J&&(0,I.jsx)(`th`,{className:`px-2 py-1.5 border-b border-border w-14 bg-muted`})]})}),(0,I.jsxs)(`tbody`,{children:[$.map(({idx:e,row:t})=>(0,I.jsx)(oe,{row:t,rowIdx:e,columns:X,selected:V.has(e),onToggleSelect:Fe,pkCol:J,editingCell:N,editValue:F,onStartEdit:Oe,onCommitEdit:ke,onCancelEdit:Ae,onSetEditValue:L,showDelete:!!u,confirmingDelete:R===e,onDelete:je,onConfirmDelete:z,onViewCell:he,onViewRow:Ce,pinned:!0,onTogglePin:Ne,pinnedCols:K,pinnedColOffsets:Q,stickyTop:Ye.get(e)??He,trRef:t=>Je(e,t)},`pin-${e}`)),ze.map((e,t)=>_e.has(t)?null:(0,I.jsx)(oe,{row:e,rowIdx:t,columns:X,selected:V.has(t),onToggleSelect:Fe,pkCol:J,editingCell:N,editValue:F,onStartEdit:Oe,onCommitEdit:ke,onCancelEdit:Ae,onSetEditValue:L,showDelete:!!u,confirmingDelete:R===t,onDelete:je,onConfirmDelete:z,onViewCell:he,onViewRow:Ce,pinned:!1,onTogglePin:Ne,pinnedCols:K,pinnedColOffsets:Q},t)),ze.length===0&&(0,I.jsx)(`tr`,{children:(0,I.jsx)(`td`,{colSpan:X.length+2,className:`px-2 py-8 text-center text-muted-foreground`,children:`No data`})})]})]})]}),W&&(0,I.jsx)(ie,{data:W,onClose:()=>G(null),onOpenInTab:we}),(0,I.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-1.5 border-t border-border bg-background shrink-0 text-xs text-muted-foreground`,children:[(0,I.jsxs)(`span`,{children:[e.total.toLocaleString(),` rows`]}),(0,I.jsxs)(`div`,{className:`hidden md:flex items-center gap-2 text-[10px] text-muted-foreground/50`,children:[(0,I.jsxs)(`span`,{children:[(0,I.jsx)(`kbd`,{className:`px-1 py-0.5 rounded bg-muted text-[9px]`,children:`/`}),` columns`]}),(0,I.jsxs)(`span`,{children:[(0,I.jsxs)(`kbd`,{className:`px-1 py-0.5 rounded bg-muted text-[9px]`,children:[`⌘`,`A`]}),` select all`]}),(0,I.jsxs)(`span`,{children:[(0,I.jsxs)(`kbd`,{className:`px-1 py-0.5 rounded bg-muted text-[9px]`,children:[`⌘`,`C`]}),` copy`]})]}),(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(`button`,{type:`button`,disabled:r<=1,onClick:()=>c(r-1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,I.jsx)(ee,{className:`size-3.5`})}),(0,I.jsxs)(`span`,{children:[r,` / `,Ze]}),(0,I.jsx)(`button`,{type:`button`,disabled:r>=Ze,onClick:()=>c(r+1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,I.jsx)(s,{className:`size-3.5`})})]})]})]})}function z(e){return e==null?`NULL`:typeof e==`object`?JSON.stringify(e):String(e)}var B=200;function ne(e){if(e==null)return!1;if(typeof e==`object`)return!0;let t=String(e);if(t.length>=B)return!0;let n=t.trimStart();return!!((n[0]===`{`||n[0]===`[`)&&(n.endsWith(`}`)||n.endsWith(`]`))||n.startsWith(`<?xml`)||n.startsWith(`<`)&&n.endsWith(`>`))}function re(e){let t=e.trimStart();if(t[0]===`{`||t[0]===`[`)try{return JSON.parse(t),`json`}catch{}return t.startsWith(`<?xml`)||t.startsWith(`<`)&&/<\/\w+>/.test(t)?`xml`:t.startsWith(`---`)||/^\w+:\s/m.test(t)?`yaml`:`plaintext`}function ie({data:e,onClose:t,onOpenInTab:n}){let r=E(),[i,a]=(0,j.useState)(!0),[o,s]=(0,j.useState)(e.content),[c,u]=(0,j.useState)(!1),f=e.language===`json`||e.language===`xml`,h=(0,j.useRef)(e.title);h.current!==e.title&&(h.current=e.title,s(e.content),u(!1));let g=(0,j.useCallback)(()=>{if(c)s(e.content),u(!1);else if(e.language===`json`)try{s(JSON.stringify(JSON.parse(e.content.trim()),null,2)),u(!0)}catch{}else if(e.language===`xml`){let t=0;s(e.content.trim().replace(/>\s*</g,`>
3
- <`).split(`
4
- `).map(e=>{let n=e.trim();n.startsWith(`</`)&&(t=Math.max(0,t-1));let r=` `.repeat(t)+n;return n.startsWith(`<`)&&!n.startsWith(`</`)&&!n.endsWith(`/>`)&&!n.startsWith(`<?`)&&t++,r}).join(`
5
- `)),u(!0)}},[c,e.content,e.language]);return(0,I.jsxs)(`div`,{className:`shrink-0 border-t border-border flex flex-col`,style:{height:`40%`},children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1 bg-muted/50 border-b border-border shrink-0`,children:[(0,I.jsx)(l,{className:`size-3 text-muted-foreground`}),(0,I.jsx)(`span`,{className:`text-xs font-medium text-foreground truncate flex-1`,children:e.title}),f&&(0,I.jsx)(`button`,{type:`button`,onClick:g,title:c?`Raw`:`Beautify`,className:`p-0.5 rounded transition-colors ${c?`text-primary`:`text-muted-foreground hover:text-foreground`}`,children:(0,I.jsx)(p,{className:`size-3`})}),(0,I.jsx)(`button`,{type:`button`,onClick:()=>a(!i),title:i?`No wrap`:`Word wrap`,className:`p-0.5 rounded transition-colors ${i?`text-primary`:`text-muted-foreground hover:text-foreground`}`,children:(0,I.jsx)(m,{className:`size-3`})}),(0,I.jsxs)(`button`,{type:`button`,onClick:n,title:`Open in new tab`,className:`flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,children:[(0,I.jsx)(v,{className:`size-3`}),(0,I.jsx)(`span`,{className:`hidden sm:inline`,children:`Open in Tab`})]}),(0,I.jsx)(`button`,{type:`button`,onClick:t,title:`Close preview (Esc)`,className:`p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,I.jsx)(d,{className:`size-3`})})]}),(0,I.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,I.jsx)(T,{height:`100%`,language:e.language===`plaintext`?void 0:e.language,value:o,theme:r,options:{readOnly:!0,minimap:{enabled:!1},scrollBeyondLastLine:!1,wordWrap:i?`on`:`off`,lineNumbers:`on`,fontSize:12,folding:!0,bracketPairColorization:{enabled:!0},domReadOnly:!0,contextmenu:!1,overviewRulerLanes:0},loading:(0,I.jsx)(b,{className:`size-4 animate-spin text-muted-foreground`})})})]})}function ae({columns:e,onSelect:t,onClose:n}){let[r,i]=(0,j.useState)(``),[a,o]=(0,j.useState)(0),s=(0,j.useMemo)(()=>{if(!r)return e;let t=r.toLowerCase();return e.filter(e=>e.toLowerCase().includes(t))},[e,r]),c=(0,j.useRef)(null);return(0,j.useEffect)(()=>{c.current?.scrollIntoView({block:`nearest`})},[a]),(0,I.jsxs)(`div`,{className:`absolute top-full right-0 mt-1 z-50 w-52 max-h-56 bg-popover border border-border rounded-md shadow-lg overflow-hidden flex flex-col`,children:[(0,I.jsx)(`input`,{autoFocus:!0,type:`text`,value:r,onChange:e=>{i(e.target.value),o(0)},onKeyDown:e=>{e.key===`Escape`?n():e.key===`ArrowDown`?(e.preventDefault(),o(e=>Math.min(e+1,s.length-1))):e.key===`ArrowUp`?(e.preventDefault(),o(e=>Math.max(e-1,0))):e.key===`Enter`&&s[a]&&t(s[a])},placeholder:`Search columns…`,className:`px-2 py-1.5 text-xs bg-transparent outline-none border-b border-border text-foreground placeholder:text-muted-foreground`}),(0,I.jsx)(`div`,{className:`overflow-auto flex-1`,children:s.map((e,n)=>(0,I.jsx)(`button`,{type:`button`,onClick:()=>t(e),ref:n===a?c:void 0,className:`w-full text-left px-2 py-1 text-xs truncate ${n===a?`bg-primary/10 text-primary`:`text-foreground hover:bg-muted`}`,children:e},e))})]})}var oe=(0,j.memo)(function({row:e,rowIdx:t,columns:n,selected:r,onToggleSelect:i,pkCol:a,editingCell:o,editValue:s,onStartEdit:c,onCommitEdit:u,onCancelEdit:d,onSetEditValue:f,showDelete:p,confirmingDelete:m,onDelete:g,onConfirmDelete:_,onViewCell:v,onViewRow:b,pinned:x,onTogglePin:S,pinnedCols:ee,pinnedColOffsets:w,stickyTop:T,trRef:E}){let D=x?`bg-muted`:r?`bg-primary/5`:`bg-background`;return(0,I.jsxs)(`tr`,{ref:E,className:`group ${x?``:`hover:bg-muted/30`}`,style:x?{position:`sticky`,top:T,zIndex:15}:void 0,children:[a&&(0,I.jsx)(`td`,{className:`px-2 py-1 border-b border-border/50 ${D}`,style:{position:`sticky`,left:0,zIndex:12},children:(0,I.jsxs)(`span`,{className:`flex items-center gap-0.5`,children:[(0,I.jsx)(`input`,{type:`checkbox`,checked:r,onChange:()=>i(t),className:`size-3 accent-primary`}),(0,I.jsx)(`button`,{type:`button`,title:`View row as JSON`,onClick:()=>b(e),className:`p-0.5 rounded transition-colors text-muted-foreground/30 md:opacity-0 md:group-hover:opacity-100 hover:text-foreground`,children:(0,I.jsx)(l,{className:`size-2.5`})}),(0,I.jsx)(`button`,{type:`button`,title:x?`Unpin row`:`Pin row`,onClick:()=>S(t),className:`p-0.5 rounded transition-colors ${x?`text-primary`:`text-muted-foreground/30 md:opacity-0 md:group-hover:opacity-100 hover:text-foreground`}`,children:x?(0,I.jsx)(C,{className:`size-2.5`}):(0,I.jsx)(y,{className:`size-2.5`})})]})}),n.map(n=>{let r=o?.rowIdx===t&&o?.col===n,i=e[n],p=!r&&ne(i),m=ee.has(n),h=w.get(n);return(0,I.jsx)(`td`,{className:`px-2 py-1 max-w-[300px] border-b border-border/50 ${m?`border-r border-r-primary/20`:``} ${m||x?D:``}`,style:h==null?void 0:{position:`sticky`,left:h,zIndex:10},children:r?(0,I.jsx)(`input`,{autoFocus:!0,className:`w-full bg-transparent border border-primary/50 rounded px-1 py-0 text-xs outline-none`,value:s,onChange:e=>f(e.target.value),onBlur:u,onKeyDown:e=>{e.key===`Enter`&&u(),e.key===`Escape`&&d()}}):(0,I.jsxs)(`span`,{className:`flex items-center gap-0.5`,children:[(0,I.jsx)(`span`,{className:`cursor-pointer truncate flex-1 ${i==null?`text-muted-foreground/40 italic`:``}`,onDoubleClick:()=>a&&c(t,n,i),title:z(i),children:z(i)}),p&&(0,I.jsx)(`button`,{type:`button`,title:`View full content`,onClick:()=>v({col:n,value:z(i),pkVal:a?String(e[a]??t):String(t)}),className:`shrink-0 p-0.5 rounded text-muted-foreground/50 hover:text-foreground transition-colors`,children:(0,I.jsx)(l,{className:`size-3`})})]})},n)}),p&&a&&(0,I.jsx)(`td`,{className:`px-2 py-1 border-b border-border/50 ${x?D:``}`,children:m?(0,I.jsxs)(`span`,{className:`flex items-center gap-1 whitespace-nowrap`,children:[(0,I.jsx)(`button`,{type:`button`,onClick:()=>g(t),className:`text-destructive text-[10px] font-medium hover:underline`,children:`Confirm`}),(0,I.jsx)(`button`,{type:`button`,onClick:()=>_(null),className:`text-muted-foreground text-[10px] hover:underline`,children:`Cancel`})]}):(0,I.jsx)(`button`,{type:`button`,onClick:()=>_(t),className:`p-0.5 rounded md:opacity-0 md:group-hover:opacity-100 hover:bg-destructive/10 hover:text-destructive transition-opacity`,title:`Delete row`,children:(0,I.jsx)(h,{className:`size-3`})})})]})});function V(e){let t={},n=/"(\w+)"\s+ILIKE\s+'%([^']*?)%'/gi,r;for(;(r=n.exec(e))!==null;)t[r[1]]=r[2].replace(/''/g,`'`);return t}function H({metadata:e}){let t=e?.connectionId,n=e?.connectionName,r=e?.tableName,i=e?.schemaName??`public`,a=e?.initialSql,o=F(t),[s,l]=(0,j.useState)([]),[u,d]=(0,j.useState)(180),p=(0,j.useRef)(null),[m,h]=(0,j.useState)({}),_=(0,j.useMemo)(()=>{if(a&&!o.selectedTable)return a;if(o.selectedTable){let e=`SELECT * FROM "${o.selectedTable}"`,t=Object.entries(m).filter(([,e])=>e.trim()).map(([e,t])=>`"${e}" ILIKE '%${t.replace(/'/g,`''`)}%'`);t.length>0&&(e+=` WHERE ${t.join(` AND `)}`),o.orderBy&&(e+=` ORDER BY "${o.orderBy}" ${o.orderDir}`);let n=(o.page-1)*100;return e+=` LIMIT 100`,n>0&&(e+=` OFFSET ${n}`),e}return`SELECT * FROM `},[a,o.selectedTable,o.orderBy,o.orderDir,o.page,m]),v=(0,j.useCallback)(e=>{h(e)},[]),y=(0,j.useRef)(void 0);(0,j.useEffect)(()=>{if(!(!o.selectedTable||Object.keys(m).length===0))return clearTimeout(y.current),y.current=setTimeout(()=>{o.queryAsTable(_)},500),()=>clearTimeout(y.current)},[m]);let b=(0,j.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=u,r=e=>{let r=e.clientY-t;d(Math.max(80,Math.min(n+r,(p.current?.clientHeight??600)-100)))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[u]);(0,j.useEffect)(()=>{g.get(`/api/db/connections/${t}/tables?cached=1`).then(e=>l(e.map(e=>({name:e.name,schema:e.schema})))).catch(()=>{})},[t]);let S=(0,j.useMemo)(()=>{if(s.length!==0)return{tables:s,getColumns:async(e,n)=>await g.get(`/api/db/connections/${t}/schema?table=${encodeURIComponent(e)}${n?`&schema=${encodeURIComponent(n)}`:``}`)}},[t,s]),C=(0,j.useRef)(!1);(0,j.useEffect)(()=>{C.current||(C.current=!0,a?o.executeQuery(a):r&&o.selectTable(r,i))},[r,i,a]);let[ee,w]=(0,j.useState)(!!a),T=(0,j.useCallback)(e=>{let t=e.trim();if(o.selectedTable&&RegExp(`^SELECT\\s+\\*\\s+FROM\\s+"?${o.selectedTable.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}"?\\b`,`i`).test(t)){h(V(t)),o.queryAsTable(t);return}w(!0),o.executeQuery(e)},[o.executeQuery,o.queryAsTable,o.selectedTable]),E=(0,j.useCallback)(e=>{w(!1),o.toggleSort(e)},[o.toggleSort]),O=(0,j.useCallback)(e=>{w(!1),o.setPage(e)},[o.setPage]),k=o.queryResult,A=ee&&!!(k||o.queryError),M=o.selectedTable&&!A;return(0,I.jsx)(`div`,{ref:p,className:`flex h-full w-full overflow-hidden`,children:(0,I.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,I.jsx)(c,{className:`size-3.5 text-muted-foreground`}),(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:n??`Database`}),o.selectedTable&&(0,I.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,o.selectedTable]}),(0,I.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[o.tableData&&(0,I.jsx)(te,{columns:o.tableData.columns,rows:o.tableData.rows,filename:n?`${n}-${o.selectedTable??`data`}`:o.selectedTable??`data`,exportAllUrl:o.selectedTable?`/api/db/connections/${t}/export?table=${encodeURIComponent(o.selectedTable)}&schema=${o.selectedSchema}`:void 0}),(0,I.jsx)(`button`,{type:`button`,onClick:()=>o.refreshData(),title:`Reload data`,className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,I.jsx)(f,{className:`size-3 ${o.loading?`animate-spin`:``}`})})]})]}),(0,I.jsx)(`div`,{className:`shrink-0 border-b border-border`,style:{height:u},children:(0,I.jsx)(D,{onExecute:T,loading:o.queryLoading,defaultValue:_,schemaInfo:S})}),(0,I.jsx)(`div`,{onMouseDown:b,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,I.jsx)(x,{className:`size-3 text-muted-foreground/50`})}),(0,I.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[M&&(0,I.jsx)(R,{tableData:o.tableData,schema:o.schema,loading:o.loading,page:o.page,onPageChange:O,onCellUpdate:o.updateCell,onRowDelete:o.deleteRow,orderBy:o.orderBy,orderDir:o.orderDir,onToggleSort:E,onBulkDelete:o.bulkDelete,onInsertRow:o.insertRow,connectionId:t,selectedTable:o.selectedTable,selectedSchema:o.selectedSchema,connectionName:n,columnFilters:m,onColumnFilter:v}),A&&(0,I.jsx)(se,{result:k,error:o.queryError,loading:o.queryLoading,schema:o.schema,connectionName:n})]})]})})}var U=()=>{};function se({result:e,error:t,loading:n,schema:r,connectionName:i}){let a=(0,j.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),o=(0,j.useMemo)(()=>r?.length?r:(e?.columns??[]).map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null})),[r,e?.columns]);return(0,I.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden text-xs`,children:[t&&(0,I.jsx)(`div`,{className:`px-3 py-2 text-destructive bg-destructive/5 shrink-0`,children:t}),e?.changeType===`modify`&&(0,I.jsxs)(`div`,{className:`px-3 py-2 text-green-500 shrink-0`,children:[e.rowsAffected,` row(s) affected`,e.executionTimeMs!=null&&(0,I.jsxs)(`span`,{className:`text-muted-foreground ml-2`,children:[e.executionTimeMs,`ms`]})]}),a&&(0,I.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[(0,I.jsx)(R,{tableData:a,schema:o,loading:!!n,page:1,onPageChange:U,onCellUpdate:U,orderBy:null,orderDir:`ASC`,onToggleSort:U,connectionName:i}),e?.executionTimeMs!=null&&(0,I.jsxs)(`div`,{className:`px-3 py-0.5 border-t border-border text-[10px] text-muted-foreground shrink-0`,children:[e.rows.length,` rows · `,e.executionTimeMs,`ms`]})]}),e?.changeType===`select`&&e.rows.length===0&&(0,I.jsxs)(`div`,{className:`px-3 py-2 text-muted-foreground shrink-0`,children:[`No results`,e.executionTimeMs!=null&&(0,I.jsxs)(`span`,{className:`ml-2 text-muted-foreground/60`,children:[e.executionTimeMs,`ms`]})]}),!e&&!t&&(0,I.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:n?(0,I.jsx)(b,{className:`size-4 animate-spin`}):`Run a query to see results`})]})}export{H as DatabaseViewer};