From 0e88ee1b1a60846df8f4ea4d29c0f725815ca460 Mon Sep 17 00:00:00 2001 From: Yukina Date: Sun, 21 Jun 2026 10:50:55 +0700 Subject: [PATCH] feat: add unsorted state to column sort --- core/ui/modules/grid-actions.js | 12 +++++++++--- core/ui/modules/grid-render.js | 2 +- core/ui/viewer.css | 5 +++-- core/ui/viewer.html | 6 +++--- website/public/sqlite-viewer/viewer.html | 6 +++--- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/core/ui/modules/grid-actions.js b/core/ui/modules/grid-actions.js index 6f1e866..fb9c59f 100644 --- a/core/ui/modules/grid-actions.js +++ b/core/ui/modules/grid-actions.js @@ -42,11 +42,17 @@ export function goToPage(pageIndex) { } export function onColumnSort(columnName) { - if (state.sortedColumn === columnName) { - state.sortAscending = !state.sortAscending; - } else { + // Cycle through three states on repeated clicks of the same column: + // none (original order) -> ascending -> descending -> none ... + if (state.sortedColumn !== columnName) { state.sortedColumn = columnName; state.sortAscending = true; + } else if (state.sortAscending) { + state.sortAscending = false; + } else { + // Back to the original, unsorted order. + state.sortedColumn = null; + state.sortAscending = true; } loadTableData(); persistState(); diff --git a/core/ui/modules/grid-render.js b/core/ui/modules/grid-render.js index 0c9b37e..89fc116 100644 --- a/core/ui/modules/grid-render.js +++ b/core/ui/modules/grid-render.js @@ -66,7 +66,7 @@ function createTableHeader(rowNumWidth, orderedColumns, pinnedColumnOffsets) { th.innerHTML = `
- ${keyIcon}${safeColName}${sortIndicator} + ${keyIcon}${safeColName}${sortIndicator}
diff --git a/core/ui/viewer.css b/core/ui/viewer.css index bc1a2eb..87b386d 100644 --- a/core/ui/viewer.css +++ b/core/ui/viewer.css @@ -408,11 +408,12 @@ body { min-width: 0; } -/* Sort indicator - displayed inline next to column name */ +/* Sort indicator - sits next to the column name as its own flex item so it is + never clipped by the name's text-overflow ellipsis on narrow columns */ .sort-indicator { font-size: 10px; - margin-left: 4px; color: var(--text-secondary); + flex-shrink: 0; } /* Primary key indicator - displayed before column name */ diff --git a/core/ui/viewer.html b/core/ui/viewer.html index 55a82b6..f79b7b9 100644 --- a/core/ui/viewer.html +++ b/core/ui/viewer.html @@ -6,7 +6,7 @@ SQLite Explorer @@ -388,7 +388,7 @@ `,e}function rn(e,n,o){let l=document.createElement("thead");l.className="grid-header";let a=document.createElement("tr"),s=document.createElement("th");s.className="header-cell row-number-header",Object.assign(s.style,{width:`${e}px`,minWidth:`${e}px`,maxWidth:`${e}px`,position:"sticky",left:"0",top:"0",zIndex:"11",background:"var(--bg-secondary)"}),s.title="Click to select all rows",s.innerHTML='
#
',a.appendChild(s);for(let i of n){let r=t.sortedColumn===i.name,c=t.pinnedColumns.has(i.name),d=t.selectedColumns.has(i.name),m=t.columnWidths[i.name]||120,y=t.columnFilters[i.name]||"",f=document.createElement("th");f.className=`header-cell ${c?"pinned":""} ${d?"column-selected":""}`,Object.assign(f.style,{width:`${m}px`,minWidth:`${m}px`,maxWidth:`${m}px`}),c&&(f.style.position="sticky",f.style.left=`${o.get(i.name)}px`),f.dataset.column=i.name;let p=X(i.name),g=X(y),b=r?`${t.sortAscending?"\u25B2":"\u25BC"}`:"",I=i.isPrimaryKey?'':"",h=c?"pinned":"",x=c?"Unpin column":"Pin column";f.innerHTML=`
- ${I}${p}${b} + ${I}${p}${b}
@@ -400,7 +400,7 @@
`,a.appendChild(f)}return l.appendChild(a),l}function cn(e,n,o,l,a,s,i,r){let c=document.createElement("tbody"),d=[];for(let p=0;p({idx:g,rowId:T(p,g)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,g)=>({idx:g,rowId:T(p,g)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],f=document.createDocumentFragment();for(let{idx:p,rowId:g}of y){let b=t.gridData[p],I=t.selectedRowIds.has(g),h=t.pinnedRowIds.has(g),x=document.createElement("tr");x.id=`row-${p}`,x.className=`data-row ${I?"selected":""} ${h?"pinned":""}`,x.dataset.rowid=g,x.dataset.rowidx=p,h&&(x.style.top=`${m.get(g)}px`);let A=document.createElement("td");A.className="data-cell row-number",Object.assign(A.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:h?"8":"2"});let R=t.currentPageIndex*t.rowsPerPage+p+1;A.appendChild(document.createTextNode(String(R)));let w=document.createElement("span");w.className=`pin-icon codicon codicon-pin ${h?"pinned":""}`,w.title=h?"Unpin row":"Pin row",A.appendChild(w),x.appendChild(A);for(let N=0;Nw&&w.trim()!=="");if(r.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){r.appendChild(sn());return}let p=new Set;if(t.selectedCells.length>0)for(let w of t.selectedCells)p.add(`${w.rowIdx},${w.colIdx}`);let g=document.createElement("table");if(g.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let w of t.tableColumns){let N=w.name.length,k=w.isPrimaryKey?86:70,q=N*8+k;t.columnWidths[w.name]=Math.max(80,Math.min(250,q))}let b=[...t.tableColumns.filter(w=>t.pinnedColumns.has(w.name)),...t.tableColumns.filter(w=>!t.pinnedColumns.has(w.name))],I=new Map,h=i-1;for(let w of b)t.pinnedColumns.has(w.name)&&(I.set(w.name,h),h+=t.columnWidths[w.name]||120);let x=new Map;t.tableColumns.forEach((w,N)=>x.set(w.name,N));let A=rn(i,b,I);g.appendChild(A);let R=cn(b,x,I,i,52,26,p,f);g.appendChild(R),r.appendChild(g),r.scrollLeft=m,r.scrollTop=y,Xe()}function Ye(){document.getElementById("pageIndicator").textContent=`${t.currentPageIndex+1} / ${t.totalPageCount}`,document.getElementById("btnFirst").disabled=t.currentPageIndex===0,document.getElementById("btnPrev").disabled=t.currentPageIndex===0,document.getElementById("btnNext").disabled=t.currentPageIndex>=t.totalPageCount-1,document.getElementById("btnLast").disabled=t.currentPageIndex>=t.totalPageCount-1}async function z(){if(t.selectedTable)try{let e=await C.getTableInfo(t.selectedTable);t.tableColumns=e.map(o=>({cid:o.ordinal,name:o.identifier,type:o.declaredType,notnull:o.isRequired,dflt_value:o.defaultExpression,isPrimaryKey:o.primaryKeyPosition>0})).sort((o,l)=>o.cid-l.cid);let n=new Set(t.tableColumns.map(o=>o.name));t.sortedColumn&&!n.has(t.sortedColumn)&&(t.sortedColumn=null,t.sortAscending=!0);for(let o of Object.keys(t.columnFilters))n.has(o)||delete t.columnFilters[o]}catch(e){console.error("Error loading columns:",e),u("Error loading columns")}}var Qe=0;async function v(e=!0,n=!0){if(!t.selectedTable)return;let o=++Qe,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==Qe||l!==t.selectedTable,i=document.getElementById("gridContainer"),c=!!(i&&i.querySelector(".data-grid"))&&t.renderedTable===t.selectedTable;n&&c&&(t.scrollPosition.left=i.scrollLeft,t.scrollPosition.top=i.scrollTop),e&&(t.isLoadingData=!0,t.isGridReloading=!0,c||$e()),L();try{let d=[];for(let[h,x]of Object.entries(t.columnFilters))x&&x.trim()&&d.push({column:h,value:x});let m=t.tableColumns.map(h=>h.name),y={filters:d,globalFilter:t.filterQuery,columns:m},f=await C.fetchTableCount(l,y);if(s())return;t.totalRecordCount=f,t.totalPageCount=Math.max(1,Math.ceil(t.totalRecordCount/t.rowsPerPage)),t.currentPageIndex>=t.totalPageCount&&(t.currentPageIndex=Math.max(0,t.totalPageCount-1));let b={columns:a==="table"?["rowid",...m]:m,orderBy:t.sortedColumn,orderDir:t.sortAscending?"ASC":"DESC",limit:t.rowsPerPage,offset:t.currentPageIndex*t.rowsPerPage,filters:d,globalFilter:t.filterQuery},I=await C.fetchTableData(l,b);if(s())return;t.gridData=I.rows||[],n&&i&&i.querySelector(".data-grid")&&(t.scrollPosition.left=i.scrollLeft,t.scrollPosition.top=i.scrollTop),!e&&t.editingCellInfo||(_(t.scrollPosition.top,t.scrollPosition.left),t.renderedTable=l),i&&(i.scrollLeft=t.scrollPosition.left,i.scrollTop=t.scrollPosition.top),Ye(),u(`${t.totalRecordCount} records`)}catch(d){console.error("Error loading data:",d),s()||(u(`Error: ${d.message}`),le(d.message))}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var S={PNG:[137,80,78,71,13,10,26,10],JPEG:[255,216,255],GIF:[71,73,70,56],BMP:[66,77],RIFF:[82,73,70,70],WEBP:[87,69,66,80],PDF:[37,80,68,70,45],ID3:[73,68,51],MP3_SYNC1:[255,251],MP3_SYNC2:[255,243],MP3_SYNC3:[255,242],OGG:[79,103,103,83],WAVE:[87,65,86,69],FLAC:[102,76,97,67],FTYP:[102,116,121,112],WEBM:[26,69,223,163],AVI:[65,86,73,32]},ie=class{constructor(){this.currentObjectUrl=null,this.modal=document.getElementById("blob-inspector-modal"),this.previewContainer=document.getElementById("tab-preview"),this.hexContainer=document.querySelector(".hex-dump"),this.infoContainer=document.getElementById("blob-info"),this.currentData=null,this.currentType=null,this.currentRowId=null,this.currentColName=null,this.currentCellInfo=null,this.isUploading=!1,this.setupEventListeners()}setupEventListeners(){this.modal.querySelectorAll(".modal-close").forEach(l=>{l.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll(".tab-btn").forEach(l=>{l.addEventListener("click",a=>{let s=a.target.dataset.tab;this.switchTab(s)})});let n=document.getElementById("blob-download-btn");n&&n.addEventListener("click",()=>this.download());let o=document.getElementById("blob-replace-btn");o&&o.addEventListener("click",()=>this.handleReplace())}setUploadState(n){this.isUploading=n;let o=document.getElementById("blob-replace-btn"),l=document.getElementById("blob-download-btn");o&&(o.disabled=n,o.textContent=n?"Uploading...":"Replace"),l&&(l.disabled=n)}async handleReplace(){if(!this.isUploading)try{if(((await C.getExtensionSettings())?.fileOperations||"native")==="web")this.showFileInput();else{let l=await C.selectFile();if(l){let a=l.data;if(!(a instanceof Uint8Array)){if(Array.isArray(a))a=new Uint8Array(a);else if(a&&typeof a=="object"){let i=Object.keys(a).filter(r=>!isNaN(parseInt(r,10))).sort((r,c)=>parseInt(r,10)-parseInt(c,10)).map(r=>a[r]);a=new Uint8Array(i)}}let s={name:l.name,arrayBuffer:async()=>a.buffer};await this.uploadFile(s)}}}catch(n){console.error("Replace failed:",n),u(`Replace failed: ${n.message}`)}}showFileInput(){let n=document.createElement("input");n.type="file",n.onchange=async o=>{let l=o.target.files[0];l&&await this.uploadFile(l)},n.click()}async uploadFile(n){if(!(!this.currentRowId||!this.currentColName)&&!this.isUploading){this.setUploadState(!0);try{u(`Reading ${n.name}...`);let o=await n.arrayBuffer(),l=new Uint8Array(o),a=l.length/(1024*1024),s=50;if(a>s)throw new Error(`File too large (${a.toFixed(1)}MB). Maximum size is ${s}MB to prevent freezing.`);a>10?u(`Uploading ${n.name} (${a.toFixed(1)}MB - this may take a moment)...`):u(`Uploading ${n.name}...`);let{rowIdx:i,colIdx:r}=this.currentCellInfo,c=this.currentData;await C.updateCell(t.selectedTable,this.currentRowId,this.currentColName,l,c),t.gridData&&t.gridData[i]&&(t.gridData[i][r+B()]=l),this.inspect(l,this.currentRowId,this.currentColName,i,r),u(`Replaced with ${n.name}`)}catch(o){console.error("Replace failed:",o);let l=o.message||String(o);l.includes("timeout")&&(l="Upload timed out. Try a smaller file or increase the timeout."),u(`Replace failed: ${l}`)}finally{this.setUploadState(!1)}}}close(){this.modal.classList.add("hidden"),this.cleanup()}cleanup(){this.setUploadState(!1),this.currentObjectUrl&&(URL.revokeObjectURL(this.currentObjectUrl),this.currentObjectUrl=null),this.previewContainer.innerHTML="",this.hexContainer.value="",this.infoContainer.textContent="",this.currentData=null}switchTab(n){this.modal.querySelectorAll(".tab-btn").forEach(a=>{a.dataset.tab===n?(a.classList.add("active"),a.style.borderBottom="2px solid var(--accent-color)",a.style.color="var(--text-primary)"):(a.classList.remove("active"),a.style.borderBottom="none",a.style.color="var(--text-secondary)")});let o=document.getElementById("tab-preview"),l=document.getElementById("tab-hex");n==="preview"?(o.style.display="flex",l.style.display="none"):(o.style.display="none",l.style.display="block")}async download(){if(!this.currentData)return;let n=this.currentType?.ext||"bin",o=`blob_${this.currentRowId}.${n}`;try{((await C.getExtensionSettings())?.fileOperations||"native")==="web"?(this.downloadBlob(this.currentData,o),u(`Downloaded ${o}`)):(await C.saveFile(o,this.currentData),u(`Saved ${o}`))}catch(l){console.error("Download failed:",l),u(`Download failed: ${l.message}`)}}downloadBlob(n,o){let l=new Blob([n]),a=URL.createObjectURL(l),s=document.createElement("a");s.href=a,s.download=o,s.click(),URL.revokeObjectURL(a)}inspect(n,o,l,a,s){this.cleanup(),this.currentRowId=o,this.currentColName=l,this.currentCellInfo={rowIdx:a,colIdx:s},this.modal.classList.remove("hidden"),this.switchTab("preview");let i=n instanceof Uint8Array?n:new Uint8Array(n);this.currentData=i;let r=this.detectType(i);this.currentType=r;let c=this.formatSize(i.length);this.infoContainer.textContent=`${l} (Row ${o}) | ${r.mime||"Unknown Type"} | ${c}`,this.renderPreview(i,r),this.renderHex(i)}detectType(n){if(this.checkSignature(n,S.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,S.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,S.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,S.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,S.RIFF)&&this.checkSignature(n.subarray(8),S.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,S.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,S.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,S.MP3_SYNC1)||this.checkSignature(n,S.MP3_SYNC2)||this.checkSignature(n,S.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,S.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,S.RIFF)&&this.checkSignature(n.subarray(8),S.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,S.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),S.FTYP)){let o=String.fromCharCode(...n.subarray(8,12));return o.startsWith("mp4")||o==="isom"||o==="avc1"||o==="M4V "?{mime:"video/mp4",type:"video",ext:"mp4"}:o==="qt "||o.startsWith("M4A")?{mime:"video/quicktime",type:"video",ext:"mov"}:{mime:"video/mp4",type:"video",ext:"mp4"}}if(this.checkSignature(n,S.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,S.RIFF)&&this.checkSignature(n.subarray(8),S.AVI))return{mime:"video/avi",type:"video",ext:"avi"};if(this.isText(n)){try{let o=new TextDecoder().decode(n),l=JSON.parse(o);if(typeof l=="object"&&l!==null)return{mime:"application/json",type:"json",ext:"json"}}catch{}return{mime:"text/plain",type:"text",ext:"txt"}}return{mime:"application/octet-stream",type:"binary",ext:"bin"}}checkSignature(n,o){if(n.lengththis.download()),l.appendChild(a),l.appendChild(s),l.appendChild(i),this.previewContainer.appendChild(l)}else{let l=document.createElement("div");l.className="empty-view";let a=document.createElement("span");a.className="codicon codicon-file-binary",a.style.fontSize="48px",a.style.opacity="0.5";let s=document.createElement("span");s.style.marginTop="12px",s.textContent="Binary Data";let i=document.createElement("span");i.style.fontSize="12px",i.style.opacity="0.7",i.textContent="Use Hex view to inspect",l.appendChild(a),l.appendChild(s),l.appendChild(i),this.previewContainer.appendChild(l)}}renderHex(n){if(!this.hexContainer)return;let o=16*1e3,l="",a=n.subarray(0,o);for(let s=0;s=32&&p<=126?String.fromCharCode(p):".")}else r.push(" "),c.push(" ");let d=r.slice(0,8).join(" "),m=r.slice(8).join(" "),y=c.join("");l+=`${i} ${d} ${m} |${y}| `}n.length>o&&(l+=` -... (${(n.length-o).toLocaleString()} more bytes not shown)`),this.hexContainer.value=l}formatSize(n){if(n===0)return"0 B";let o=1024,l=["B","KB","MB","GB"],a=Math.floor(Math.log(n)/Math.log(o));return parseFloat((n/Math.pow(o,a)).toFixed(2))+" "+l[a]}};var Ee;function Ze(){Ee=new ie,document.getElementById("btnCloseCellPreview")?.addEventListener("click",G),document.getElementById("formatJsonBtn")?.addEventListener("click",dn),document.getElementById("compactJsonBtn")?.addEventListener("click",un),document.getElementById("wrapTextBtn")?.addEventListener("click",mn),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Ie),document.getElementById("btnCancelCellPreview")?.addEventListener("click",G),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",at)}function et(e,n,o){if(t.selectedTableType!=="table"){u("Views are read-only");return}if(t.editingCellInfo){if(t.editingCellInfo.rowIdx===e&&t.editingCellInfo.colIdx===n)return;ce()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=P(s,n);if(i instanceof Uint8Array){H(e,n,o);return}if(typeof i=="string"){let d=i.trim();if(d.startsWith("{")&&d.endsWith("}")||d.startsWith("[")&&d.endsWith("]"))try{JSON.parse(d),H(e,n,o);return}catch{}}t.editingCellInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:i};let r=i===null?"":String(i);a.innerHTML="",a.classList.add("editing");let c=document.createElement("textarea");c.className="cell-input",c.value=r,c.spellcheck=!1,a.appendChild(c),c.focus(),t.activeCellInput=c,c.addEventListener("keydown",tt),c.addEventListener("blur",nt),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function tt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),ot()):e.key==="Escape"&&(e.preventDefault(),ce())}function nt(){setTimeout(()=>{t.editingCellInfo&&ot()},100)}async function ot(){if(t.isSavingCell||!t.editingCellInfo||!t.activeCellInput)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.editingCellInfo,s=t.activeCellInput.value,i=a===null?"":String(a);if(s===i){ce(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let r=t.tableColumns[n],c=r&&r.notnull===1,d;s===""?c?d="":d=null:!isNaN(Number(s))&&s.trim()!==""?d=Number(s):d=s;try{t.isSavingCell=!0,u("Saving..."),await C.updateCell(t.selectedTable,oe(o),l,d,a),t.gridData[e][n+B()]=d,lt(),ve(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(m){console.error("Save failed:",m);let y=m.message||String(m);u(`Save failed: ${y}`)}finally{t.isSavingCell=!1}}function ce(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;lt(),ve(e,n,o),se()}function lt(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",tt),t.activeCellInput.removeEventListener("blur",nt),t.activeCellInput=null),t.editingCellInfo=null}async function Ie(){if(!t.cellPreviewInfo)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,s=t.tableColumns[n],i=document.getElementById("vscode-env")?.dataset.webviewId||"default";try{u("Opening in VS Code..."),G(),await C.openCellEditor({table:t.selectedTable,name:""},oe(o),l,{},{value:a,type:{type:s.type},webviewId:i,rowCount:t.gridData.length}),u("Opened in VS Code")}catch(r){console.error("Failed to open in VS Code:",r),u(`Error: ${r.message}`)}}function H(e,n,o){t.editingCellInfo&&ce();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=P(a,n);if(s instanceof Uint8Array){Ee&&Ee.inspect(s,o,l.name,e,n);return}t.cellPreviewInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:s};let i=document.getElementById("cellPreviewModal"),r=document.getElementById("cellPreviewColumnName"),c=document.getElementById("cellPreviewTypeBadge"),d=document.getElementById("cellPreviewTextarea"),m=document.getElementById("cellPreviewReadonlyBadge"),y=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let p="";s==null?p="":s instanceof Uint8Array?p="[BLOB: "+Array.from(s).map(b=>b.toString(16).padStart(2,"0")).join(" ")+"]":p=String(s),d.value=p;let g=t.selectedTableType!=="table";d.readOnly=g,g?(d.classList.add("readonly"),m.style.display="inline",y.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",y.style.display="inline-block"),re(),d.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",d.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",f.classList.toggle("active",t.cellPreviewWrapEnabled),i.classList.remove("hidden"),d.focus(),d.oninput=re,d.onkeydown=b=>{b.key==="Escape"?(b.preventDefault(),G()):b.key==="Enter"&&(b.ctrlKey||b.metaKey)&&(b.preventDefault(),at())}}function re(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function G(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function at(){if(!t.cellPreviewInfo)return;if(t.selectedTableType!=="table"){u("Views are read-only");return}let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,i=document.getElementById("cellPreviewTextarea").value,r=a===null?"":String(a);if(i===r){G(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let c=t.tableColumns[n],d=c&&c.notnull===1,m;i===""?m=d?"":null:!isNaN(Number(i))&&i.trim()!==""?m=Number(i):m=i;try{u("Saving..."),await C.updateCell(t.selectedTable,oe(o),l,m,a),t.gridData[e][n+B()]=m,G(),ve(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(y){console.error("Save failed:",y),u(`Save failed: ${y.message}`)}}function dn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),re()}catch{u("Content is not valid JSON")}}function un(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),re()}catch{u("Content is not valid JSON")}}function mn(){t.cellPreviewWrapEnabled=!t.cellPreviewWrapEnabled;let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("wrapTextBtn");e.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",e.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",n.classList.toggle("active",t.cellPreviewWrapEnabled)}function ve(e,n,o){let l=document.getElementById(`cell-${e}-${n}`);if(!l)return;l.classList.remove("editing"),o==null?l.classList.add("null-value"):l.classList.remove("null-value");let a=t.tableColumns[n],s=K(o,a?.type,t.dateFormat,a?.name),i=o!=null&&!(o instanceof Uint8Array);l.textContent="";let r=document.createElement("span");if(r.className="cell-text",r.textContent=s,l.appendChild(r),i){let d=document.createElement("span");d.className="expand-icon codicon codicon-link-external",d.title="View full content",l.appendChild(d)}let c=r.scrollWidth>r.clientWidth;l.classList.toggle("has-overflow",c)}function st(){clearTimeout(t.filterTimer),t.filterTimer=setTimeout(()=>{t.filterQuery=document.getElementById("filterInput").value,t.currentPageIndex=0,v(),F()},300)}function it(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,v(),F()}function rt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,_(),F())}function ee(e){e>=0&&el.name===n);if(o!==-1){if((e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedRowIds.clear(),e.shiftKey&&t.lastSelectedColumnIndex!==null){e.metaKey||e.ctrlKey||(t.selectedCells=[],t.selectedColumns.clear());let l=Math.min(t.lastSelectedColumnIndex,o),a=Math.max(t.lastSelectedColumnIndex,o),s=new Array;if(t.selectedCells.length>0)for(let i of t.selectedCells)i.colIdx>=l&&i.colIdx<=a&&(s[i.rowIdx]||(s[i.rowIdx]=new Set),s[i.rowIdx].add(i.colIdx));for(let i=l;i<=a;i++){let r=t.tableColumns[i].name;t.selectedColumns.add(r);for(let c=0;c0&&a===l)t.selectedCells=t.selectedCells.filter(i=>i.colIdx!==o),t.selectedColumns.delete(n);else{let i=new Set;for(let r of t.selectedCells)r.colIdx===o&&i.add(r.rowIdx);for(let r=0;r0&&a===l&&t.selectedColumns.size===1&&t.selectedColumns.has(n))t.selectedCells=[],t.selectedColumns.clear(),t.lastSelectedColumnIndex=null;else{t.selectedCells=[],t.selectedColumns.clear();for(let i=0;ii.name===t.resizingColumn);if(l===-1)return;let a=document.querySelector(`th[data-column="${t.resizingColumn}"]`);a&&(a.style.width=`${o}px`,a.style.minWidth=`${o}px`,a.style.maxWidth=`${o}px`);let s=document.querySelectorAll(`.data-row td:nth-child(${l+2})`);for(let i of s)i.style.width=`${o}px`,i.style.minWidth=`${o}px`,i.style.maxWidth=`${o}px`;t.pinnedColumns.has(t.resizingColumn)}function ht(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",gt),document.removeEventListener("mouseup",ht),document.body.style.userSelect="",document.body.style.cursor="",_()}function yt(e,n,o){if(e.stopPropagation(),(e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),e.shiftKey&&t.lastSelectedRowIndex!==null){e.metaKey||e.ctrlKey||t.selectedRowIds.clear();let l=Math.min(t.lastSelectedRowIndex,o),a=Math.max(t.lastSelectedRowIndex,o);for(let s=l;s<=a;s++){let i=T(t.gridData[s],s);t.selectedRowIds.add(i)}}else e.ctrlKey||e.metaKey?(t.selectedRowIds.has(n)?t.selectedRowIds.delete(n):t.selectedRowIds.add(n),t.lastSelectedRowIndex=o):t.selectedRowIds.has(n)&&t.selectedRowIds.size===1?(t.selectedRowIds.delete(n),t.lastSelectedRowIndex=null):(t.selectedRowIds.clear(),t.selectedRowIds.add(n),t.lastSelectedRowIndex=o);M(),L(),j()}function de(e){if(e.stopPropagation(),t.gridData.length===0)return;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear();let n=!0;for(let o=0;o=s&&m.rowIdx<=i&&m.colIdx>=r&&m.colIdx<=c&&(d[m.rowIdx]||(d[m.rowIdx]=new Set),d[m.rowIdx].add(m.colIdx));for(let m=s;m<=i;m++){let y=d[m];for(let f=r;f<=c;f++)if(!y||!y.has(f)){let p=T(t.gridData[m],m),g=P(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:p,value:g})}}}else if(e.metaKey||e.ctrlKey){e.preventDefault(),t.selectedRowIds.clear();let s=t.selectedCells.findIndex(i=>i.rowIdx===n&&i.colIdx===o);s>=0?t.selectedCells.splice(s,1):(t.selectedCells.push({rowIdx:n,colIdx:o,rowId:l,value:a}),t.lastSelectedCell={rowIdx:n,colIdx:o})}else if(e.shiftKey&&t.lastSelectedCell){e.preventDefault(),t.selectedRowIds.clear(),t.selectedCells=[];let s=Math.min(t.lastSelectedCell.rowIdx,n),i=Math.max(t.lastSelectedCell.rowIdx,n),r=Math.min(t.lastSelectedCell.colIdx,o),c=Math.max(t.lastSelectedCell.colIdx,o);for(let d=s;d<=i;d++)for(let m=r;m<=c;m++){let y=T(t.gridData[d],d),f=P(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:y,value:f})}}else t.selectedRowIds.clear(),t.selectedCells=[{rowIdx:n,colIdx:o,rowId:l,value:a}],t.lastSelectedCell={rowIdx:n,colIdx:o},t.selectedColumns.clear();M(),L(),j()}function xt(e,n,o,l){if(t.cellEditBehavior==="vscode"){let a=t.tableColumns[o];if(!a)return;let s=t.gridData[n];if(!s)return;let i=P(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Ie()}else t.cellEditBehavior==="modal"?H(n,o,l):et(n,o,l)}function bt(){document.getElementById("filterInput")?.addEventListener("keyup",st),document.getElementById("pageSizeSelect")?.addEventListener("change",it),document.getElementById("dateFormatSelect")?.addEventListener("change",rt),document.getElementById("btnFirst")?.addEventListener("click",()=>ee(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>ee(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>ee(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>ee(t.totalPageCount-1))}function wt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",pn),e.addEventListener("keydown",fn),e.addEventListener("click",gn),e.addEventListener("dblclick",Cn),e.addEventListener("mouseover",xn),e.addEventListener("scroll",bn,{passive:!0}))}function pn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&ft(e,n.dataset.column)}}function fn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&dt(e,n)}}function gn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){hn(e,n);return}yn(e,n)}function hn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Se(l.dataset.column);return}if(n.closest(".header-bottom")||n.closest(".column-filter")){e.stopPropagation();return}if(n.closest(".select-column-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&ut(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&mt(e,l.dataset.column);return}if(n.closest(".row-number-header")){de(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&ct(l.dataset.column);return}}function yn(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=te(a);pt(e,s)}return}if(n.closest(".expand-icon")){let l=n.closest(".data-cell");if(l){let a=parseInt(l.dataset.rowidx,10),s=parseInt(l.dataset.colidx,10),i=te(l.closest(".data-row").dataset.rowid);H(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=te(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);yt(e,a,s)}return}let o=n.closest(".data-cell");if(o){let l=parseInt(o.dataset.rowidx,10),a=parseInt(o.dataset.colidx,10),s=o.closest(".data-row"),i=te(s.dataset.rowid);Ct(e,l,a,i);return}}function Cn(e){if(t.isGridReloading)return;let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("row-number")){let o=parseInt(n.dataset.rowidx,10),l=parseInt(n.dataset.colidx,10),a=n.closest(".data-row"),s=te(a.dataset.rowid);xt(e,o,l,s)}}function xn(e){let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("checked-overflow")){let o=n.querySelector(".cell-text");if(o){let l=o.scrollWidth>o.clientWidth;n.classList.toggle("has-overflow",l),n.classList.add("checked-overflow")}}}function bn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,F()}function te(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Et={async refreshContent(e){return t.isDbConnected&&(await V(),!(t.schemaCache.tables.some(o=>o.name===t.selectedTable)||t.schemaCache.views.some(o=>o.name===t.selectedTable))&&t.selectedTable?(t.selectedTable=null,t.selectedTableType=null,document.getElementById("tableNameLabel").textContent="No table selected",document.getElementById("gridContainer").innerHTML=` +... (${(n.length-o).toLocaleString()} more bytes not shown)`),this.hexContainer.value=l}formatSize(n){if(n===0)return"0 B";let o=1024,l=["B","KB","MB","GB"],a=Math.floor(Math.log(n)/Math.log(o));return parseFloat((n/Math.pow(o,a)).toFixed(2))+" "+l[a]}};var Ee;function Ze(){Ee=new ie,document.getElementById("btnCloseCellPreview")?.addEventListener("click",G),document.getElementById("formatJsonBtn")?.addEventListener("click",dn),document.getElementById("compactJsonBtn")?.addEventListener("click",un),document.getElementById("wrapTextBtn")?.addEventListener("click",mn),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Ie),document.getElementById("btnCancelCellPreview")?.addEventListener("click",G),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",at)}function et(e,n,o){if(t.selectedTableType!=="table"){u("Views are read-only");return}if(t.editingCellInfo){if(t.editingCellInfo.rowIdx===e&&t.editingCellInfo.colIdx===n)return;ce()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=P(s,n);if(i instanceof Uint8Array){H(e,n,o);return}if(typeof i=="string"){let d=i.trim();if(d.startsWith("{")&&d.endsWith("}")||d.startsWith("[")&&d.endsWith("]"))try{JSON.parse(d),H(e,n,o);return}catch{}}t.editingCellInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:i};let r=i===null?"":String(i);a.innerHTML="",a.classList.add("editing");let c=document.createElement("textarea");c.className="cell-input",c.value=r,c.spellcheck=!1,a.appendChild(c),c.focus(),t.activeCellInput=c,c.addEventListener("keydown",tt),c.addEventListener("blur",nt),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function tt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),ot()):e.key==="Escape"&&(e.preventDefault(),ce())}function nt(){setTimeout(()=>{t.editingCellInfo&&ot()},100)}async function ot(){if(t.isSavingCell||!t.editingCellInfo||!t.activeCellInput)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.editingCellInfo,s=t.activeCellInput.value,i=a===null?"":String(a);if(s===i){ce(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let r=t.tableColumns[n],c=r&&r.notnull===1,d;s===""?c?d="":d=null:!isNaN(Number(s))&&s.trim()!==""?d=Number(s):d=s;try{t.isSavingCell=!0,u("Saving..."),await C.updateCell(t.selectedTable,oe(o),l,d,a),t.gridData[e][n+B()]=d,lt(),ve(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(m){console.error("Save failed:",m);let y=m.message||String(m);u(`Save failed: ${y}`)}finally{t.isSavingCell=!1}}function ce(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;lt(),ve(e,n,o),se()}function lt(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",tt),t.activeCellInput.removeEventListener("blur",nt),t.activeCellInput=null),t.editingCellInfo=null}async function Ie(){if(!t.cellPreviewInfo)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,s=t.tableColumns[n],i=document.getElementById("vscode-env")?.dataset.webviewId||"default";try{u("Opening in VS Code..."),G(),await C.openCellEditor({table:t.selectedTable,name:""},oe(o),l,{},{value:a,type:{type:s.type},webviewId:i,rowCount:t.gridData.length}),u("Opened in VS Code")}catch(r){console.error("Failed to open in VS Code:",r),u(`Error: ${r.message}`)}}function H(e,n,o){t.editingCellInfo&&ce();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=P(a,n);if(s instanceof Uint8Array){Ee&&Ee.inspect(s,o,l.name,e,n);return}t.cellPreviewInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:s};let i=document.getElementById("cellPreviewModal"),r=document.getElementById("cellPreviewColumnName"),c=document.getElementById("cellPreviewTypeBadge"),d=document.getElementById("cellPreviewTextarea"),m=document.getElementById("cellPreviewReadonlyBadge"),y=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let p="";s==null?p="":s instanceof Uint8Array?p="[BLOB: "+Array.from(s).map(b=>b.toString(16).padStart(2,"0")).join(" ")+"]":p=String(s),d.value=p;let g=t.selectedTableType!=="table";d.readOnly=g,g?(d.classList.add("readonly"),m.style.display="inline",y.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",y.style.display="inline-block"),re(),d.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",d.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",f.classList.toggle("active",t.cellPreviewWrapEnabled),i.classList.remove("hidden"),d.focus(),d.oninput=re,d.onkeydown=b=>{b.key==="Escape"?(b.preventDefault(),G()):b.key==="Enter"&&(b.ctrlKey||b.metaKey)&&(b.preventDefault(),at())}}function re(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function G(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function at(){if(!t.cellPreviewInfo)return;if(t.selectedTableType!=="table"){u("Views are read-only");return}let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,i=document.getElementById("cellPreviewTextarea").value,r=a===null?"":String(a);if(i===r){G(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let c=t.tableColumns[n],d=c&&c.notnull===1,m;i===""?m=d?"":null:!isNaN(Number(i))&&i.trim()!==""?m=Number(i):m=i;try{u("Saving..."),await C.updateCell(t.selectedTable,oe(o),l,m,a),t.gridData[e][n+B()]=m,G(),ve(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(y){console.error("Save failed:",y),u(`Save failed: ${y.message}`)}}function dn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),re()}catch{u("Content is not valid JSON")}}function un(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),re()}catch{u("Content is not valid JSON")}}function mn(){t.cellPreviewWrapEnabled=!t.cellPreviewWrapEnabled;let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("wrapTextBtn");e.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",e.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",n.classList.toggle("active",t.cellPreviewWrapEnabled)}function ve(e,n,o){let l=document.getElementById(`cell-${e}-${n}`);if(!l)return;l.classList.remove("editing"),o==null?l.classList.add("null-value"):l.classList.remove("null-value");let a=t.tableColumns[n],s=K(o,a?.type,t.dateFormat,a?.name),i=o!=null&&!(o instanceof Uint8Array);l.textContent="";let r=document.createElement("span");if(r.className="cell-text",r.textContent=s,l.appendChild(r),i){let d=document.createElement("span");d.className="expand-icon codicon codicon-link-external",d.title="View full content",l.appendChild(d)}let c=r.scrollWidth>r.clientWidth;l.classList.toggle("has-overflow",c)}function st(){clearTimeout(t.filterTimer),t.filterTimer=setTimeout(()=>{t.filterQuery=document.getElementById("filterInput").value,t.currentPageIndex=0,v(),F()},300)}function it(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,v(),F()}function rt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,_(),F())}function ee(e){e>=0&&el.name===n);if(o!==-1){if((e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedRowIds.clear(),e.shiftKey&&t.lastSelectedColumnIndex!==null){e.metaKey||e.ctrlKey||(t.selectedCells=[],t.selectedColumns.clear());let l=Math.min(t.lastSelectedColumnIndex,o),a=Math.max(t.lastSelectedColumnIndex,o),s=new Array;if(t.selectedCells.length>0)for(let i of t.selectedCells)i.colIdx>=l&&i.colIdx<=a&&(s[i.rowIdx]||(s[i.rowIdx]=new Set),s[i.rowIdx].add(i.colIdx));for(let i=l;i<=a;i++){let r=t.tableColumns[i].name;t.selectedColumns.add(r);for(let c=0;c0&&a===l)t.selectedCells=t.selectedCells.filter(i=>i.colIdx!==o),t.selectedColumns.delete(n);else{let i=new Set;for(let r of t.selectedCells)r.colIdx===o&&i.add(r.rowIdx);for(let r=0;r0&&a===l&&t.selectedColumns.size===1&&t.selectedColumns.has(n))t.selectedCells=[],t.selectedColumns.clear(),t.lastSelectedColumnIndex=null;else{t.selectedCells=[],t.selectedColumns.clear();for(let i=0;ii.name===t.resizingColumn);if(l===-1)return;let a=document.querySelector(`th[data-column="${t.resizingColumn}"]`);a&&(a.style.width=`${o}px`,a.style.minWidth=`${o}px`,a.style.maxWidth=`${o}px`);let s=document.querySelectorAll(`.data-row td:nth-child(${l+2})`);for(let i of s)i.style.width=`${o}px`,i.style.minWidth=`${o}px`,i.style.maxWidth=`${o}px`;t.pinnedColumns.has(t.resizingColumn)}function ht(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",gt),document.removeEventListener("mouseup",ht),document.body.style.userSelect="",document.body.style.cursor="",_()}function yt(e,n,o){if(e.stopPropagation(),(e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),e.shiftKey&&t.lastSelectedRowIndex!==null){e.metaKey||e.ctrlKey||t.selectedRowIds.clear();let l=Math.min(t.lastSelectedRowIndex,o),a=Math.max(t.lastSelectedRowIndex,o);for(let s=l;s<=a;s++){let i=T(t.gridData[s],s);t.selectedRowIds.add(i)}}else e.ctrlKey||e.metaKey?(t.selectedRowIds.has(n)?t.selectedRowIds.delete(n):t.selectedRowIds.add(n),t.lastSelectedRowIndex=o):t.selectedRowIds.has(n)&&t.selectedRowIds.size===1?(t.selectedRowIds.delete(n),t.lastSelectedRowIndex=null):(t.selectedRowIds.clear(),t.selectedRowIds.add(n),t.lastSelectedRowIndex=o);M(),L(),j()}function de(e){if(e.stopPropagation(),t.gridData.length===0)return;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear();let n=!0;for(let o=0;o=s&&m.rowIdx<=i&&m.colIdx>=r&&m.colIdx<=c&&(d[m.rowIdx]||(d[m.rowIdx]=new Set),d[m.rowIdx].add(m.colIdx));for(let m=s;m<=i;m++){let y=d[m];for(let f=r;f<=c;f++)if(!y||!y.has(f)){let p=T(t.gridData[m],m),g=P(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:p,value:g})}}}else if(e.metaKey||e.ctrlKey){e.preventDefault(),t.selectedRowIds.clear();let s=t.selectedCells.findIndex(i=>i.rowIdx===n&&i.colIdx===o);s>=0?t.selectedCells.splice(s,1):(t.selectedCells.push({rowIdx:n,colIdx:o,rowId:l,value:a}),t.lastSelectedCell={rowIdx:n,colIdx:o})}else if(e.shiftKey&&t.lastSelectedCell){e.preventDefault(),t.selectedRowIds.clear(),t.selectedCells=[];let s=Math.min(t.lastSelectedCell.rowIdx,n),i=Math.max(t.lastSelectedCell.rowIdx,n),r=Math.min(t.lastSelectedCell.colIdx,o),c=Math.max(t.lastSelectedCell.colIdx,o);for(let d=s;d<=i;d++)for(let m=r;m<=c;m++){let y=T(t.gridData[d],d),f=P(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:y,value:f})}}else t.selectedRowIds.clear(),t.selectedCells=[{rowIdx:n,colIdx:o,rowId:l,value:a}],t.lastSelectedCell={rowIdx:n,colIdx:o},t.selectedColumns.clear();M(),L(),j()}function xt(e,n,o,l){if(t.cellEditBehavior==="vscode"){let a=t.tableColumns[o];if(!a)return;let s=t.gridData[n];if(!s)return;let i=P(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Ie()}else t.cellEditBehavior==="modal"?H(n,o,l):et(n,o,l)}function bt(){document.getElementById("filterInput")?.addEventListener("keyup",st),document.getElementById("pageSizeSelect")?.addEventListener("change",it),document.getElementById("dateFormatSelect")?.addEventListener("change",rt),document.getElementById("btnFirst")?.addEventListener("click",()=>ee(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>ee(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>ee(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>ee(t.totalPageCount-1))}function wt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",pn),e.addEventListener("keydown",fn),e.addEventListener("click",gn),e.addEventListener("dblclick",Cn),e.addEventListener("mouseover",xn),e.addEventListener("scroll",bn,{passive:!0}))}function pn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&ft(e,n.dataset.column)}}function fn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&dt(e,n)}}function gn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){hn(e,n);return}yn(e,n)}function hn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Se(l.dataset.column);return}if(n.closest(".header-bottom")||n.closest(".column-filter")){e.stopPropagation();return}if(n.closest(".select-column-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&ut(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&mt(e,l.dataset.column);return}if(n.closest(".row-number-header")){de(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&ct(l.dataset.column);return}}function yn(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=te(a);pt(e,s)}return}if(n.closest(".expand-icon")){let l=n.closest(".data-cell");if(l){let a=parseInt(l.dataset.rowidx,10),s=parseInt(l.dataset.colidx,10),i=te(l.closest(".data-row").dataset.rowid);H(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=te(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);yt(e,a,s)}return}let o=n.closest(".data-cell");if(o){let l=parseInt(o.dataset.rowidx,10),a=parseInt(o.dataset.colidx,10),s=o.closest(".data-row"),i=te(s.dataset.rowid);Ct(e,l,a,i);return}}function Cn(e){if(t.isGridReloading)return;let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("row-number")){let o=parseInt(n.dataset.rowidx,10),l=parseInt(n.dataset.colidx,10),a=n.closest(".data-row"),s=te(a.dataset.rowid);xt(e,o,l,s)}}function xn(e){let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("checked-overflow")){let o=n.querySelector(".cell-text");if(o){let l=o.scrollWidth>o.clientWidth;n.classList.toggle("has-overflow",l),n.classList.add("checked-overflow")}}}function bn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,F()}function te(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Et={async refreshContent(e){return t.isDbConnected&&(await V(),!(t.schemaCache.tables.some(o=>o.name===t.selectedTable)||t.schemaCache.views.some(o=>o.name===t.selectedTable))&&t.selectedTable?(t.selectedTable=null,t.selectedTableType=null,document.getElementById("tableNameLabel").textContent="No table selected",document.getElementById("gridContainer").innerHTML=`
Select a table diff --git a/website/public/sqlite-viewer/viewer.html b/website/public/sqlite-viewer/viewer.html index aa96d82..3b3caa1 100644 --- a/website/public/sqlite-viewer/viewer.html +++ b/website/public/sqlite-viewer/viewer.html @@ -6,7 +6,7 @@ SQLite Explorer @@ -388,7 +388,7 @@ `,e}function zt(e,n,o){let l=document.createElement("thead");l.className="grid-header";let a=document.createElement("tr"),s=document.createElement("th");s.className="header-cell row-number-header",Object.assign(s.style,{width:`${e}px`,minWidth:`${e}px`,maxWidth:`${e}px`,position:"sticky",left:"0",top:"0",zIndex:"11",background:"var(--bg-secondary)"}),s.title="Click to select all rows",s.innerHTML='
#
',a.appendChild(s);for(let i of n){let r=t.sortedColumn===i.name,c=t.pinnedColumns.has(i.name),d=t.selectedColumns.has(i.name),m=t.columnWidths[i.name]||120,y=t.columnFilters[i.name]||"",f=document.createElement("th");f.className=`header-cell ${c?"pinned":""} ${d?"column-selected":""}`,Object.assign(f.style,{width:`${m}px`,minWidth:`${m}px`,maxWidth:`${m}px`}),c&&(f.style.position="sticky",f.style.left=`${o.get(i.name)}px`),f.dataset.column=i.name;let p=J(i.name),g=J(y),b=r?`${t.sortAscending?"\u25B2":"\u25BC"}`:"",E=i.isPrimaryKey?'':"",h=c?"pinned":"",C=c?"Unpin column":"Pin column";f.innerHTML=`
- ${E}${p}${b} + ${E}${p}${b}
@@ -400,7 +400,7 @@
`,a.appendChild(f)}return l.appendChild(a),l}function jt(e,n,o,l,a,s,i,r){let c=document.createElement("tbody"),d=[];for(let p=0;p({idx:g,rowId:T(p,g)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,g)=>({idx:g,rowId:T(p,g)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],f=document.createDocumentFragment();for(let{idx:p,rowId:g}of y){let b=t.gridData[p],E=t.selectedRowIds.has(g),h=t.pinnedRowIds.has(g),C=document.createElement("tr");C.id=`row-${p}`,C.className=`data-row ${E?"selected":""} ${h?"pinned":""}`,C.dataset.rowid=g,C.dataset.rowidx=p,h&&(C.style.top=`${m.get(g)}px`);let A=document.createElement("td");A.className="data-cell row-number",Object.assign(A.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:h?"8":"2"});let R=t.currentPageIndex*t.rowsPerPage+p+1;A.appendChild(document.createTextNode(String(R)));let w=document.createElement("span");w.className=`pin-icon codicon codicon-pin ${h?"pinned":""}`,w.title=h?"Unpin row":"Pin row",A.appendChild(w),C.appendChild(A);for(let N=0;Nw&&w.trim()!=="");if(r.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){r.appendChild(Ot());return}let p=new Set;if(t.selectedCells.length>0)for(let w of t.selectedCells)p.add(`${w.rowIdx},${w.colIdx}`);let g=document.createElement("table");if(g.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let w of t.tableColumns){let N=w.name.length,k=w.isPrimaryKey?86:70,W=N*8+k;t.columnWidths[w.name]=Math.max(80,Math.min(250,W))}let b=[...t.tableColumns.filter(w=>t.pinnedColumns.has(w.name)),...t.tableColumns.filter(w=>!t.pinnedColumns.has(w.name))],E=new Map,h=i-1;for(let w of b)t.pinnedColumns.has(w.name)&&(E.set(w.name,h),h+=t.columnWidths[w.name]||120);let C=new Map;t.tableColumns.forEach((w,N)=>C.set(w.name,N));let A=zt(i,b,E);g.appendChild(A);let R=jt(b,C,E,i,52,26,p,f);g.appendChild(R),r.appendChild(g),r.scrollLeft=m,r.scrollTop=y,Fe()}function Ue(){document.getElementById("pageIndicator").textContent=`${t.currentPageIndex+1} / ${t.totalPageCount}`,document.getElementById("btnFirst").disabled=t.currentPageIndex===0,document.getElementById("btnPrev").disabled=t.currentPageIndex===0,document.getElementById("btnNext").disabled=t.currentPageIndex>=t.totalPageCount-1,document.getElementById("btnLast").disabled=t.currentPageIndex>=t.totalPageCount-1}async function q(){if(t.selectedTable)try{let e=await x.getTableInfo(t.selectedTable);t.tableColumns=e.map(o=>({cid:o.ordinal,name:o.identifier,type:o.declaredType,notnull:o.isRequired,dflt_value:o.defaultExpression,isPrimaryKey:o.primaryKeyPosition>0})).sort((o,l)=>o.cid-l.cid);let n=new Set(t.tableColumns.map(o=>o.name));t.sortedColumn&&!n.has(t.sortedColumn)&&(t.sortedColumn=null,t.sortAscending=!0);for(let o of Object.keys(t.columnFilters))n.has(o)||delete t.columnFilters[o]}catch(e){console.error("Error loading columns:",e),u("Error loading columns")}}var Oe=0;async function v(e=!0,n=!0){if(!t.selectedTable)return;let o=++Oe,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==Oe||l!==t.selectedTable,i=document.getElementById("gridContainer"),c=!!(i&&i.querySelector(".data-grid"))&&t.renderedTable===t.selectedTable;n&&c&&(t.scrollPosition.left=i.scrollLeft,t.scrollPosition.top=i.scrollTop),e&&(t.isLoadingData=!0,t.isGridReloading=!0,c||$e()),L();try{let d=[];for(let[h,C]of Object.entries(t.columnFilters))C&&C.trim()&&d.push({column:h,value:C});let m=t.tableColumns.map(h=>h.name),y={filters:d,globalFilter:t.filterQuery,columns:m},f=await x.fetchTableCount(l,y);if(s())return;t.totalRecordCount=f,t.totalPageCount=Math.max(1,Math.ceil(t.totalRecordCount/t.rowsPerPage)),t.currentPageIndex>=t.totalPageCount&&(t.currentPageIndex=Math.max(0,t.totalPageCount-1));let b={columns:a==="table"?["rowid",...m]:m,orderBy:t.sortedColumn,orderDir:t.sortAscending?"ASC":"DESC",limit:t.rowsPerPage,offset:t.currentPageIndex*t.rowsPerPage,filters:d,globalFilter:t.filterQuery},E=await x.fetchTableData(l,b);if(s())return;t.gridData=E.rows||[],n&&i&&i.querySelector(".data-grid")&&(t.scrollPosition.left=i.scrollLeft,t.scrollPosition.top=i.scrollTop),!e&&t.editingCellInfo||(z(t.scrollPosition.top,t.scrollPosition.left),t.renderedTable=l),i&&(i.scrollLeft=t.scrollPosition.left,i.scrollTop=t.scrollPosition.top),Ue(),u(`${t.totalRecordCount} records`)}catch(d){console.error("Error loading data:",d),s()||(u(`Error: ${d.message}`),ne(d.message))}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var S={PNG:[137,80,78,71,13,10,26,10],JPEG:[255,216,255],GIF:[71,73,70,56],BMP:[66,77],RIFF:[82,73,70,70],WEBP:[87,69,66,80],PDF:[37,80,68,70,45],ID3:[73,68,51],MP3_SYNC1:[255,251],MP3_SYNC2:[255,243],MP3_SYNC3:[255,242],OGG:[79,103,103,83],WAVE:[87,65,86,69],FLAC:[102,76,97,67],FTYP:[102,116,121,112],WEBM:[26,69,223,163],AVI:[65,86,73,32]},le=class{constructor(){this.currentObjectUrl=null,this.modal=document.getElementById("blob-inspector-modal"),this.previewContainer=document.getElementById("tab-preview"),this.hexContainer=document.querySelector(".hex-dump"),this.infoContainer=document.getElementById("blob-info"),this.currentData=null,this.currentType=null,this.currentRowId=null,this.currentColName=null,this.currentCellInfo=null,this.isUploading=!1,this.setupEventListeners()}setupEventListeners(){this.modal.querySelectorAll(".modal-close").forEach(l=>{l.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll(".tab-btn").forEach(l=>{l.addEventListener("click",a=>{let s=a.target.dataset.tab;this.switchTab(s)})});let n=document.getElementById("blob-download-btn");n&&n.addEventListener("click",()=>this.download());let o=document.getElementById("blob-replace-btn");o&&o.addEventListener("click",()=>this.handleReplace())}setUploadState(n){this.isUploading=n;let o=document.getElementById("blob-replace-btn"),l=document.getElementById("blob-download-btn");o&&(o.disabled=n,o.textContent=n?"Uploading...":"Replace"),l&&(l.disabled=n)}async handleReplace(){if(!this.isUploading)try{if(((await x.getExtensionSettings())?.fileOperations||"native")==="web")this.showFileInput();else{let l=await x.selectFile();if(l){let a=l.data;if(!(a instanceof Uint8Array)){if(Array.isArray(a))a=new Uint8Array(a);else if(a&&typeof a=="object"){let i=Object.keys(a).filter(r=>!isNaN(parseInt(r,10))).sort((r,c)=>parseInt(r,10)-parseInt(c,10)).map(r=>a[r]);a=new Uint8Array(i)}}let s={name:l.name,arrayBuffer:async()=>a.buffer};await this.uploadFile(s)}}}catch(n){console.error("Replace failed:",n),u(`Replace failed: ${n.message}`)}}showFileInput(){let n=document.createElement("input");n.type="file",n.onchange=async o=>{let l=o.target.files[0];l&&await this.uploadFile(l)},n.click()}async uploadFile(n){if(!(!this.currentRowId||!this.currentColName)&&!this.isUploading){this.setUploadState(!0);try{u(`Reading ${n.name}...`);let o=await n.arrayBuffer(),l=new Uint8Array(o),a=l.length/(1024*1024),s=50;if(a>s)throw new Error(`File too large (${a.toFixed(1)}MB). Maximum size is ${s}MB to prevent freezing.`);a>10?u(`Uploading ${n.name} (${a.toFixed(1)}MB - this may take a moment)...`):u(`Uploading ${n.name}...`);let{rowIdx:i,colIdx:r}=this.currentCellInfo,c=this.currentData;await x.updateCell(t.selectedTable,this.currentRowId,this.currentColName,l,c),t.gridData&&t.gridData[i]&&(t.gridData[i][r+B()]=l),this.inspect(l,this.currentRowId,this.currentColName,i,r),u(`Replaced with ${n.name}`)}catch(o){console.error("Replace failed:",o);let l=o.message||String(o);l.includes("timeout")&&(l="Upload timed out. Try a smaller file or increase the timeout."),u(`Replace failed: ${l}`)}finally{this.setUploadState(!1)}}}close(){this.modal.classList.add("hidden"),this.cleanup()}cleanup(){this.setUploadState(!1),this.currentObjectUrl&&(URL.revokeObjectURL(this.currentObjectUrl),this.currentObjectUrl=null),this.previewContainer.innerHTML="",this.hexContainer.value="",this.infoContainer.textContent="",this.currentData=null}switchTab(n){this.modal.querySelectorAll(".tab-btn").forEach(a=>{a.dataset.tab===n?(a.classList.add("active"),a.style.borderBottom="2px solid var(--accent-color)",a.style.color="var(--text-primary)"):(a.classList.remove("active"),a.style.borderBottom="none",a.style.color="var(--text-secondary)")});let o=document.getElementById("tab-preview"),l=document.getElementById("tab-hex");n==="preview"?(o.style.display="flex",l.style.display="none"):(o.style.display="none",l.style.display="block")}async download(){if(!this.currentData)return;let n=this.currentType?.ext||"bin",o=`blob_${this.currentRowId}.${n}`;try{((await x.getExtensionSettings())?.fileOperations||"native")==="web"?(this.downloadBlob(this.currentData,o),u(`Downloaded ${o}`)):(await x.saveFile(o,this.currentData),u(`Saved ${o}`))}catch(l){console.error("Download failed:",l),u(`Download failed: ${l.message}`)}}downloadBlob(n,o){let l=new Blob([n]),a=URL.createObjectURL(l),s=document.createElement("a");s.href=a,s.download=o,s.click(),URL.revokeObjectURL(a)}inspect(n,o,l,a,s){this.cleanup(),this.currentRowId=o,this.currentColName=l,this.currentCellInfo={rowIdx:a,colIdx:s},this.modal.classList.remove("hidden"),this.switchTab("preview");let i=n instanceof Uint8Array?n:new Uint8Array(n);this.currentData=i;let r=this.detectType(i);this.currentType=r;let c=this.formatSize(i.length);this.infoContainer.textContent=`${l} (Row ${o}) | ${r.mime||"Unknown Type"} | ${c}`,this.renderPreview(i,r),this.renderHex(i)}detectType(n){if(this.checkSignature(n,S.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,S.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,S.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,S.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,S.RIFF)&&this.checkSignature(n.subarray(8),S.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,S.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,S.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,S.MP3_SYNC1)||this.checkSignature(n,S.MP3_SYNC2)||this.checkSignature(n,S.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,S.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,S.RIFF)&&this.checkSignature(n.subarray(8),S.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,S.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),S.FTYP)){let o=String.fromCharCode(...n.subarray(8,12));return o.startsWith("mp4")||o==="isom"||o==="avc1"||o==="M4V "?{mime:"video/mp4",type:"video",ext:"mp4"}:o==="qt "||o.startsWith("M4A")?{mime:"video/quicktime",type:"video",ext:"mov"}:{mime:"video/mp4",type:"video",ext:"mp4"}}if(this.checkSignature(n,S.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,S.RIFF)&&this.checkSignature(n.subarray(8),S.AVI))return{mime:"video/avi",type:"video",ext:"avi"};if(this.isText(n)){try{let o=new TextDecoder().decode(n),l=JSON.parse(o);if(typeof l=="object"&&l!==null)return{mime:"application/json",type:"json",ext:"json"}}catch{}return{mime:"text/plain",type:"text",ext:"txt"}}return{mime:"application/octet-stream",type:"binary",ext:"bin"}}checkSignature(n,o){if(n.lengththis.download()),l.appendChild(a),l.appendChild(s),l.appendChild(i),this.previewContainer.appendChild(l)}else{let l=document.createElement("div");l.className="empty-view";let a=document.createElement("span");a.className="codicon codicon-file-binary",a.style.fontSize="48px",a.style.opacity="0.5";let s=document.createElement("span");s.style.marginTop="12px",s.textContent="Binary Data";let i=document.createElement("span");i.style.fontSize="12px",i.style.opacity="0.7",i.textContent="Use Hex view to inspect",l.appendChild(a),l.appendChild(s),l.appendChild(i),this.previewContainer.appendChild(l)}}renderHex(n){if(!this.hexContainer)return;let o=16*1e3,l="",a=n.subarray(0,o);for(let s=0;s=32&&p<=126?String.fromCharCode(p):".")}else r.push(" "),c.push(" ");let d=r.slice(0,8).join(" "),m=r.slice(8).join(" "),y=c.join("");l+=`${i} ${d} ${m} |${y}| `}n.length>o&&(l+=` -... (${(n.length-o).toLocaleString()} more bytes not shown)`),this.hexContainer.value=l}formatSize(n){if(n===0)return"0 B";let o=1024,l=["B","KB","MB","GB"],a=Math.floor(Math.log(n)/Math.log(o));return parseFloat((n/Math.pow(o,a)).toFixed(2))+" "+l[a]}};var be;function ze(){be=new le,document.getElementById("btnCloseCellPreview")?.addEventListener("click",H),document.getElementById("formatJsonBtn")?.addEventListener("click",Vt),document.getElementById("compactJsonBtn")?.addEventListener("click",Wt),document.getElementById("wrapTextBtn")?.addEventListener("click",_t),document.getElementById("openInVsCodeBtn")?.addEventListener("click",we),document.getElementById("btnCancelCellPreview")?.addEventListener("click",H),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",Ke)}function je(e,n,o){if(t.selectedTableType!=="table"){u("Views are read-only");return}if(t.editingCellInfo){if(t.editingCellInfo.rowIdx===e&&t.editingCellInfo.colIdx===n)return;se()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=P(s,n);if(i instanceof Uint8Array){K(e,n,o);return}if(typeof i=="string"){let d=i.trim();if(d.startsWith("{")&&d.endsWith("}")||d.startsWith("[")&&d.endsWith("]"))try{JSON.parse(d),K(e,n,o);return}catch{}}t.editingCellInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:i};let r=i===null?"":String(i);a.innerHTML="",a.classList.add("editing");let c=document.createElement("textarea");c.className="cell-input",c.value=r,c.spellcheck=!1,a.appendChild(c),c.focus(),t.activeCellInput=c,c.addEventListener("keydown",Ve),c.addEventListener("blur",We),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function Ve(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),_e()):e.key==="Escape"&&(e.preventDefault(),se())}function We(){setTimeout(()=>{t.editingCellInfo&&_e()},100)}async function _e(){if(t.isSavingCell||!t.editingCellInfo||!t.activeCellInput)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.editingCellInfo,s=t.activeCellInput.value,i=a===null?"":String(a);if(s===i){se(),t.selectedCells=[],t.lastSelectedCell=null,F();return}let r=t.tableColumns[n],c=r&&r.notnull===1,d;s===""?c?d="":d=null:!isNaN(Number(s))&&s.trim()!==""?d=Number(s):d=s;try{t.isSavingCell=!0,u("Saving..."),await x.updateCell(t.selectedTable,te(o),l,d,a),t.gridData[e][n+B()]=d,qe(),Ee(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let y=m.message||String(m);u(`Save failed: ${y}`)}finally{t.isSavingCell=!1}}function se(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;qe(),Ee(e,n,o),oe()}function qe(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",Ve),t.activeCellInput.removeEventListener("blur",We),t.activeCellInput=null),t.editingCellInfo=null}async function we(){if(!t.cellPreviewInfo)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,s=t.tableColumns[n],i=document.getElementById("vscode-env")?.dataset.webviewId||"default";try{u("Opening in VS Code..."),H(),await x.openCellEditor({table:t.selectedTable,name:""},te(o),l,{},{value:a,type:{type:s.type},webviewId:i,rowCount:t.gridData.length}),u("Opened in VS Code")}catch(r){console.error("Failed to open in VS Code:",r),u(`Error: ${r.message}`)}}function K(e,n,o){t.editingCellInfo&&se();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=P(a,n);if(s instanceof Uint8Array){be&&be.inspect(s,o,l.name,e,n);return}t.cellPreviewInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:s};let i=document.getElementById("cellPreviewModal"),r=document.getElementById("cellPreviewColumnName"),c=document.getElementById("cellPreviewTypeBadge"),d=document.getElementById("cellPreviewTextarea"),m=document.getElementById("cellPreviewReadonlyBadge"),y=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let p="";s==null?p="":s instanceof Uint8Array?p="[BLOB: "+Array.from(s).map(b=>b.toString(16).padStart(2,"0")).join(" ")+"]":p=String(s),d.value=p;let g=t.selectedTableType!=="table";d.readOnly=g,g?(d.classList.add("readonly"),m.style.display="inline",y.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",y.style.display="inline-block"),ae(),d.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",d.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",f.classList.toggle("active",t.cellPreviewWrapEnabled),i.classList.remove("hidden"),d.focus(),d.oninput=ae,d.onkeydown=b=>{b.key==="Escape"?(b.preventDefault(),H()):b.key==="Enter"&&(b.ctrlKey||b.metaKey)&&(b.preventDefault(),Ke())}}function ae(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function H(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function Ke(){if(!t.cellPreviewInfo)return;if(t.selectedTableType!=="table"){u("Views are read-only");return}let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,i=document.getElementById("cellPreviewTextarea").value,r=a===null?"":String(a);if(i===r){H(),t.selectedCells=[],t.lastSelectedCell=null,F();return}let c=t.tableColumns[n],d=c&&c.notnull===1,m;i===""?m=d?"":null:!isNaN(Number(i))&&i.trim()!==""?m=Number(i):m=i;try{u("Saving..."),await x.updateCell(t.selectedTable,te(o),l,m,a),t.gridData[e][n+B()]=m,H(),Ee(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(y){console.error("Save failed:",y),u(`Save failed: ${y.message}`)}}function Vt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ae()}catch{u("Content is not valid JSON")}}function Wt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ae()}catch{u("Content is not valid JSON")}}function _t(){t.cellPreviewWrapEnabled=!t.cellPreviewWrapEnabled;let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("wrapTextBtn");e.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",e.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",n.classList.toggle("active",t.cellPreviewWrapEnabled)}function Ee(e,n,o){let l=document.getElementById(`cell-${e}-${n}`);if(!l)return;l.classList.remove("editing"),o==null?l.classList.add("null-value"):l.classList.remove("null-value");let a=t.tableColumns[n],s=_(o,a?.type,t.dateFormat,a?.name),i=o!=null&&!(o instanceof Uint8Array);l.textContent="";let r=document.createElement("span");if(r.className="cell-text",r.textContent=s,l.appendChild(r),i){let d=document.createElement("span");d.className="expand-icon codicon codicon-link-external",d.title="View full content",l.appendChild(d)}let c=r.scrollWidth>r.clientWidth;l.classList.toggle("has-overflow",c)}function He(){clearTimeout(t.filterTimer),t.filterTimer=setTimeout(()=>{t.filterQuery=document.getElementById("filterInput").value,t.currentPageIndex=0,v(),M()},300)}function Ge(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,v(),M()}function Je(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,z(),M())}function Z(e){e>=0&&el.name===n);if(o!==-1){if((e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedRowIds.clear(),e.shiftKey&&t.lastSelectedColumnIndex!==null){e.metaKey||e.ctrlKey||(t.selectedCells=[],t.selectedColumns.clear());let l=Math.min(t.lastSelectedColumnIndex,o),a=Math.max(t.lastSelectedColumnIndex,o),s=new Array;if(t.selectedCells.length>0)for(let i of t.selectedCells)i.colIdx>=l&&i.colIdx<=a&&(s[i.rowIdx]||(s[i.rowIdx]=new Set),s[i.rowIdx].add(i.colIdx));for(let i=l;i<=a;i++){let r=t.tableColumns[i].name;t.selectedColumns.add(r);for(let c=0;c0&&a===l)t.selectedCells=t.selectedCells.filter(i=>i.colIdx!==o),t.selectedColumns.delete(n);else{let i=new Set;for(let r of t.selectedCells)r.colIdx===o&&i.add(r.rowIdx);for(let r=0;r0&&a===l&&t.selectedColumns.size===1&&t.selectedColumns.has(n))t.selectedCells=[],t.selectedColumns.clear(),t.lastSelectedColumnIndex=null;else{t.selectedCells=[],t.selectedColumns.clear();for(let i=0;ii.name===t.resizingColumn);if(l===-1)return;let a=document.querySelector(`th[data-column="${t.resizingColumn}"]`);a&&(a.style.width=`${o}px`,a.style.minWidth=`${o}px`,a.style.maxWidth=`${o}px`);let s=document.querySelectorAll(`.data-row td:nth-child(${l+2})`);for(let i of s)i.style.width=`${o}px`,i.style.minWidth=`${o}px`,i.style.maxWidth=`${o}px`;t.pinnedColumns.has(t.resizingColumn)}function ot(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",nt),document.removeEventListener("mouseup",ot),document.body.style.userSelect="",document.body.style.cursor="",z()}function lt(e,n,o){if(e.stopPropagation(),(e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),e.shiftKey&&t.lastSelectedRowIndex!==null){e.metaKey||e.ctrlKey||t.selectedRowIds.clear();let l=Math.min(t.lastSelectedRowIndex,o),a=Math.max(t.lastSelectedRowIndex,o);for(let s=l;s<=a;s++){let i=T(t.gridData[s],s);t.selectedRowIds.add(i)}}else e.ctrlKey||e.metaKey?(t.selectedRowIds.has(n)?t.selectedRowIds.delete(n):t.selectedRowIds.add(n),t.lastSelectedRowIndex=o):t.selectedRowIds.has(n)&&t.selectedRowIds.size===1?(t.selectedRowIds.delete(n),t.lastSelectedRowIndex=null):(t.selectedRowIds.clear(),t.selectedRowIds.add(n),t.lastSelectedRowIndex=o);F(),L(),O()}function ie(e){if(e.stopPropagation(),t.gridData.length===0)return;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear();let n=!0;for(let o=0;o=s&&m.rowIdx<=i&&m.colIdx>=r&&m.colIdx<=c&&(d[m.rowIdx]||(d[m.rowIdx]=new Set),d[m.rowIdx].add(m.colIdx));for(let m=s;m<=i;m++){let y=d[m];for(let f=r;f<=c;f++)if(!y||!y.has(f)){let p=T(t.gridData[m],m),g=P(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:p,value:g})}}}else if(e.metaKey||e.ctrlKey){e.preventDefault(),t.selectedRowIds.clear();let s=t.selectedCells.findIndex(i=>i.rowIdx===n&&i.colIdx===o);s>=0?t.selectedCells.splice(s,1):(t.selectedCells.push({rowIdx:n,colIdx:o,rowId:l,value:a}),t.lastSelectedCell={rowIdx:n,colIdx:o})}else if(e.shiftKey&&t.lastSelectedCell){e.preventDefault(),t.selectedRowIds.clear(),t.selectedCells=[];let s=Math.min(t.lastSelectedCell.rowIdx,n),i=Math.max(t.lastSelectedCell.rowIdx,n),r=Math.min(t.lastSelectedCell.colIdx,o),c=Math.max(t.lastSelectedCell.colIdx,o);for(let d=s;d<=i;d++)for(let m=r;m<=c;m++){let y=T(t.gridData[d],d),f=P(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:y,value:f})}}else t.selectedRowIds.clear(),t.selectedCells=[{rowIdx:n,colIdx:o,rowId:l,value:a}],t.lastSelectedCell={rowIdx:n,colIdx:o},t.selectedColumns.clear();F(),L(),O()}function st(e,n,o,l){if(t.cellEditBehavior==="vscode"){let a=t.tableColumns[o];if(!a)return;let s=t.gridData[n];if(!s)return;let i=P(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},we()}else t.cellEditBehavior==="modal"?K(n,o,l):je(n,o,l)}function it(){document.getElementById("filterInput")?.addEventListener("keyup",He),document.getElementById("pageSizeSelect")?.addEventListener("change",Ge),document.getElementById("dateFormatSelect")?.addEventListener("change",Je),document.getElementById("btnFirst")?.addEventListener("click",()=>Z(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>Z(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>Z(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>Z(t.totalPageCount-1))}function rt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",qt),e.addEventListener("keydown",Kt),e.addEventListener("click",Ht),e.addEventListener("dblclick",Xt),e.addEventListener("mouseover",Yt),e.addEventListener("scroll",Zt,{passive:!0}))}function qt(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&tt(e,n.dataset.column)}}function Kt(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ye(e,n)}}function Ht(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Gt(e,n);return}Jt(e,n)}function Gt(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Ie(l.dataset.column);return}if(n.closest(".header-bottom")||n.closest(".column-filter")){e.stopPropagation();return}if(n.closest(".select-column-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Ze(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Qe(e,l.dataset.column);return}if(n.closest(".row-number-header")){ie(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&Xe(l.dataset.column);return}}function Jt(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=Q(a);et(e,s)}return}if(n.closest(".expand-icon")){let l=n.closest(".data-cell");if(l){let a=parseInt(l.dataset.rowidx,10),s=parseInt(l.dataset.colidx,10),i=Q(l.closest(".data-row").dataset.rowid);K(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=Q(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);lt(e,a,s)}return}let o=n.closest(".data-cell");if(o){let l=parseInt(o.dataset.rowidx,10),a=parseInt(o.dataset.colidx,10),s=o.closest(".data-row"),i=Q(s.dataset.rowid);at(e,l,a,i);return}}function Xt(e){if(t.isGridReloading)return;let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("row-number")){let o=parseInt(n.dataset.rowidx,10),l=parseInt(n.dataset.colidx,10),a=n.closest(".data-row"),s=Q(a.dataset.rowid);st(e,o,l,s)}}function Yt(e){let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("checked-overflow")){let o=n.querySelector(".cell-text");if(o){let l=o.scrollWidth>o.clientWidth;n.classList.toggle("has-overflow",l),n.classList.add("checked-overflow")}}}function Zt(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,M()}function Q(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}function ct(){document.addEventListener("click",e=>{let n=e.target,o=n.closest(".modal-close, .modal-cancel");if(o){let l=o.dataset.modal;l&&U(l)}n.classList.contains("modal-overlay")&&n.classList.add("hidden")}),document.addEventListener("keydown",e=>{if(e.key==="Escape"){let n=document.querySelector(".modal-overlay:not(.hidden)");n&&(n.classList.add("hidden"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation())}})}function j(e){let n=document.getElementById(e);if(n){n.classList.remove("hidden");let o=n.querySelector("input, select, textarea, button");o&&o.focus()}}function U(e){let n=document.getElementById(e);n&&n.classList.add("hidden")}function dt(){document.getElementById("btnAddRow")?.addEventListener("click",Qt),document.getElementById("btnDeleteRows")?.addEventListener("click",tn),document.getElementById("btnAddColumn")?.addEventListener("click",sn),document.getElementById("btnSubmitAddRow")?.addEventListener("click",en),document.getElementById("btnSubmitDelete")?.addEventListener("click",re),document.getElementById("btnSubmitCreateTable")?.addEventListener("click",an),document.getElementById("btnAddColumnDef")?.addEventListener("click",()=>pt()),document.getElementById("columnDefinitions")?.addEventListener("click",e=>{let n=e.target.closest(".btn-remove-col");if(n){let o=n.dataset.colid;ln(o)}}),document.getElementById("btnSubmitAddColumn")?.addEventListener("click",rn)}function Qt(){if(!t.selectedTable||t.selectedTableType!=="table")return;let e=document.getElementById("addRowForm");e.replaceChildren(),t.tableColumns.forEach(n=>{let o=n.notnull===1&&!n.isPrimaryKey,l=document.createElement("div");l.className="form-field";let a=document.createElement("label");if(a.textContent=n.name,o){let r=document.createElement("span");r.style.color="var(--error-color)",r.textContent="*",a.appendChild(document.createTextNode(" ")),a.appendChild(r)}let s=document.createElement("span");s.style.opacity="0.5",s.textContent=` (${n.type})`,a.appendChild(document.createTextNode(" ")),a.appendChild(s);let i=document.createElement("input");i.type="text",i.dataset.column=n.name,i.dataset.required=o.toString(),n.isPrimaryKey?(i.placeholder="Auto (Primary Key)",i.disabled=!0):o?i.placeholder="Required":i.placeholder="NULL",l.appendChild(a),l.appendChild(i),e.appendChild(l)}),j("addRowModal")}async function en(){let e=document.querySelectorAll("#addRowForm input[data-column]:not([disabled])"),n=[];for(let l of e){let a=l.dataset.column,s=l.value.trim();l.dataset.required==="true"&&(s===""||s.toLowerCase()==="null")?(n.push(a),l.style.borderColor="var(--error-color)"):l.style.borderColor=""}if(n.length>0){u(`Required fields missing: ${n.join(", ")}`);return}let o={};for(let l of e){let a=l.dataset.column,s=l.value.trim();s!==""&&(s.toLowerCase()==="null"?o[a]=null:!isNaN(Number(s))&&s!==""?o[a]=Number(s):o[a]=s)}try{u("Inserting row..."),await x.insertRow(t.selectedTable,o),U("addRowModal"),await v(),u("Row inserted - Ctrl+S to save")}catch(l){console.error("Insert failed:",l),u(`Error: ${l.message}`)}}function tn(){if(t.selectedColumns.size>0){let e=Array.from(t.selectedColumns);document.getElementById("deleteConfirmText").textContent=`Are you sure you want to delete ${e.length} column${e.length>1?"s":""} (${e.join(", ")})? This will permanently remove the column${e.length>1?"s":""} and all their data.`}else if(t.selectedRowIds.size>0)document.getElementById("deleteConfirmText").textContent=`Are you sure you want to delete ${t.selectedRowIds.size} row${t.selectedRowIds.size>1?"s":""}?`;else return;j("deleteModal")}async function re(){t.selectedColumns.size>0?await on():t.selectedRowIds.size>0&&await nn()}async function nn(){if(t.selectedRowIds.size===0)return;let e=Array.from(t.selectedRowIds);try{u("Deleting rows..."),await x.deleteRows(t.selectedTable,e),U("deleteModal"),t.selectedRowIds.clear(),await v(),L(),u(`Deleted ${e.length} row${e.length>1?"s":""} - Ctrl+S to save`)}catch(n){console.error("Delete rows failed:",n),u(`Error: ${n.message}`)}}async function on(){if(t.selectedColumns.size===0)return;let e=Array.from(t.selectedColumns);try{u("Deleting columns...");let n=await x.deleteColumns(t.selectedTable,e);if(n&&n.cancelled){u("Delete cancelled"),U("deleteModal");return}U("deleteModal"),t.selectedColumns.clear(),t.selectedCells=[],t.lastSelectedCell=null,await V(),await q(),await v(),L(),u(`Deleted ${e.length} column${e.length>1?"s":""} - Ctrl+S to save`)}catch(n){console.error("Delete columns failed:",n),u(`Error: ${n.message}`)}}var ut=0;function mt(){document.getElementById("newTableName").value="",document.getElementById("columnDefinitions").replaceChildren(),ut=0,pt(!0),j("createTableModal")}function pt(e=!1){let n=document.getElementById("columnDefinitions"),o=++ut,l=document.createElement("div");l.className="column-def-row",l.id=`colDef_${o}`,Object.assign(l.style,{display:"flex",gap:"8px",marginBottom:"8px",alignItems:"center"});let a=document.createElement("input");a.type="text",a.placeholder="Column name",a.className="col-name",a.style.flex="2",e&&(a.value="id"),l.appendChild(a);let s=document.createElement("select");s.className="col-type",s.style.flex="1",["INTEGER","TEXT","REAL","BLOB","NUMERIC"].forEach(f=>{let p=document.createElement("option");p.value=f,p.textContent=f,e&&f==="INTEGER"&&(p.selected=!0),!e&&f==="TEXT"&&(p.selected=!0),s.appendChild(p)}),l.appendChild(s);let i=document.createElement("label");Object.assign(i.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"});let r=document.createElement("input");r.type="checkbox",r.className="col-pk",r.style.margin="0",e&&(r.checked=!0),i.appendChild(r),i.appendChild(document.createTextNode(" PK")),l.appendChild(i);let c=document.createElement("label");Object.assign(c.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"});let d=document.createElement("input");d.type="checkbox",d.className="col-nn",d.style.margin="0",c.appendChild(d),c.appendChild(document.createTextNode(" NN")),l.appendChild(c);let m=document.createElement("button");m.className="icon-button btn-remove-col",m.dataset.colid=o.toString(),m.title="Remove",e&&(m.disabled=!0);let y=document.createElement("span");y.className="codicon codicon-close",m.appendChild(y),l.appendChild(m),n.appendChild(l)}function ln(e){let n=document.getElementById(`colDef_${e}`);n&&n.remove()}async function an(){let e=document.getElementById("newTableName").value.trim();if(!e){u("Error: Table name is required");return}if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)){u("Error: Invalid table name");return}let n=[],o=document.querySelectorAll(".column-def-row");for(let l of o){let a=l.querySelector(".col-name").value.trim(),s=l.querySelector(".col-type").value,i=l.querySelector(".col-pk").checked,r=l.querySelector(".col-nn").checked;a&&n.push({name:a,type:s,primaryKey:i,notNull:r})}if(n.length===0){u("Error: At least one column is required");return}try{u("Creating table..."),await x.createTable(e,n),U("createTableModal"),await V(),u(`Table "${e}" created - Ctrl+S to save`)}catch(l){console.error("Create table failed:",l),u(`Error: ${l.message}`)}}function sn(){!t.selectedTable||t.selectedTableType!=="table"||(document.getElementById("newColumnName").value="",document.getElementById("newColumnType").value="TEXT",document.getElementById("newColumnDefault").value="",j("addColumnModal"))}async function rn(){let e=document.getElementById("newColumnName").value.trim(),n=document.getElementById("newColumnType").value,o=document.getElementById("newColumnDefault").value.trim();if(!e){u("Error: Column name is required");return}if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)){u("Error: Invalid column name");return}try{u("Adding column..."),await x.addColumn(t.selectedTable,e,n,o),U("addColumnModal"),await q(),await v(),u(`Column "${e}" added - Ctrl+S to save`)}catch(l){console.error("Add column failed:",l),u(`Error: ${l.message}`)}}function ft(){let e=document.getElementById("pragmaSettingsContainer");e&&e.addEventListener("change",n=>{let o=n.target;if(o.matches(".setting-extension")){let l=o.dataset.key,a=o.type==="checkbox"?o.checked:o.value;dn(l,a)}else if(o.matches(".setting-pragma")){let l=o.dataset.name,a=o.dataset.type,s=o.value;a==="number"?s=Number(s):a==="bool"&&(s=s==="true"?1:0),un(l,s)}})}async function gt(){let e=document.getElementById("settingsModal");e&&(e.classList.remove("hidden"),await ve())}async function ve(){let e=document.getElementById("pragmaSettingsContainer");e.textContent="Loading settings...";try{let[n,o]=await Promise.all([x.getPragmas(),x.getExtensionSettings()]);cn(n,o)}catch(n){console.error("Failed to load settings:",n),e.textContent=`Error loading settings: ${n.message}`,e.style.color="var(--error-color)"}}function cn(e,n){let o=document.getElementById("pragmaSettingsContainer");if(!o)return;let l=(h,C)=>h.map(A=>{let R=String(A),N=String(C).toUpperCase()===R.toUpperCase(),k=document.createElement("option");return k.value=R,k.selected=N,k.textContent=R,k});o.replaceChildren();let a=h=>{let C=document.createElement("div");C.className="setting-section-title",Object.assign(C.style,{fontWeight:"600",marginBottom:"8px",paddingBottom:"4px",borderBottom:"1px solid var(--border-color)"}),C.textContent=h,o.appendChild(C)},s=(h,C,A)=>{let R=document.createElement("div");R.className="form-field";let w=document.createElement("label");if(C.type==="checkbox"?(Object.assign(w.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"}),C.style.margin="0",w.appendChild(C),w.appendChild(document.createTextNode(h)),R.appendChild(w)):(w.textContent=h,R.appendChild(w),R.appendChild(C)),A){let N=document.createElement("div");N.className="setting-desc",N.textContent=A,R.appendChild(N)}o.appendChild(R)};if(o.children.length>0){let h=document.createElement("div");h.style.height="16px",o.appendChild(h)}a("Extension Settings");let i=document.createElement("input");i.type="checkbox",i.className="setting-extension",i.dataset.key="autoCommit",i.checked=!!n.autoCommit,s("Auto-Commit Changes",i,"Automatically save changes to disk immediately. If disabled, you must save manually (Ctrl+S).");let r=document.createElement("select");r.className="setting-extension",r.dataset.key="doubleClickBehavior",l(["inline","modal","vscode"],n.cellEditBehavior).forEach(h=>r.appendChild(h)),s("Double Click Behavior",r,"Action when double-clicking a cell");let c=document.createElement("div");c.style.height="16px",o.appendChild(c),a("SQLite Settings (Pragmas)");let d=document.createElement("select");d.className="setting-pragma",d.dataset.name="journal_mode",l(["DELETE","TRUNCATE","PERSIST","MEMORY","WAL","OFF"],e.journal_mode).forEach(h=>d.appendChild(h)),s("Journal Mode",d,"Database journaling mode (WAL is recommended for concurrency)");let m=document.createElement("select");m.className="setting-pragma",m.dataset.name="foreign_keys",m.dataset.type="bool";let y=document.createElement("option");y.value="true",y.textContent="ON";let f=document.createElement("option");f.value="false",f.textContent="OFF",Number(e.foreign_keys)===1?y.selected=!0:f.selected=!0,m.appendChild(y),m.appendChild(f),s("Foreign Keys",m,"Enforce foreign key constraints");let p=document.createElement("select");p.className="setting-pragma",p.dataset.name="synchronous",p.dataset.type="number",[{v:0,t:"OFF (0)"},{v:1,t:"NORMAL (1)"},{v:2,t:"FULL (2)"},{v:3,t:"EXTRA (3)"}].forEach(h=>{let C=document.createElement("option");C.value=h.v,C.textContent=h.t,Number(e.synchronous)===h.v&&(C.selected=!0),p.appendChild(C)}),s("Synchronous",p,"Disk synchronization safety level");let g=document.createElement("select");g.className="setting-pragma",g.dataset.name="locking_mode",l(["NORMAL","EXCLUSIVE"],e.locking_mode).forEach(h=>g.appendChild(h)),s("Locking Mode",g,"");let b=document.createElement("select");b.className="setting-pragma",b.dataset.name="auto_vacuum",b.dataset.type="number",[{v:0,t:"NONE (0)"},{v:1,t:"FULL (1)"},{v:2,t:"INCREMENTAL (2)"}].forEach(h=>{let C=document.createElement("option");C.value=h.v,C.textContent=h.t,Number(e.auto_vacuum)===h.v&&(C.selected=!0),b.appendChild(C)}),s("Auto Vacuum",b,"");let E=document.createElement("input");E.type="number",E.className="setting-pragma",E.dataset.name="cache_size",E.dataset.type="number",E.value=e.cache_size,s("Cache Size",E,"Number of pages (positive) or kilobytes (negative)")}async function dn(e,n){try{await x.updateExtensionSetting(e,n),u(`Updated ${e}`)}catch(o){console.error(`Failed to set ${e}:`,o),u(`Error: ${o.message}`),await ve()}}async function un(e,n){try{u(`Updating ${e}...`),await x.setPragma(e,n),u(`Updated ${e}`)}catch(o){console.error(`Failed to set ${e}:`,o),u(`Error: ${o.message}`),await ve()}}function ht(e,n){let o=new Map;for(let l of e){let a=n&&n[l.colIdx];a&&(o.has(l.colIdx)||o.set(l.colIdx,{name:a.name,type:a.type,values:new Set}),o.get(l.colIdx).values.add(l.value))}return o}function yt(e){let n=Array.from(e||[]);if(n.length===0)return"";if(n.length>1)return"(mixed values)";let o=n[0];return o===null?"NULL":o instanceof Uint8Array?"[BLOB]":String(o)}function Ct(e,n,o){let l=[];for(let a of e){let s=n.get(a.colIdx);if(!s)continue;let i=s.dataset||{},r=i.isnull==="true",c=i.ispatch==="true",d=s.value;if(d===""&&!r)continue;let m=o&&o[a.colIdx];if(!m)continue;let y=d,f="set";if(r)y=null;else if(c)f="json_patch";else{let p=(m.type||"").toUpperCase();(p==="INTEGER"||p==="REAL"||p==="NUMERIC")&&!isNaN(Number(d))&&d.trim()!==""&&(y=Number(d))}l.push({rowId:a.rowId,column:m.name,value:y,originalValue:a.value,operation:f,rowIdx:a.rowIdx,colIdx:a.colIdx})}return l}function bt(){let e=document.getElementById("sidebarPanel");if(!e)return;let n=document.getElementById("sidebarFilterInput");n&&n.addEventListener("input",()=>{t.sidebarFilter=n.value,Be()}),e.addEventListener("click",o=>{let l=o.target;if(l.closest("#btnOpenSettings")){gt();return}if(l.closest("#btnOpenCreateTable")){o.stopPropagation(),mt();return}if(l.closest("#btnReload")){Cn();return}if(l.closest("#btnApplyBatchUpdate")){pn();return}let a=l.closest(".list-item");if(a){let c=a.dataset.name,d=a.dataset.type;if(c&&d){yn(c,d);return}}let s=l.closest(".section-title");if(s){if(l.closest(".icon-button")||s.id==="btnOpenSettings")return;let c=s.dataset.section;c&&hn(c)}let i=l.closest(".btn-batch-null");if(i){let c=i.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);fn(d)}return}let r=l.closest(".btn-batch-patch");if(r){let c=r.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);gn(d,r)}return}})}async function V(){if(t.isDbConnected)try{let e=await x.fetchSchema();t.schemaCache.tables=(e.tables||[]).map(n=>({name:n.identifier})),t.schemaCache.views=(e.views||[]).map(n=>({name:n.identifier})),t.schemaCache.indexes=(e.indexes||[]).map(n=>({name:n.identifier,table:n.parentTable})),Be()}catch(e){console.error("Error loading schema:",e),u("Error loading schema")}}function Se(e,n){return n?e.filter(o=>o.name.toLowerCase().includes(n)):e}function Te(e,n,o,l){let a=document.getElementById(e);a&&(a.textContent=l?`${n}/${o}`:o)}function xt(e,n,o,l,a){let s=document.getElementById(e);if(!s)return;if(s.replaceChildren(),n.length===0){let r=document.createElement("li");r.className="list-item",r.style.opacity="0.5",r.textContent=a,s.appendChild(r);return}let i=document.createDocumentFragment();n.forEach(r=>{let c=document.createElement("li");c.className="list-item",t.selectedTable===r.name&&t.selectedTableType===o&&c.classList.add("selected"),c.dataset.name=r.name,o&&(c.dataset.type=o),c.title=r.name;let d=document.createElement("span");d.className=`item-icon codicon ${l}`,c.appendChild(d);let m=document.createElement("span");m.className="item-name",m.textContent=r.name,c.appendChild(m),i.appendChild(c)}),s.appendChild(i)}function mn(e,n,o){let l=document.getElementById(e);if(!l)return;if(l.replaceChildren(),n.length===0){let s=document.createElement("li");s.className="list-item",s.style.opacity="0.5",s.textContent=o,l.appendChild(s);return}let a=document.createDocumentFragment();n.forEach(s=>{let i=document.createElement("li");i.className="list-item",i.title=`${s.name} on ${s.table}`;let r=document.createElement("span");r.className="item-icon codicon codicon-list-selection",i.appendChild(r);let c=document.createElement("div");c.className="item-content";let d=document.createElement("span");d.className="item-name",d.textContent=s.name,c.appendChild(d);let m=document.createElement("span");m.className="item-detail",m.textContent=s.table,c.appendChild(m),i.appendChild(c),a.appendChild(i)}),l.appendChild(a)}function Be(){let e=t.sidebarFilter.toLowerCase(),n=e.length>0,o=Se(t.schemaCache.tables,e),l=Se(t.schemaCache.views,e),a=Se(t.schemaCache.indexes,e);Te("tablesBadge",o.length,t.schemaCache.tables.length,n),Te("viewsBadge",l.length,t.schemaCache.views.length,n),Te("indexesBadge",a.length,t.schemaCache.indexes.length,n),xt("tablesList",o,"table","codicon-table",e?"No matching tables":"No tables"),xt("viewsList",l,"view","codicon-eye",e?"No matching views":"No views"),mn("indexesList",a,e?"No matching indexes":"No indexes")}function O(){let e=document.getElementById("batchUpdateSectionTitle"),n=document.getElementById("batchUpdateList"),o=document.getElementById("batchUpdateCount"),l=document.getElementById("batchUpdateFields");if(!e||!n||!o||!l)return;let a=t.selectedCells.length;if(a===0){e.classList.add("hidden"),n.classList.add("hidden");return}e.classList.remove("hidden"),n.classList.remove("hidden"),e.classList.remove("collapsed"),o.textContent=a;let s=ht(t.selectedCells,t.tableColumns);l.replaceChildren();let i=document.createDocumentFragment();for(let[r,c]of s){let d=yt(c.values),m=document.createElement("div");m.className="form-field batch-field",m.dataset.colidx=r,m.style.marginBottom="8px";let y=document.createElement("label");y.style.fontSize="11px",y.style.color="var(--text-secondary)";let f=document.createTextNode(c.name+" ");y.appendChild(f);let p=document.createElement("span");p.style.opacity="0.7",p.textContent=c.type||"",y.appendChild(p),m.appendChild(y);let g=document.createElement("div");g.style.display="flex",g.style.gap="4px";let b=document.createElement("input");b.type="text",b.className="batch-input",b.placeholder=d,b.dataset.colidx=r,b.style.flex="1",b.style.minWidth="0",g.appendChild(b);let E=document.createElement("button");E.className="btn-secondary btn-batch-null",E.style.padding="2px 6px",E.title="Set to NULL",E.textContent="NULL",g.appendChild(E);let h=document.createElement("button");h.className="btn-secondary btn-batch-patch",h.style.padding="2px 6px",h.title="JSON Patch",h.textContent="{}",g.appendChild(h),m.appendChild(g),i.appendChild(m)}l.appendChild(i)}async function pn(){if(t.selectedCells.length===0)return;let e=document.querySelectorAll(".batch-input"),n=new Map;for(let l of e){let a=parseInt(l.dataset.colidx,10);if(n.set(a,l),l.dataset.ispatch==="true")try{JSON.parse(l.value)}catch{let i=t.tableColumns[a];u(`Invalid JSON for patch in ${i?.name??`column ${a}`}`);return}}let o=Ct(t.selectedCells,n,t.tableColumns);if(o.length===0){u("No values entered for batch update");return}try{u(`Updating ${o.length} cells...`);let l=`Batch update ${o.length} cells`,a=o.map(r=>({rowId:r.rowId,column:r.column,value:r.value,originalValue:r.originalValue,operation:r.operation}));if(await x.updateCellBatch(t.selectedTable,a,l),!o.some(r=>r.operation==="json_patch"))for(let r of o)t.gridData[r.rowIdx][r.colIdx+B()]=r.value;await v(!1);let i=[];for(let r of t.selectedCells){let c=t.gridData[r.rowIdx][r.colIdx+B()];i.push({...r,value:c})}t.selectedCells=i,O(),u("Batch update completed")}catch(l){console.error("Batch update failed:",l),u(`Batch update failed: ${l.message}`)}}function fn(e){let n=document.querySelector(`.batch-input[data-colidx="${e}"]`),o=document.querySelector(`.batch-field[data-colidx="${e}"] .btn-batch-patch`);n&&(n.value="",n.placeholder="SET TO NULL",n.dataset.isnull="true",n.dataset.ispatch="false",n.style.fontStyle="italic",o&&(o.style.background="",o.style.color=""))}function gn(e,n){let o=document.querySelector(`.batch-input[data-colidx="${e}"]`);o&&(o.dataset.ispatch==="true"?(o.dataset.ispatch="false",o.placeholder="(mixed values)",n.style.background="",n.style.color=""):(o.dataset.ispatch="true",o.dataset.isnull="false",o.placeholder='JSON Patch (e.g. {"a": 1})',o.style.fontStyle="normal",n.style.background="var(--accent-color)",n.style.color="white"))}function hn(e){let n=document.getElementById(`${e}List`),o=document.querySelector(`.section-title[data-section="${e}"]`);n&&o&&(n.classList.toggle("hidden"),o.classList.toggle("collapsed"))}async function yn(e,n){t.selectedTable=e,t.selectedTableType=n,t.currentPageIndex=0,t.sortedColumn=null,t.sortAscending=!0,t.filterQuery="",t.columnFilters={},t.selectedRowIds.clear(),t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),t.pinnedColumns.clear(),t.pinnedRowIds.clear(),t.columnWidths={},t.scrollPosition={top:0,left:0},Be();let o=document.getElementById("tableNameLabel");o&&(o.textContent=e);let l=document.getElementById("filterInput");l&&(l.value=""),await q(),await v(!0,!1),M()}async function Cn(){if(t.isDbConnected)try{u("Reloading..."),await x.refreshFile(),await V(),t.selectedTable&&(await q(),await v()),u("Reloaded")}catch(e){console.error("Reload failed:",e),u(`Reload failed: ${e.message}`)}}function wt(){document.getElementById("btnExport")?.addEventListener("click",xn),document.getElementById("btnSubmitExport")?.addEventListener("click",bn),document.getElementById("exportFormat")?.addEventListener("change",Et)}function xn(){if(!t.selectedTable)return;let e=document.getElementById("exportFormat");e&&(e.value="csv");let n=document.getElementById("exportColumns");n&&(n.replaceChildren(),t.tableColumns.forEach(o=>{let l=document.createElement("div"),a=document.createElement("label");Object.assign(a.style,{display:"flex",alignItems:"center",gap:"3px",marginBottom:"4px",fontSize:"13px",cursor:"pointer"});let s=document.createElement("input");s.type="checkbox",s.className="export-col-check",s.value=o.name,s.checked=!0,s.style.margin="0",a.appendChild(s),a.appendChild(document.createTextNode(o.name)),n.appendChild(a)})),Et(),j("exportModal")}function Et(){let e=document.getElementById("exportFormat").value,n=document.getElementById("exportOptions");if(n.replaceChildren(),e==="csv"||e==="excel"){let o=document.createElement("label");Object.assign(o.style,{display:"flex",alignItems:"center",gap:"3px",marginBottom:"4px",fontSize:"13px",cursor:"pointer"});let l=document.createElement("input");l.type="checkbox",l.id="exportHeader",l.checked=!0,l.style.margin="0",o.appendChild(l),o.appendChild(document.createTextNode(" Include Headers")),n.appendChild(o)}else if(e==="sql"){let o=document.createElement("label");Object.assign(o.style,{display:"flex",alignItems:"center",gap:"3px",marginBottom:"4px",fontSize:"13px",cursor:"pointer"});let l=document.createElement("input");l.type="checkbox",l.id="exportTableName",l.checked=!0,l.style.margin="0",o.appendChild(l),o.appendChild(document.createTextNode(" Include Table Name")),n.appendChild(o)}}async function bn(){let e=document.getElementById("exportFormat").value,n=document.querySelectorAll(".export-col-check:checked"),o=Array.from(n).map(a=>a.value);if(o.length===0){u("Error: Select at least one column");return}let l={};if(e==="csv"||e==="excel"?l.header=document.getElementById("exportHeader")?.checked??!0:e==="sql"&&(l.includeTableName=document.getElementById("exportTableName")?.checked??!0),t.selectedTableType==="table"){let a=Array.from(t.selectedRowIds);a.length>0&&(l.rowIds=a)}try{u("Exporting..."),U("exportModal"),await x.exportTable({table:t.selectedTable},o,null,null,{format:e,...l}),u("Export initiated")}catch(a){console.error("Export failed:",a),u(`Export failed: ${a.message}`)}}async function It(){if(t.selectedCells.length!==0)try{let e;if(t.selectedCells.length===1){let n=t.selectedCells[0].value;n==null?e="":n instanceof Uint8Array?e="[BLOB]":e=String(n)}else{let n=[...new Set(t.selectedCells.map(s=>s.rowIdx))].sort((s,i)=>s-i),o=[...new Set(t.selectedCells.map(s=>s.colIdx))].sort((s,i)=>s-i),l=new Map;for(let s of t.selectedCells)l.set(`${s.rowIdx},${s.colIdx}`,s.value);let a=[];for(let s of n){let i=[];for(let r of o){let c=`${s},${r}`,d=l.has(c)?l.get(c):"";d==null?d="":d instanceof Uint8Array?d="[BLOB]":(d=String(d),d=d.replace(/\t/g," ").replace(/\n/g," ")),i.push(d)}a.push(i.join(" "))}e=a.join(` +... (${(n.length-o).toLocaleString()} more bytes not shown)`),this.hexContainer.value=l}formatSize(n){if(n===0)return"0 B";let o=1024,l=["B","KB","MB","GB"],a=Math.floor(Math.log(n)/Math.log(o));return parseFloat((n/Math.pow(o,a)).toFixed(2))+" "+l[a]}};var be;function ze(){be=new le,document.getElementById("btnCloseCellPreview")?.addEventListener("click",H),document.getElementById("formatJsonBtn")?.addEventListener("click",Vt),document.getElementById("compactJsonBtn")?.addEventListener("click",Wt),document.getElementById("wrapTextBtn")?.addEventListener("click",_t),document.getElementById("openInVsCodeBtn")?.addEventListener("click",we),document.getElementById("btnCancelCellPreview")?.addEventListener("click",H),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",Ke)}function je(e,n,o){if(t.selectedTableType!=="table"){u("Views are read-only");return}if(t.editingCellInfo){if(t.editingCellInfo.rowIdx===e&&t.editingCellInfo.colIdx===n)return;se()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=P(s,n);if(i instanceof Uint8Array){K(e,n,o);return}if(typeof i=="string"){let d=i.trim();if(d.startsWith("{")&&d.endsWith("}")||d.startsWith("[")&&d.endsWith("]"))try{JSON.parse(d),K(e,n,o);return}catch{}}t.editingCellInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:i};let r=i===null?"":String(i);a.innerHTML="",a.classList.add("editing");let c=document.createElement("textarea");c.className="cell-input",c.value=r,c.spellcheck=!1,a.appendChild(c),c.focus(),t.activeCellInput=c,c.addEventListener("keydown",Ve),c.addEventListener("blur",We),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function Ve(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),_e()):e.key==="Escape"&&(e.preventDefault(),se())}function We(){setTimeout(()=>{t.editingCellInfo&&_e()},100)}async function _e(){if(t.isSavingCell||!t.editingCellInfo||!t.activeCellInput)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.editingCellInfo,s=t.activeCellInput.value,i=a===null?"":String(a);if(s===i){se(),t.selectedCells=[],t.lastSelectedCell=null,F();return}let r=t.tableColumns[n],c=r&&r.notnull===1,d;s===""?c?d="":d=null:!isNaN(Number(s))&&s.trim()!==""?d=Number(s):d=s;try{t.isSavingCell=!0,u("Saving..."),await x.updateCell(t.selectedTable,te(o),l,d,a),t.gridData[e][n+B()]=d,qe(),Ee(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let y=m.message||String(m);u(`Save failed: ${y}`)}finally{t.isSavingCell=!1}}function se(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;qe(),Ee(e,n,o),oe()}function qe(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",Ve),t.activeCellInput.removeEventListener("blur",We),t.activeCellInput=null),t.editingCellInfo=null}async function we(){if(!t.cellPreviewInfo)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,s=t.tableColumns[n],i=document.getElementById("vscode-env")?.dataset.webviewId||"default";try{u("Opening in VS Code..."),H(),await x.openCellEditor({table:t.selectedTable,name:""},te(o),l,{},{value:a,type:{type:s.type},webviewId:i,rowCount:t.gridData.length}),u("Opened in VS Code")}catch(r){console.error("Failed to open in VS Code:",r),u(`Error: ${r.message}`)}}function K(e,n,o){t.editingCellInfo&&se();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=P(a,n);if(s instanceof Uint8Array){be&&be.inspect(s,o,l.name,e,n);return}t.cellPreviewInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:s};let i=document.getElementById("cellPreviewModal"),r=document.getElementById("cellPreviewColumnName"),c=document.getElementById("cellPreviewTypeBadge"),d=document.getElementById("cellPreviewTextarea"),m=document.getElementById("cellPreviewReadonlyBadge"),y=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let p="";s==null?p="":s instanceof Uint8Array?p="[BLOB: "+Array.from(s).map(b=>b.toString(16).padStart(2,"0")).join(" ")+"]":p=String(s),d.value=p;let g=t.selectedTableType!=="table";d.readOnly=g,g?(d.classList.add("readonly"),m.style.display="inline",y.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",y.style.display="inline-block"),ae(),d.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",d.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",f.classList.toggle("active",t.cellPreviewWrapEnabled),i.classList.remove("hidden"),d.focus(),d.oninput=ae,d.onkeydown=b=>{b.key==="Escape"?(b.preventDefault(),H()):b.key==="Enter"&&(b.ctrlKey||b.metaKey)&&(b.preventDefault(),Ke())}}function ae(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function H(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function Ke(){if(!t.cellPreviewInfo)return;if(t.selectedTableType!=="table"){u("Views are read-only");return}let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,i=document.getElementById("cellPreviewTextarea").value,r=a===null?"":String(a);if(i===r){H(),t.selectedCells=[],t.lastSelectedCell=null,F();return}let c=t.tableColumns[n],d=c&&c.notnull===1,m;i===""?m=d?"":null:!isNaN(Number(i))&&i.trim()!==""?m=Number(i):m=i;try{u("Saving..."),await x.updateCell(t.selectedTable,te(o),l,m,a),t.gridData[e][n+B()]=m,H(),Ee(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(y){console.error("Save failed:",y),u(`Save failed: ${y.message}`)}}function Vt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ae()}catch{u("Content is not valid JSON")}}function Wt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ae()}catch{u("Content is not valid JSON")}}function _t(){t.cellPreviewWrapEnabled=!t.cellPreviewWrapEnabled;let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("wrapTextBtn");e.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",e.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",n.classList.toggle("active",t.cellPreviewWrapEnabled)}function Ee(e,n,o){let l=document.getElementById(`cell-${e}-${n}`);if(!l)return;l.classList.remove("editing"),o==null?l.classList.add("null-value"):l.classList.remove("null-value");let a=t.tableColumns[n],s=_(o,a?.type,t.dateFormat,a?.name),i=o!=null&&!(o instanceof Uint8Array);l.textContent="";let r=document.createElement("span");if(r.className="cell-text",r.textContent=s,l.appendChild(r),i){let d=document.createElement("span");d.className="expand-icon codicon codicon-link-external",d.title="View full content",l.appendChild(d)}let c=r.scrollWidth>r.clientWidth;l.classList.toggle("has-overflow",c)}function He(){clearTimeout(t.filterTimer),t.filterTimer=setTimeout(()=>{t.filterQuery=document.getElementById("filterInput").value,t.currentPageIndex=0,v(),M()},300)}function Ge(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,v(),M()}function Je(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,z(),M())}function Z(e){e>=0&&el.name===n);if(o!==-1){if((e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedRowIds.clear(),e.shiftKey&&t.lastSelectedColumnIndex!==null){e.metaKey||e.ctrlKey||(t.selectedCells=[],t.selectedColumns.clear());let l=Math.min(t.lastSelectedColumnIndex,o),a=Math.max(t.lastSelectedColumnIndex,o),s=new Array;if(t.selectedCells.length>0)for(let i of t.selectedCells)i.colIdx>=l&&i.colIdx<=a&&(s[i.rowIdx]||(s[i.rowIdx]=new Set),s[i.rowIdx].add(i.colIdx));for(let i=l;i<=a;i++){let r=t.tableColumns[i].name;t.selectedColumns.add(r);for(let c=0;c0&&a===l)t.selectedCells=t.selectedCells.filter(i=>i.colIdx!==o),t.selectedColumns.delete(n);else{let i=new Set;for(let r of t.selectedCells)r.colIdx===o&&i.add(r.rowIdx);for(let r=0;r0&&a===l&&t.selectedColumns.size===1&&t.selectedColumns.has(n))t.selectedCells=[],t.selectedColumns.clear(),t.lastSelectedColumnIndex=null;else{t.selectedCells=[],t.selectedColumns.clear();for(let i=0;ii.name===t.resizingColumn);if(l===-1)return;let a=document.querySelector(`th[data-column="${t.resizingColumn}"]`);a&&(a.style.width=`${o}px`,a.style.minWidth=`${o}px`,a.style.maxWidth=`${o}px`);let s=document.querySelectorAll(`.data-row td:nth-child(${l+2})`);for(let i of s)i.style.width=`${o}px`,i.style.minWidth=`${o}px`,i.style.maxWidth=`${o}px`;t.pinnedColumns.has(t.resizingColumn)}function ot(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",nt),document.removeEventListener("mouseup",ot),document.body.style.userSelect="",document.body.style.cursor="",z()}function lt(e,n,o){if(e.stopPropagation(),(e.shiftKey||e.metaKey||e.ctrlKey)&&e.preventDefault(),t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),e.shiftKey&&t.lastSelectedRowIndex!==null){e.metaKey||e.ctrlKey||t.selectedRowIds.clear();let l=Math.min(t.lastSelectedRowIndex,o),a=Math.max(t.lastSelectedRowIndex,o);for(let s=l;s<=a;s++){let i=T(t.gridData[s],s);t.selectedRowIds.add(i)}}else e.ctrlKey||e.metaKey?(t.selectedRowIds.has(n)?t.selectedRowIds.delete(n):t.selectedRowIds.add(n),t.lastSelectedRowIndex=o):t.selectedRowIds.has(n)&&t.selectedRowIds.size===1?(t.selectedRowIds.delete(n),t.lastSelectedRowIndex=null):(t.selectedRowIds.clear(),t.selectedRowIds.add(n),t.lastSelectedRowIndex=o);F(),L(),O()}function ie(e){if(e.stopPropagation(),t.gridData.length===0)return;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear();let n=!0;for(let o=0;o=s&&m.rowIdx<=i&&m.colIdx>=r&&m.colIdx<=c&&(d[m.rowIdx]||(d[m.rowIdx]=new Set),d[m.rowIdx].add(m.colIdx));for(let m=s;m<=i;m++){let y=d[m];for(let f=r;f<=c;f++)if(!y||!y.has(f)){let p=T(t.gridData[m],m),g=P(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:p,value:g})}}}else if(e.metaKey||e.ctrlKey){e.preventDefault(),t.selectedRowIds.clear();let s=t.selectedCells.findIndex(i=>i.rowIdx===n&&i.colIdx===o);s>=0?t.selectedCells.splice(s,1):(t.selectedCells.push({rowIdx:n,colIdx:o,rowId:l,value:a}),t.lastSelectedCell={rowIdx:n,colIdx:o})}else if(e.shiftKey&&t.lastSelectedCell){e.preventDefault(),t.selectedRowIds.clear(),t.selectedCells=[];let s=Math.min(t.lastSelectedCell.rowIdx,n),i=Math.max(t.lastSelectedCell.rowIdx,n),r=Math.min(t.lastSelectedCell.colIdx,o),c=Math.max(t.lastSelectedCell.colIdx,o);for(let d=s;d<=i;d++)for(let m=r;m<=c;m++){let y=T(t.gridData[d],d),f=P(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:y,value:f})}}else t.selectedRowIds.clear(),t.selectedCells=[{rowIdx:n,colIdx:o,rowId:l,value:a}],t.lastSelectedCell={rowIdx:n,colIdx:o},t.selectedColumns.clear();F(),L(),O()}function st(e,n,o,l){if(t.cellEditBehavior==="vscode"){let a=t.tableColumns[o];if(!a)return;let s=t.gridData[n];if(!s)return;let i=P(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},we()}else t.cellEditBehavior==="modal"?K(n,o,l):je(n,o,l)}function it(){document.getElementById("filterInput")?.addEventListener("keyup",He),document.getElementById("pageSizeSelect")?.addEventListener("change",Ge),document.getElementById("dateFormatSelect")?.addEventListener("change",Je),document.getElementById("btnFirst")?.addEventListener("click",()=>Z(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>Z(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>Z(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>Z(t.totalPageCount-1))}function rt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",qt),e.addEventListener("keydown",Kt),e.addEventListener("click",Ht),e.addEventListener("dblclick",Xt),e.addEventListener("mouseover",Yt),e.addEventListener("scroll",Zt,{passive:!0}))}function qt(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&tt(e,n.dataset.column)}}function Kt(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ye(e,n)}}function Ht(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Gt(e,n);return}Jt(e,n)}function Gt(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Ie(l.dataset.column);return}if(n.closest(".header-bottom")||n.closest(".column-filter")){e.stopPropagation();return}if(n.closest(".select-column-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Ze(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Qe(e,l.dataset.column);return}if(n.closest(".row-number-header")){ie(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&Xe(l.dataset.column);return}}function Jt(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=Q(a);et(e,s)}return}if(n.closest(".expand-icon")){let l=n.closest(".data-cell");if(l){let a=parseInt(l.dataset.rowidx,10),s=parseInt(l.dataset.colidx,10),i=Q(l.closest(".data-row").dataset.rowid);K(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=Q(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);lt(e,a,s)}return}let o=n.closest(".data-cell");if(o){let l=parseInt(o.dataset.rowidx,10),a=parseInt(o.dataset.colidx,10),s=o.closest(".data-row"),i=Q(s.dataset.rowid);at(e,l,a,i);return}}function Xt(e){if(t.isGridReloading)return;let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("row-number")){let o=parseInt(n.dataset.rowidx,10),l=parseInt(n.dataset.colidx,10),a=n.closest(".data-row"),s=Q(a.dataset.rowid);st(e,o,l,s)}}function Yt(e){let n=e.target.closest(".data-cell");if(n&&!n.classList.contains("checked-overflow")){let o=n.querySelector(".cell-text");if(o){let l=o.scrollWidth>o.clientWidth;n.classList.toggle("has-overflow",l),n.classList.add("checked-overflow")}}}function Zt(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,M()}function Q(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}function ct(){document.addEventListener("click",e=>{let n=e.target,o=n.closest(".modal-close, .modal-cancel");if(o){let l=o.dataset.modal;l&&U(l)}n.classList.contains("modal-overlay")&&n.classList.add("hidden")}),document.addEventListener("keydown",e=>{if(e.key==="Escape"){let n=document.querySelector(".modal-overlay:not(.hidden)");n&&(n.classList.add("hidden"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation())}})}function j(e){let n=document.getElementById(e);if(n){n.classList.remove("hidden");let o=n.querySelector("input, select, textarea, button");o&&o.focus()}}function U(e){let n=document.getElementById(e);n&&n.classList.add("hidden")}function dt(){document.getElementById("btnAddRow")?.addEventListener("click",Qt),document.getElementById("btnDeleteRows")?.addEventListener("click",tn),document.getElementById("btnAddColumn")?.addEventListener("click",sn),document.getElementById("btnSubmitAddRow")?.addEventListener("click",en),document.getElementById("btnSubmitDelete")?.addEventListener("click",re),document.getElementById("btnSubmitCreateTable")?.addEventListener("click",an),document.getElementById("btnAddColumnDef")?.addEventListener("click",()=>pt()),document.getElementById("columnDefinitions")?.addEventListener("click",e=>{let n=e.target.closest(".btn-remove-col");if(n){let o=n.dataset.colid;ln(o)}}),document.getElementById("btnSubmitAddColumn")?.addEventListener("click",rn)}function Qt(){if(!t.selectedTable||t.selectedTableType!=="table")return;let e=document.getElementById("addRowForm");e.replaceChildren(),t.tableColumns.forEach(n=>{let o=n.notnull===1&&!n.isPrimaryKey,l=document.createElement("div");l.className="form-field";let a=document.createElement("label");if(a.textContent=n.name,o){let r=document.createElement("span");r.style.color="var(--error-color)",r.textContent="*",a.appendChild(document.createTextNode(" ")),a.appendChild(r)}let s=document.createElement("span");s.style.opacity="0.5",s.textContent=` (${n.type})`,a.appendChild(document.createTextNode(" ")),a.appendChild(s);let i=document.createElement("input");i.type="text",i.dataset.column=n.name,i.dataset.required=o.toString(),n.isPrimaryKey?(i.placeholder="Auto (Primary Key)",i.disabled=!0):o?i.placeholder="Required":i.placeholder="NULL",l.appendChild(a),l.appendChild(i),e.appendChild(l)}),j("addRowModal")}async function en(){let e=document.querySelectorAll("#addRowForm input[data-column]:not([disabled])"),n=[];for(let l of e){let a=l.dataset.column,s=l.value.trim();l.dataset.required==="true"&&(s===""||s.toLowerCase()==="null")?(n.push(a),l.style.borderColor="var(--error-color)"):l.style.borderColor=""}if(n.length>0){u(`Required fields missing: ${n.join(", ")}`);return}let o={};for(let l of e){let a=l.dataset.column,s=l.value.trim();s!==""&&(s.toLowerCase()==="null"?o[a]=null:!isNaN(Number(s))&&s!==""?o[a]=Number(s):o[a]=s)}try{u("Inserting row..."),await x.insertRow(t.selectedTable,o),U("addRowModal"),await v(),u("Row inserted - Ctrl+S to save")}catch(l){console.error("Insert failed:",l),u(`Error: ${l.message}`)}}function tn(){if(t.selectedColumns.size>0){let e=Array.from(t.selectedColumns);document.getElementById("deleteConfirmText").textContent=`Are you sure you want to delete ${e.length} column${e.length>1?"s":""} (${e.join(", ")})? This will permanently remove the column${e.length>1?"s":""} and all their data.`}else if(t.selectedRowIds.size>0)document.getElementById("deleteConfirmText").textContent=`Are you sure you want to delete ${t.selectedRowIds.size} row${t.selectedRowIds.size>1?"s":""}?`;else return;j("deleteModal")}async function re(){t.selectedColumns.size>0?await on():t.selectedRowIds.size>0&&await nn()}async function nn(){if(t.selectedRowIds.size===0)return;let e=Array.from(t.selectedRowIds);try{u("Deleting rows..."),await x.deleteRows(t.selectedTable,e),U("deleteModal"),t.selectedRowIds.clear(),await v(),L(),u(`Deleted ${e.length} row${e.length>1?"s":""} - Ctrl+S to save`)}catch(n){console.error("Delete rows failed:",n),u(`Error: ${n.message}`)}}async function on(){if(t.selectedColumns.size===0)return;let e=Array.from(t.selectedColumns);try{u("Deleting columns...");let n=await x.deleteColumns(t.selectedTable,e);if(n&&n.cancelled){u("Delete cancelled"),U("deleteModal");return}U("deleteModal"),t.selectedColumns.clear(),t.selectedCells=[],t.lastSelectedCell=null,await V(),await q(),await v(),L(),u(`Deleted ${e.length} column${e.length>1?"s":""} - Ctrl+S to save`)}catch(n){console.error("Delete columns failed:",n),u(`Error: ${n.message}`)}}var ut=0;function mt(){document.getElementById("newTableName").value="",document.getElementById("columnDefinitions").replaceChildren(),ut=0,pt(!0),j("createTableModal")}function pt(e=!1){let n=document.getElementById("columnDefinitions"),o=++ut,l=document.createElement("div");l.className="column-def-row",l.id=`colDef_${o}`,Object.assign(l.style,{display:"flex",gap:"8px",marginBottom:"8px",alignItems:"center"});let a=document.createElement("input");a.type="text",a.placeholder="Column name",a.className="col-name",a.style.flex="2",e&&(a.value="id"),l.appendChild(a);let s=document.createElement("select");s.className="col-type",s.style.flex="1",["INTEGER","TEXT","REAL","BLOB","NUMERIC"].forEach(f=>{let p=document.createElement("option");p.value=f,p.textContent=f,e&&f==="INTEGER"&&(p.selected=!0),!e&&f==="TEXT"&&(p.selected=!0),s.appendChild(p)}),l.appendChild(s);let i=document.createElement("label");Object.assign(i.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"});let r=document.createElement("input");r.type="checkbox",r.className="col-pk",r.style.margin="0",e&&(r.checked=!0),i.appendChild(r),i.appendChild(document.createTextNode(" PK")),l.appendChild(i);let c=document.createElement("label");Object.assign(c.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"});let d=document.createElement("input");d.type="checkbox",d.className="col-nn",d.style.margin="0",c.appendChild(d),c.appendChild(document.createTextNode(" NN")),l.appendChild(c);let m=document.createElement("button");m.className="icon-button btn-remove-col",m.dataset.colid=o.toString(),m.title="Remove",e&&(m.disabled=!0);let y=document.createElement("span");y.className="codicon codicon-close",m.appendChild(y),l.appendChild(m),n.appendChild(l)}function ln(e){let n=document.getElementById(`colDef_${e}`);n&&n.remove()}async function an(){let e=document.getElementById("newTableName").value.trim();if(!e){u("Error: Table name is required");return}if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)){u("Error: Invalid table name");return}let n=[],o=document.querySelectorAll(".column-def-row");for(let l of o){let a=l.querySelector(".col-name").value.trim(),s=l.querySelector(".col-type").value,i=l.querySelector(".col-pk").checked,r=l.querySelector(".col-nn").checked;a&&n.push({name:a,type:s,primaryKey:i,notNull:r})}if(n.length===0){u("Error: At least one column is required");return}try{u("Creating table..."),await x.createTable(e,n),U("createTableModal"),await V(),u(`Table "${e}" created - Ctrl+S to save`)}catch(l){console.error("Create table failed:",l),u(`Error: ${l.message}`)}}function sn(){!t.selectedTable||t.selectedTableType!=="table"||(document.getElementById("newColumnName").value="",document.getElementById("newColumnType").value="TEXT",document.getElementById("newColumnDefault").value="",j("addColumnModal"))}async function rn(){let e=document.getElementById("newColumnName").value.trim(),n=document.getElementById("newColumnType").value,o=document.getElementById("newColumnDefault").value.trim();if(!e){u("Error: Column name is required");return}if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)){u("Error: Invalid column name");return}try{u("Adding column..."),await x.addColumn(t.selectedTable,e,n,o),U("addColumnModal"),await q(),await v(),u(`Column "${e}" added - Ctrl+S to save`)}catch(l){console.error("Add column failed:",l),u(`Error: ${l.message}`)}}function ft(){let e=document.getElementById("pragmaSettingsContainer");e&&e.addEventListener("change",n=>{let o=n.target;if(o.matches(".setting-extension")){let l=o.dataset.key,a=o.type==="checkbox"?o.checked:o.value;dn(l,a)}else if(o.matches(".setting-pragma")){let l=o.dataset.name,a=o.dataset.type,s=o.value;a==="number"?s=Number(s):a==="bool"&&(s=s==="true"?1:0),un(l,s)}})}async function gt(){let e=document.getElementById("settingsModal");e&&(e.classList.remove("hidden"),await ve())}async function ve(){let e=document.getElementById("pragmaSettingsContainer");e.textContent="Loading settings...";try{let[n,o]=await Promise.all([x.getPragmas(),x.getExtensionSettings()]);cn(n,o)}catch(n){console.error("Failed to load settings:",n),e.textContent=`Error loading settings: ${n.message}`,e.style.color="var(--error-color)"}}function cn(e,n){let o=document.getElementById("pragmaSettingsContainer");if(!o)return;let l=(h,C)=>h.map(A=>{let R=String(A),N=String(C).toUpperCase()===R.toUpperCase(),k=document.createElement("option");return k.value=R,k.selected=N,k.textContent=R,k});o.replaceChildren();let a=h=>{let C=document.createElement("div");C.className="setting-section-title",Object.assign(C.style,{fontWeight:"600",marginBottom:"8px",paddingBottom:"4px",borderBottom:"1px solid var(--border-color)"}),C.textContent=h,o.appendChild(C)},s=(h,C,A)=>{let R=document.createElement("div");R.className="form-field";let w=document.createElement("label");if(C.type==="checkbox"?(Object.assign(w.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"}),C.style.margin="0",w.appendChild(C),w.appendChild(document.createTextNode(h)),R.appendChild(w)):(w.textContent=h,R.appendChild(w),R.appendChild(C)),A){let N=document.createElement("div");N.className="setting-desc",N.textContent=A,R.appendChild(N)}o.appendChild(R)};if(o.children.length>0){let h=document.createElement("div");h.style.height="16px",o.appendChild(h)}a("Extension Settings");let i=document.createElement("input");i.type="checkbox",i.className="setting-extension",i.dataset.key="autoCommit",i.checked=!!n.autoCommit,s("Auto-Commit Changes",i,"Automatically save changes to disk immediately. If disabled, you must save manually (Ctrl+S).");let r=document.createElement("select");r.className="setting-extension",r.dataset.key="doubleClickBehavior",l(["inline","modal","vscode"],n.cellEditBehavior).forEach(h=>r.appendChild(h)),s("Double Click Behavior",r,"Action when double-clicking a cell");let c=document.createElement("div");c.style.height="16px",o.appendChild(c),a("SQLite Settings (Pragmas)");let d=document.createElement("select");d.className="setting-pragma",d.dataset.name="journal_mode",l(["DELETE","TRUNCATE","PERSIST","MEMORY","WAL","OFF"],e.journal_mode).forEach(h=>d.appendChild(h)),s("Journal Mode",d,"Database journaling mode (WAL is recommended for concurrency)");let m=document.createElement("select");m.className="setting-pragma",m.dataset.name="foreign_keys",m.dataset.type="bool";let y=document.createElement("option");y.value="true",y.textContent="ON";let f=document.createElement("option");f.value="false",f.textContent="OFF",Number(e.foreign_keys)===1?y.selected=!0:f.selected=!0,m.appendChild(y),m.appendChild(f),s("Foreign Keys",m,"Enforce foreign key constraints");let p=document.createElement("select");p.className="setting-pragma",p.dataset.name="synchronous",p.dataset.type="number",[{v:0,t:"OFF (0)"},{v:1,t:"NORMAL (1)"},{v:2,t:"FULL (2)"},{v:3,t:"EXTRA (3)"}].forEach(h=>{let C=document.createElement("option");C.value=h.v,C.textContent=h.t,Number(e.synchronous)===h.v&&(C.selected=!0),p.appendChild(C)}),s("Synchronous",p,"Disk synchronization safety level");let g=document.createElement("select");g.className="setting-pragma",g.dataset.name="locking_mode",l(["NORMAL","EXCLUSIVE"],e.locking_mode).forEach(h=>g.appendChild(h)),s("Locking Mode",g,"");let b=document.createElement("select");b.className="setting-pragma",b.dataset.name="auto_vacuum",b.dataset.type="number",[{v:0,t:"NONE (0)"},{v:1,t:"FULL (1)"},{v:2,t:"INCREMENTAL (2)"}].forEach(h=>{let C=document.createElement("option");C.value=h.v,C.textContent=h.t,Number(e.auto_vacuum)===h.v&&(C.selected=!0),b.appendChild(C)}),s("Auto Vacuum",b,"");let E=document.createElement("input");E.type="number",E.className="setting-pragma",E.dataset.name="cache_size",E.dataset.type="number",E.value=e.cache_size,s("Cache Size",E,"Number of pages (positive) or kilobytes (negative)")}async function dn(e,n){try{await x.updateExtensionSetting(e,n),u(`Updated ${e}`)}catch(o){console.error(`Failed to set ${e}:`,o),u(`Error: ${o.message}`),await ve()}}async function un(e,n){try{u(`Updating ${e}...`),await x.setPragma(e,n),u(`Updated ${e}`)}catch(o){console.error(`Failed to set ${e}:`,o),u(`Error: ${o.message}`),await ve()}}function ht(e,n){let o=new Map;for(let l of e){let a=n&&n[l.colIdx];a&&(o.has(l.colIdx)||o.set(l.colIdx,{name:a.name,type:a.type,values:new Set}),o.get(l.colIdx).values.add(l.value))}return o}function yt(e){let n=Array.from(e||[]);if(n.length===0)return"";if(n.length>1)return"(mixed values)";let o=n[0];return o===null?"NULL":o instanceof Uint8Array?"[BLOB]":String(o)}function Ct(e,n,o){let l=[];for(let a of e){let s=n.get(a.colIdx);if(!s)continue;let i=s.dataset||{},r=i.isnull==="true",c=i.ispatch==="true",d=s.value;if(d===""&&!r)continue;let m=o&&o[a.colIdx];if(!m)continue;let y=d,f="set";if(r)y=null;else if(c)f="json_patch";else{let p=(m.type||"").toUpperCase();(p==="INTEGER"||p==="REAL"||p==="NUMERIC")&&!isNaN(Number(d))&&d.trim()!==""&&(y=Number(d))}l.push({rowId:a.rowId,column:m.name,value:y,originalValue:a.value,operation:f,rowIdx:a.rowIdx,colIdx:a.colIdx})}return l}function bt(){let e=document.getElementById("sidebarPanel");if(!e)return;let n=document.getElementById("sidebarFilterInput");n&&n.addEventListener("input",()=>{t.sidebarFilter=n.value,Be()}),e.addEventListener("click",o=>{let l=o.target;if(l.closest("#btnOpenSettings")){gt();return}if(l.closest("#btnOpenCreateTable")){o.stopPropagation(),mt();return}if(l.closest("#btnReload")){Cn();return}if(l.closest("#btnApplyBatchUpdate")){pn();return}let a=l.closest(".list-item");if(a){let c=a.dataset.name,d=a.dataset.type;if(c&&d){yn(c,d);return}}let s=l.closest(".section-title");if(s){if(l.closest(".icon-button")||s.id==="btnOpenSettings")return;let c=s.dataset.section;c&&hn(c)}let i=l.closest(".btn-batch-null");if(i){let c=i.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);fn(d)}return}let r=l.closest(".btn-batch-patch");if(r){let c=r.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);gn(d,r)}return}})}async function V(){if(t.isDbConnected)try{let e=await x.fetchSchema();t.schemaCache.tables=(e.tables||[]).map(n=>({name:n.identifier})),t.schemaCache.views=(e.views||[]).map(n=>({name:n.identifier})),t.schemaCache.indexes=(e.indexes||[]).map(n=>({name:n.identifier,table:n.parentTable})),Be()}catch(e){console.error("Error loading schema:",e),u("Error loading schema")}}function Se(e,n){return n?e.filter(o=>o.name.toLowerCase().includes(n)):e}function Te(e,n,o,l){let a=document.getElementById(e);a&&(a.textContent=l?`${n}/${o}`:o)}function xt(e,n,o,l,a){let s=document.getElementById(e);if(!s)return;if(s.replaceChildren(),n.length===0){let r=document.createElement("li");r.className="list-item",r.style.opacity="0.5",r.textContent=a,s.appendChild(r);return}let i=document.createDocumentFragment();n.forEach(r=>{let c=document.createElement("li");c.className="list-item",t.selectedTable===r.name&&t.selectedTableType===o&&c.classList.add("selected"),c.dataset.name=r.name,o&&(c.dataset.type=o),c.title=r.name;let d=document.createElement("span");d.className=`item-icon codicon ${l}`,c.appendChild(d);let m=document.createElement("span");m.className="item-name",m.textContent=r.name,c.appendChild(m),i.appendChild(c)}),s.appendChild(i)}function mn(e,n,o){let l=document.getElementById(e);if(!l)return;if(l.replaceChildren(),n.length===0){let s=document.createElement("li");s.className="list-item",s.style.opacity="0.5",s.textContent=o,l.appendChild(s);return}let a=document.createDocumentFragment();n.forEach(s=>{let i=document.createElement("li");i.className="list-item",i.title=`${s.name} on ${s.table}`;let r=document.createElement("span");r.className="item-icon codicon codicon-list-selection",i.appendChild(r);let c=document.createElement("div");c.className="item-content";let d=document.createElement("span");d.className="item-name",d.textContent=s.name,c.appendChild(d);let m=document.createElement("span");m.className="item-detail",m.textContent=s.table,c.appendChild(m),i.appendChild(c),a.appendChild(i)}),l.appendChild(a)}function Be(){let e=t.sidebarFilter.toLowerCase(),n=e.length>0,o=Se(t.schemaCache.tables,e),l=Se(t.schemaCache.views,e),a=Se(t.schemaCache.indexes,e);Te("tablesBadge",o.length,t.schemaCache.tables.length,n),Te("viewsBadge",l.length,t.schemaCache.views.length,n),Te("indexesBadge",a.length,t.schemaCache.indexes.length,n),xt("tablesList",o,"table","codicon-table",e?"No matching tables":"No tables"),xt("viewsList",l,"view","codicon-eye",e?"No matching views":"No views"),mn("indexesList",a,e?"No matching indexes":"No indexes")}function O(){let e=document.getElementById("batchUpdateSectionTitle"),n=document.getElementById("batchUpdateList"),o=document.getElementById("batchUpdateCount"),l=document.getElementById("batchUpdateFields");if(!e||!n||!o||!l)return;let a=t.selectedCells.length;if(a===0){e.classList.add("hidden"),n.classList.add("hidden");return}e.classList.remove("hidden"),n.classList.remove("hidden"),e.classList.remove("collapsed"),o.textContent=a;let s=ht(t.selectedCells,t.tableColumns);l.replaceChildren();let i=document.createDocumentFragment();for(let[r,c]of s){let d=yt(c.values),m=document.createElement("div");m.className="form-field batch-field",m.dataset.colidx=r,m.style.marginBottom="8px";let y=document.createElement("label");y.style.fontSize="11px",y.style.color="var(--text-secondary)";let f=document.createTextNode(c.name+" ");y.appendChild(f);let p=document.createElement("span");p.style.opacity="0.7",p.textContent=c.type||"",y.appendChild(p),m.appendChild(y);let g=document.createElement("div");g.style.display="flex",g.style.gap="4px";let b=document.createElement("input");b.type="text",b.className="batch-input",b.placeholder=d,b.dataset.colidx=r,b.style.flex="1",b.style.minWidth="0",g.appendChild(b);let E=document.createElement("button");E.className="btn-secondary btn-batch-null",E.style.padding="2px 6px",E.title="Set to NULL",E.textContent="NULL",g.appendChild(E);let h=document.createElement("button");h.className="btn-secondary btn-batch-patch",h.style.padding="2px 6px",h.title="JSON Patch",h.textContent="{}",g.appendChild(h),m.appendChild(g),i.appendChild(m)}l.appendChild(i)}async function pn(){if(t.selectedCells.length===0)return;let e=document.querySelectorAll(".batch-input"),n=new Map;for(let l of e){let a=parseInt(l.dataset.colidx,10);if(n.set(a,l),l.dataset.ispatch==="true")try{JSON.parse(l.value)}catch{let i=t.tableColumns[a];u(`Invalid JSON for patch in ${i?.name??`column ${a}`}`);return}}let o=Ct(t.selectedCells,n,t.tableColumns);if(o.length===0){u("No values entered for batch update");return}try{u(`Updating ${o.length} cells...`);let l=`Batch update ${o.length} cells`,a=o.map(r=>({rowId:r.rowId,column:r.column,value:r.value,originalValue:r.originalValue,operation:r.operation}));if(await x.updateCellBatch(t.selectedTable,a,l),!o.some(r=>r.operation==="json_patch"))for(let r of o)t.gridData[r.rowIdx][r.colIdx+B()]=r.value;await v(!1);let i=[];for(let r of t.selectedCells){let c=t.gridData[r.rowIdx][r.colIdx+B()];i.push({...r,value:c})}t.selectedCells=i,O(),u("Batch update completed")}catch(l){console.error("Batch update failed:",l),u(`Batch update failed: ${l.message}`)}}function fn(e){let n=document.querySelector(`.batch-input[data-colidx="${e}"]`),o=document.querySelector(`.batch-field[data-colidx="${e}"] .btn-batch-patch`);n&&(n.value="",n.placeholder="SET TO NULL",n.dataset.isnull="true",n.dataset.ispatch="false",n.style.fontStyle="italic",o&&(o.style.background="",o.style.color=""))}function gn(e,n){let o=document.querySelector(`.batch-input[data-colidx="${e}"]`);o&&(o.dataset.ispatch==="true"?(o.dataset.ispatch="false",o.placeholder="(mixed values)",n.style.background="",n.style.color=""):(o.dataset.ispatch="true",o.dataset.isnull="false",o.placeholder='JSON Patch (e.g. {"a": 1})',o.style.fontStyle="normal",n.style.background="var(--accent-color)",n.style.color="white"))}function hn(e){let n=document.getElementById(`${e}List`),o=document.querySelector(`.section-title[data-section="${e}"]`);n&&o&&(n.classList.toggle("hidden"),o.classList.toggle("collapsed"))}async function yn(e,n){t.selectedTable=e,t.selectedTableType=n,t.currentPageIndex=0,t.sortedColumn=null,t.sortAscending=!0,t.filterQuery="",t.columnFilters={},t.selectedRowIds.clear(),t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),t.pinnedColumns.clear(),t.pinnedRowIds.clear(),t.columnWidths={},t.scrollPosition={top:0,left:0},Be();let o=document.getElementById("tableNameLabel");o&&(o.textContent=e);let l=document.getElementById("filterInput");l&&(l.value=""),await q(),await v(!0,!1),M()}async function Cn(){if(t.isDbConnected)try{u("Reloading..."),await x.refreshFile(),await V(),t.selectedTable&&(await q(),await v()),u("Reloaded")}catch(e){console.error("Reload failed:",e),u(`Reload failed: ${e.message}`)}}function wt(){document.getElementById("btnExport")?.addEventListener("click",xn),document.getElementById("btnSubmitExport")?.addEventListener("click",bn),document.getElementById("exportFormat")?.addEventListener("change",Et)}function xn(){if(!t.selectedTable)return;let e=document.getElementById("exportFormat");e&&(e.value="csv");let n=document.getElementById("exportColumns");n&&(n.replaceChildren(),t.tableColumns.forEach(o=>{let l=document.createElement("div"),a=document.createElement("label");Object.assign(a.style,{display:"flex",alignItems:"center",gap:"3px",marginBottom:"4px",fontSize:"13px",cursor:"pointer"});let s=document.createElement("input");s.type="checkbox",s.className="export-col-check",s.value=o.name,s.checked=!0,s.style.margin="0",a.appendChild(s),a.appendChild(document.createTextNode(o.name)),n.appendChild(a)})),Et(),j("exportModal")}function Et(){let e=document.getElementById("exportFormat").value,n=document.getElementById("exportOptions");if(n.replaceChildren(),e==="csv"||e==="excel"){let o=document.createElement("label");Object.assign(o.style,{display:"flex",alignItems:"center",gap:"3px",marginBottom:"4px",fontSize:"13px",cursor:"pointer"});let l=document.createElement("input");l.type="checkbox",l.id="exportHeader",l.checked=!0,l.style.margin="0",o.appendChild(l),o.appendChild(document.createTextNode(" Include Headers")),n.appendChild(o)}else if(e==="sql"){let o=document.createElement("label");Object.assign(o.style,{display:"flex",alignItems:"center",gap:"3px",marginBottom:"4px",fontSize:"13px",cursor:"pointer"});let l=document.createElement("input");l.type="checkbox",l.id="exportTableName",l.checked=!0,l.style.margin="0",o.appendChild(l),o.appendChild(document.createTextNode(" Include Table Name")),n.appendChild(o)}}async function bn(){let e=document.getElementById("exportFormat").value,n=document.querySelectorAll(".export-col-check:checked"),o=Array.from(n).map(a=>a.value);if(o.length===0){u("Error: Select at least one column");return}let l={};if(e==="csv"||e==="excel"?l.header=document.getElementById("exportHeader")?.checked??!0:e==="sql"&&(l.includeTableName=document.getElementById("exportTableName")?.checked??!0),t.selectedTableType==="table"){let a=Array.from(t.selectedRowIds);a.length>0&&(l.rowIds=a)}try{u("Exporting..."),U("exportModal"),await x.exportTable({table:t.selectedTable},o,null,null,{format:e,...l}),u("Export initiated")}catch(a){console.error("Export failed:",a),u(`Export failed: ${a.message}`)}}async function It(){if(t.selectedCells.length!==0)try{let e;if(t.selectedCells.length===1){let n=t.selectedCells[0].value;n==null?e="":n instanceof Uint8Array?e="[BLOB]":e=String(n)}else{let n=[...new Set(t.selectedCells.map(s=>s.rowIdx))].sort((s,i)=>s-i),o=[...new Set(t.selectedCells.map(s=>s.colIdx))].sort((s,i)=>s-i),l=new Map;for(let s of t.selectedCells)l.set(`${s.rowIdx},${s.colIdx}`,s.value);let a=[];for(let s of n){let i=[];for(let r of o){let c=`${s},${r}`,d=l.has(c)?l.get(c):"";d==null?d="":d instanceof Uint8Array?d="[BLOB]":(d=String(d),d=d.replace(/\t/g," ").replace(/\n/g," ")),i.push(d)}a.push(i.join(" "))}e=a.join(` `)}await navigator.clipboard.writeText(e),u(`Copied ${t.selectedCells.length} cell${t.selectedCells.length>1?"s":""}`)}catch(e){console.error("Copy failed:",e),u("Copy failed: "+e.message)}}async function vt(){if(t.selectedRowIds.size!==0)try{let e=[];for(let l=0;lc==null?"":c instanceof Uint8Array?"[BLOB]":String(c));e.push(r.join(" "))}}let o=[t.tableColumns.map(l=>l.name).join(" "),...e].join(` `);await navigator.clipboard.writeText(o),u(`Copied ${e.length} row${e.length>1?"s":""} to clipboard`)}catch(e){console.error("Copy failed:",e),u("Copy failed: "+e.message)}}async function St(){if(t.selectedCells.length!==0){if(t.selectedTableType!=="table"){u("Views are read-only");return}try{u("Clearing cells...");let e=[];for(let o of t.selectedCells){let l=t.tableColumns[o.colIdx];if(!l)continue;let s=l.notnull===1?"":null;e.push({rowId:o.rowId,column:l.name,value:s,originalValue:o.value,rowIdx:o.rowIdx,colIdx:o.colIdx})}let n=`Clear ${e.length} cell${e.length>1?"s":""}`;await x.updateCellBatch(t.selectedTable,e,n);for(let o of e)t.gridData[o.rowIdx][o.colIdx+B()]=o.value;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),await v(),L(),u(`${n} - Ctrl+S to save`)}catch(e){console.error("Clear cells failed:",e),u(`Clear failed: ${e.message}`)}}}var ce=50*1024*1024,Re=!1;function Tt(){let e=document.getElementById("gridContainer");if(!e){console.error("gridContainer not found");return}document.addEventListener("dragover",n=>n.preventDefault()),document.addEventListener("drop",n=>n.preventDefault()),e.addEventListener("dragover",wn),e.addEventListener("dragleave",En),e.addEventListener("drop",In)}var D=null;function wn(e){if(e.preventDefault(),t.isGridReloading){D&&(D.classList.remove("drag-over"),D=null);return}e.dataTransfer.dropEffect="copy";let n=e.target.closest(".data-cell");n&&!n.classList.contains("row-number")?(D&&D!==n&&D.classList.remove("drag-over"),n.classList.add("drag-over"),D=n):D&&(D.classList.remove("drag-over"),D=null)}function En(e){e.target}async function In(e){if(e.preventDefault(),D&&(D.classList.remove("drag-over"),D=null),t.isGridReloading)return;let n=e.target.closest(".data-cell");if(!n||n.classList.contains("row-number"))return;if(e.dataTransfer.files.length>0){let l=e.dataTransfer.files[0];await vn(n,l.name,l);return}let o=e.dataTransfer.getData("text/uri-list");if(o){let l=o.split(/\r?\n/);if(l.length>0&&l[0]){let a=l[0],s="unknown_file";try{let i=a.split("/");s=decodeURIComponent(i[i.length-1])}catch(i){console.warn("Failed to parse name from URI",i)}await Sn(n,s,a);return}}}async function vn(e,n,o){if(o.size>ce){let l=(o.size/1048576).toFixed(1),a=(ce/(1024*1024)).toFixed(0);u(`File too large (${l}MB). Maximum is ${a}MB.`);return}try{u(`Reading ${n}...`);let l=await Tn(o),a=new Uint8Array(l);await Bt(e,n,a)}catch(l){console.error("File read failed:",l),u(`File read failed: ${l.message}`)}}async function Sn(e,n,o){try{u(`Fetching ${n}...`);let l=await x.readWorkspaceFileUri(o),a;if(l instanceof Uint8Array)a=l;else if(l&&l.type==="Buffer"&&Array.isArray(l.data))a=new Uint8Array(l.data);else if(l&&typeof l=="object"&&Object.keys(l).some(s=>!isNaN(s)))a=new Uint8Array(Object.values(l));else throw console.error("Unknown data format from backend:",l),new Error("Received invalid data format from backend");await Bt(e,n,a)}catch(l){console.error("URI upload failed:",l),u(`Upload failed: ${l.message}`)}}async function Bt(e,n,o){if(Re){u("Upload already in progress...");return}if(o.byteLength>ce){let c=(o.byteLength/1048576).toFixed(1),d=(ce/(1024*1024)).toFixed(0);u(`File too large (${c}MB). Maximum is ${d}MB.`);return}let l=parseInt(e.dataset.rowidx,10),a=parseInt(e.dataset.colidx,10);if(!t.gridData)return;let s=t.gridData[l];if(!s)return;let i=T(s,l),r=t.tableColumns[a];if(t.selectedTableType!=="table"){u("Cannot upload to a view");return}Re=!0,t.isLoadingData=!0;try{u(`Uploading ${n} (${Bn(o.byteLength)})...`);let c=s[a+B()];await x.updateCell(t.selectedTable,i,r.name,o,c),t.gridData[l][a+B()]=o,Rn(e,o),u(`Uploaded ${n}`)}catch(c){console.error("Upload failed:",c);let d=c.message||String(c);d.includes("timeout")&&(d="Upload timed out. Try a smaller file."),u(`Upload failed: ${d}`)}finally{Re=!1,t.isLoadingData=!1}}function Tn(e){return new Promise((n,o)=>{let l=new FileReader;l.onload=()=>n(l.result),l.onerror=()=>o(l.error),l.readAsArrayBuffer(e)})}function Bn(e){if(e===0)return"0 B";let n=1024,o=["B","KB","MB","GB"],l=Math.floor(Math.log(e)/Math.log(n));return parseFloat((e/Math.pow(n,l)).toFixed(2))+" "+o[l]}function Rn(e,n){let o=_(n);e.textContent="";let l=document.createElement("span");l.className="cell-text",l.textContent=o,e.appendChild(l);let a=document.createElement("span");a.className="expand-icon codicon codicon-link-external",a.title="View full content",e.appendChild(a),e.classList.remove("null-value")}var Rt={async refreshContent(e){return t.isDbConnected&&(await V(),!(t.schemaCache.tables.some(o=>o.name===t.selectedTable)||t.schemaCache.views.some(o=>o.name===t.selectedTable))&&t.selectedTable?(t.selectedTable=null,t.selectedTableType=null,document.getElementById("tableNameLabel").textContent="No table selected",xe()):t.selectedTable&&await v(!1)),{success:!0}},async updateColorScheme(e){return document.documentElement.style.colorScheme=e,{success:!0}},async updateCellEditBehavior(e){return t.cellEditBehavior=e,{success:!0}}};function Ln(){window.addEventListener("message",e=>{let n=e.data;if(n&&n.kind==="invoke"){let{correlationId:l,methodName:a,parameters:s}=n,i=Rt[a];typeof i=="function"?Promise.resolve(i.apply(Rt,s||[])).then(r=>{Ae(l,r)}).catch(r=>{ye(l,r instanceof Error?r.message:String(r))}):ye(l,`Unknown method: ${a}`);return}if(!n||n.channel!=="rpc")return;let o=n.content;o&&o.kind==="response"&&ke(o)})}Ln();async function Pn(){try{bt(),dt(),wt(),ct(),ft(),ze(),it(),rt(),Me(),Tt();let e=document.getElementById("openInVsCodeBtn");e&&(e.style.display="none"),u("Connecting to database...");let n=await x.initialize();t.isDbConnected=!0,await x.ping(),await V(),u("Ready"),xe(),document.addEventListener("keydown",async o=>{if(o.key==="Escape"&&!t.editingCellInfo&&!document.querySelector(".modal-overlay:not(.hidden)")&&oe(),(o.metaKey||o.ctrlKey)&&o.key==="c"){if(t.editingCellInfo||document.activeElement.tagName==="INPUT")return;t.selectedCells.length>0?(o.preventDefault(),await It()):t.selectedRowIds.size>0&&(o.preventDefault(),await vt())}if((o.metaKey||o.ctrlKey)&&o.key==="a"){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT")return;t.selectedTable&&(o.preventDefault(),ie(o))}if((o.metaKey||o.ctrlKey)&&(o.key==="Delete"||o.key==="Backspace")){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT"||document.activeElement.tagName==="TEXTAREA")return;t.selectedTable&&t.selectedTableType==="table"&&(o.preventDefault(),t.selectedColumns.size>0?await re():t.selectedRowIds.size>0?await re():t.selectedCells.length>0&&await St())}})}catch(e){console.error("Init error:",e),ne(e.message)}}Pn();})();