From e8addb85a83aa8755277e09958dce3dd89f48414 Mon Sep 17 00:00:00 2001 From: Yukina Date: Sun, 21 Jun 2026 10:23:55 +0700 Subject: [PATCH 1/5] feat: implement cell match navigation via Enter key --- core/ui/modules/grid-actions.js | 60 +++++++++--- core/ui/modules/grid-events.js | 6 +- core/ui/modules/grid-render.js | 19 +++- core/ui/modules/match-nav.js | 114 +++++++++++++++++++++++ core/ui/modules/state.js | 10 +- core/ui/viewer.css | 69 +++++++++++++- core/ui/viewer.html | 43 +++++---- core/ui/viewer.template.html | 8 +- website/public/sqlite-viewer/viewer.html | 39 +++++--- 9 files changed, 314 insertions(+), 54 deletions(-) create mode 100644 core/ui/modules/match-nav.js diff --git a/core/ui/modules/grid-actions.js b/core/ui/modules/grid-actions.js index fb9c59f..530ff4d 100644 --- a/core/ui/modules/grid-actions.js +++ b/core/ui/modules/grid-actions.js @@ -6,20 +6,35 @@ import { updateToolbarButtons } from './ui.js'; import { updateBatchSidebar } from './sidebar.js'; import { getRowId, getCellValue } from './data-utils.js'; import { openCellPreview, startCellEdit, openCellInVsCode } from './edit.js'; - -export function onFilterChange() { - clearTimeout(state.filterTimer); - state.filterTimer = setTimeout(() => { - state.filterQuery = document.getElementById('filterInput').value; +import { navigateMatches, resetMatchNav } from './match-nav.js'; + +/** + * Apply the global filter and jump to a match. The filter is only run when the + * user submits (Enter / Search button) — there is no filter-as-you-type. If the + * term is unchanged the grid already reflects it, so we skip the refetch and + * just advance to the next match. + */ +export async function applyGlobalFilter(direction = 1) { + const value = document.getElementById('filterInput').value; + if (value !== state.filterQuery) { + state.filterQuery = value; state.currentPageIndex = 0; - loadTableData(); + resetMatchNav(); + await loadTableData(); persistState(); - }, 300); + } + navigateMatches('global', direction); +} + +export function onFilterEnter(event) { + // Enter jumps to the next match, Shift+Enter to the previous one. + if (event.key === 'Enter') applyGlobalFilter(event.shiftKey ? -1 : 1); } export function onPageSizeChange() { state.rowsPerPage = parseInt(document.getElementById('pageSizeSelect').value, 10); state.currentPageIndex = 0; + resetMatchNav(); loadTableData(); persistState(); } @@ -37,6 +52,7 @@ export function goToPage(pageIndex) { if (pageIndex >= 0 && pageIndex < state.totalPageCount) { state.currentPageIndex = pageIndex; state.scrollPosition = { top: 0, left: 0 }; + resetMatchNav(); loadTableData(true, false); } } @@ -54,23 +70,41 @@ export function onColumnSort(columnName) { state.sortedColumn = null; state.sortAscending = true; } + resetMatchNav(); loadTableData(); persistState(); } -export function applyColumnFilter(columnName) { +/** + * Apply a column filter and jump to a match. Like the global filter, this only + * runs on submit (Enter / Search button). When the term changed we refetch and + * restore focus to the (rebuilt) input so the user can keep pressing Enter to + * cycle through matches; when unchanged we just advance to the next match. + */ +export async function applyColumnFilter(columnName, direction = 1) { const input = document.querySelector(`.column-filter[data-column="${columnName}"]`); - if (input) { + if (!input) return; + + const changed = input.value !== (state.columnFilters[columnName] || ''); + if (changed) { state.columnFilters[columnName] = input.value; state.currentPageIndex = 0; - loadTableData(); + resetMatchNav(); + await loadTableData(); + // loadTableData() rebuilds the header, so the input we focused is gone. + // Re-focus the freshly rendered one and place the caret at the end. + const newInput = document.querySelector(`.column-filter[data-column="${columnName}"]`); + if (newInput) { + newInput.focus(); + newInput.setSelectionRange(newInput.value.length, newInput.value.length); + } } + navigateMatches(columnName, direction); } export function onColumnFilterKeydown(event, columnName) { - if (event.key === 'Enter') { - applyColumnFilter(columnName); - } + // Enter jumps to the next match, Shift+Enter to the previous one. + if (event.key === 'Enter') applyColumnFilter(columnName, event.shiftKey ? -1 : 1); } // Column Selection diff --git a/core/ui/modules/grid-events.js b/core/ui/modules/grid-events.js index d7c0b1a..f30af67 100644 --- a/core/ui/modules/grid-events.js +++ b/core/ui/modules/grid-events.js @@ -1,7 +1,8 @@ import { state, persistState } from './state.js'; import { goToPage, - onFilterChange, + applyGlobalFilter, + onFilterEnter, onPageSizeChange, onDateFormatChange, startColumnResize, @@ -19,7 +20,8 @@ import { import { openCellPreview } from './edit.js'; export function initGridControls() { - document.getElementById('filterInput')?.addEventListener('keyup', onFilterChange); + document.getElementById('filterInput')?.addEventListener('keydown', onFilterEnter); + document.getElementById('btnApplyFilter')?.addEventListener('click', applyGlobalFilter); document.getElementById('pageSizeSelect')?.addEventListener('change', onPageSizeChange); document.getElementById('dateFormatSelect')?.addEventListener('change', onDateFormatChange); diff --git a/core/ui/modules/grid-render.js b/core/ui/modules/grid-render.js index 60f0b11..dad47fa 100644 --- a/core/ui/modules/grid-render.js +++ b/core/ui/modules/grid-render.js @@ -62,6 +62,9 @@ function createTableHeader(rowNumWidth, orderedColumns, pinnedColumnOffsets) { const keyIcon = col.isPrimaryKey ? '' : ''; const pinClass = isPinned ? 'pinned' : ''; const pinTitle = isPinned ? 'Unpin column' : 'Pin column'; + const matchCounterText = state.matchNav.scope === col.name && state.matchNav.matches.length > 0 + ? `${state.matchNav.currentIndex + 1}/${state.matchNav.matches.length}` + : ''; th.innerHTML = `
@@ -71,8 +74,11 @@ function createTableHeader(rowNumWidth, orderedColumns, pinnedColumnOffsets) {
- - +
+ + ${matchCounterText} +
+
@@ -86,6 +92,10 @@ function createTableHeader(rowNumWidth, orderedColumns, pinnedColumnOffsets) { function createTableBody(orderedColumns, columnIndexMap, pinnedColumnOffsets, rowNumWidth, headerHeight, rowHeight, selectedCellKeys, hasActiveFilters) { const tbody = document.createElement('tbody'); + const activeMatch = state.matchNav.currentIndex >= 0 + ? state.matchNav.matches[state.matchNav.currentIndex] + : null; + // Pinned rows logic const pinnedRowsList = []; for (let rowIdx = 0; rowIdx < state.gridData.length; rowIdx++) { @@ -159,10 +169,11 @@ function createTableBody(orderedColumns, columnIndexMap, pinnedColumnOffsets, ro const isColPinned = state.pinnedColumns.has(col.name); const hasContent = !isNull && !(value instanceof Uint8Array); const colWidth = state.columnWidths[col.name] || 120; + const isActiveMatch = !!activeMatch && activeMatch.rowIdx === rowIdx && activeMatch.colIdx === originalColIdx; const td = document.createElement('td'); td.id = `cell-${rowIdx}-${originalColIdx}`; - td.className = `data-cell ${isNull ? 'null-value' : ''} ${isCellSelected ? 'cell-selected' : ''} ${isColPinned ? 'pinned' : ''}`; + td.className = `data-cell ${isNull ? 'null-value' : ''} ${isCellSelected ? 'cell-selected' : ''} ${isColPinned ? 'pinned' : ''} ${isActiveMatch ? 'active-match-cell' : ''}`; td.dataset.rowidx = rowIdx; td.dataset.colidx = originalColIdx; @@ -208,7 +219,7 @@ function createTableBody(orderedColumns, columnIndexMap, pinnedColumnOffsets, ro padding: '20px', color: 'var(--text-secondary)' }); - td.textContent = 'No rows match the current filter. Modify or clear filters above.'; + td.textContent = 'No rows match the current filter.'; tr.appendChild(td); fragment.appendChild(tr); } diff --git a/core/ui/modules/match-nav.js b/core/ui/modules/match-nav.js new file mode 100644 index 0000000..2343e7e --- /dev/null +++ b/core/ui/modules/match-nav.js @@ -0,0 +1,114 @@ +/** + * Filter Match Navigation + * + * Lets the user press Enter in the global filter or a column filter to jump + * between cells whose displayed text contains the active filter term, + * cycling through them with a visible border + a "current / total" counter. + */ +import { state } from './state.js'; +import { getCellValue } from './data-utils.js'; +import { formatCellValueAsText } from './utils.js'; + +function activeTerm(scope) { + return (scope === 'global' ? state.filterQuery : state.columnFilters[scope] || '').trim().toLowerCase(); +} + +function computeMatches(scope, term) { + const matches = []; + if (!term) return matches; + + // Resolve the columns to scan and their data indices once, outside the row loop. + const columnsToScan = []; + state.tableColumns.forEach((col, idx) => { + if (scope === 'global' || col.name === scope) { + columnsToScan.push({ col, colIdx: idx }); + } + }); + + for (let rowIdx = 0; rowIdx < state.gridData.length; rowIdx++) { + const row = state.gridData[rowIdx]; + for (const { col, colIdx } of columnsToScan) { + const value = getCellValue(row, colIdx); + const text = formatCellValueAsText(value, col.type, state.dateFormat, col.name); + if (text.toLowerCase().includes(term)) { + matches.push({ rowIdx, colIdx }); + } + } + } + return matches; +} + +function focusActiveMatch() { + document.querySelectorAll('.active-match-cell').forEach(el => el.classList.remove('active-match-cell')); + + const { matches, currentIndex } = state.matchNav; + if (currentIndex < 0 || currentIndex >= matches.length) return; + + const { rowIdx, colIdx } = matches[currentIndex]; + const cellEl = document.getElementById(`cell-${rowIdx}-${colIdx}`); + if (cellEl) { + cellEl.classList.add('active-match-cell'); + cellEl.scrollIntoView({ block: 'nearest', inline: 'nearest' }); + } +} + +function updateMatchCounterUI() { + const { scope, matches, currentIndex } = state.matchNav; + const counterText = matches.length > 0 ? `${currentIndex + 1}/${matches.length}` : ''; + + const globalCounter = document.getElementById('filterMatchCounter'); + if (globalCounter) { + globalCounter.textContent = scope === 'global' ? counterText : ''; + } + + document.querySelectorAll('.column-filter-counter').forEach(el => { + el.textContent = el.dataset.column === scope ? counterText : ''; + }); +} + +/** + * Move to the next (direction = 1) or previous (direction = -1) match for the + * given scope ('global' or a column name), wrapping around at either end. + * Matches are cached on `state.matchNav` and only recomputed when the scope or + * term changes (a fresh term is detected after `resetMatchNav()` cleared the + * cache), so pressing Enter/Shift+Enter repeatedly is O(matches), not a full + * rescan of every row. + */ +export function navigateMatches(scope, direction = 1) { + const term = activeTerm(scope); + const cacheValid = state.matchNav.scope === scope + && state.matchNav.term === term + && state.matchNav.matches.length > 0; + + if (cacheValid) { + const len = state.matchNav.matches.length; + state.matchNav.currentIndex = (state.matchNav.currentIndex + direction + len) % len; + } else { + const matches = computeMatches(scope, term); + state.matchNav.scope = scope; + state.matchNav.term = term; + state.matchNav.matches = matches; + // Fresh search: forward starts at the first match, backward at the last. + state.matchNav.currentIndex = matches.length === 0 + ? -1 + : (direction === 1 ? 0 : matches.length - 1); + } + + focusActiveMatch(); + updateMatchCounterUI(); +} + +/** + * Clear match navigation state, e.g. when the filter term or grid data + * changes outside of an explicit Enter-to-navigate action (sorting, paging, + * applying a new term) so a stale border/counter isn't left pointing at the + * wrong cell and the cache is invalidated. + */ +export function resetMatchNav() { + state.matchNav.scope = null; + state.matchNav.term = null; + state.matchNav.matches = []; + state.matchNav.currentIndex = -1; + document.querySelectorAll('.active-match-cell').forEach(el => el.classList.remove('active-match-cell')); + updateMatchCounterUI(); +} diff --git a/core/ui/modules/state.js b/core/ui/modules/state.js index 0aee203..1864f64 100644 --- a/core/ui/modules/state.js +++ b/core/ui/modules/state.js @@ -75,7 +75,15 @@ export const state = { // Settings dateFormat: 'raw', // 'raw', 'local', 'iso', 'relative' - cellEditBehavior: 'inline' // 'inline', 'modal', 'vscode' + cellEditBehavior: 'inline', // 'inline', 'modal', 'vscode' + + // Filter match navigation (Enter-to-jump on global/column filters) + matchNav: { + scope: null, // 'global' or a column name + term: null, // the lowercased term the cached matches were computed for + matches: [], // [{ rowIdx, colIdx }] in row/column order + currentIndex: -1 + } }; /** diff --git a/core/ui/viewer.css b/core/ui/viewer.css index f7898e3..f476561 100644 --- a/core/ui/viewer.css +++ b/core/ui/viewer.css @@ -287,12 +287,24 @@ body { cursor: not-allowed; } +/* Groups the filter input + Search button so they sit flush as one control */ +.filter-group { + display: flex; + align-items: stretch; +} + +.filter-input-wrap { + position: relative; + display: inline-flex; + align-items: center; +} + .filter-input { background: var(--bg-tertiary); border: 1px solid var(--border-color); color: var(--text-primary); padding: 4px 8px; - border-radius: 3px; + border-radius: 3px 0 0 3px; font-size: 12px; width: 200px; } @@ -302,6 +314,29 @@ body { border-color: var(--accent-color); } +/* Current/total match counter overlaid at the right edge inside the filter input */ +.filter-match-counter { + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + font-size: 10px; + color: var(--text-secondary); + white-space: nowrap; + pointer-events: none; +} + +/* Reserve room for the counter only when it has content */ +.filter-input-wrap:has(.filter-match-counter:not(:empty)) .filter-input { + padding-right: 38px; +} + +/* Search button flush against the global filter (inherits joined borders/radii + from .filter-apply-btn, matching the column filter); just match input padding */ +.filter-apply-btn-toolbar { + padding: 4px 8px; +} + /* ================================================================ DATA GRID STYLES ================================================================ */ @@ -460,6 +495,31 @@ body { opacity: 0.7; } +/* Wrapper so the counter can overlay the right edge inside the column filter input */ +.column-filter-wrap { + position: relative; + flex: 1; + min-width: 0; + display: flex; +} + +/* Current/total match counter overlaid inside the column filter input, when non-empty */ +.column-filter-counter { + position: absolute; + right: 6px; + top: 50%; + transform: translateY(-50%); + font-size: 10px; + color: var(--text-secondary); + white-space: nowrap; + pointer-events: none; +} + +/* Reserve room for the counter only when it has content */ +.column-filter-wrap:has(.column-filter-counter:not(:empty)) .column-filter { + padding-right: 30px; +} + /* Filter apply button - triggers filter on click */ .filter-apply-btn { padding: 2px 6px; @@ -636,6 +696,13 @@ body { background: var(--active-bg); } +/* Cell the user just jumped to via Enter-to-navigate on a filter */ +.data-cell.active-match-cell { + outline: 2px solid var(--accent-color); + outline-offset: -2px; + z-index: 3; +} + /* Header cell styling when entire column is selected */ .header-cell.column-selected { /* Layer active background over secondary background to ensure opacity for sticky header */ diff --git a/core/ui/viewer.html b/core/ui/viewer.html index a7c5a42..8056476 100644 --- a/core/ui/viewer.html +++ b/core/ui/viewer.html @@ -6,7 +6,7 @@ SQLite Explorer @@ -101,7 +101,13 @@ - +
+
+ + +
+ +
@@ -364,51 +370,54 @@ diff --git a/core/ui/viewer.template.html b/core/ui/viewer.template.html index c82a8a3..2282910 100644 --- a/core/ui/viewer.template.html +++ b/core/ui/viewer.template.html @@ -100,7 +100,13 @@ - +
+
+ + +
+ +
diff --git a/website/public/sqlite-viewer/viewer.html b/website/public/sqlite-viewer/viewer.html index c5a946c..e3c9adc 100644 --- a/website/public/sqlite-viewer/viewer.html +++ b/website/public/sqlite-viewer/viewer.html @@ -6,7 +6,7 @@ SQLite Explorer @@ -101,7 +101,13 @@ - +
+
+ + +
+ +
@@ -364,45 +370,48 @@ From 94451b4173454ec9b9229aea1ea6e4913d601924 Mon Sep 17 00:00:00 2001 From: zknpr Date: Sun, 21 Jun 2026 23:06:17 +0200 Subject: [PATCH 2/5] fix: address match-navigation review (Gemini + integration) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - btnApplyFilter passed the click MouseEvent as `direction`, making navigateMatches compute NaN (first click jumped to the last match, a second wedged navigation). Bind `() => applyGlobalFilter(1)` and normalize direction to ±1 in navigateMatches. - Guard applyGlobalFilter/applyColumnFilter on state.isGridReloading so the toolbar filter (which bypasses the #gridContainer guards) can't stack a concurrent refetch or act on the stale grid. - preventDefault() on the global + column filter Enter handlers. - match-nav: String(formatCellValueAsText(...)) before toLowerCase() to avoid a throw on non-string formatter output. - onDateFormatChange now resetMatchNav() — the cached matches/active highlight are stale once the displayed text changes. - viewer.css: keep a pinned cell's z-index (5) when it is the active match, instead of dropping to the active-match z-index (3). - Remove the now-dead state.filterTimer (the old debounced onFilterChange was replaced by Enter-to-submit). Regenerated bundles. Co-Authored-By: Claude Opus 4.8 (1M context) --- core/ui/modules/grid-actions.js | 22 +++++++++++++++++++--- core/ui/modules/grid-events.js | 4 +++- core/ui/modules/match-nav.js | 7 ++++++- core/ui/modules/state.js | 1 - core/ui/viewer.css | 8 ++++++++ core/ui/viewer.html | 8 ++++---- website/public/sqlite-viewer/viewer.html | 16 ++++++++-------- 7 files changed, 48 insertions(+), 18 deletions(-) diff --git a/core/ui/modules/grid-actions.js b/core/ui/modules/grid-actions.js index 530ff4d..97f2152 100644 --- a/core/ui/modules/grid-actions.js +++ b/core/ui/modules/grid-actions.js @@ -15,7 +15,13 @@ import { navigateMatches, resetMatchNav } from './match-nav.js'; * just advance to the next match. */ export async function applyGlobalFilter(direction = 1) { - const value = document.getElementById('filterInput').value; + // The toolbar filter input bypasses the #gridContainer guards, so block here + // while a reload is in flight to avoid a concurrent refetch / acting on the + // stale grid (the column filter is already covered by handleKeydown/handleClick). + if (state.isGridReloading) return; + const input = document.getElementById('filterInput'); + if (!input) return; + const value = input.value; if (value !== state.filterQuery) { state.filterQuery = value; state.currentPageIndex = 0; @@ -28,7 +34,10 @@ export async function applyGlobalFilter(direction = 1) { export function onFilterEnter(event) { // Enter jumps to the next match, Shift+Enter to the previous one. - if (event.key === 'Enter') applyGlobalFilter(event.shiftKey ? -1 : 1); + if (event.key === 'Enter') { + event.preventDefault(); + applyGlobalFilter(event.shiftKey ? -1 : 1); + } } export function onPageSizeChange() { @@ -43,6 +52,9 @@ export function onDateFormatChange() { const select = document.getElementById('dateFormatSelect'); if (select) { state.dateFormat = select.value; + // Cached matches were computed against the previous formatted text, so they + // (and the highlighted active cell) are stale once the format changes. + resetMatchNav(); renderDataGrid(); persistState(); } @@ -82,6 +94,7 @@ export function onColumnSort(columnName) { * cycle through matches; when unchanged we just advance to the next match. */ export async function applyColumnFilter(columnName, direction = 1) { + if (state.isGridReloading) return; // don't stack a refetch/navigate on an in-flight reload const input = document.querySelector(`.column-filter[data-column="${columnName}"]`); if (!input) return; @@ -104,7 +117,10 @@ export async function applyColumnFilter(columnName, direction = 1) { export function onColumnFilterKeydown(event, columnName) { // Enter jumps to the next match, Shift+Enter to the previous one. - if (event.key === 'Enter') applyColumnFilter(columnName, event.shiftKey ? -1 : 1); + if (event.key === 'Enter') { + event.preventDefault(); + applyColumnFilter(columnName, event.shiftKey ? -1 : 1); + } } // Column Selection diff --git a/core/ui/modules/grid-events.js b/core/ui/modules/grid-events.js index f30af67..088835e 100644 --- a/core/ui/modules/grid-events.js +++ b/core/ui/modules/grid-events.js @@ -21,7 +21,9 @@ import { openCellPreview } from './edit.js'; export function initGridControls() { document.getElementById('filterInput')?.addEventListener('keydown', onFilterEnter); - document.getElementById('btnApplyFilter')?.addEventListener('click', applyGlobalFilter); + // Wrap so the click MouseEvent isn't passed as `direction` (which would make + // navigateMatches compute NaN); the Search button always advances forward. + document.getElementById('btnApplyFilter')?.addEventListener('click', () => applyGlobalFilter(1)); document.getElementById('pageSizeSelect')?.addEventListener('change', onPageSizeChange); document.getElementById('dateFormatSelect')?.addEventListener('change', onDateFormatChange); diff --git a/core/ui/modules/match-nav.js b/core/ui/modules/match-nav.js index 2343e7e..0bb6fb5 100644 --- a/core/ui/modules/match-nav.js +++ b/core/ui/modules/match-nav.js @@ -29,7 +29,9 @@ function computeMatches(scope, term) { const row = state.gridData[rowIdx]; for (const { col, colIdx } of columnsToScan) { const value = getCellValue(row, colIdx); - const text = formatCellValueAsText(value, col.type, state.dateFormat, col.name); + // String() guards against formatters that may return a non-string + // (number/null/undefined), which would otherwise throw on .toLowerCase(). + const text = String(formatCellValueAsText(value, col.type, state.dateFormat, col.name)); if (text.toLowerCase().includes(term)) { matches.push({ rowIdx, colIdx }); } @@ -75,6 +77,9 @@ function updateMatchCounterUI() { * rescan of every row. */ export function navigateMatches(scope, direction = 1) { + // Normalize to ±1 so a stray non-numeric arg (e.g. a DOM event) can never + // produce a NaN index in the modulo arithmetic below. + direction = direction < 0 ? -1 : 1; const term = activeTerm(scope); const cacheValid = state.matchNav.scope === scope && state.matchNav.term === term diff --git a/core/ui/modules/state.js b/core/ui/modules/state.js index 1864f64..b51fded 100644 --- a/core/ui/modules/state.js +++ b/core/ui/modules/state.js @@ -19,7 +19,6 @@ export const state = { sortedColumn: null, sortAscending: true, filterQuery: '', - filterTimer: null, selectedRowIds: new Set(), gridData: [], diff --git a/core/ui/viewer.css b/core/ui/viewer.css index f476561..1a485fc 100644 --- a/core/ui/viewer.css +++ b/core/ui/viewer.css @@ -703,6 +703,14 @@ body { z-index: 3; } +/* A pinned cell must keep its sticky stacking (z-index 5) even when it is the + active match — this rule is later + more specific than .data-cell.pinned, so + without it the active-match z-index (3) would drop the pinned cell below its + neighbors. */ +.data-cell.pinned.active-match-cell { + z-index: 5; +} + /* Header cell styling when entire column is selected */ .header-cell.column-selected { /* Layer active background over secondary background to ensure opacity for sticky header */ diff --git a/core/ui/viewer.html b/core/ui/viewer.html index 8056476..d2a76a8 100644 --- a/core/ui/viewer.html +++ b/core/ui/viewer.html @@ -6,7 +6,7 @@ SQLite Explorer @@ -370,7 +370,7 @@ From 32040944c065f50a4f94e1ea71499d4513b9606b Mon Sep 17 00:00:00 2001 From: zknpr Date: Sun, 21 Jun 2026 23:17:28 +0200 Subject: [PATCH 3/5] fix: ignore IME composition Enter in filter submit (Codex) The Enter that confirms an IME candidate (Japanese/Chinese/Korean) fires as key==='Enter'; with the new preventDefault the global and column filter handlers were submitting the filter and starting a reload before the composed text committed, breaking CJK input. Guard both Enter handlers on !event.isComposing. Regenerated bundles. Co-Authored-By: Claude Opus 4.8 (1M context) --- core/ui/modules/grid-actions.js | 11 +++++++---- core/ui/viewer.html | 2 +- website/public/sqlite-viewer/viewer.html | 14 +++++++------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/core/ui/modules/grid-actions.js b/core/ui/modules/grid-actions.js index 97f2152..768f3ee 100644 --- a/core/ui/modules/grid-actions.js +++ b/core/ui/modules/grid-actions.js @@ -33,8 +33,10 @@ export async function applyGlobalFilter(direction = 1) { } export function onFilterEnter(event) { - // Enter jumps to the next match, Shift+Enter to the previous one. - if (event.key === 'Enter') { + // Enter jumps to the next match, Shift+Enter to the previous one. Ignore the + // Enter that confirms an IME composition candidate (isComposing) so we don't + // submit the filter / preventDefault before the composed text is committed. + if (event.key === 'Enter' && !event.isComposing) { event.preventDefault(); applyGlobalFilter(event.shiftKey ? -1 : 1); } @@ -116,8 +118,9 @@ export async function applyColumnFilter(columnName, direction = 1) { } export function onColumnFilterKeydown(event, columnName) { - // Enter jumps to the next match, Shift+Enter to the previous one. - if (event.key === 'Enter') { + // Enter jumps to the next match, Shift+Enter to the previous one. Ignore the + // IME composition-confirm Enter (isComposing) so CJK input isn't broken. + if (event.key === 'Enter' && !event.isComposing) { event.preventDefault(); applyColumnFilter(columnName, event.shiftKey ? -1 : 1); } diff --git a/core/ui/viewer.html b/core/ui/viewer.html index d2a76a8..8a7d9f5 100644 --- a/core/ui/viewer.html +++ b/core/ui/viewer.html @@ -409,7 +409,7 @@
`,a.appendChild(f)}return l.appendChild(a),l}function xn(e,n,o,l,a,s,i,r){let c=document.createElement("tbody"),d=t.matchNav.currentIndex>=0?t.matchNav.matches[t.matchNav.currentIndex]:null,m=[];for(let p=0;p({idx:y,rowId:B(p,y)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,y)=>({idx:y,rowId:B(p,y)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],g=e.map(p=>ze([t.filterQuery,t.columnFilters[p.name]])),E=document.createDocumentFragment();for(let{idx:p,rowId:y}of f){let C=t.gridData[p],w=t.selectedRowIds.has(y),L=t.pinnedRowIds.has(y),v=document.createElement("tr");v.id=`row-${p}`,v.className=`data-row ${w?"selected":""} ${L?"pinned":""}`,v.dataset.rowid=y,v.dataset.rowidx=p,L&&(v.style.top=`${h.get(y)}px`);let b=document.createElement("td");b.className="data-cell row-number",Object.assign(b.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:L?"8":"2"});let k=t.currentPageIndex*t.rowsPerPage+p+1;b.appendChild(document.createTextNode(String(k)));let M=document.createElement("span");M.className=`pin-icon codicon codicon-pin ${L?"pinned":""}`,M.title=L?"Unpin row":"Pin row",b.appendChild(M),v.appendChild(b);for(let H=0;Hb&&b.trim()!=="");if(r.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){r.appendChild(yn());return}let g=new Set;if(t.selectedCells.length>0)for(let b of t.selectedCells)g.add(`${b.rowIdx},${b.colIdx}`);let E=document.createElement("table");if(E.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let b of t.tableColumns){let k=b.name.length,M=b.isPrimaryKey?86:70,H=k*8+M;t.columnWidths[b.name]=Math.max(80,Math.min(250,H))}let p=[...t.tableColumns.filter(b=>t.pinnedColumns.has(b.name)),...t.tableColumns.filter(b=>!t.pinnedColumns.has(b.name))],y=new Map,C=i-1;for(let b of p)t.pinnedColumns.has(b.name)&&(y.set(b.name,C),C+=t.columnWidths[b.name]||120);let w=new Map;t.tableColumns.forEach((b,k)=>w.set(b.name,k));let L=Cn(i,p,y);E.appendChild(L);let v=xn(p,w,y,i,52,26,g,f);E.appendChild(v),r.appendChild(E),r.scrollLeft=m,r.scrollTop=h,ot()}function lt(){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 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 at=0;async function S(e=!0,n=!0){if(!t.selectedTable)return;let o=++at,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==at||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||je()),P();try{let d=[];for(let[C,w]of Object.entries(t.columnFilters))w&&w.trim()&&d.push({column:C,value:w});let m=t.tableColumns.map(C=>C.name),h={filters:d,globalFilter:t.filterQuery,columns:m},f=await x.fetchTableCount(l,h);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 p={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},y=await x.fetchTableData(l,p);if(s())return;t.gridData=y.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),lt(),u(`${t.totalRecordCount} records`)}catch(d){console.error("Error loading data:",d),s()||(u(`Error: ${d.message}`),ie(d.message))}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var T={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]},de=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+R()]=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,T.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,T.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,T.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,T.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,T.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,T.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.MP3_SYNC1)||this.checkSignature(n,T.MP3_SYNC2)||this.checkSignature(n,T.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,T.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),T.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,T.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.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&&g<=126?String.fromCharCode(g):".")}else r.push(" "),c.push(" ");let d=r.slice(0,8).join(" "),m=r.slice(8).join(" "),h=c.join("");l+=`${i} ${d} ${m} |${h}| `}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 Se;function st(){Se=new de,document.getElementById("btnCloseCellPreview")?.addEventListener("click",X),document.getElementById("formatJsonBtn")?.addEventListener("click",bn),document.getElementById("compactJsonBtn")?.addEventListener("click",wn),document.getElementById("wrapTextBtn")?.addEventListener("click",En),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Te),document.getElementById("btnCancelCellPreview")?.addEventListener("click",X),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",mt)}function it(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;me()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=N(s,n);if(i instanceof Uint8Array){J(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),J(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",rt),c.addEventListener("blur",ct),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function rt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),dt()):e.key==="Escape"&&(e.preventDefault(),me())}function ct(){setTimeout(()=>{t.editingCellInfo&&dt()},100)}async function dt(){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){me(),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,se(o),l,d,a),t.gridData[e][n+R()]=d,ut(),Be(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function me(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;ut(),Be(e,n,o),ce()}function ut(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",rt),t.activeCellInput.removeEventListener("blur",ct),t.activeCellInput=null),t.editingCellInfo=null}async function Te(){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..."),X(),await x.openCellEditor({table:t.selectedTable,name:""},se(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 J(e,n,o){t.editingCellInfo&&me();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=N(a,n);if(s instanceof Uint8Array){Se&&Se.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"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ue(),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=ue,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),X()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),mt())}}function ue(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function X(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function mt(){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){X(),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,se(o),l,m,a),t.gridData[e][n+R()]=m,X(),Be(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function bn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ue()}catch{u("Content is not valid JSON")}}function wn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ue()}catch{u("Content is not valid JSON")}}function En(){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 Be(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=V(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 In(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function vn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function pt(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Ne(e,n=1){n=n<0?-1:1;let o=In(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=vn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}Sn(),pt()}function K(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),pt()}async function Re(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;o!==t.filterQuery&&(t.filterQuery=o,t.currentPageIndex=0,K(),await S(),$()),Ne("global",e)}function ft(e){e.key==="Enter"&&(e.preventDefault(),Re(e.shiftKey?-1:1))}function ht(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,K(),S(),$()}function gt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,K(),_(),$())}function oe(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 vt(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",It),document.removeEventListener("mouseup",vt),document.body.style.userSelect="",document.body.style.cursor="",_()}function St(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=B(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(),P(),W()}function pe(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 h=d[m];for(let f=r;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=N(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}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 h=B(t.gridData[d],d),f=N(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),P(),W()}function Bt(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=N(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Te()}else t.cellEditBehavior==="modal"?J(n,o,l):it(n,o,l)}function Nt(){document.getElementById("filterInput")?.addEventListener("keydown",ft),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Re(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",ht),document.getElementById("dateFormatSelect")?.addEventListener("change",gt),document.getElementById("btnFirst")?.addEventListener("click",()=>oe(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>oe(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>oe(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>oe(t.totalPageCount-1))}function Rt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",Tn),e.addEventListener("keydown",Bn),e.addEventListener("click",Nn),e.addEventListener("dblclick",Pn),e.addEventListener("mouseover",Dn),e.addEventListener("scroll",kn,{passive:!0}))}function Tn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&Et(e,n.dataset.column)}}function Bn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ct(e,n)}}function Nn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Rn(e,n);return}Ln(e,n)}function Rn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Le(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&&xt(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&bt(e,l.dataset.column);return}if(n.closest(".row-number-header")){pe(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&yt(l.dataset.column);return}}function Ln(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=le(a);wt(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=le(l.closest(".data-row").dataset.rowid);J(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=le(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);St(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=le(s.dataset.rowid);Tt(e,l,a,i);return}}function Pn(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=le(a.dataset.rowid);Bt(e,o,l,s)}}function Dn(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 kn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,$()}function le(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Lt={async refreshContent(e){return t.isDbConnected&&(await j(),!(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 Se;function st(){Se=new de,document.getElementById("btnCloseCellPreview")?.addEventListener("click",X),document.getElementById("formatJsonBtn")?.addEventListener("click",bn),document.getElementById("compactJsonBtn")?.addEventListener("click",wn),document.getElementById("wrapTextBtn")?.addEventListener("click",En),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Te),document.getElementById("btnCancelCellPreview")?.addEventListener("click",X),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",mt)}function it(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;me()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=N(s,n);if(i instanceof Uint8Array){J(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),J(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",rt),c.addEventListener("blur",ct),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function rt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),dt()):e.key==="Escape"&&(e.preventDefault(),me())}function ct(){setTimeout(()=>{t.editingCellInfo&&dt()},100)}async function dt(){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){me(),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,se(o),l,d,a),t.gridData[e][n+R()]=d,ut(),Be(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function me(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;ut(),Be(e,n,o),ce()}function ut(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",rt),t.activeCellInput.removeEventListener("blur",ct),t.activeCellInput=null),t.editingCellInfo=null}async function Te(){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..."),X(),await x.openCellEditor({table:t.selectedTable,name:""},se(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 J(e,n,o){t.editingCellInfo&&me();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=N(a,n);if(s instanceof Uint8Array){Se&&Se.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"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ue(),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=ue,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),X()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),mt())}}function ue(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function X(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function mt(){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){X(),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,se(o),l,m,a),t.gridData[e][n+R()]=m,X(),Be(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function bn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ue()}catch{u("Content is not valid JSON")}}function wn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ue()}catch{u("Content is not valid JSON")}}function En(){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 Be(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=V(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 In(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function vn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function pt(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Ne(e,n=1){n=n<0?-1:1;let o=In(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=vn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}Sn(),pt()}function K(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),pt()}async function Re(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;o!==t.filterQuery&&(t.filterQuery=o,t.currentPageIndex=0,K(),await S(),$()),Ne("global",e)}function ft(e){e.key==="Enter"&&!e.isComposing&&(e.preventDefault(),Re(e.shiftKey?-1:1))}function ht(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,K(),S(),$()}function gt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,K(),_(),$())}function oe(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 vt(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",It),document.removeEventListener("mouseup",vt),document.body.style.userSelect="",document.body.style.cursor="",_()}function St(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=B(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(),P(),W()}function pe(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 h=d[m];for(let f=r;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=N(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}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 h=B(t.gridData[d],d),f=N(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),P(),W()}function Bt(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=N(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Te()}else t.cellEditBehavior==="modal"?J(n,o,l):it(n,o,l)}function Nt(){document.getElementById("filterInput")?.addEventListener("keydown",ft),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Re(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",ht),document.getElementById("dateFormatSelect")?.addEventListener("change",gt),document.getElementById("btnFirst")?.addEventListener("click",()=>oe(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>oe(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>oe(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>oe(t.totalPageCount-1))}function Rt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",Tn),e.addEventListener("keydown",Bn),e.addEventListener("click",Nn),e.addEventListener("dblclick",Pn),e.addEventListener("mouseover",Dn),e.addEventListener("scroll",kn,{passive:!0}))}function Tn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&Et(e,n.dataset.column)}}function Bn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ct(e,n)}}function Nn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Rn(e,n);return}Ln(e,n)}function Rn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Le(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&&xt(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&bt(e,l.dataset.column);return}if(n.closest(".row-number-header")){pe(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&yt(l.dataset.column);return}}function Ln(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=le(a);wt(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=le(l.closest(".data-row").dataset.rowid);J(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=le(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);St(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=le(s.dataset.rowid);Tt(e,l,a,i);return}}function Pn(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=le(a.dataset.rowid);Bt(e,o,l,s)}}function Dn(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 kn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,$()}function le(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Lt={async refreshContent(e){return t.isDbConnected&&(await j(),!(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 bc27c62..b5d6b47 100644 --- a/website/public/sqlite-viewer/viewer.html +++ b/website/public/sqlite-viewer/viewer.html @@ -370,7 +370,7 @@
From 4b5c64453ab25e968f0ca19e2ef2d205b3492b60 Mon Sep 17 00:00:00 2001 From: zknpr Date: Sun, 21 Jun 2026 23:30:20 +0200 Subject: [PATCH 4/5] fix: let a failed filter submit be retried (Codex) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit applyGlobalFilter/applyColumnFilter set the filter term before awaiting loadTableData, which swallows errors. After a failed/timed-out fetch the term looked applied, so re-submitting the same query skipped the refetch (value === state.filterQuery) and only navigated — the user couldn't retry without editing the text. loadTableData now returns true on success / false on a genuine (non-superseded) failure. Both apply paths revert the term (global) or restore/delete the prior column value on false, so the same query re-runs the fetch. Regenerated bundles. Co-Authored-By: Claude Opus 4.8 (1M context) --- core/ui/modules/grid-actions.js | 19 +++++++++++++++++-- core/ui/modules/grid-data.js | 3 +++ core/ui/viewer.html | 8 ++++---- website/public/sqlite-viewer/viewer.html | 18 +++++++++--------- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/core/ui/modules/grid-actions.js b/core/ui/modules/grid-actions.js index 768f3ee..2884418 100644 --- a/core/ui/modules/grid-actions.js +++ b/core/ui/modules/grid-actions.js @@ -23,10 +23,17 @@ export async function applyGlobalFilter(direction = 1) { if (!input) return; const value = input.value; if (value !== state.filterQuery) { + const previous = state.filterQuery; state.filterQuery = value; state.currentPageIndex = 0; resetMatchNav(); - await loadTableData(); + const ok = await loadTableData(); + if (ok === false) { + // The fetch failed; don't treat the term as applied, so the user can + // retry the same query with Enter/Search without editing the text first. + state.filterQuery = previous; + return; + } persistState(); } navigateMatches('global', direction); @@ -102,10 +109,18 @@ export async function applyColumnFilter(columnName, direction = 1) { const changed = input.value !== (state.columnFilters[columnName] || ''); if (changed) { + const previous = state.columnFilters[columnName]; state.columnFilters[columnName] = input.value; state.currentPageIndex = 0; resetMatchNav(); - await loadTableData(); + const ok = await loadTableData(); + if (ok === false) { + // The fetch failed; restore the prior value so the same query can be + // retried with Enter/Search rather than appearing already-applied. + if (previous === undefined) delete state.columnFilters[columnName]; + else state.columnFilters[columnName] = previous; + return; + } // loadTableData() rebuilds the header, so the input we focused is gone. // Re-focus the freshly rendered one and place the caret at the end. const newInput = document.querySelector(`.column-filter[data-column="${columnName}"]`); diff --git a/core/ui/modules/grid-data.js b/core/ui/modules/grid-data.js index bfe1c46..f77ccac 100644 --- a/core/ui/modules/grid-data.js +++ b/core/ui/modules/grid-data.js @@ -180,6 +180,7 @@ export async function loadTableData(showSpinner = true, saveScrollPosition = tru updatePagination(); updateStatus(`${state.totalRecordCount} records`); + return true; // signals callers (e.g. filter submit) that the load applied } catch (err) { console.error('Error loading data:', err); @@ -187,7 +188,9 @@ export async function loadTableData(showSpinner = true, saveScrollPosition = tru if (!isSuperseded()) { updateStatus(`Error: ${err.message}`); showErrorState(err.message); + return false; // the current load genuinely failed (lets callers retry) } + // Superseded failure: a newer load owns the outcome — return undefined. } finally { // isLoadingData keeps its original lifecycle. It is also set by BLOB uploads // (dnd.js), so a superseded or no-spinner load must NOT clear it — only the diff --git a/core/ui/viewer.html b/core/ui/viewer.html index 8a7d9f5..7bd99eb 100644 --- a/core/ui/viewer.html +++ b/core/ui/viewer.html @@ -387,7 +387,7 @@ Error ${Z(e)} - `)}function P(){let e=t.selectedTable&&t.selectedTableType==="table",n=t.selectedRowIds.size>0,o=t.selectedColumns.size>0,l=document.getElementById("btnAddRow"),a=document.getElementById("btnAddColumn"),s=document.getElementById("btnDeleteRows"),i=document.getElementById("btnExport");l&&(l.disabled=!e),a&&(a.disabled=!e),s&&(s.disabled=!e||!n&&!o),i&&(i.disabled=!t.selectedTable)}function qe(){let e=document.getElementById("sidebarPanel"),n=document.getElementById("resizeHandle");if(!e||!n)return;let o=!1;n.addEventListener("mousedown",l=>{o=!0,document.body.style.cursor="col-resize",l.preventDefault()}),document.addEventListener("mousemove",l=>{if(!o)return;let a=Math.max(150,Math.min(400,l.clientX));e.style.width=a+"px"}),document.addEventListener("mouseup",()=>{o&&(o=!1,document.body.style.cursor="")})}function R(){return t.selectedTableType==="table"?1:0}function B(e,n){return t.selectedTableType==="table"?e[0]:t.currentPageIndex*t.rowsPerPage+n}function N(e,n){return e[n+R()]}function _e(){document.addEventListener("click",e=>{let n=e.target,o=n.closest(".modal-close, .modal-cancel");if(o){let l=o.dataset.modal;l&&O(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 q(e){let n=document.getElementById(e);if(n){n.classList.remove("hidden");let o=n.querySelector("input, select, textarea, button");o&&o.focus()}}function O(e){let n=document.getElementById(e);n&&n.classList.add("hidden")}function Ke(){document.getElementById("btnAddRow")?.addEventListener("click",Qt),document.getElementById("btnDeleteRows")?.addEventListener("click",Zt),document.getElementById("btnAddColumn")?.addEventListener("click",ln),document.getElementById("btnSubmitAddRow")?.addEventListener("click",Yt),document.getElementById("btnSubmitDelete")?.addEventListener("click",re),document.getElementById("btnSubmitCreateTable")?.addEventListener("click",on),document.getElementById("btnAddColumnDef")?.addEventListener("click",()=>Je()),document.getElementById("columnDefinitions")?.addEventListener("click",e=>{let n=e.target.closest(".btn-remove-col");if(n){let o=n.dataset.colid;nn(o)}}),document.getElementById("btnSubmitAddColumn")?.addEventListener("click",an)}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)}),q("addRowModal")}async function Yt(){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),O("addRowModal"),await S(),u("Row inserted - Ctrl+S to save")}catch(l){console.error("Insert failed:",l),u(`Error: ${l.message}`)}}function Zt(){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;q("deleteModal")}async function re(){t.selectedColumns.size>0?await tn():t.selectedRowIds.size>0&&await en()}async function en(){if(t.selectedRowIds.size===0)return;let e=Array.from(t.selectedRowIds);try{u("Deleting rows..."),await x.deleteRows(t.selectedTable,e),O("deleteModal"),t.selectedRowIds.clear(),await S(),P(),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 tn(){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"),O("deleteModal");return}O("deleteModal"),t.selectedColumns.clear(),t.selectedCells=[],t.lastSelectedCell=null,await j(),await z(),await S(),P(),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 He=0;function Ge(){document.getElementById("newTableName").value="",document.getElementById("columnDefinitions").replaceChildren(),He=0,Je(!0),q("createTableModal")}function Je(e=!1){let n=document.getElementById("columnDefinitions"),o=++He,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 g=document.createElement("option");g.value=f,g.textContent=f,e&&f==="INTEGER"&&(g.selected=!0),!e&&f==="TEXT"&&(g.selected=!0),s.appendChild(g)}),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 h=document.createElement("span");h.className="codicon codicon-close",m.appendChild(h),l.appendChild(m),n.appendChild(l)}function nn(e){let n=document.getElementById(`colDef_${e}`);n&&n.remove()}async function on(){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),O("createTableModal"),await j(),u(`Table "${e}" created - Ctrl+S to save`)}catch(l){console.error("Create table failed:",l),u(`Error: ${l.message}`)}}function ln(){!t.selectedTable||t.selectedTableType!=="table"||(document.getElementById("newColumnName").value="",document.getElementById("newColumnType").value="TEXT",document.getElementById("newColumnDefault").value="",q("addColumnModal"))}async function an(){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),O("addColumnModal"),await z(),await S(),u(`Column "${e}" added - Ctrl+S to save`)}catch(l){console.error("Add column failed:",l),u(`Error: ${l.message}`)}}function Xe(){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;rn(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),cn(l,s)}})}async function Qe(){let e=document.getElementById("settingsModal");e&&(e.classList.remove("hidden"),await Ee())}async function Ee(){let e=document.getElementById("pragmaSettingsContainer");e.textContent="Loading settings...";try{let[n,o]=await Promise.all([x.getPragmas(),x.getExtensionSettings()]);sn(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 sn(e,n){let o=document.getElementById("pragmaSettingsContainer");if(!o)return;let l=(C,w)=>C.map(L=>{let v=String(L),k=String(w).toUpperCase()===v.toUpperCase(),M=document.createElement("option");return M.value=v,M.selected=k,M.textContent=v,M});o.replaceChildren();let a=C=>{let w=document.createElement("div");w.className="setting-section-title",Object.assign(w.style,{fontWeight:"600",marginBottom:"8px",paddingBottom:"4px",borderBottom:"1px solid var(--border-color)"}),w.textContent=C,o.appendChild(w)},s=(C,w,L)=>{let v=document.createElement("div");v.className="form-field";let b=document.createElement("label");if(w.type==="checkbox"?(Object.assign(b.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"}),w.style.margin="0",b.appendChild(w),b.appendChild(document.createTextNode(C)),v.appendChild(b)):(b.textContent=C,v.appendChild(b),v.appendChild(w)),L){let k=document.createElement("div");k.className="setting-desc",k.textContent=L,v.appendChild(k)}o.appendChild(v)};if(o.children.length>0){let C=document.createElement("div");C.style.height="16px",o.appendChild(C)}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(C=>r.appendChild(C)),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(C=>d.appendChild(C)),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 h=document.createElement("option");h.value="true",h.textContent="ON";let f=document.createElement("option");f.value="false",f.textContent="OFF",Number(e.foreign_keys)===1?h.selected=!0:f.selected=!0,m.appendChild(h),m.appendChild(f),s("Foreign Keys",m,"Enforce foreign key constraints");let g=document.createElement("select");g.className="setting-pragma",g.dataset.name="synchronous",g.dataset.type="number",[{v:0,t:"OFF (0)"},{v:1,t:"NORMAL (1)"},{v:2,t:"FULL (2)"},{v:3,t:"EXTRA (3)"}].forEach(C=>{let w=document.createElement("option");w.value=C.v,w.textContent=C.t,Number(e.synchronous)===C.v&&(w.selected=!0),g.appendChild(w)}),s("Synchronous",g,"Disk synchronization safety level");let E=document.createElement("select");E.className="setting-pragma",E.dataset.name="locking_mode",l(["NORMAL","EXCLUSIVE"],e.locking_mode).forEach(C=>E.appendChild(C)),s("Locking Mode",E,"");let p=document.createElement("select");p.className="setting-pragma",p.dataset.name="auto_vacuum",p.dataset.type="number",[{v:0,t:"NONE (0)"},{v:1,t:"FULL (1)"},{v:2,t:"INCREMENTAL (2)"}].forEach(C=>{let w=document.createElement("option");w.value=C.v,w.textContent=C.t,Number(e.auto_vacuum)===C.v&&(w.selected=!0),p.appendChild(w)}),s("Auto Vacuum",p,"");let y=document.createElement("input");y.type="number",y.className="setting-pragma",y.dataset.name="cache_size",y.dataset.type="number",y.value=e.cache_size,s("Cache Size",y,"Number of pages (positive) or kilobytes (negative)")}async function rn(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 Ee()}}async function cn(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 Ee()}}function Ye(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 Ze(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 et(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 h=d,f="set";if(r)h=null;else if(c)f="json_patch";else{let g=(m.type||"").toUpperCase();(g==="INTEGER"||g==="REAL"||g==="NUMERIC")&&!isNaN(Number(d))&&d.trim()!==""&&(h=Number(d))}l.push({rowId:a.rowId,column:m.name,value:h,originalValue:a.value,operation:f,rowIdx:a.rowIdx,colIdx:a.colIdx})}return l}function nt(){let e=document.getElementById("sidebarPanel");if(!e)return;let n=document.getElementById("sidebarFilterInput");n&&n.addEventListener("input",()=>{t.sidebarFilter=n.value,ee()}),e.addEventListener("click",o=>{let l=o.target;if(l.closest("#btnOpenSettings")){Qe();return}if(l.closest("#btnOpenCreateTable")){o.stopPropagation(),Ge();return}if(l.closest("#btnReload")){gn();return}if(l.closest("#btnApplyBatchUpdate")){un();return}let a=l.closest(".list-item");if(a){let c=a.dataset.name,d=a.dataset.type;if(c&&d){hn(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&&fn(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);mn(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);pn(d,r)}return}})}async function j(){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})),ee()}catch(e){console.error("Error loading schema:",e),u("Error loading schema")}}function Ie(e,n){return n?e.filter(o=>o.name.toLowerCase().includes(n)):e}function ve(e,n,o,l){let a=document.getElementById(e);a&&(a.textContent=l?`${n}/${o}`:o)}function tt(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 dn(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 ee(){let e=t.sidebarFilter.toLowerCase(),n=e.length>0,o=Ie(t.schemaCache.tables,e),l=Ie(t.schemaCache.views,e),a=Ie(t.schemaCache.indexes,e);ve("tablesBadge",o.length,t.schemaCache.tables.length,n),ve("viewsBadge",l.length,t.schemaCache.views.length,n),ve("indexesBadge",a.length,t.schemaCache.indexes.length,n),tt("tablesList",o,"table","codicon-table",e?"No matching tables":"No tables"),tt("viewsList",l,"view","codicon-eye",e?"No matching views":"No views"),dn("indexesList",a,e?"No matching indexes":"No indexes")}function W(){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=Ye(t.selectedCells,t.tableColumns);l.replaceChildren();let i=document.createDocumentFragment();for(let[r,c]of s){let d=Ze(c.values),m=document.createElement("div");m.className="form-field batch-field",m.dataset.colidx=r,m.style.marginBottom="8px";let h=document.createElement("label");h.style.fontSize="11px",h.style.color="var(--text-secondary)";let f=document.createTextNode(c.name+" ");h.appendChild(f);let g=document.createElement("span");g.style.opacity="0.7",g.textContent=c.type||"",h.appendChild(g),m.appendChild(h);let E=document.createElement("div");E.style.display="flex",E.style.gap="4px";let p=document.createElement("input");p.type="text",p.className="batch-input",p.placeholder=d,p.dataset.colidx=r,p.style.flex="1",p.style.minWidth="0",E.appendChild(p);let y=document.createElement("button");y.className="btn-secondary btn-batch-null",y.style.padding="2px 6px",y.title="Set to NULL",y.textContent="NULL",E.appendChild(y);let C=document.createElement("button");C.className="btn-secondary btn-batch-patch",C.style.padding="2px 6px",C.title="JSON Patch",C.textContent="{}",E.appendChild(C),m.appendChild(E),i.appendChild(m)}l.appendChild(i)}async function un(){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=et(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+R()]=r.value;await S(!1);let i=[];for(let r of t.selectedCells){let c=t.gridData[r.rowIdx][r.colIdx+R()];i.push({...r,value:c})}t.selectedCells=i,W(),u("Batch update completed")}catch(l){console.error("Batch update failed:",l),u(`Batch update failed: ${l.message}`)}}function mn(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 pn(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 fn(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 hn(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},ee();let o=document.getElementById("tableNameLabel");o&&(o.textContent=e);let l=document.getElementById("filterInput");l&&(l.value=""),await z(),await S(!0,!1),$()}async function gn(){if(t.isDbConnected)try{u("Reloading..."),await x.refreshFile(),await j(),t.selectedTable&&(await z(),await S()),u("Reloaded")}catch(e){console.error("Reload failed:",e),u(`Reload failed: ${e.message}`)}}var te=new Set,ne=new Set;function ot(){te.clear(),t.selectedCells.length>0&&t.selectedCells.forEach(e=>{te.add(`cell-${e.rowIdx}-${e.colIdx}`)}),ne.clear(),t.selectedRowIds.size>0&&document.querySelectorAll(".data-row.selected").forEach(n=>{n.id&&ne.add(n.id)})}function F(){let e=new Set;for(let o of t.selectedCells)e.add(`cell-${o.rowIdx}-${o.colIdx}`);for(let o of te)if(!e.has(o)){let l=document.getElementById(o);l&&l.classList.remove("cell-selected")}for(let o of e)if(!te.has(o)){let l=document.getElementById(o);l&&l.classList.add("cell-selected")}te=e;let n=new Set;for(let o=0;oo.classList.remove("column-selected")),t.selectedColumns.size>0&&t.selectedColumns.forEach(o=>{let l=CSS.escape(o),a=document.querySelector(`.header-cell[data-column="${l}"]`);a&&a.classList.add("column-selected")})}function ce(){t.selectedCells=[],t.selectedRowIds.clear(),t.selectedColumns.clear(),t.lastSelectedCell=null,F(),P(),W()}function yn(){let e=document.createElement("div");return e.className="empty-view",e.innerHTML=` + `)}function P(){let e=t.selectedTable&&t.selectedTableType==="table",n=t.selectedRowIds.size>0,o=t.selectedColumns.size>0,l=document.getElementById("btnAddRow"),a=document.getElementById("btnAddColumn"),s=document.getElementById("btnDeleteRows"),i=document.getElementById("btnExport");l&&(l.disabled=!e),a&&(a.disabled=!e),s&&(s.disabled=!e||!n&&!o),i&&(i.disabled=!t.selectedTable)}function qe(){let e=document.getElementById("sidebarPanel"),n=document.getElementById("resizeHandle");if(!e||!n)return;let o=!1;n.addEventListener("mousedown",l=>{o=!0,document.body.style.cursor="col-resize",l.preventDefault()}),document.addEventListener("mousemove",l=>{if(!o)return;let a=Math.max(150,Math.min(400,l.clientX));e.style.width=a+"px"}),document.addEventListener("mouseup",()=>{o&&(o=!1,document.body.style.cursor="")})}function N(){return t.selectedTableType==="table"?1:0}function B(e,n){return t.selectedTableType==="table"?e[0]:t.currentPageIndex*t.rowsPerPage+n}function R(e,n){return e[n+N()]}function _e(){document.addEventListener("click",e=>{let n=e.target,o=n.closest(".modal-close, .modal-cancel");if(o){let l=o.dataset.modal;l&&O(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 q(e){let n=document.getElementById(e);if(n){n.classList.remove("hidden");let o=n.querySelector("input, select, textarea, button");o&&o.focus()}}function O(e){let n=document.getElementById(e);n&&n.classList.add("hidden")}function Ke(){document.getElementById("btnAddRow")?.addEventListener("click",Qt),document.getElementById("btnDeleteRows")?.addEventListener("click",Zt),document.getElementById("btnAddColumn")?.addEventListener("click",ln),document.getElementById("btnSubmitAddRow")?.addEventListener("click",Yt),document.getElementById("btnSubmitDelete")?.addEventListener("click",re),document.getElementById("btnSubmitCreateTable")?.addEventListener("click",on),document.getElementById("btnAddColumnDef")?.addEventListener("click",()=>Je()),document.getElementById("columnDefinitions")?.addEventListener("click",e=>{let n=e.target.closest(".btn-remove-col");if(n){let o=n.dataset.colid;nn(o)}}),document.getElementById("btnSubmitAddColumn")?.addEventListener("click",an)}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)}),q("addRowModal")}async function Yt(){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),O("addRowModal"),await S(),u("Row inserted - Ctrl+S to save")}catch(l){console.error("Insert failed:",l),u(`Error: ${l.message}`)}}function Zt(){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;q("deleteModal")}async function re(){t.selectedColumns.size>0?await tn():t.selectedRowIds.size>0&&await en()}async function en(){if(t.selectedRowIds.size===0)return;let e=Array.from(t.selectedRowIds);try{u("Deleting rows..."),await x.deleteRows(t.selectedTable,e),O("deleteModal"),t.selectedRowIds.clear(),await S(),P(),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 tn(){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"),O("deleteModal");return}O("deleteModal"),t.selectedColumns.clear(),t.selectedCells=[],t.lastSelectedCell=null,await j(),await z(),await S(),P(),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 He=0;function Ge(){document.getElementById("newTableName").value="",document.getElementById("columnDefinitions").replaceChildren(),He=0,Je(!0),q("createTableModal")}function Je(e=!1){let n=document.getElementById("columnDefinitions"),o=++He,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 g=document.createElement("option");g.value=f,g.textContent=f,e&&f==="INTEGER"&&(g.selected=!0),!e&&f==="TEXT"&&(g.selected=!0),s.appendChild(g)}),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 h=document.createElement("span");h.className="codicon codicon-close",m.appendChild(h),l.appendChild(m),n.appendChild(l)}function nn(e){let n=document.getElementById(`colDef_${e}`);n&&n.remove()}async function on(){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),O("createTableModal"),await j(),u(`Table "${e}" created - Ctrl+S to save`)}catch(l){console.error("Create table failed:",l),u(`Error: ${l.message}`)}}function ln(){!t.selectedTable||t.selectedTableType!=="table"||(document.getElementById("newColumnName").value="",document.getElementById("newColumnType").value="TEXT",document.getElementById("newColumnDefault").value="",q("addColumnModal"))}async function an(){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),O("addColumnModal"),await z(),await S(),u(`Column "${e}" added - Ctrl+S to save`)}catch(l){console.error("Add column failed:",l),u(`Error: ${l.message}`)}}function Xe(){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;rn(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),cn(l,s)}})}async function Qe(){let e=document.getElementById("settingsModal");e&&(e.classList.remove("hidden"),await Ee())}async function Ee(){let e=document.getElementById("pragmaSettingsContainer");e.textContent="Loading settings...";try{let[n,o]=await Promise.all([x.getPragmas(),x.getExtensionSettings()]);sn(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 sn(e,n){let o=document.getElementById("pragmaSettingsContainer");if(!o)return;let l=(C,w)=>C.map(L=>{let v=String(L),k=String(w).toUpperCase()===v.toUpperCase(),M=document.createElement("option");return M.value=v,M.selected=k,M.textContent=v,M});o.replaceChildren();let a=C=>{let w=document.createElement("div");w.className="setting-section-title",Object.assign(w.style,{fontWeight:"600",marginBottom:"8px",paddingBottom:"4px",borderBottom:"1px solid var(--border-color)"}),w.textContent=C,o.appendChild(w)},s=(C,w,L)=>{let v=document.createElement("div");v.className="form-field";let b=document.createElement("label");if(w.type==="checkbox"?(Object.assign(b.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"}),w.style.margin="0",b.appendChild(w),b.appendChild(document.createTextNode(C)),v.appendChild(b)):(b.textContent=C,v.appendChild(b),v.appendChild(w)),L){let k=document.createElement("div");k.className="setting-desc",k.textContent=L,v.appendChild(k)}o.appendChild(v)};if(o.children.length>0){let C=document.createElement("div");C.style.height="16px",o.appendChild(C)}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(C=>r.appendChild(C)),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(C=>d.appendChild(C)),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 h=document.createElement("option");h.value="true",h.textContent="ON";let f=document.createElement("option");f.value="false",f.textContent="OFF",Number(e.foreign_keys)===1?h.selected=!0:f.selected=!0,m.appendChild(h),m.appendChild(f),s("Foreign Keys",m,"Enforce foreign key constraints");let g=document.createElement("select");g.className="setting-pragma",g.dataset.name="synchronous",g.dataset.type="number",[{v:0,t:"OFF (0)"},{v:1,t:"NORMAL (1)"},{v:2,t:"FULL (2)"},{v:3,t:"EXTRA (3)"}].forEach(C=>{let w=document.createElement("option");w.value=C.v,w.textContent=C.t,Number(e.synchronous)===C.v&&(w.selected=!0),g.appendChild(w)}),s("Synchronous",g,"Disk synchronization safety level");let E=document.createElement("select");E.className="setting-pragma",E.dataset.name="locking_mode",l(["NORMAL","EXCLUSIVE"],e.locking_mode).forEach(C=>E.appendChild(C)),s("Locking Mode",E,"");let p=document.createElement("select");p.className="setting-pragma",p.dataset.name="auto_vacuum",p.dataset.type="number",[{v:0,t:"NONE (0)"},{v:1,t:"FULL (1)"},{v:2,t:"INCREMENTAL (2)"}].forEach(C=>{let w=document.createElement("option");w.value=C.v,w.textContent=C.t,Number(e.auto_vacuum)===C.v&&(w.selected=!0),p.appendChild(w)}),s("Auto Vacuum",p,"");let y=document.createElement("input");y.type="number",y.className="setting-pragma",y.dataset.name="cache_size",y.dataset.type="number",y.value=e.cache_size,s("Cache Size",y,"Number of pages (positive) or kilobytes (negative)")}async function rn(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 Ee()}}async function cn(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 Ee()}}function Ye(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 Ze(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 et(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 h=d,f="set";if(r)h=null;else if(c)f="json_patch";else{let g=(m.type||"").toUpperCase();(g==="INTEGER"||g==="REAL"||g==="NUMERIC")&&!isNaN(Number(d))&&d.trim()!==""&&(h=Number(d))}l.push({rowId:a.rowId,column:m.name,value:h,originalValue:a.value,operation:f,rowIdx:a.rowIdx,colIdx:a.colIdx})}return l}function nt(){let e=document.getElementById("sidebarPanel");if(!e)return;let n=document.getElementById("sidebarFilterInput");n&&n.addEventListener("input",()=>{t.sidebarFilter=n.value,ee()}),e.addEventListener("click",o=>{let l=o.target;if(l.closest("#btnOpenSettings")){Qe();return}if(l.closest("#btnOpenCreateTable")){o.stopPropagation(),Ge();return}if(l.closest("#btnReload")){gn();return}if(l.closest("#btnApplyBatchUpdate")){un();return}let a=l.closest(".list-item");if(a){let c=a.dataset.name,d=a.dataset.type;if(c&&d){hn(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&&fn(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);mn(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);pn(d,r)}return}})}async function j(){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})),ee()}catch(e){console.error("Error loading schema:",e),u("Error loading schema")}}function Ie(e,n){return n?e.filter(o=>o.name.toLowerCase().includes(n)):e}function ve(e,n,o,l){let a=document.getElementById(e);a&&(a.textContent=l?`${n}/${o}`:o)}function tt(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 dn(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 ee(){let e=t.sidebarFilter.toLowerCase(),n=e.length>0,o=Ie(t.schemaCache.tables,e),l=Ie(t.schemaCache.views,e),a=Ie(t.schemaCache.indexes,e);ve("tablesBadge",o.length,t.schemaCache.tables.length,n),ve("viewsBadge",l.length,t.schemaCache.views.length,n),ve("indexesBadge",a.length,t.schemaCache.indexes.length,n),tt("tablesList",o,"table","codicon-table",e?"No matching tables":"No tables"),tt("viewsList",l,"view","codicon-eye",e?"No matching views":"No views"),dn("indexesList",a,e?"No matching indexes":"No indexes")}function W(){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=Ye(t.selectedCells,t.tableColumns);l.replaceChildren();let i=document.createDocumentFragment();for(let[r,c]of s){let d=Ze(c.values),m=document.createElement("div");m.className="form-field batch-field",m.dataset.colidx=r,m.style.marginBottom="8px";let h=document.createElement("label");h.style.fontSize="11px",h.style.color="var(--text-secondary)";let f=document.createTextNode(c.name+" ");h.appendChild(f);let g=document.createElement("span");g.style.opacity="0.7",g.textContent=c.type||"",h.appendChild(g),m.appendChild(h);let E=document.createElement("div");E.style.display="flex",E.style.gap="4px";let p=document.createElement("input");p.type="text",p.className="batch-input",p.placeholder=d,p.dataset.colidx=r,p.style.flex="1",p.style.minWidth="0",E.appendChild(p);let y=document.createElement("button");y.className="btn-secondary btn-batch-null",y.style.padding="2px 6px",y.title="Set to NULL",y.textContent="NULL",E.appendChild(y);let C=document.createElement("button");C.className="btn-secondary btn-batch-patch",C.style.padding="2px 6px",C.title="JSON Patch",C.textContent="{}",E.appendChild(C),m.appendChild(E),i.appendChild(m)}l.appendChild(i)}async function un(){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=et(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+N()]=r.value;await S(!1);let i=[];for(let r of t.selectedCells){let c=t.gridData[r.rowIdx][r.colIdx+N()];i.push({...r,value:c})}t.selectedCells=i,W(),u("Batch update completed")}catch(l){console.error("Batch update failed:",l),u(`Batch update failed: ${l.message}`)}}function mn(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 pn(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 fn(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 hn(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},ee();let o=document.getElementById("tableNameLabel");o&&(o.textContent=e);let l=document.getElementById("filterInput");l&&(l.value=""),await z(),await S(!0,!1),$()}async function gn(){if(t.isDbConnected)try{u("Reloading..."),await x.refreshFile(),await j(),t.selectedTable&&(await z(),await S()),u("Reloaded")}catch(e){console.error("Reload failed:",e),u(`Reload failed: ${e.message}`)}}var te=new Set,ne=new Set;function ot(){te.clear(),t.selectedCells.length>0&&t.selectedCells.forEach(e=>{te.add(`cell-${e.rowIdx}-${e.colIdx}`)}),ne.clear(),t.selectedRowIds.size>0&&document.querySelectorAll(".data-row.selected").forEach(n=>{n.id&&ne.add(n.id)})}function F(){let e=new Set;for(let o of t.selectedCells)e.add(`cell-${o.rowIdx}-${o.colIdx}`);for(let o of te)if(!e.has(o)){let l=document.getElementById(o);l&&l.classList.remove("cell-selected")}for(let o of e)if(!te.has(o)){let l=document.getElementById(o);l&&l.classList.add("cell-selected")}te=e;let n=new Set;for(let o=0;oo.classList.remove("column-selected")),t.selectedColumns.size>0&&t.selectedColumns.forEach(o=>{let l=CSS.escape(o),a=document.querySelector(`.header-cell[data-column="${l}"]`);a&&a.classList.add("column-selected")})}function ce(){t.selectedCells=[],t.selectedRowIds.clear(),t.selectedColumns.clear(),t.lastSelectedCell=null,F(),P(),W()}function yn(){let e=document.createElement("div");return e.className="empty-view",e.innerHTML=` No data This table is empty @@ -407,9 +407,9 @@
- `,a.appendChild(f)}return l.appendChild(a),l}function xn(e,n,o,l,a,s,i,r){let c=document.createElement("tbody"),d=t.matchNav.currentIndex>=0?t.matchNav.matches[t.matchNav.currentIndex]:null,m=[];for(let p=0;p({idx:y,rowId:B(p,y)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,y)=>({idx:y,rowId:B(p,y)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],g=e.map(p=>ze([t.filterQuery,t.columnFilters[p.name]])),E=document.createDocumentFragment();for(let{idx:p,rowId:y}of f){let C=t.gridData[p],w=t.selectedRowIds.has(y),L=t.pinnedRowIds.has(y),v=document.createElement("tr");v.id=`row-${p}`,v.className=`data-row ${w?"selected":""} ${L?"pinned":""}`,v.dataset.rowid=y,v.dataset.rowidx=p,L&&(v.style.top=`${h.get(y)}px`);let b=document.createElement("td");b.className="data-cell row-number",Object.assign(b.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:L?"8":"2"});let k=t.currentPageIndex*t.rowsPerPage+p+1;b.appendChild(document.createTextNode(String(k)));let M=document.createElement("span");M.className=`pin-icon codicon codicon-pin ${L?"pinned":""}`,M.title=L?"Unpin row":"Pin row",b.appendChild(M),v.appendChild(b);for(let H=0;Hb&&b.trim()!=="");if(r.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){r.appendChild(yn());return}let g=new Set;if(t.selectedCells.length>0)for(let b of t.selectedCells)g.add(`${b.rowIdx},${b.colIdx}`);let E=document.createElement("table");if(E.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let b of t.tableColumns){let k=b.name.length,M=b.isPrimaryKey?86:70,H=k*8+M;t.columnWidths[b.name]=Math.max(80,Math.min(250,H))}let p=[...t.tableColumns.filter(b=>t.pinnedColumns.has(b.name)),...t.tableColumns.filter(b=>!t.pinnedColumns.has(b.name))],y=new Map,C=i-1;for(let b of p)t.pinnedColumns.has(b.name)&&(y.set(b.name,C),C+=t.columnWidths[b.name]||120);let w=new Map;t.tableColumns.forEach((b,k)=>w.set(b.name,k));let L=Cn(i,p,y);E.appendChild(L);let v=xn(p,w,y,i,52,26,g,f);E.appendChild(v),r.appendChild(E),r.scrollLeft=m,r.scrollTop=h,ot()}function lt(){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 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 at=0;async function S(e=!0,n=!0){if(!t.selectedTable)return;let o=++at,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==at||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||je()),P();try{let d=[];for(let[C,w]of Object.entries(t.columnFilters))w&&w.trim()&&d.push({column:C,value:w});let m=t.tableColumns.map(C=>C.name),h={filters:d,globalFilter:t.filterQuery,columns:m},f=await x.fetchTableCount(l,h);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 p={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},y=await x.fetchTableData(l,p);if(s())return;t.gridData=y.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),lt(),u(`${t.totalRecordCount} records`)}catch(d){console.error("Error loading data:",d),s()||(u(`Error: ${d.message}`),ie(d.message))}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var T={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]},de=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+R()]=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,T.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,T.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,T.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,T.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,T.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,T.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.MP3_SYNC1)||this.checkSignature(n,T.MP3_SYNC2)||this.checkSignature(n,T.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,T.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),T.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,T.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.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&&g<=126?String.fromCharCode(g):".")}else r.push(" "),c.push(" ");let d=r.slice(0,8).join(" "),m=r.slice(8).join(" "),h=c.join("");l+=`${i} ${d} ${m} |${h}| + `,a.appendChild(f)}return l.appendChild(a),l}function xn(e,n,o,l,a,s,i,r){let c=document.createElement("tbody"),d=t.matchNav.currentIndex>=0?t.matchNav.matches[t.matchNav.currentIndex]:null,m=[];for(let p=0;p({idx:y,rowId:B(p,y)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,y)=>({idx:y,rowId:B(p,y)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],g=e.map(p=>ze([t.filterQuery,t.columnFilters[p.name]])),E=document.createDocumentFragment();for(let{idx:p,rowId:y}of f){let C=t.gridData[p],w=t.selectedRowIds.has(y),L=t.pinnedRowIds.has(y),v=document.createElement("tr");v.id=`row-${p}`,v.className=`data-row ${w?"selected":""} ${L?"pinned":""}`,v.dataset.rowid=y,v.dataset.rowidx=p,L&&(v.style.top=`${h.get(y)}px`);let b=document.createElement("td");b.className="data-cell row-number",Object.assign(b.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:L?"8":"2"});let k=t.currentPageIndex*t.rowsPerPage+p+1;b.appendChild(document.createTextNode(String(k)));let M=document.createElement("span");M.className=`pin-icon codicon codicon-pin ${L?"pinned":""}`,M.title=L?"Unpin row":"Pin row",b.appendChild(M),v.appendChild(b);for(let H=0;Hb&&b.trim()!=="");if(r.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){r.appendChild(yn());return}let g=new Set;if(t.selectedCells.length>0)for(let b of t.selectedCells)g.add(`${b.rowIdx},${b.colIdx}`);let E=document.createElement("table");if(E.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let b of t.tableColumns){let k=b.name.length,M=b.isPrimaryKey?86:70,H=k*8+M;t.columnWidths[b.name]=Math.max(80,Math.min(250,H))}let p=[...t.tableColumns.filter(b=>t.pinnedColumns.has(b.name)),...t.tableColumns.filter(b=>!t.pinnedColumns.has(b.name))],y=new Map,C=i-1;for(let b of p)t.pinnedColumns.has(b.name)&&(y.set(b.name,C),C+=t.columnWidths[b.name]||120);let w=new Map;t.tableColumns.forEach((b,k)=>w.set(b.name,k));let L=Cn(i,p,y);E.appendChild(L);let v=xn(p,w,y,i,52,26,g,f);E.appendChild(v),r.appendChild(E),r.scrollLeft=m,r.scrollTop=h,ot()}function lt(){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 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 at=0;async function S(e=!0,n=!0){if(!t.selectedTable)return;let o=++at,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==at||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||je()),P();try{let d=[];for(let[C,w]of Object.entries(t.columnFilters))w&&w.trim()&&d.push({column:C,value:w});let m=t.tableColumns.map(C=>C.name),h={filters:d,globalFilter:t.filterQuery,columns:m},f=await x.fetchTableCount(l,h);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 p={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},y=await x.fetchTableData(l,p);return s()?void 0:(t.gridData=y.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),lt(),u(`${t.totalRecordCount} records`),!0)}catch(d){if(console.error("Error loading data:",d),!s())return u(`Error: ${d.message}`),ie(d.message),!1}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var T={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]},de=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+N()]=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,T.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,T.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,T.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,T.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,T.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,T.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.MP3_SYNC1)||this.checkSignature(n,T.MP3_SYNC2)||this.checkSignature(n,T.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,T.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),T.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,T.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.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&&g<=126?String.fromCharCode(g):".")}else r.push(" "),c.push(" ");let d=r.slice(0,8).join(" "),m=r.slice(8).join(" "),h=c.join("");l+=`${i} ${d} ${m} |${h}| `}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 Se;function st(){Se=new de,document.getElementById("btnCloseCellPreview")?.addEventListener("click",X),document.getElementById("formatJsonBtn")?.addEventListener("click",bn),document.getElementById("compactJsonBtn")?.addEventListener("click",wn),document.getElementById("wrapTextBtn")?.addEventListener("click",En),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Te),document.getElementById("btnCancelCellPreview")?.addEventListener("click",X),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",mt)}function it(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;me()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=N(s,n);if(i instanceof Uint8Array){J(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),J(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",rt),c.addEventListener("blur",ct),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function rt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),dt()):e.key==="Escape"&&(e.preventDefault(),me())}function ct(){setTimeout(()=>{t.editingCellInfo&&dt()},100)}async function dt(){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){me(),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,se(o),l,d,a),t.gridData[e][n+R()]=d,ut(),Be(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function me(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;ut(),Be(e,n,o),ce()}function ut(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",rt),t.activeCellInput.removeEventListener("blur",ct),t.activeCellInput=null),t.editingCellInfo=null}async function Te(){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..."),X(),await x.openCellEditor({table:t.selectedTable,name:""},se(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 J(e,n,o){t.editingCellInfo&&me();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=N(a,n);if(s instanceof Uint8Array){Se&&Se.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"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ue(),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=ue,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),X()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),mt())}}function ue(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function X(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function mt(){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){X(),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,se(o),l,m,a),t.gridData[e][n+R()]=m,X(),Be(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function bn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ue()}catch{u("Content is not valid JSON")}}function wn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ue()}catch{u("Content is not valid JSON")}}function En(){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 Be(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=V(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 In(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function vn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function pt(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Ne(e,n=1){n=n<0?-1:1;let o=In(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=vn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}Sn(),pt()}function K(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),pt()}async function Re(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;o!==t.filterQuery&&(t.filterQuery=o,t.currentPageIndex=0,K(),await S(),$()),Ne("global",e)}function ft(e){e.key==="Enter"&&!e.isComposing&&(e.preventDefault(),Re(e.shiftKey?-1:1))}function ht(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,K(),S(),$()}function gt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,K(),_(),$())}function oe(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 vt(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",It),document.removeEventListener("mouseup",vt),document.body.style.userSelect="",document.body.style.cursor="",_()}function St(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=B(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(),P(),W()}function pe(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 h=d[m];for(let f=r;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=N(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}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 h=B(t.gridData[d],d),f=N(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),P(),W()}function Bt(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=N(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Te()}else t.cellEditBehavior==="modal"?J(n,o,l):it(n,o,l)}function Nt(){document.getElementById("filterInput")?.addEventListener("keydown",ft),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Re(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",ht),document.getElementById("dateFormatSelect")?.addEventListener("change",gt),document.getElementById("btnFirst")?.addEventListener("click",()=>oe(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>oe(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>oe(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>oe(t.totalPageCount-1))}function Rt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",Tn),e.addEventListener("keydown",Bn),e.addEventListener("click",Nn),e.addEventListener("dblclick",Pn),e.addEventListener("mouseover",Dn),e.addEventListener("scroll",kn,{passive:!0}))}function Tn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&Et(e,n.dataset.column)}}function Bn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ct(e,n)}}function Nn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Rn(e,n);return}Ln(e,n)}function Rn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Le(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&&xt(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&bt(e,l.dataset.column);return}if(n.closest(".row-number-header")){pe(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&yt(l.dataset.column);return}}function Ln(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=le(a);wt(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=le(l.closest(".data-row").dataset.rowid);J(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=le(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);St(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=le(s.dataset.rowid);Tt(e,l,a,i);return}}function Pn(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=le(a.dataset.rowid);Bt(e,o,l,s)}}function Dn(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 kn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,$()}function le(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Lt={async refreshContent(e){return t.isDbConnected&&(await j(),!(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 Se;function st(){Se=new de,document.getElementById("btnCloseCellPreview")?.addEventListener("click",X),document.getElementById("formatJsonBtn")?.addEventListener("click",bn),document.getElementById("compactJsonBtn")?.addEventListener("click",wn),document.getElementById("wrapTextBtn")?.addEventListener("click",En),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Te),document.getElementById("btnCancelCellPreview")?.addEventListener("click",X),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",mt)}function it(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;me()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=R(s,n);if(i instanceof Uint8Array){J(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),J(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",rt),c.addEventListener("blur",ct),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function rt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),dt()):e.key==="Escape"&&(e.preventDefault(),me())}function ct(){setTimeout(()=>{t.editingCellInfo&&dt()},100)}async function dt(){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){me(),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,se(o),l,d,a),t.gridData[e][n+N()]=d,ut(),Be(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function me(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;ut(),Be(e,n,o),ce()}function ut(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",rt),t.activeCellInput.removeEventListener("blur",ct),t.activeCellInput=null),t.editingCellInfo=null}async function Te(){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..."),X(),await x.openCellEditor({table:t.selectedTable,name:""},se(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 J(e,n,o){t.editingCellInfo&&me();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=R(a,n);if(s instanceof Uint8Array){Se&&Se.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"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ue(),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=ue,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),X()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),mt())}}function ue(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function X(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function mt(){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){X(),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,se(o),l,m,a),t.gridData[e][n+N()]=m,X(),Be(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function bn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ue()}catch{u("Content is not valid JSON")}}function wn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ue()}catch{u("Content is not valid JSON")}}function En(){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 Be(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=V(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 In(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function vn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function pt(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Re(e,n=1){n=n<0?-1:1;let o=In(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=vn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}Sn(),pt()}function K(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),pt()}async function Ne(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;if(o!==t.filterQuery){let l=t.filterQuery;if(t.filterQuery=o,t.currentPageIndex=0,K(),await S()===!1){t.filterQuery=l;return}$()}Re("global",e)}function ft(e){e.key==="Enter"&&!e.isComposing&&(e.preventDefault(),Ne(e.shiftKey?-1:1))}function ht(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,K(),S(),$()}function gt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,K(),_(),$())}function oe(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 vt(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",It),document.removeEventListener("mouseup",vt),document.body.style.userSelect="",document.body.style.cursor="",_()}function St(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=B(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(),P(),W()}function pe(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 h=d[m];for(let f=r;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=R(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}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 h=B(t.gridData[d],d),f=R(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),P(),W()}function Bt(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=R(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Te()}else t.cellEditBehavior==="modal"?J(n,o,l):it(n,o,l)}function Rt(){document.getElementById("filterInput")?.addEventListener("keydown",ft),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Ne(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",ht),document.getElementById("dateFormatSelect")?.addEventListener("change",gt),document.getElementById("btnFirst")?.addEventListener("click",()=>oe(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>oe(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>oe(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>oe(t.totalPageCount-1))}function Nt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",Tn),e.addEventListener("keydown",Bn),e.addEventListener("click",Rn),e.addEventListener("dblclick",Pn),e.addEventListener("mouseover",Dn),e.addEventListener("scroll",kn,{passive:!0}))}function Tn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&Et(e,n.dataset.column)}}function Bn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ct(e,n)}}function Rn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Nn(e,n);return}Ln(e,n)}function Nn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Le(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&&xt(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&bt(e,l.dataset.column);return}if(n.closest(".row-number-header")){pe(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&yt(l.dataset.column);return}}function Ln(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=le(a);wt(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=le(l.closest(".data-row").dataset.rowid);J(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=le(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);St(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=le(s.dataset.rowid);Tt(e,l,a,i);return}}function Pn(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=le(a.dataset.rowid);Bt(e,o,l,s)}}function Dn(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 kn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,$()}function le(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Lt={async refreshContent(e){return t.isDbConnected&&(await j(),!(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 @@ -417,7 +417,7 @@
`):t.selectedTable&&(await z(),await S(!1))),{success:!0}},async updateColorScheme(e){return document.documentElement.style.colorScheme=e,{success:!0}},async updateCellEditBehavior(e){return t.cellEditBehavior=e,{success:!0}}};function Pt(){window.addEventListener("message",e=>{let n=e.data;if(n&&n.kind==="invoke"){let{correlationId:l,methodName:a,parameters:s}=n,i=Lt[a];typeof i=="function"?Promise.resolve(i.apply(Lt,s||[])).then(r=>{Oe(l,r)}).catch(r=>{be(l,r instanceof Error?r.message:String(r))}):be(l,`Unknown method: ${a}`);return}if(!n||n.channel!=="rpc")return;let o=n.content;o&&o.kind==="response"&&Ue(o)})}function Dt(){document.getElementById("btnExport")?.addEventListener("click",An),document.getElementById("btnSubmitExport")?.addEventListener("click",$n),document.getElementById("exportFormat")?.addEventListener("change",kt)}function An(){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)})),kt(),q("exportModal")}function kt(){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 $n(){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..."),O("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 At(){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 $t(){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 Ft(){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+R()]=o.value;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),await S(),P(),u(`${n} - Ctrl+S to save`)}catch(e){console.error("Clear cells failed:",e),u(`Clear failed: ${e.message}`)}}}var fe=50*1024*1024,Pe=!1;function Mt(){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",Fn),e.addEventListener("dragleave",Mn),e.addEventListener("drop",Un)}var D=null;function Fn(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 Mn(e){e.target}async function Un(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 On(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 zn(n,s,a);return}}}async function On(e,n,o){if(o.size>fe){let l=(o.size/1048576).toFixed(1),a=(fe/(1024*1024)).toFixed(0);u(`File too large (${l}MB). Maximum is ${a}MB.`);return}try{u(`Reading ${n}...`);let l=await Vn(o),a=new Uint8Array(l);await Ut(e,n,a)}catch(l){console.error("File read failed:",l),u(`File read failed: ${l.message}`)}}async function zn(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 Ut(e,n,a)}catch(l){console.error("URI upload failed:",l),u(`Upload failed: ${l.message}`)}}async function Ut(e,n,o){if(Pe){u("Upload already in progress...");return}if(o.byteLength>fe){let c=(o.byteLength/1048576).toFixed(1),d=(fe/(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=B(s,l),r=t.tableColumns[a];if(t.selectedTableType!=="table"){u("Cannot upload to a view");return}Pe=!0,t.isLoadingData=!0;try{u(`Uploading ${n} (${jn(o.byteLength)})...`);let c=s[a+R()];await x.updateCell(t.selectedTable,i,r.name,o,c),t.gridData[l][a+R()]=o,Wn(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{Pe=!1,t.isLoadingData=!1}}function Vn(e){return new Promise((n,o)=>{let l=new FileReader;l.onload=()=>n(l.result),l.onerror=()=>o(l.error),l.readAsArrayBuffer(e)})}function jn(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 Wn(e,n){let o=V(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")}Pt();function qn(){nt(),Ke(),Dt(),_e(),Xe(),st(),Nt(),Rt(),qe(),Mt()}async function _n(){u("Connecting to database...");let e=await x.initialize();if(!e||!e.connected)throw new Error("Failed to connect to database");t.isDbConnected=!0,await x.ping(),await j()}async function Kn(){let e=Fe();if(e&&e.selectedTable){t.selectedTable=e.selectedTable,t.selectedTableType=e.selectedTableType||"table",t.currentPageIndex=e.currentPageIndex||0,t.rowsPerPage=e.rowsPerPage||500,t.sortedColumn=e.sortedColumn||null,t.sortAscending=e.sortAscending!==!1,t.filterQuery=e.filterQuery||"",t.columnWidths=e.columnWidths||{},t.columnFilters=e.columnFilters||{},t.sidebarFilter=e.sidebarFilter||"",t.dateFormat=e.dateFormat||"raw",t.cellEditBehavior=e.cellEditBehavior||"inline",t.pinnedColumns=new Set(e.pinnedColumns||[]),t.pinnedRowIds=new Set(e.pinnedRowIds||[]),t.selectedColumns=new Set(e.selectedColumns||[]);let n=e.scrollPosition||{top:0,left:0};t.scrollPosition={...n};let o=document.getElementById("sidebarFilterInput");o&&(o.value=t.sidebarFilter);let l=document.getElementById("filterInput");l&&(l.value=t.filterQuery);let a=document.getElementById("dateFormatSelect");a&&(a.value=t.dateFormat);let s=document.getElementById("pageSizeSelect");s&&(s.value=String(t.rowsPerPage));let i=document.getElementById("tableNameLabel");i&&(i.textContent=t.selectedTable),ee(),await z(),await S(!0,!1);let r=document.getElementById("gridContainer");r&&(r.scrollLeft=n.left,r.scrollTop=n.top),u(`${t.totalRecordCount} records`)}else u("Ready"),We()}function Hn(){let e=document.getElementById("vscode-env");e&&e.dataset.cellEditBehavior&&(t.cellEditBehavior=e.dataset.cellEditBehavior)}function Gn(){document.addEventListener("keydown",async e=>{if(e.key==="Escape"&&!t.editingCellInfo&&!document.querySelector(".modal-overlay:not(.hidden)")&&ce(),(e.metaKey||e.ctrlKey)&&e.key==="c"){if(t.editingCellInfo||document.activeElement.tagName==="INPUT"||document.activeElement.tagName==="TEXTAREA")return;t.selectedCells.length>0?(e.preventDefault(),await At()):t.selectedRowIds.size>0&&(e.preventDefault(),await $t())}if((e.metaKey||e.ctrlKey)&&e.key==="a"){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT"||document.activeElement.tagName==="TEXTAREA")return;t.selectedTable&&(e.preventDefault(),pe(e))}if((e.metaKey||e.ctrlKey)&&(e.key==="Delete"||e.key==="Backspace")){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT"||document.activeElement.tagName==="TEXTAREA")return;t.selectedTable&&t.selectedTableType==="table"&&(e.preventDefault(),t.selectedColumns.size>0?await re():t.selectedRowIds.size>0?await re():t.selectedCells.length>0&&await Ft())}})}async function Jn(){try{qn(),await _n(),await Kn(),Hn(),Gn()}catch(e){console.error("Init error:",e),ie(e.message)}}Jn();})(); +`);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 Ft(){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+N()]=o.value;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),await S(),P(),u(`${n} - Ctrl+S to save`)}catch(e){console.error("Clear cells failed:",e),u(`Clear failed: ${e.message}`)}}}var fe=50*1024*1024,Pe=!1;function Mt(){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",Fn),e.addEventListener("dragleave",Mn),e.addEventListener("drop",Un)}var D=null;function Fn(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 Mn(e){e.target}async function Un(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 On(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 zn(n,s,a);return}}}async function On(e,n,o){if(o.size>fe){let l=(o.size/1048576).toFixed(1),a=(fe/(1024*1024)).toFixed(0);u(`File too large (${l}MB). Maximum is ${a}MB.`);return}try{u(`Reading ${n}...`);let l=await Vn(o),a=new Uint8Array(l);await Ut(e,n,a)}catch(l){console.error("File read failed:",l),u(`File read failed: ${l.message}`)}}async function zn(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 Ut(e,n,a)}catch(l){console.error("URI upload failed:",l),u(`Upload failed: ${l.message}`)}}async function Ut(e,n,o){if(Pe){u("Upload already in progress...");return}if(o.byteLength>fe){let c=(o.byteLength/1048576).toFixed(1),d=(fe/(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=B(s,l),r=t.tableColumns[a];if(t.selectedTableType!=="table"){u("Cannot upload to a view");return}Pe=!0,t.isLoadingData=!0;try{u(`Uploading ${n} (${jn(o.byteLength)})...`);let c=s[a+N()];await x.updateCell(t.selectedTable,i,r.name,o,c),t.gridData[l][a+N()]=o,Wn(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{Pe=!1,t.isLoadingData=!1}}function Vn(e){return new Promise((n,o)=>{let l=new FileReader;l.onload=()=>n(l.result),l.onerror=()=>o(l.error),l.readAsArrayBuffer(e)})}function jn(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 Wn(e,n){let o=V(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")}Pt();function qn(){nt(),Ke(),Dt(),_e(),Xe(),st(),Rt(),Nt(),qe(),Mt()}async function _n(){u("Connecting to database...");let e=await x.initialize();if(!e||!e.connected)throw new Error("Failed to connect to database");t.isDbConnected=!0,await x.ping(),await j()}async function Kn(){let e=Fe();if(e&&e.selectedTable){t.selectedTable=e.selectedTable,t.selectedTableType=e.selectedTableType||"table",t.currentPageIndex=e.currentPageIndex||0,t.rowsPerPage=e.rowsPerPage||500,t.sortedColumn=e.sortedColumn||null,t.sortAscending=e.sortAscending!==!1,t.filterQuery=e.filterQuery||"",t.columnWidths=e.columnWidths||{},t.columnFilters=e.columnFilters||{},t.sidebarFilter=e.sidebarFilter||"",t.dateFormat=e.dateFormat||"raw",t.cellEditBehavior=e.cellEditBehavior||"inline",t.pinnedColumns=new Set(e.pinnedColumns||[]),t.pinnedRowIds=new Set(e.pinnedRowIds||[]),t.selectedColumns=new Set(e.selectedColumns||[]);let n=e.scrollPosition||{top:0,left:0};t.scrollPosition={...n};let o=document.getElementById("sidebarFilterInput");o&&(o.value=t.sidebarFilter);let l=document.getElementById("filterInput");l&&(l.value=t.filterQuery);let a=document.getElementById("dateFormatSelect");a&&(a.value=t.dateFormat);let s=document.getElementById("pageSizeSelect");s&&(s.value=String(t.rowsPerPage));let i=document.getElementById("tableNameLabel");i&&(i.textContent=t.selectedTable),ee(),await z(),await S(!0,!1);let r=document.getElementById("gridContainer");r&&(r.scrollLeft=n.left,r.scrollTop=n.top),u(`${t.totalRecordCount} records`)}else u("Ready"),We()}function Hn(){let e=document.getElementById("vscode-env");e&&e.dataset.cellEditBehavior&&(t.cellEditBehavior=e.dataset.cellEditBehavior)}function Gn(){document.addEventListener("keydown",async e=>{if(e.key==="Escape"&&!t.editingCellInfo&&!document.querySelector(".modal-overlay:not(.hidden)")&&ce(),(e.metaKey||e.ctrlKey)&&e.key==="c"){if(t.editingCellInfo||document.activeElement.tagName==="INPUT"||document.activeElement.tagName==="TEXTAREA")return;t.selectedCells.length>0?(e.preventDefault(),await At()):t.selectedRowIds.size>0&&(e.preventDefault(),await $t())}if((e.metaKey||e.ctrlKey)&&e.key==="a"){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT"||document.activeElement.tagName==="TEXTAREA")return;t.selectedTable&&(e.preventDefault(),pe(e))}if((e.metaKey||e.ctrlKey)&&(e.key==="Delete"||e.key==="Backspace")){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT"||document.activeElement.tagName==="TEXTAREA")return;t.selectedTable&&t.selectedTableType==="table"&&(e.preventDefault(),t.selectedColumns.size>0?await re():t.selectedRowIds.size>0?await re():t.selectedCells.length>0&&await Ft())}})}async function Jn(){try{qn(),await _n(),await Kn(),Hn(),Gn()}catch(e){console.error("Init error:",e),ie(e.message)}}Jn();})(); diff --git a/website/public/sqlite-viewer/viewer.html b/website/public/sqlite-viewer/viewer.html index b5d6b47..6b58354 100644 --- a/website/public/sqlite-viewer/viewer.html +++ b/website/public/sqlite-viewer/viewer.html @@ -370,7 +370,7 @@ From 2985be8d9b498ac0aef85ea6520860dd174842ff Mon Sep 17 00:00:00 2001 From: zknpr Date: Sun, 21 Jun 2026 23:40:03 +0200 Subject: [PATCH 5/5] fix: don't navigate after a superseded filter load (Codex) A filter load superseded by a newer toolbar load (pagination/page-size/ table switch) resolves undefined; the previous check only stopped explicit false, so a slow submit could resume and navigateMatches against the stale grid while the newer load was still rendering, showing a stale active match/counter on the wrong page. Treat only ok === true as applied: false still reverts the term (retry), undefined now returns without navigating. Applied to both global and column filter paths. Regenerated bundles. Co-Authored-By: Claude Opus 4.8 (1M context) --- core/ui/modules/grid-actions.js | 24 +++++++++++++++--------- core/ui/viewer.html | 2 +- website/public/sqlite-viewer/viewer.html | 10 +++++----- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/core/ui/modules/grid-actions.js b/core/ui/modules/grid-actions.js index 2884418..883c25f 100644 --- a/core/ui/modules/grid-actions.js +++ b/core/ui/modules/grid-actions.js @@ -28,10 +28,13 @@ export async function applyGlobalFilter(direction = 1) { state.currentPageIndex = 0; resetMatchNav(); const ok = await loadTableData(); - if (ok === false) { - // The fetch failed; don't treat the term as applied, so the user can - // retry the same query with Enter/Search without editing the text first. - state.filterQuery = previous; + if (ok !== true) { + // Only a fully-applied load (true) should persist/navigate. false = a + // genuine failure: revert so the same query can be retried. undefined = + // superseded by a newer load (pagination/page-size/table switch); leave + // the term (that load is using it) and don't navigate against the stale + // grid while it's still in flight. + if (ok === false) state.filterQuery = previous; return; } persistState(); @@ -114,11 +117,14 @@ export async function applyColumnFilter(columnName, direction = 1) { state.currentPageIndex = 0; resetMatchNav(); const ok = await loadTableData(); - if (ok === false) { - // The fetch failed; restore the prior value so the same query can be - // retried with Enter/Search rather than appearing already-applied. - if (previous === undefined) delete state.columnFilters[columnName]; - else state.columnFilters[columnName] = previous; + if (ok !== true) { + // Only a fully-applied load (true) proceeds. false = genuine failure: + // restore the prior value so the query can be retried. undefined = + // superseded by a newer load; leave the value and don't navigate. + if (ok === false) { + if (previous === undefined) delete state.columnFilters[columnName]; + else state.columnFilters[columnName] = previous; + } return; } // loadTableData() rebuilds the header, so the input we focused is gone. diff --git a/core/ui/viewer.html b/core/ui/viewer.html index 7bd99eb..fe1d6dd 100644 --- a/core/ui/viewer.html +++ b/core/ui/viewer.html @@ -409,7 +409,7 @@
`,a.appendChild(f)}return l.appendChild(a),l}function xn(e,n,o,l,a,s,i,r){let c=document.createElement("tbody"),d=t.matchNav.currentIndex>=0?t.matchNav.matches[t.matchNav.currentIndex]:null,m=[];for(let p=0;p({idx:y,rowId:B(p,y)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,y)=>({idx:y,rowId:B(p,y)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],g=e.map(p=>ze([t.filterQuery,t.columnFilters[p.name]])),E=document.createDocumentFragment();for(let{idx:p,rowId:y}of f){let C=t.gridData[p],w=t.selectedRowIds.has(y),L=t.pinnedRowIds.has(y),v=document.createElement("tr");v.id=`row-${p}`,v.className=`data-row ${w?"selected":""} ${L?"pinned":""}`,v.dataset.rowid=y,v.dataset.rowidx=p,L&&(v.style.top=`${h.get(y)}px`);let b=document.createElement("td");b.className="data-cell row-number",Object.assign(b.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:L?"8":"2"});let k=t.currentPageIndex*t.rowsPerPage+p+1;b.appendChild(document.createTextNode(String(k)));let M=document.createElement("span");M.className=`pin-icon codicon codicon-pin ${L?"pinned":""}`,M.title=L?"Unpin row":"Pin row",b.appendChild(M),v.appendChild(b);for(let H=0;Hb&&b.trim()!=="");if(r.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){r.appendChild(yn());return}let g=new Set;if(t.selectedCells.length>0)for(let b of t.selectedCells)g.add(`${b.rowIdx},${b.colIdx}`);let E=document.createElement("table");if(E.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let b of t.tableColumns){let k=b.name.length,M=b.isPrimaryKey?86:70,H=k*8+M;t.columnWidths[b.name]=Math.max(80,Math.min(250,H))}let p=[...t.tableColumns.filter(b=>t.pinnedColumns.has(b.name)),...t.tableColumns.filter(b=>!t.pinnedColumns.has(b.name))],y=new Map,C=i-1;for(let b of p)t.pinnedColumns.has(b.name)&&(y.set(b.name,C),C+=t.columnWidths[b.name]||120);let w=new Map;t.tableColumns.forEach((b,k)=>w.set(b.name,k));let L=Cn(i,p,y);E.appendChild(L);let v=xn(p,w,y,i,52,26,g,f);E.appendChild(v),r.appendChild(E),r.scrollLeft=m,r.scrollTop=h,ot()}function lt(){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 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 at=0;async function S(e=!0,n=!0){if(!t.selectedTable)return;let o=++at,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==at||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||je()),P();try{let d=[];for(let[C,w]of Object.entries(t.columnFilters))w&&w.trim()&&d.push({column:C,value:w});let m=t.tableColumns.map(C=>C.name),h={filters:d,globalFilter:t.filterQuery,columns:m},f=await x.fetchTableCount(l,h);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 p={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},y=await x.fetchTableData(l,p);return s()?void 0:(t.gridData=y.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),lt(),u(`${t.totalRecordCount} records`),!0)}catch(d){if(console.error("Error loading data:",d),!s())return u(`Error: ${d.message}`),ie(d.message),!1}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var T={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]},de=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+N()]=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,T.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,T.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,T.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,T.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,T.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,T.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.MP3_SYNC1)||this.checkSignature(n,T.MP3_SYNC2)||this.checkSignature(n,T.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,T.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),T.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,T.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.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&&g<=126?String.fromCharCode(g):".")}else r.push(" "),c.push(" ");let d=r.slice(0,8).join(" "),m=r.slice(8).join(" "),h=c.join("");l+=`${i} ${d} ${m} |${h}| `}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 Se;function st(){Se=new de,document.getElementById("btnCloseCellPreview")?.addEventListener("click",X),document.getElementById("formatJsonBtn")?.addEventListener("click",bn),document.getElementById("compactJsonBtn")?.addEventListener("click",wn),document.getElementById("wrapTextBtn")?.addEventListener("click",En),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Te),document.getElementById("btnCancelCellPreview")?.addEventListener("click",X),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",mt)}function it(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;me()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=R(s,n);if(i instanceof Uint8Array){J(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),J(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",rt),c.addEventListener("blur",ct),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function rt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),dt()):e.key==="Escape"&&(e.preventDefault(),me())}function ct(){setTimeout(()=>{t.editingCellInfo&&dt()},100)}async function dt(){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){me(),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,se(o),l,d,a),t.gridData[e][n+N()]=d,ut(),Be(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function me(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;ut(),Be(e,n,o),ce()}function ut(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",rt),t.activeCellInput.removeEventListener("blur",ct),t.activeCellInput=null),t.editingCellInfo=null}async function Te(){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..."),X(),await x.openCellEditor({table:t.selectedTable,name:""},se(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 J(e,n,o){t.editingCellInfo&&me();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=R(a,n);if(s instanceof Uint8Array){Se&&Se.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"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ue(),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=ue,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),X()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),mt())}}function ue(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function X(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function mt(){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){X(),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,se(o),l,m,a),t.gridData[e][n+N()]=m,X(),Be(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function bn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ue()}catch{u("Content is not valid JSON")}}function wn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ue()}catch{u("Content is not valid JSON")}}function En(){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 Be(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=V(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 In(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function vn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function pt(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Re(e,n=1){n=n<0?-1:1;let o=In(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=vn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}Sn(),pt()}function K(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),pt()}async function Ne(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;if(o!==t.filterQuery){let l=t.filterQuery;if(t.filterQuery=o,t.currentPageIndex=0,K(),await S()===!1){t.filterQuery=l;return}$()}Re("global",e)}function ft(e){e.key==="Enter"&&!e.isComposing&&(e.preventDefault(),Ne(e.shiftKey?-1:1))}function ht(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,K(),S(),$()}function gt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,K(),_(),$())}function oe(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 vt(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",It),document.removeEventListener("mouseup",vt),document.body.style.userSelect="",document.body.style.cursor="",_()}function St(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=B(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(),P(),W()}function pe(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 h=d[m];for(let f=r;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=R(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}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 h=B(t.gridData[d],d),f=R(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),P(),W()}function Bt(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=R(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Te()}else t.cellEditBehavior==="modal"?J(n,o,l):it(n,o,l)}function Rt(){document.getElementById("filterInput")?.addEventListener("keydown",ft),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Ne(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",ht),document.getElementById("dateFormatSelect")?.addEventListener("change",gt),document.getElementById("btnFirst")?.addEventListener("click",()=>oe(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>oe(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>oe(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>oe(t.totalPageCount-1))}function Nt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",Tn),e.addEventListener("keydown",Bn),e.addEventListener("click",Rn),e.addEventListener("dblclick",Pn),e.addEventListener("mouseover",Dn),e.addEventListener("scroll",kn,{passive:!0}))}function Tn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&Et(e,n.dataset.column)}}function Bn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ct(e,n)}}function Rn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Nn(e,n);return}Ln(e,n)}function Nn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Le(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&&xt(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&bt(e,l.dataset.column);return}if(n.closest(".row-number-header")){pe(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&yt(l.dataset.column);return}}function Ln(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=le(a);wt(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=le(l.closest(".data-row").dataset.rowid);J(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=le(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);St(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=le(s.dataset.rowid);Tt(e,l,a,i);return}}function Pn(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=le(a.dataset.rowid);Bt(e,o,l,s)}}function Dn(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 kn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,$()}function le(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Lt={async refreshContent(e){return t.isDbConnected&&(await j(),!(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 Se;function st(){Se=new de,document.getElementById("btnCloseCellPreview")?.addEventListener("click",X),document.getElementById("formatJsonBtn")?.addEventListener("click",bn),document.getElementById("compactJsonBtn")?.addEventListener("click",wn),document.getElementById("wrapTextBtn")?.addEventListener("click",En),document.getElementById("openInVsCodeBtn")?.addEventListener("click",Te),document.getElementById("btnCancelCellPreview")?.addEventListener("click",X),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",mt)}function it(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;me()}let l=t.tableColumns[n];if(!l)return;let a=document.getElementById(`cell-${e}-${n}`);if(!a)return;let s=t.gridData[e],i=R(s,n);if(i instanceof Uint8Array){J(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),J(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",rt),c.addEventListener("blur",ct),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function rt(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),dt()):e.key==="Escape"&&(e.preventDefault(),me())}function ct(){setTimeout(()=>{t.editingCellInfo&&dt()},100)}async function dt(){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){me(),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,se(o),l,d,a),t.gridData[e][n+N()]=d,ut(),Be(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function me(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;ut(),Be(e,n,o),ce()}function ut(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",rt),t.activeCellInput.removeEventListener("blur",ct),t.activeCellInput=null),t.editingCellInfo=null}async function Te(){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..."),X(),await x.openCellEditor({table:t.selectedTable,name:""},se(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 J(e,n,o){t.editingCellInfo&&me();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=R(a,n);if(s instanceof Uint8Array){Se&&Se.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"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");r.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ue(),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=ue,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),X()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),mt())}}function ue(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function X(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function mt(){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){X(),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,se(o),l,m,a),t.gridData[e][n+N()]=m,X(),Be(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,F(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function bn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ue()}catch{u("Content is not valid JSON")}}function wn(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ue()}catch{u("Content is not valid JSON")}}function En(){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 Be(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=V(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 In(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function vn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function pt(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Re(e,n=1){n=n<0?-1:1;let o=In(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=vn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}Sn(),pt()}function K(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),pt()}async function Ne(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;if(o!==t.filterQuery){let l=t.filterQuery;t.filterQuery=o,t.currentPageIndex=0,K();let a=await S();if(a!==!0){a===!1&&(t.filterQuery=l);return}$()}Re("global",e)}function ft(e){e.key==="Enter"&&!e.isComposing&&(e.preventDefault(),Ne(e.shiftKey?-1:1))}function ht(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,K(),S(),$()}function gt(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,K(),_(),$())}function oe(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 vt(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",It),document.removeEventListener("mouseup",vt),document.body.style.userSelect="",document.body.style.cursor="",_()}function St(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=B(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(),P(),W()}function pe(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 h=d[m];for(let f=r;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=R(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}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 h=B(t.gridData[d],d),f=R(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),P(),W()}function Bt(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=R(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:i},Te()}else t.cellEditBehavior==="modal"?J(n,o,l):it(n,o,l)}function Rt(){document.getElementById("filterInput")?.addEventListener("keydown",ft),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Ne(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",ht),document.getElementById("dateFormatSelect")?.addEventListener("change",gt),document.getElementById("btnFirst")?.addEventListener("click",()=>oe(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>oe(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>oe(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>oe(t.totalPageCount-1))}function Nt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",Tn),e.addEventListener("keydown",Bn),e.addEventListener("click",Rn),e.addEventListener("dblclick",Pn),e.addEventListener("mouseover",Dn),e.addEventListener("scroll",kn,{passive:!0}))}function Tn(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&Et(e,n.dataset.column)}}function Bn(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&Ct(e,n)}}function Rn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){Nn(e,n);return}Ln(e,n)}function Nn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Le(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&&xt(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&bt(e,l.dataset.column);return}if(n.closest(".row-number-header")){pe(e);return}let o=n.closest(".header-top");if(o){let l=o.closest(".header-cell");l&&l.dataset.column&&yt(l.dataset.column);return}}function Ln(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=le(a);wt(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=le(l.closest(".data-row").dataset.rowid);J(a,s,i)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=le(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);St(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=le(s.dataset.rowid);Tt(e,l,a,i);return}}function Pn(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=le(a.dataset.rowid);Bt(e,o,l,s)}}function Dn(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 kn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,$()}function le(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}var Lt={async refreshContent(e){return t.isDbConnected&&(await j(),!(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 6b58354..fc76044 100644 --- a/website/public/sqlite-viewer/viewer.html +++ b/website/public/sqlite-viewer/viewer.html @@ -387,7 +387,7 @@ Error ${Y(e)}
- `)}function k(){let e=t.selectedTable&&t.selectedTableType==="table",n=t.selectedRowIds.size>0,o=t.selectedColumns.size>0,l=document.getElementById("btnAddRow"),a=document.getElementById("btnAddColumn"),s=document.getElementById("btnDeleteRows"),r=document.getElementById("btnExport");l&&(l.disabled=!e),a&&(a.disabled=!e),s&&(s.disabled=!e||!n&&!o),r&&(r.disabled=!t.selectedTable)}function We(){let e=document.getElementById("sidebarPanel"),n=document.getElementById("resizeHandle");if(!e||!n)return;let o=!1;n.addEventListener("mousedown",l=>{o=!0,document.body.style.cursor="col-resize",l.preventDefault()}),document.addEventListener("mousemove",l=>{if(!o)return;let a=Math.max(150,Math.min(400,l.clientX));e.style.width=a+"px"}),document.addEventListener("mouseup",()=>{o&&(o=!1,document.body.style.cursor="")})}function L(){return t.selectedTableType==="table"?1:0}function B(e,n){return t.selectedTableType==="table"?e[0]:t.currentPageIndex*t.rowsPerPage+n}function R(e,n){return e[n+L()]}var Z=new Set,ee=new Set;function _e(){Z.clear(),t.selectedCells.length>0&&t.selectedCells.forEach(e=>{Z.add(`cell-${e.rowIdx}-${e.colIdx}`)}),ee.clear(),t.selectedRowIds.size>0&&document.querySelectorAll(".data-row.selected").forEach(n=>{n.id&&ee.add(n.id)})}function M(){let e=new Set;for(let o of t.selectedCells)e.add(`cell-${o.rowIdx}-${o.colIdx}`);for(let o of Z)if(!e.has(o)){let l=document.getElementById(o);l&&l.classList.remove("cell-selected")}for(let o of e)if(!Z.has(o)){let l=document.getElementById(o);l&&l.classList.add("cell-selected")}Z=e;let n=new Set;for(let o=0;oo.classList.remove("column-selected")),t.selectedColumns.size>0&&t.selectedColumns.forEach(o=>{let l=CSS.escape(o),a=document.querySelector(`.header-cell[data-column="${l}"]`);a&&a.classList.add("column-selected")})}function se(){t.selectedCells=[],t.selectedRowIds.clear(),t.selectedColumns.clear(),t.lastSelectedCell=null,M(),k(),z()}function Jt(){let e=document.createElement("div");return e.className="empty-view",e.innerHTML=` + `)}function D(){let e=t.selectedTable&&t.selectedTableType==="table",n=t.selectedRowIds.size>0,o=t.selectedColumns.size>0,l=document.getElementById("btnAddRow"),a=document.getElementById("btnAddColumn"),s=document.getElementById("btnDeleteRows"),r=document.getElementById("btnExport");l&&(l.disabled=!e),a&&(a.disabled=!e),s&&(s.disabled=!e||!n&&!o),r&&(r.disabled=!t.selectedTable)}function We(){let e=document.getElementById("sidebarPanel"),n=document.getElementById("resizeHandle");if(!e||!n)return;let o=!1;n.addEventListener("mousedown",l=>{o=!0,document.body.style.cursor="col-resize",l.preventDefault()}),document.addEventListener("mousemove",l=>{if(!o)return;let a=Math.max(150,Math.min(400,l.clientX));e.style.width=a+"px"}),document.addEventListener("mouseup",()=>{o&&(o=!1,document.body.style.cursor="")})}function L(){return t.selectedTableType==="table"?1:0}function B(e,n){return t.selectedTableType==="table"?e[0]:t.currentPageIndex*t.rowsPerPage+n}function R(e,n){return e[n+L()]}var Z=new Set,ee=new Set;function _e(){Z.clear(),t.selectedCells.length>0&&t.selectedCells.forEach(e=>{Z.add(`cell-${e.rowIdx}-${e.colIdx}`)}),ee.clear(),t.selectedRowIds.size>0&&document.querySelectorAll(".data-row.selected").forEach(n=>{n.id&&ee.add(n.id)})}function M(){let e=new Set;for(let o of t.selectedCells)e.add(`cell-${o.rowIdx}-${o.colIdx}`);for(let o of Z)if(!e.has(o)){let l=document.getElementById(o);l&&l.classList.remove("cell-selected")}for(let o of e)if(!Z.has(o)){let l=document.getElementById(o);l&&l.classList.add("cell-selected")}Z=e;let n=new Set;for(let o=0;oo.classList.remove("column-selected")),t.selectedColumns.size>0&&t.selectedColumns.forEach(o=>{let l=CSS.escape(o),a=document.querySelector(`.header-cell[data-column="${l}"]`);a&&a.classList.add("column-selected")})}function se(){t.selectedCells=[],t.selectedRowIds.clear(),t.selectedColumns.clear(),t.lastSelectedCell=null,M(),D(),z()}function Jt(){let e=document.createElement("div");return e.className="empty-view",e.innerHTML=` No data This table is empty @@ -407,11 +407,11 @@
- `,a.appendChild(f)}return l.appendChild(a),l}function Qt(e,n,o,l,a,s,r,i){let c=document.createElement("tbody"),d=t.matchNav.currentIndex>=0?t.matchNav.matches[t.matchNav.currentIndex]:null,m=[];for(let p=0;p({idx:y,rowId:B(p,y)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,y)=>({idx:y,rowId:B(p,y)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],g=e.map(p=>ze([t.filterQuery,t.columnFilters[p.name]])),E=document.createDocumentFragment();for(let{idx:p,rowId:y}of f){let C=t.gridData[p],b=t.selectedRowIds.has(y),N=t.pinnedRowIds.has(y),I=document.createElement("tr");I.id=`row-${p}`,I.className=`data-row ${b?"selected":""} ${N?"pinned":""}`,I.dataset.rowid=y,I.dataset.rowidx=p,N&&(I.style.top=`${h.get(y)}px`);let w=document.createElement("td");w.className="data-cell row-number",Object.assign(w.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:N?"8":"2"});let P=t.currentPageIndex*t.rowsPerPage+p+1;w.appendChild(document.createTextNode(String(P)));let F=document.createElement("span");F.className=`pin-icon codicon codicon-pin ${N?"pinned":""}`,F.title=N?"Unpin row":"Pin row",w.appendChild(F),I.appendChild(w);for(let q=0;qw&&w.trim()!=="");if(i.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){i.appendChild(Jt());return}let g=new Set;if(t.selectedCells.length>0)for(let w of t.selectedCells)g.add(`${w.rowIdx},${w.colIdx}`);let E=document.createElement("table");if(E.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let w of t.tableColumns){let P=w.name.length,F=w.isPrimaryKey?86:70,q=P*8+F;t.columnWidths[w.name]=Math.max(80,Math.min(250,q))}let p=[...t.tableColumns.filter(w=>t.pinnedColumns.has(w.name)),...t.tableColumns.filter(w=>!t.pinnedColumns.has(w.name))],y=new Map,C=r-1;for(let w of p)t.pinnedColumns.has(w.name)&&(y.set(w.name,C),C+=t.columnWidths[w.name]||120);let b=new Map;t.tableColumns.forEach((w,P)=>b.set(w.name,P));let N=Xt(r,p,y);E.appendChild(N);let I=Qt(p,b,y,r,52,26,g,f);E.appendChild(I),i.appendChild(E),i.scrollLeft=m,i.scrollTop=h,_e()}function qe(){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 H(){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 Ke=0;async function S(e=!0,n=!0){if(!t.selectedTable)return;let o=++Ke,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==Ke||l!==t.selectedTable,r=document.getElementById("gridContainer"),c=!!(r&&r.querySelector(".data-grid"))&&t.renderedTable===t.selectedTable;n&&c&&(t.scrollPosition.left=r.scrollLeft,t.scrollPosition.top=r.scrollTop),e&&(t.isLoadingData=!0,t.isGridReloading=!0,c||Ve()),k();try{let d=[];for(let[C,b]of Object.entries(t.columnFilters))b&&b.trim()&&d.push({column:C,value:b});let m=t.tableColumns.map(C=>C.name),h={filters:d,globalFilter:t.filterQuery,columns:m},f=await x.fetchTableCount(l,h);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 p={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},y=await x.fetchTableData(l,p);return s()?void 0:(t.gridData=y.rows||[],n&&r&&r.querySelector(".data-grid")&&(t.scrollPosition.left=r.scrollLeft,t.scrollPosition.top=r.scrollTop),!e&&t.editingCellInfo||(j(t.scrollPosition.top,t.scrollPosition.left),t.renderedTable=l),r&&(r.scrollLeft=t.scrollPosition.left,r.scrollTop=t.scrollPosition.top),qe(),u(`${t.totalRecordCount} records`),!0)}catch(d){if(console.error("Error loading data:",d),!s())return u(`Error: ${d.message}`),ae(d.message),!1}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var T={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]},re=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 r=Object.keys(a).filter(i=>!isNaN(parseInt(i,10))).sort((i,c)=>parseInt(i,10)-parseInt(c,10)).map(i=>a[i]);a=new Uint8Array(r)}}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:r,colIdx:i}=this.currentCellInfo,c=this.currentData;await x.updateCell(t.selectedTable,this.currentRowId,this.currentColName,l,c),t.gridData&&t.gridData[r]&&(t.gridData[r][i+L()]=l),this.inspect(l,this.currentRowId,this.currentColName,r,i),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 r=n instanceof Uint8Array?n:new Uint8Array(n);this.currentData=r;let i=this.detectType(r);this.currentType=i;let c=this.formatSize(r.length);this.infoContainer.textContent=`${l} (Row ${o}) | ${i.mime||"Unknown Type"} | ${c}`,this.renderPreview(r,i),this.renderHex(r)}detectType(n){if(this.checkSignature(n,T.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,T.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,T.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,T.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,T.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,T.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.MP3_SYNC1)||this.checkSignature(n,T.MP3_SYNC2)||this.checkSignature(n,T.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,T.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),T.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,T.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.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(r),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 r=document.createElement("span");r.style.fontSize="12px",r.style.opacity="0.7",r.textContent="Use Hex view to inspect",l.appendChild(a),l.appendChild(s),l.appendChild(r),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&&g<=126?String.fromCharCode(g):".")}else i.push(" "),c.push(" ");let d=i.slice(0,8).join(" "),m=i.slice(8).join(" "),h=c.join("");l+=`${r} ${d} ${m} |${h}| + `,a.appendChild(f)}return l.appendChild(a),l}function Qt(e,n,o,l,a,s,r,i){let c=document.createElement("tbody"),d=t.matchNav.currentIndex>=0?t.matchNav.matches[t.matchNav.currentIndex]:null,m=[];for(let p=0;p({idx:y,rowId:B(p,y)})).filter(p=>t.pinnedRowIds.has(p.rowId)),...t.gridData.map((p,y)=>({idx:y,rowId:B(p,y)})).filter(p=>!t.pinnedRowIds.has(p.rowId))],g=e.map(p=>ze([t.filterQuery,t.columnFilters[p.name]])),E=document.createDocumentFragment();for(let{idx:p,rowId:y}of f){let C=t.gridData[p],b=t.selectedRowIds.has(y),N=t.pinnedRowIds.has(y),I=document.createElement("tr");I.id=`row-${p}`,I.className=`data-row ${b?"selected":""} ${N?"pinned":""}`,I.dataset.rowid=y,I.dataset.rowidx=p,N&&(I.style.top=`${h.get(y)}px`);let w=document.createElement("td");w.className="data-cell row-number",Object.assign(w.style,{width:`${l}px`,minWidth:`${l}px`,maxWidth:`${l}px`,position:"sticky",left:"0",zIndex:N?"8":"2"});let P=t.currentPageIndex*t.rowsPerPage+p+1;w.appendChild(document.createTextNode(String(P)));let F=document.createElement("span");F.className=`pin-icon codicon codicon-pin ${N?"pinned":""}`,F.title=N?"Unpin row":"Pin row",w.appendChild(F),I.appendChild(w);for(let q=0;qw&&w.trim()!=="");if(i.innerHTML="",t.gridData.length===0&&!f&&t.tableColumns.length===0){i.appendChild(Jt());return}let g=new Set;if(t.selectedCells.length>0)for(let w of t.selectedCells)g.add(`${w.rowIdx},${w.colIdx}`);let E=document.createElement("table");if(E.className="data-grid",Object.keys(t.columnWidths).length===0&&t.gridData.length>0)for(let w of t.tableColumns){let P=w.name.length,F=w.isPrimaryKey?86:70,q=P*8+F;t.columnWidths[w.name]=Math.max(80,Math.min(250,q))}let p=[...t.tableColumns.filter(w=>t.pinnedColumns.has(w.name)),...t.tableColumns.filter(w=>!t.pinnedColumns.has(w.name))],y=new Map,C=r-1;for(let w of p)t.pinnedColumns.has(w.name)&&(y.set(w.name,C),C+=t.columnWidths[w.name]||120);let b=new Map;t.tableColumns.forEach((w,P)=>b.set(w.name,P));let N=Xt(r,p,y);E.appendChild(N);let I=Qt(p,b,y,r,52,26,g,f);E.appendChild(I),i.appendChild(E),i.scrollLeft=m,i.scrollTop=h,_e()}function qe(){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 H(){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 Ke=0;async function S(e=!0,n=!0){if(!t.selectedTable)return;let o=++Ke,l=t.selectedTable,a=t.selectedTableType,s=()=>o!==Ke||l!==t.selectedTable,r=document.getElementById("gridContainer"),c=!!(r&&r.querySelector(".data-grid"))&&t.renderedTable===t.selectedTable;n&&c&&(t.scrollPosition.left=r.scrollLeft,t.scrollPosition.top=r.scrollTop),e&&(t.isLoadingData=!0,t.isGridReloading=!0,c||Ve()),D();try{let d=[];for(let[C,b]of Object.entries(t.columnFilters))b&&b.trim()&&d.push({column:C,value:b});let m=t.tableColumns.map(C=>C.name),h={filters:d,globalFilter:t.filterQuery,columns:m},f=await x.fetchTableCount(l,h);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 p={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},y=await x.fetchTableData(l,p);return s()?void 0:(t.gridData=y.rows||[],n&&r&&r.querySelector(".data-grid")&&(t.scrollPosition.left=r.scrollLeft,t.scrollPosition.top=r.scrollTop),!e&&t.editingCellInfo||(j(t.scrollPosition.top,t.scrollPosition.left),t.renderedTable=l),r&&(r.scrollLeft=t.scrollPosition.left,r.scrollTop=t.scrollPosition.top),qe(),u(`${t.totalRecordCount} records`),!0)}catch(d){if(console.error("Error loading data:",d),!s())return u(`Error: ${d.message}`),ae(d.message),!1}finally{e&&(t.isLoadingData=!1),s()||(t.isGridReloading=!1)}}var T={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]},re=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 r=Object.keys(a).filter(i=>!isNaN(parseInt(i,10))).sort((i,c)=>parseInt(i,10)-parseInt(c,10)).map(i=>a[i]);a=new Uint8Array(r)}}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:r,colIdx:i}=this.currentCellInfo,c=this.currentData;await x.updateCell(t.selectedTable,this.currentRowId,this.currentColName,l,c),t.gridData&&t.gridData[r]&&(t.gridData[r][i+L()]=l),this.inspect(l,this.currentRowId,this.currentColName,r,i),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 r=n instanceof Uint8Array?n:new Uint8Array(n);this.currentData=r;let i=this.detectType(r);this.currentType=i;let c=this.formatSize(r.length);this.infoContainer.textContent=`${l} (Row ${o}) | ${i.mime||"Unknown Type"} | ${c}`,this.renderPreview(r,i),this.renderHex(r)}detectType(n){if(this.checkSignature(n,T.PNG))return{mime:"image/png",type:"image",ext:"png"};if(this.checkSignature(n,T.JPEG))return{mime:"image/jpeg",type:"image",ext:"jpg"};if(this.checkSignature(n,T.GIF))return{mime:"image/gif",type:"image",ext:"gif"};if(this.checkSignature(n,T.BMP))return{mime:"image/bmp",type:"image",ext:"bmp"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WEBP))return{mime:"image/webp",type:"image",ext:"webp"};if(this.checkSignature(n,T.PDF))return{mime:"application/pdf",type:"pdf",ext:"pdf"};if(this.checkSignature(n,T.ID3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.MP3_SYNC1)||this.checkSignature(n,T.MP3_SYNC2)||this.checkSignature(n,T.MP3_SYNC3))return{mime:"audio/mpeg",type:"audio",ext:"mp3"};if(this.checkSignature(n,T.OGG))return{mime:"audio/ogg",type:"audio",ext:"ogg"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.WAVE))return{mime:"audio/wav",type:"audio",ext:"wav"};if(this.checkSignature(n,T.FLAC))return{mime:"audio/flac",type:"audio",ext:"flac"};if(this.checkSignature(n.subarray(4),T.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,T.WEBM))return{mime:"video/webm",type:"video",ext:"webm"};if(this.checkSignature(n,T.RIFF)&&this.checkSignature(n.subarray(8),T.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(r),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 r=document.createElement("span");r.style.fontSize="12px",r.style.opacity="0.7",r.textContent="Use Hex view to inspect",l.appendChild(a),l.appendChild(s),l.appendChild(r),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&&g<=126?String.fromCharCode(g):".")}else i.push(" "),c.push(" ");let d=i.slice(0,8).join(" "),m=i.slice(8).join(" "),h=c.join("");l+=`${r} ${d} ${m} |${h}| `}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 Ie;function He(){Ie=new re,document.getElementById("btnCloseCellPreview")?.addEventListener("click",J),document.getElementById("formatJsonBtn")?.addEventListener("click",Yt),document.getElementById("compactJsonBtn")?.addEventListener("click",Zt),document.getElementById("wrapTextBtn")?.addEventListener("click",en),document.getElementById("openInVsCodeBtn")?.addEventListener("click",ve),document.getElementById("btnCancelCellPreview")?.addEventListener("click",J),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",Ze)}function Ge(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],r=R(s,n);if(r instanceof Uint8Array){G(e,n,o);return}if(typeof r=="string"){let d=r.trim();if(d.startsWith("{")&&d.endsWith("}")||d.startsWith("[")&&d.endsWith("]"))try{JSON.parse(d),G(e,n,o);return}catch{}}t.editingCellInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:r};let i=r===null?"":String(r);a.innerHTML="",a.classList.add("editing");let c=document.createElement("textarea");c.className="cell-input",c.value=i,c.spellcheck=!1,a.appendChild(c),c.focus(),t.activeCellInput=c,c.addEventListener("keydown",Je),c.addEventListener("blur",Xe),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function Je(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),Qe()):e.key==="Escape"&&(e.preventDefault(),ce())}function Xe(){setTimeout(()=>{t.editingCellInfo&&Qe()},100)}async function Qe(){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,r=a===null?"":String(a);if(s===r){ce(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let i=t.tableColumns[n],c=i&&i.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,le(o),l,d,a),t.gridData[e][n+L()]=d,Ye(),Se(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function ce(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;Ye(),Se(e,n,o),se()}function Ye(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",Je),t.activeCellInput.removeEventListener("blur",Xe),t.activeCellInput=null),t.editingCellInfo=null}async function ve(){if(!t.cellPreviewInfo)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,s=t.tableColumns[n],r=document.getElementById("vscode-env")?.dataset.webviewId||"default";try{u("Opening in VS Code..."),J(),await x.openCellEditor({table:t.selectedTable,name:""},le(o),l,{},{value:a,type:{type:s.type},webviewId:r,rowCount:t.gridData.length}),u("Opened in VS Code")}catch(i){console.error("Failed to open in VS Code:",i),u(`Error: ${i.message}`)}}function G(e,n,o){t.editingCellInfo&&ce();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=R(a,n);if(s instanceof Uint8Array){Ie&&Ie.inspect(s,o,l.name,e,n);return}t.cellPreviewInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:s};let r=document.getElementById("cellPreviewModal"),i=document.getElementById("cellPreviewColumnName"),c=document.getElementById("cellPreviewTypeBadge"),d=document.getElementById("cellPreviewTextarea"),m=document.getElementById("cellPreviewReadonlyBadge"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");i.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ie(),d.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",d.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",f.classList.toggle("active",t.cellPreviewWrapEnabled),r.classList.remove("hidden"),d.focus(),d.oninput=ie,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),J()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),Ze())}}function ie(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function J(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function Ze(){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,r=document.getElementById("cellPreviewTextarea").value,i=a===null?"":String(a);if(r===i){J(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let c=t.tableColumns[n],d=c&&c.notnull===1,m;r===""?m=d?"":null:!isNaN(Number(r))&&r.trim()!==""?m=Number(r):m=r;try{u("Saving..."),await x.updateCell(t.selectedTable,le(o),l,m,a),t.gridData[e][n+L()]=m,J(),Se(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function Yt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ie()}catch{u("Content is not valid JSON")}}function Zt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ie()}catch{u("Content is not valid JSON")}}function en(){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 Se(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(o,a?.type,t.dateFormat,a?.name),r=o!=null&&!(o instanceof Uint8Array);l.textContent="";let i=document.createElement("span");if(i.className="cell-text",i.textContent=s,l.appendChild(i),r){let d=document.createElement("span");d.className="expand-icon codicon codicon-link-external",d.title="View full content",l.appendChild(d)}let c=i.scrollWidth>i.clientWidth;l.classList.toggle("has-overflow",c)}function tn(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function nn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function et(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Te(e,n=1){n=n<0?-1:1;let o=tn(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=nn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}on(),et()}function V(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),et()}async function Be(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;if(o!==t.filterQuery){let l=t.filterQuery;if(t.filterQuery=o,t.currentPageIndex=0,V(),await S()===!1){t.filterQuery=l;return}A()}Te("global",e)}function tt(e){e.key==="Enter"&&!e.isComposing&&(e.preventDefault(),Be(e.shiftKey?-1:1))}function nt(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,V(),S(),A()}function ot(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,V(),j(),A())}function te(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 r of t.selectedCells)r.colIdx>=l&&r.colIdx<=a&&(s[r.rowIdx]||(s[r.rowIdx]=new Set),s[r.rowIdx].add(r.colIdx));for(let r=l;r<=a;r++){let i=t.tableColumns[r].name;t.selectedColumns.add(i);for(let c=0;c0&&a===l)t.selectedCells=t.selectedCells.filter(r=>r.colIdx!==o),t.selectedColumns.delete(n);else{let r=new Set;for(let i of t.selectedCells)i.colIdx===o&&r.add(i.rowIdx);for(let i=0;i0&&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 r=0;rr.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 r of s)r.style.width=`${o}px`,r.style.minWidth=`${o}px`,r.style.maxWidth=`${o}px`;t.pinnedColumns.has(t.resizingColumn)}function ut(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",dt),document.removeEventListener("mouseup",ut),document.body.style.userSelect="",document.body.style.cursor="",j()}function mt(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 r=B(t.gridData[s],s);t.selectedRowIds.add(r)}}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(),k(),z()}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<=r&&m.colIdx>=i&&m.colIdx<=c&&(d[m.rowIdx]||(d[m.rowIdx]=new Set),d[m.rowIdx].add(m.colIdx));for(let m=s;m<=r;m++){let h=d[m];for(let f=i;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=R(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}else if(e.metaKey||e.ctrlKey){e.preventDefault(),t.selectedRowIds.clear();let s=t.selectedCells.findIndex(r=>r.rowIdx===n&&r.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),r=Math.max(t.lastSelectedCell.rowIdx,n),i=Math.min(t.lastSelectedCell.colIdx,o),c=Math.max(t.lastSelectedCell.colIdx,o);for(let d=s;d<=r;d++)for(let m=i;m<=c;m++){let h=B(t.gridData[d],d),f=R(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),k(),z()}function ft(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 r=R(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:r},ve()}else t.cellEditBehavior==="modal"?G(n,o,l):Ge(n,o,l)}function ht(){document.getElementById("filterInput")?.addEventListener("keydown",tt),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Be(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",nt),document.getElementById("dateFormatSelect")?.addEventListener("change",ot),document.getElementById("btnFirst")?.addEventListener("click",()=>te(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>te(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>te(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>te(t.totalPageCount-1))}function gt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",ln),e.addEventListener("keydown",an),e.addEventListener("click",sn),e.addEventListener("dblclick",dn),e.addEventListener("mouseover",un),e.addEventListener("scroll",mn,{passive:!0}))}function ln(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&ct(e,n.dataset.column)}}function an(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&at(e,n)}}function sn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){rn(e,n);return}cn(e,n)}function rn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Re(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&&st(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&rt(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&<(l.dataset.column);return}}function cn(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=ne(a);it(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),r=ne(l.closest(".data-row").dataset.rowid);G(a,s,r)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=ne(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);mt(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"),r=ne(s.dataset.rowid);pt(e,l,a,r);return}}function dn(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=ne(a.dataset.rowid);ft(e,o,l,s)}}function un(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 mn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,A()}function ne(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}function yt(){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 W(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 Ct(){document.getElementById("btnAddRow")?.addEventListener("click",pn),document.getElementById("btnDeleteRows")?.addEventListener("click",hn),document.getElementById("btnAddColumn")?.addEventListener("click",wn),document.getElementById("btnSubmitAddRow")?.addEventListener("click",fn),document.getElementById("btnSubmitDelete")?.addEventListener("click",ue),document.getElementById("btnSubmitCreateTable")?.addEventListener("click",xn),document.getElementById("btnAddColumnDef")?.addEventListener("click",()=>bt()),document.getElementById("columnDefinitions")?.addEventListener("click",e=>{let n=e.target.closest(".btn-remove-col");if(n){let o=n.dataset.colid;Cn(o)}}),document.getElementById("btnSubmitAddColumn")?.addEventListener("click",bn)}function pn(){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 i=document.createElement("span");i.style.color="var(--error-color)",i.textContent="*",a.appendChild(document.createTextNode(" ")),a.appendChild(i)}let s=document.createElement("span");s.style.opacity="0.5",s.textContent=` (${n.type})`,a.appendChild(document.createTextNode(" ")),a.appendChild(s);let r=document.createElement("input");r.type="text",r.dataset.column=n.name,r.dataset.required=o.toString(),n.isPrimaryKey?(r.placeholder="Auto (Primary Key)",r.disabled=!0):o?r.placeholder="Required":r.placeholder="NULL",l.appendChild(a),l.appendChild(r),e.appendChild(l)}),W("addRowModal")}async function fn(){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 S(),u("Row inserted - Ctrl+S to save")}catch(l){console.error("Insert failed:",l),u(`Error: ${l.message}`)}}function hn(){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;W("deleteModal")}async function ue(){t.selectedColumns.size>0?await yn():t.selectedRowIds.size>0&&await gn()}async function gn(){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 S(),k(),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 yn(){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 _(),await H(),await S(),k(),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 xt=0;function wt(){document.getElementById("newTableName").value="",document.getElementById("columnDefinitions").replaceChildren(),xt=0,bt(!0),W("createTableModal")}function bt(e=!1){let n=document.getElementById("columnDefinitions"),o=++xt,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 g=document.createElement("option");g.value=f,g.textContent=f,e&&f==="INTEGER"&&(g.selected=!0),!e&&f==="TEXT"&&(g.selected=!0),s.appendChild(g)}),l.appendChild(s);let r=document.createElement("label");Object.assign(r.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"});let i=document.createElement("input");i.type="checkbox",i.className="col-pk",i.style.margin="0",e&&(i.checked=!0),r.appendChild(i),r.appendChild(document.createTextNode(" PK")),l.appendChild(r);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 h=document.createElement("span");h.className="codicon codicon-close",m.appendChild(h),l.appendChild(m),n.appendChild(l)}function Cn(e){let n=document.getElementById(`colDef_${e}`);n&&n.remove()}async function xn(){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,r=l.querySelector(".col-pk").checked,i=l.querySelector(".col-nn").checked;a&&n.push({name:a,type:s,primaryKey:r,notNull:i})}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 _(),u(`Table "${e}" created - Ctrl+S to save`)}catch(l){console.error("Create table failed:",l),u(`Error: ${l.message}`)}}function wn(){!t.selectedTable||t.selectedTableType!=="table"||(document.getElementById("newColumnName").value="",document.getElementById("newColumnType").value="TEXT",document.getElementById("newColumnDefault").value="",W("addColumnModal"))}async function bn(){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 H(),await S(),u(`Column "${e}" added - Ctrl+S to save`)}catch(l){console.error("Add column failed:",l),u(`Error: ${l.message}`)}}function Et(){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;In(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),vn(l,s)}})}async function It(){let e=document.getElementById("settingsModal");e&&(e.classList.remove("hidden"),await Le())}async function Le(){let e=document.getElementById("pragmaSettingsContainer");e.textContent="Loading settings...";try{let[n,o]=await Promise.all([x.getPragmas(),x.getExtensionSettings()]);En(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 En(e,n){let o=document.getElementById("pragmaSettingsContainer");if(!o)return;let l=(C,b)=>C.map(N=>{let I=String(N),P=String(b).toUpperCase()===I.toUpperCase(),F=document.createElement("option");return F.value=I,F.selected=P,F.textContent=I,F});o.replaceChildren();let a=C=>{let b=document.createElement("div");b.className="setting-section-title",Object.assign(b.style,{fontWeight:"600",marginBottom:"8px",paddingBottom:"4px",borderBottom:"1px solid var(--border-color)"}),b.textContent=C,o.appendChild(b)},s=(C,b,N)=>{let I=document.createElement("div");I.className="form-field";let w=document.createElement("label");if(b.type==="checkbox"?(Object.assign(w.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"}),b.style.margin="0",w.appendChild(b),w.appendChild(document.createTextNode(C)),I.appendChild(w)):(w.textContent=C,I.appendChild(w),I.appendChild(b)),N){let P=document.createElement("div");P.className="setting-desc",P.textContent=N,I.appendChild(P)}o.appendChild(I)};if(o.children.length>0){let C=document.createElement("div");C.style.height="16px",o.appendChild(C)}a("Extension Settings");let r=document.createElement("input");r.type="checkbox",r.className="setting-extension",r.dataset.key="autoCommit",r.checked=!!n.autoCommit,s("Auto-Commit Changes",r,"Automatically save changes to disk immediately. If disabled, you must save manually (Ctrl+S).");let i=document.createElement("select");i.className="setting-extension",i.dataset.key="doubleClickBehavior",l(["inline","modal","vscode"],n.cellEditBehavior).forEach(C=>i.appendChild(C)),s("Double Click Behavior",i,"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(C=>d.appendChild(C)),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 h=document.createElement("option");h.value="true",h.textContent="ON";let f=document.createElement("option");f.value="false",f.textContent="OFF",Number(e.foreign_keys)===1?h.selected=!0:f.selected=!0,m.appendChild(h),m.appendChild(f),s("Foreign Keys",m,"Enforce foreign key constraints");let g=document.createElement("select");g.className="setting-pragma",g.dataset.name="synchronous",g.dataset.type="number",[{v:0,t:"OFF (0)"},{v:1,t:"NORMAL (1)"},{v:2,t:"FULL (2)"},{v:3,t:"EXTRA (3)"}].forEach(C=>{let b=document.createElement("option");b.value=C.v,b.textContent=C.t,Number(e.synchronous)===C.v&&(b.selected=!0),g.appendChild(b)}),s("Synchronous",g,"Disk synchronization safety level");let E=document.createElement("select");E.className="setting-pragma",E.dataset.name="locking_mode",l(["NORMAL","EXCLUSIVE"],e.locking_mode).forEach(C=>E.appendChild(C)),s("Locking Mode",E,"");let p=document.createElement("select");p.className="setting-pragma",p.dataset.name="auto_vacuum",p.dataset.type="number",[{v:0,t:"NONE (0)"},{v:1,t:"FULL (1)"},{v:2,t:"INCREMENTAL (2)"}].forEach(C=>{let b=document.createElement("option");b.value=C.v,b.textContent=C.t,Number(e.auto_vacuum)===C.v&&(b.selected=!0),p.appendChild(b)}),s("Auto Vacuum",p,"");let y=document.createElement("input");y.type="number",y.className="setting-pragma",y.dataset.name="cache_size",y.dataset.type="number",y.value=e.cache_size,s("Cache Size",y,"Number of pages (positive) or kilobytes (negative)")}async function In(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 Le()}}async function vn(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 Le()}}function vt(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 St(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 Tt(e,n,o){let l=[];for(let a of e){let s=n.get(a.colIdx);if(!s)continue;let r=s.dataset||{},i=r.isnull==="true",c=r.ispatch==="true",d=s.value;if(d===""&&!i)continue;let m=o&&o[a.colIdx];if(!m)continue;let h=d,f="set";if(i)h=null;else if(c)f="json_patch";else{let g=(m.type||"").toUpperCase();(g==="INTEGER"||g==="REAL"||g==="NUMERIC")&&!isNaN(Number(d))&&d.trim()!==""&&(h=Number(d))}l.push({rowId:a.rowId,column:m.name,value:h,originalValue:a.value,operation:f,rowIdx:a.rowIdx,colIdx:a.colIdx})}return l}function Rt(){let e=document.getElementById("sidebarPanel");if(!e)return;let n=document.getElementById("sidebarFilterInput");n&&n.addEventListener("input",()=>{t.sidebarFilter=n.value,De()}),e.addEventListener("click",o=>{let l=o.target;if(l.closest("#btnOpenSettings")){It();return}if(l.closest("#btnOpenCreateTable")){o.stopPropagation(),wt();return}if(l.closest("#btnReload")){kn();return}if(l.closest("#btnApplyBatchUpdate")){Tn();return}let a=l.closest(".list-item");if(a){let c=a.dataset.name,d=a.dataset.type;if(c&&d){Nn(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&&Ln(c)}let r=l.closest(".btn-batch-null");if(r){let c=r.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);Bn(d)}return}let i=l.closest(".btn-batch-patch");if(i){let c=i.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);Rn(d,i)}return}})}async function _(){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})),De()}catch(e){console.error("Error loading schema:",e),u("Error loading schema")}}function Ne(e,n){return n?e.filter(o=>o.name.toLowerCase().includes(n)):e}function ke(e,n,o,l){let a=document.getElementById(e);a&&(a.textContent=l?`${n}/${o}`:o)}function Bt(e,n,o,l,a){let s=document.getElementById(e);if(!s)return;if(s.replaceChildren(),n.length===0){let i=document.createElement("li");i.className="list-item",i.style.opacity="0.5",i.textContent=a,s.appendChild(i);return}let r=document.createDocumentFragment();n.forEach(i=>{let c=document.createElement("li");c.className="list-item",t.selectedTable===i.name&&t.selectedTableType===o&&c.classList.add("selected"),c.dataset.name=i.name,o&&(c.dataset.type=o),c.title=i.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=i.name,c.appendChild(m),r.appendChild(c)}),s.appendChild(r)}function Sn(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 r=document.createElement("li");r.className="list-item",r.title=`${s.name} on ${s.table}`;let i=document.createElement("span");i.className="item-icon codicon codicon-list-selection",r.appendChild(i);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),r.appendChild(c),a.appendChild(r)}),l.appendChild(a)}function De(){let e=t.sidebarFilter.toLowerCase(),n=e.length>0,o=Ne(t.schemaCache.tables,e),l=Ne(t.schemaCache.views,e),a=Ne(t.schemaCache.indexes,e);ke("tablesBadge",o.length,t.schemaCache.tables.length,n),ke("viewsBadge",l.length,t.schemaCache.views.length,n),ke("indexesBadge",a.length,t.schemaCache.indexes.length,n),Bt("tablesList",o,"table","codicon-table",e?"No matching tables":"No tables"),Bt("viewsList",l,"view","codicon-eye",e?"No matching views":"No views"),Sn("indexesList",a,e?"No matching indexes":"No indexes")}function z(){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=vt(t.selectedCells,t.tableColumns);l.replaceChildren();let r=document.createDocumentFragment();for(let[i,c]of s){let d=St(c.values),m=document.createElement("div");m.className="form-field batch-field",m.dataset.colidx=i,m.style.marginBottom="8px";let h=document.createElement("label");h.style.fontSize="11px",h.style.color="var(--text-secondary)";let f=document.createTextNode(c.name+" ");h.appendChild(f);let g=document.createElement("span");g.style.opacity="0.7",g.textContent=c.type||"",h.appendChild(g),m.appendChild(h);let E=document.createElement("div");E.style.display="flex",E.style.gap="4px";let p=document.createElement("input");p.type="text",p.className="batch-input",p.placeholder=d,p.dataset.colidx=i,p.style.flex="1",p.style.minWidth="0",E.appendChild(p);let y=document.createElement("button");y.className="btn-secondary btn-batch-null",y.style.padding="2px 6px",y.title="Set to NULL",y.textContent="NULL",E.appendChild(y);let C=document.createElement("button");C.className="btn-secondary btn-batch-patch",C.style.padding="2px 6px",C.title="JSON Patch",C.textContent="{}",E.appendChild(C),m.appendChild(E),r.appendChild(m)}l.appendChild(r)}async function Tn(){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 r=t.tableColumns[a];u(`Invalid JSON for patch in ${r?.name??`column ${a}`}`);return}}let o=Tt(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(i=>({rowId:i.rowId,column:i.column,value:i.value,originalValue:i.originalValue,operation:i.operation}));if(await x.updateCellBatch(t.selectedTable,a,l),!o.some(i=>i.operation==="json_patch"))for(let i of o)t.gridData[i.rowIdx][i.colIdx+L()]=i.value;await S(!1);let r=[];for(let i of t.selectedCells){let c=t.gridData[i.rowIdx][i.colIdx+L()];r.push({...i,value:c})}t.selectedCells=r,z(),u("Batch update completed")}catch(l){console.error("Batch update failed:",l),u(`Batch update failed: ${l.message}`)}}function Bn(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 Rn(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 Ln(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 Nn(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},De();let o=document.getElementById("tableNameLabel");o&&(o.textContent=e);let l=document.getElementById("filterInput");l&&(l.value=""),await H(),await S(!0,!1),A()}async function kn(){if(t.isDbConnected)try{u("Reloading..."),await x.refreshFile(),await _(),t.selectedTable&&(await H(),await S()),u("Reloaded")}catch(e){console.error("Reload failed:",e),u(`Reload failed: ${e.message}`)}}function Lt(){document.getElementById("btnExport")?.addEventListener("click",Dn),document.getElementById("btnSubmitExport")?.addEventListener("click",Pn),document.getElementById("exportFormat")?.addEventListener("change",Nt)}function Dn(){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)})),Nt(),W("exportModal")}function Nt(){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 Pn(){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 kt(){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,r)=>s-r),o=[...new Set(t.selectedCells.map(s=>s.colIdx))].sort((s,r)=>s-r),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 r=[];for(let i of o){let c=`${s},${i}`,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," ")),r.push(d)}a.push(r.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 Dt(){if(t.selectedRowIds.size!==0)try{let e=[];for(let l=0;lc==null?"":c instanceof Uint8Array?"[BLOB]":String(c));e.push(i.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 Pt(){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+L()]=o.value;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),await S(),k(),u(`${n} - Ctrl+S to save`)}catch(e){console.error("Clear cells failed:",e),u(`Clear failed: ${e.message}`)}}}var me=50*1024*1024,Pe=!1;function $t(){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",$n),e.addEventListener("dragleave",An),e.addEventListener("drop",Mn)}var D=null;function $n(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 An(e){e.target}async function Mn(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 Fn(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 r=a.split("/");s=decodeURIComponent(r[r.length-1])}catch(r){console.warn("Failed to parse name from URI",r)}await Un(n,s,a);return}}}async function Fn(e,n,o){if(o.size>me){let l=(o.size/1048576).toFixed(1),a=(me/(1024*1024)).toFixed(0);u(`File too large (${l}MB). Maximum is ${a}MB.`);return}try{u(`Reading ${n}...`);let l=await On(o),a=new Uint8Array(l);await At(e,n,a)}catch(l){console.error("File read failed:",l),u(`File read failed: ${l.message}`)}}async function Un(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 At(e,n,a)}catch(l){console.error("URI upload failed:",l),u(`Upload failed: ${l.message}`)}}async function At(e,n,o){if(Pe){u("Upload already in progress...");return}if(o.byteLength>me){let c=(o.byteLength/1048576).toFixed(1),d=(me/(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 r=B(s,l),i=t.tableColumns[a];if(t.selectedTableType!=="table"){u("Cannot upload to a view");return}Pe=!0,t.isLoadingData=!0;try{u(`Uploading ${n} (${zn(o.byteLength)})...`);let c=s[a+L()];await x.updateCell(t.selectedTable,r,i.name,o,c),t.gridData[l][a+L()]=o,jn(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{Pe=!1,t.isLoadingData=!1}}function On(e){return new Promise((n,o)=>{let l=new FileReader;l.onload=()=>n(l.result),l.onerror=()=>o(l.error),l.readAsArrayBuffer(e)})}function zn(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 jn(e,n){let o=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 Mt={async refreshContent(e){return t.isDbConnected&&(await _(),!(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",Ee()):t.selectedTable&&await S(!1)),{success:!0}},async updateColorScheme(e){return document.documentElement.style.colorScheme=e,{success:!0}},async updateCellEditBehavior(e){return t.cellEditBehavior=e,{success:!0}}};function Vn(){window.addEventListener("message",e=>{let n=e.data;if(n&&n.kind==="invoke"){let{correlationId:l,methodName:a,parameters:s}=n,r=Mt[a];typeof r=="function"?Promise.resolve(r.apply(Mt,s||[])).then(i=>{Oe(l,i)}).catch(i=>{we(l,i instanceof Error?i.message:String(i))}):we(l,`Unknown method: ${a}`);return}if(!n||n.channel!=="rpc")return;let o=n.content;o&&o.kind==="response"&&Ue(o)})}Vn();async function Wn(){try{Rt(),Ct(),Lt(),yt(),Et(),He(),ht(),gt(),We(),$t();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 _(),u("Ready"),Ee(),document.addEventListener("keydown",async o=>{if(o.key==="Escape"&&!t.editingCellInfo&&!document.querySelector(".modal-overlay:not(.hidden)")&&se(),(o.metaKey||o.ctrlKey)&&o.key==="c"){if(t.editingCellInfo||document.activeElement.tagName==="INPUT")return;t.selectedCells.length>0?(o.preventDefault(),await kt()):t.selectedRowIds.size>0&&(o.preventDefault(),await Dt())}if((o.metaKey||o.ctrlKey)&&o.key==="a"){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT")return;t.selectedTable&&(o.preventDefault(),de(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 ue():t.selectedRowIds.size>0?await ue():t.selectedCells.length>0&&await Pt())}})}catch(e){console.error("Init error:",e),ae(e.message)}}Wn();})(); +... (${(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 Ie;function He(){Ie=new re,document.getElementById("btnCloseCellPreview")?.addEventListener("click",J),document.getElementById("formatJsonBtn")?.addEventListener("click",Yt),document.getElementById("compactJsonBtn")?.addEventListener("click",Zt),document.getElementById("wrapTextBtn")?.addEventListener("click",en),document.getElementById("openInVsCodeBtn")?.addEventListener("click",ve),document.getElementById("btnCancelCellPreview")?.addEventListener("click",J),document.getElementById("cellPreviewSaveBtn")?.addEventListener("click",Ze)}function Ge(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],r=R(s,n);if(r instanceof Uint8Array){G(e,n,o);return}if(typeof r=="string"){let d=r.trim();if(d.startsWith("{")&&d.endsWith("}")||d.startsWith("[")&&d.endsWith("]"))try{JSON.parse(d),G(e,n,o);return}catch{}}t.editingCellInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:r};let i=r===null?"":String(r);a.innerHTML="",a.classList.add("editing");let c=document.createElement("textarea");c.className="cell-input",c.value=i,c.spellcheck=!1,a.appendChild(c),c.focus(),t.activeCellInput=c,c.addEventListener("keydown",Je),c.addEventListener("blur",Xe),c.addEventListener("click",d=>d.stopPropagation()),t.isTransitioningEdit=!0,setTimeout(()=>{t.isTransitioningEdit=!1},100)}function Je(e){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),Qe()):e.key==="Escape"&&(e.preventDefault(),ce())}function Xe(){setTimeout(()=>{t.editingCellInfo&&Qe()},100)}async function Qe(){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,r=a===null?"":String(a);if(s===r){ce(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let i=t.tableColumns[n],c=i&&i.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,le(o),l,d,a),t.gridData[e][n+L()]=d,Ye(),Se(e,n,d),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(m){console.error("Save failed:",m);let h=m.message||String(m);u(`Save failed: ${h}`)}finally{t.isSavingCell=!1}}function ce(){if(!t.editingCellInfo)return;let{rowIdx:e,colIdx:n,originalValue:o}=t.editingCellInfo;Ye(),Se(e,n,o),se()}function Ye(){t.activeCellInput&&(t.activeCellInput.removeEventListener("keydown",Je),t.activeCellInput.removeEventListener("blur",Xe),t.activeCellInput=null),t.editingCellInfo=null}async function ve(){if(!t.cellPreviewInfo)return;let{rowIdx:e,colIdx:n,rowId:o,columnName:l,originalValue:a}=t.cellPreviewInfo,s=t.tableColumns[n],r=document.getElementById("vscode-env")?.dataset.webviewId||"default";try{u("Opening in VS Code..."),J(),await x.openCellEditor({table:t.selectedTable,name:""},le(o),l,{},{value:a,type:{type:s.type},webviewId:r,rowCount:t.gridData.length}),u("Opened in VS Code")}catch(i){console.error("Failed to open in VS Code:",i),u(`Error: ${i.message}`)}}function G(e,n,o){t.editingCellInfo&&ce();let l=t.tableColumns[n];if(!l)return;let a=t.gridData[e];if(!a)return;let s=R(a,n);if(s instanceof Uint8Array){Ie&&Ie.inspect(s,o,l.name,e,n);return}t.cellPreviewInfo={rowIdx:e,colIdx:n,rowId:o,columnName:l.name,originalValue:s};let r=document.getElementById("cellPreviewModal"),i=document.getElementById("cellPreviewColumnName"),c=document.getElementById("cellPreviewTypeBadge"),d=document.getElementById("cellPreviewTextarea"),m=document.getElementById("cellPreviewReadonlyBadge"),h=document.getElementById("cellPreviewSaveBtn"),f=document.getElementById("wrapTextBtn");i.textContent=l.name,c.textContent=l.type||"TEXT";let g="";s==null?g="":s instanceof Uint8Array?g="[BLOB: "+Array.from(s).map(p=>p.toString(16).padStart(2,"0")).join(" ")+"]":g=String(s),d.value=g;let E=t.selectedTableType!=="table";d.readOnly=E,E?(d.classList.add("readonly"),m.style.display="inline",h.style.display="none"):(d.classList.remove("readonly"),m.style.display="none",h.style.display="inline-block"),ie(),d.style.whiteSpace=t.cellPreviewWrapEnabled?"pre-wrap":"pre",d.style.overflowX=t.cellPreviewWrapEnabled?"hidden":"auto",f.classList.toggle("active",t.cellPreviewWrapEnabled),r.classList.remove("hidden"),d.focus(),d.oninput=ie,d.onkeydown=p=>{p.key==="Escape"?(p.preventDefault(),J()):p.key==="Enter"&&(p.ctrlKey||p.metaKey)&&(p.preventDefault(),Ze())}}function ie(){let e=document.getElementById("cellPreviewTextarea"),n=document.getElementById("cellPreviewCharCount"),o=e.value.length;n.textContent=`${o.toLocaleString()} character${o!==1?"s":""}`}function J(){document.getElementById("cellPreviewModal").classList.add("hidden"),t.cellPreviewInfo=null}async function Ze(){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,r=document.getElementById("cellPreviewTextarea").value,i=a===null?"":String(a);if(r===i){J(),t.selectedCells=[],t.lastSelectedCell=null,M();return}let c=t.tableColumns[n],d=c&&c.notnull===1,m;r===""?m=d?"":null:!isNaN(Number(r))&&r.trim()!==""?m=Number(r):m=r;try{u("Saving..."),await x.updateCell(t.selectedTable,le(o),l,m,a),t.gridData[e][n+L()]=m,J(),Se(e,n,m),t.selectedCells=[],t.lastSelectedCell=null,M(),u("Saved")}catch(h){console.error("Save failed:",h),u(`Save failed: ${h.message}`)}}function Yt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n,null,2),ie()}catch{u("Content is not valid JSON")}}function Zt(){let e=document.getElementById("cellPreviewTextarea");try{let n=JSON.parse(e.value);e.value=JSON.stringify(n),ie()}catch{u("Content is not valid JSON")}}function en(){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 Se(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(o,a?.type,t.dateFormat,a?.name),r=o!=null&&!(o instanceof Uint8Array);l.textContent="";let i=document.createElement("span");if(i.className="cell-text",i.textContent=s,l.appendChild(i),r){let d=document.createElement("span");d.className="expand-icon codicon codicon-link-external",d.title="View full content",l.appendChild(d)}let c=i.scrollWidth>i.clientWidth;l.classList.toggle("has-overflow",c)}function tn(e){return(e==="global"?t.filterQuery:t.columnFilters[e]||"").trim().toLowerCase()}function nn(e,n){let o=[];if(!n)return o;let l=[];t.tableColumns.forEach((a,s)=>{(e==="global"||a.name===e)&&l.push({col:a,colIdx:s})});for(let a=0;as.classList.remove("active-match-cell"));let{matches:e,currentIndex:n}=t.matchNav;if(n<0||n>=e.length)return;let{rowIdx:o,colIdx:l}=e[n],a=document.getElementById(`cell-${o}-${l}`);a&&(a.classList.add("active-match-cell"),a.scrollIntoView({block:"nearest",inline:"nearest"}))}function et(){let{scope:e,matches:n,currentIndex:o}=t.matchNav,l=n.length>0?`${o+1}/${n.length}`:"",a=document.getElementById("filterMatchCounter");a&&(a.textContent=e==="global"?l:""),document.querySelectorAll(".column-filter-counter").forEach(s=>{s.textContent=s.dataset.column===e?l:""})}function Te(e,n=1){n=n<0?-1:1;let o=tn(e);if(t.matchNav.scope===e&&t.matchNav.term===o&&t.matchNav.matches.length>0){let a=t.matchNav.matches.length;t.matchNav.currentIndex=(t.matchNav.currentIndex+n+a)%a}else{let a=nn(e,o);t.matchNav.scope=e,t.matchNav.term=o,t.matchNav.matches=a,t.matchNav.currentIndex=a.length===0?-1:n===1?0:a.length-1}on(),et()}function V(){t.matchNav.scope=null,t.matchNav.term=null,t.matchNav.matches=[],t.matchNav.currentIndex=-1,document.querySelectorAll(".active-match-cell").forEach(e=>e.classList.remove("active-match-cell")),et()}async function Be(e=1){if(t.isGridReloading)return;let n=document.getElementById("filterInput");if(!n)return;let o=n.value;if(o!==t.filterQuery){let l=t.filterQuery;t.filterQuery=o,t.currentPageIndex=0,V();let a=await S();if(a!==!0){a===!1&&(t.filterQuery=l);return}A()}Te("global",e)}function tt(e){e.key==="Enter"&&!e.isComposing&&(e.preventDefault(),Be(e.shiftKey?-1:1))}function nt(){t.rowsPerPage=parseInt(document.getElementById("pageSizeSelect").value,10),t.currentPageIndex=0,V(),S(),A()}function ot(){let e=document.getElementById("dateFormatSelect");e&&(t.dateFormat=e.value,V(),j(),A())}function te(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 r of t.selectedCells)r.colIdx>=l&&r.colIdx<=a&&(s[r.rowIdx]||(s[r.rowIdx]=new Set),s[r.rowIdx].add(r.colIdx));for(let r=l;r<=a;r++){let i=t.tableColumns[r].name;t.selectedColumns.add(i);for(let c=0;c0&&a===l)t.selectedCells=t.selectedCells.filter(r=>r.colIdx!==o),t.selectedColumns.delete(n);else{let r=new Set;for(let i of t.selectedCells)i.colIdx===o&&r.add(i.rowIdx);for(let i=0;i0&&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 r=0;rr.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 r of s)r.style.width=`${o}px`,r.style.minWidth=`${o}px`,r.style.maxWidth=`${o}px`;t.pinnedColumns.has(t.resizingColumn)}function ut(){if(!t.resizingColumn)return;let e=document.querySelector(".resize-handle.resizing");e&&e.classList.remove("resizing"),t.resizingColumn=null,document.removeEventListener("mousemove",dt),document.removeEventListener("mouseup",ut),document.body.style.userSelect="",document.body.style.cursor="",j()}function mt(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 r=B(t.gridData[s],s);t.selectedRowIds.add(r)}}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(),D(),z()}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<=r&&m.colIdx>=i&&m.colIdx<=c&&(d[m.rowIdx]||(d[m.rowIdx]=new Set),d[m.rowIdx].add(m.colIdx));for(let m=s;m<=r;m++){let h=d[m];for(let f=i;f<=c;f++)if(!h||!h.has(f)){let g=B(t.gridData[m],m),E=R(t.gridData[m],f);t.selectedCells.push({rowIdx:m,colIdx:f,rowId:g,value:E})}}}else if(e.metaKey||e.ctrlKey){e.preventDefault(),t.selectedRowIds.clear();let s=t.selectedCells.findIndex(r=>r.rowIdx===n&&r.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),r=Math.max(t.lastSelectedCell.rowIdx,n),i=Math.min(t.lastSelectedCell.colIdx,o),c=Math.max(t.lastSelectedCell.colIdx,o);for(let d=s;d<=r;d++)for(let m=i;m<=c;m++){let h=B(t.gridData[d],d),f=R(t.gridData[d],m);t.selectedCells.push({rowIdx:d,colIdx:m,rowId:h,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(),D(),z()}function ft(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 r=R(s,o);t.cellPreviewInfo={rowIdx:n,colIdx:o,rowId:l,columnName:a.name,originalValue:r},ve()}else t.cellEditBehavior==="modal"?G(n,o,l):Ge(n,o,l)}function ht(){document.getElementById("filterInput")?.addEventListener("keydown",tt),document.getElementById("btnApplyFilter")?.addEventListener("click",()=>Be(1)),document.getElementById("pageSizeSelect")?.addEventListener("change",nt),document.getElementById("dateFormatSelect")?.addEventListener("change",ot),document.getElementById("btnFirst")?.addEventListener("click",()=>te(0)),document.getElementById("btnPrev")?.addEventListener("click",()=>te(t.currentPageIndex-1)),document.getElementById("btnNext")?.addEventListener("click",()=>te(t.currentPageIndex+1)),document.getElementById("btnLast")?.addEventListener("click",()=>te(t.totalPageCount-1))}function gt(){let e=document.getElementById("gridContainer");e&&(e.addEventListener("mousedown",ln),e.addEventListener("keydown",an),e.addEventListener("click",sn),e.addEventListener("dblclick",dn),e.addEventListener("mouseover",un),e.addEventListener("scroll",mn,{passive:!0}))}function ln(e){if(e.target.classList.contains("resize-handle")){e.stopPropagation();let n=e.target.closest(".header-cell");n&&n.dataset.column&&ct(e,n.dataset.column)}}function an(e){if(!t.isGridReloading&&e.target.classList.contains("column-filter")){let n=e.target.dataset.column;n&&at(e,n)}}function sn(e){if(t.isGridReloading)return;let n=e.target;if(n.closest(".grid-header")){rn(e,n);return}cn(e,n)}function rn(e,n){if(n.closest(".filter-apply-btn")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&Re(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&&st(e,l.dataset.column);return}if(n.closest(".pin-icon")){e.stopPropagation();let l=n.closest(".header-cell");l&&l.dataset.column&&rt(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&<(l.dataset.column);return}}function cn(e,n){if(n.closest(".pin-icon")){let l=n.closest(".data-row");if(l){let a=l.dataset.rowid,s=ne(a);it(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),r=ne(l.closest(".data-row").dataset.rowid);G(a,s,r)}return}if(n.closest(".row-number")){let l=n.closest(".data-row");if(l){let a=ne(l.dataset.rowid),s=parseInt(l.dataset.rowidx,10);mt(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"),r=ne(s.dataset.rowid);pt(e,l,a,r);return}}function dn(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=ne(a.dataset.rowid);ft(e,o,l,s)}}function un(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 mn(e){if(t.isGridReloading)return;let n=e.currentTarget;t.scrollPosition.left=n.scrollLeft,t.scrollPosition.top=n.scrollTop,A()}function ne(e){if(e==null)return e;let n=Number(e);return!isNaN(n)&&e.trim()!==""?n:e}function yt(){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 W(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 Ct(){document.getElementById("btnAddRow")?.addEventListener("click",pn),document.getElementById("btnDeleteRows")?.addEventListener("click",hn),document.getElementById("btnAddColumn")?.addEventListener("click",wn),document.getElementById("btnSubmitAddRow")?.addEventListener("click",fn),document.getElementById("btnSubmitDelete")?.addEventListener("click",ue),document.getElementById("btnSubmitCreateTable")?.addEventListener("click",xn),document.getElementById("btnAddColumnDef")?.addEventListener("click",()=>bt()),document.getElementById("columnDefinitions")?.addEventListener("click",e=>{let n=e.target.closest(".btn-remove-col");if(n){let o=n.dataset.colid;Cn(o)}}),document.getElementById("btnSubmitAddColumn")?.addEventListener("click",bn)}function pn(){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 i=document.createElement("span");i.style.color="var(--error-color)",i.textContent="*",a.appendChild(document.createTextNode(" ")),a.appendChild(i)}let s=document.createElement("span");s.style.opacity="0.5",s.textContent=` (${n.type})`,a.appendChild(document.createTextNode(" ")),a.appendChild(s);let r=document.createElement("input");r.type="text",r.dataset.column=n.name,r.dataset.required=o.toString(),n.isPrimaryKey?(r.placeholder="Auto (Primary Key)",r.disabled=!0):o?r.placeholder="Required":r.placeholder="NULL",l.appendChild(a),l.appendChild(r),e.appendChild(l)}),W("addRowModal")}async function fn(){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 S(),u("Row inserted - Ctrl+S to save")}catch(l){console.error("Insert failed:",l),u(`Error: ${l.message}`)}}function hn(){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;W("deleteModal")}async function ue(){t.selectedColumns.size>0?await yn():t.selectedRowIds.size>0&&await gn()}async function gn(){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 S(),D(),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 yn(){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 _(),await H(),await S(),D(),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 xt=0;function wt(){document.getElementById("newTableName").value="",document.getElementById("columnDefinitions").replaceChildren(),xt=0,bt(!0),W("createTableModal")}function bt(e=!1){let n=document.getElementById("columnDefinitions"),o=++xt,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 g=document.createElement("option");g.value=f,g.textContent=f,e&&f==="INTEGER"&&(g.selected=!0),!e&&f==="TEXT"&&(g.selected=!0),s.appendChild(g)}),l.appendChild(s);let r=document.createElement("label");Object.assign(r.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"});let i=document.createElement("input");i.type="checkbox",i.className="col-pk",i.style.margin="0",e&&(i.checked=!0),r.appendChild(i),r.appendChild(document.createTextNode(" PK")),l.appendChild(r);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 h=document.createElement("span");h.className="codicon codicon-close",m.appendChild(h),l.appendChild(m),n.appendChild(l)}function Cn(e){let n=document.getElementById(`colDef_${e}`);n&&n.remove()}async function xn(){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,r=l.querySelector(".col-pk").checked,i=l.querySelector(".col-nn").checked;a&&n.push({name:a,type:s,primaryKey:r,notNull:i})}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 _(),u(`Table "${e}" created - Ctrl+S to save`)}catch(l){console.error("Create table failed:",l),u(`Error: ${l.message}`)}}function wn(){!t.selectedTable||t.selectedTableType!=="table"||(document.getElementById("newColumnName").value="",document.getElementById("newColumnType").value="TEXT",document.getElementById("newColumnDefault").value="",W("addColumnModal"))}async function bn(){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 H(),await S(),u(`Column "${e}" added - Ctrl+S to save`)}catch(l){console.error("Add column failed:",l),u(`Error: ${l.message}`)}}function Et(){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;In(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),vn(l,s)}})}async function It(){let e=document.getElementById("settingsModal");e&&(e.classList.remove("hidden"),await Le())}async function Le(){let e=document.getElementById("pragmaSettingsContainer");e.textContent="Loading settings...";try{let[n,o]=await Promise.all([x.getPragmas(),x.getExtensionSettings()]);En(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 En(e,n){let o=document.getElementById("pragmaSettingsContainer");if(!o)return;let l=(C,b)=>C.map(N=>{let I=String(N),P=String(b).toUpperCase()===I.toUpperCase(),F=document.createElement("option");return F.value=I,F.selected=P,F.textContent=I,F});o.replaceChildren();let a=C=>{let b=document.createElement("div");b.className="setting-section-title",Object.assign(b.style,{fontWeight:"600",marginBottom:"8px",paddingBottom:"4px",borderBottom:"1px solid var(--border-color)"}),b.textContent=C,o.appendChild(b)},s=(C,b,N)=>{let I=document.createElement("div");I.className="form-field";let w=document.createElement("label");if(b.type==="checkbox"?(Object.assign(w.style,{display:"flex",alignItems:"center",gap:"4px",cursor:"pointer"}),b.style.margin="0",w.appendChild(b),w.appendChild(document.createTextNode(C)),I.appendChild(w)):(w.textContent=C,I.appendChild(w),I.appendChild(b)),N){let P=document.createElement("div");P.className="setting-desc",P.textContent=N,I.appendChild(P)}o.appendChild(I)};if(o.children.length>0){let C=document.createElement("div");C.style.height="16px",o.appendChild(C)}a("Extension Settings");let r=document.createElement("input");r.type="checkbox",r.className="setting-extension",r.dataset.key="autoCommit",r.checked=!!n.autoCommit,s("Auto-Commit Changes",r,"Automatically save changes to disk immediately. If disabled, you must save manually (Ctrl+S).");let i=document.createElement("select");i.className="setting-extension",i.dataset.key="doubleClickBehavior",l(["inline","modal","vscode"],n.cellEditBehavior).forEach(C=>i.appendChild(C)),s("Double Click Behavior",i,"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(C=>d.appendChild(C)),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 h=document.createElement("option");h.value="true",h.textContent="ON";let f=document.createElement("option");f.value="false",f.textContent="OFF",Number(e.foreign_keys)===1?h.selected=!0:f.selected=!0,m.appendChild(h),m.appendChild(f),s("Foreign Keys",m,"Enforce foreign key constraints");let g=document.createElement("select");g.className="setting-pragma",g.dataset.name="synchronous",g.dataset.type="number",[{v:0,t:"OFF (0)"},{v:1,t:"NORMAL (1)"},{v:2,t:"FULL (2)"},{v:3,t:"EXTRA (3)"}].forEach(C=>{let b=document.createElement("option");b.value=C.v,b.textContent=C.t,Number(e.synchronous)===C.v&&(b.selected=!0),g.appendChild(b)}),s("Synchronous",g,"Disk synchronization safety level");let E=document.createElement("select");E.className="setting-pragma",E.dataset.name="locking_mode",l(["NORMAL","EXCLUSIVE"],e.locking_mode).forEach(C=>E.appendChild(C)),s("Locking Mode",E,"");let p=document.createElement("select");p.className="setting-pragma",p.dataset.name="auto_vacuum",p.dataset.type="number",[{v:0,t:"NONE (0)"},{v:1,t:"FULL (1)"},{v:2,t:"INCREMENTAL (2)"}].forEach(C=>{let b=document.createElement("option");b.value=C.v,b.textContent=C.t,Number(e.auto_vacuum)===C.v&&(b.selected=!0),p.appendChild(b)}),s("Auto Vacuum",p,"");let y=document.createElement("input");y.type="number",y.className="setting-pragma",y.dataset.name="cache_size",y.dataset.type="number",y.value=e.cache_size,s("Cache Size",y,"Number of pages (positive) or kilobytes (negative)")}async function In(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 Le()}}async function vn(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 Le()}}function vt(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 St(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 Tt(e,n,o){let l=[];for(let a of e){let s=n.get(a.colIdx);if(!s)continue;let r=s.dataset||{},i=r.isnull==="true",c=r.ispatch==="true",d=s.value;if(d===""&&!i)continue;let m=o&&o[a.colIdx];if(!m)continue;let h=d,f="set";if(i)h=null;else if(c)f="json_patch";else{let g=(m.type||"").toUpperCase();(g==="INTEGER"||g==="REAL"||g==="NUMERIC")&&!isNaN(Number(d))&&d.trim()!==""&&(h=Number(d))}l.push({rowId:a.rowId,column:m.name,value:h,originalValue:a.value,operation:f,rowIdx:a.rowIdx,colIdx:a.colIdx})}return l}function Rt(){let e=document.getElementById("sidebarPanel");if(!e)return;let n=document.getElementById("sidebarFilterInput");n&&n.addEventListener("input",()=>{t.sidebarFilter=n.value,ke()}),e.addEventListener("click",o=>{let l=o.target;if(l.closest("#btnOpenSettings")){It();return}if(l.closest("#btnOpenCreateTable")){o.stopPropagation(),wt();return}if(l.closest("#btnReload")){Dn();return}if(l.closest("#btnApplyBatchUpdate")){Tn();return}let a=l.closest(".list-item");if(a){let c=a.dataset.name,d=a.dataset.type;if(c&&d){Nn(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&&Ln(c)}let r=l.closest(".btn-batch-null");if(r){let c=r.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);Bn(d)}return}let i=l.closest(".btn-batch-patch");if(i){let c=i.closest(".batch-field");if(c){let d=parseInt(c.dataset.colidx,10);Rn(d,i)}return}})}async function _(){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})),ke()}catch(e){console.error("Error loading schema:",e),u("Error loading schema")}}function Ne(e,n){return n?e.filter(o=>o.name.toLowerCase().includes(n)):e}function De(e,n,o,l){let a=document.getElementById(e);a&&(a.textContent=l?`${n}/${o}`:o)}function Bt(e,n,o,l,a){let s=document.getElementById(e);if(!s)return;if(s.replaceChildren(),n.length===0){let i=document.createElement("li");i.className="list-item",i.style.opacity="0.5",i.textContent=a,s.appendChild(i);return}let r=document.createDocumentFragment();n.forEach(i=>{let c=document.createElement("li");c.className="list-item",t.selectedTable===i.name&&t.selectedTableType===o&&c.classList.add("selected"),c.dataset.name=i.name,o&&(c.dataset.type=o),c.title=i.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=i.name,c.appendChild(m),r.appendChild(c)}),s.appendChild(r)}function Sn(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 r=document.createElement("li");r.className="list-item",r.title=`${s.name} on ${s.table}`;let i=document.createElement("span");i.className="item-icon codicon codicon-list-selection",r.appendChild(i);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),r.appendChild(c),a.appendChild(r)}),l.appendChild(a)}function ke(){let e=t.sidebarFilter.toLowerCase(),n=e.length>0,o=Ne(t.schemaCache.tables,e),l=Ne(t.schemaCache.views,e),a=Ne(t.schemaCache.indexes,e);De("tablesBadge",o.length,t.schemaCache.tables.length,n),De("viewsBadge",l.length,t.schemaCache.views.length,n),De("indexesBadge",a.length,t.schemaCache.indexes.length,n),Bt("tablesList",o,"table","codicon-table",e?"No matching tables":"No tables"),Bt("viewsList",l,"view","codicon-eye",e?"No matching views":"No views"),Sn("indexesList",a,e?"No matching indexes":"No indexes")}function z(){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=vt(t.selectedCells,t.tableColumns);l.replaceChildren();let r=document.createDocumentFragment();for(let[i,c]of s){let d=St(c.values),m=document.createElement("div");m.className="form-field batch-field",m.dataset.colidx=i,m.style.marginBottom="8px";let h=document.createElement("label");h.style.fontSize="11px",h.style.color="var(--text-secondary)";let f=document.createTextNode(c.name+" ");h.appendChild(f);let g=document.createElement("span");g.style.opacity="0.7",g.textContent=c.type||"",h.appendChild(g),m.appendChild(h);let E=document.createElement("div");E.style.display="flex",E.style.gap="4px";let p=document.createElement("input");p.type="text",p.className="batch-input",p.placeholder=d,p.dataset.colidx=i,p.style.flex="1",p.style.minWidth="0",E.appendChild(p);let y=document.createElement("button");y.className="btn-secondary btn-batch-null",y.style.padding="2px 6px",y.title="Set to NULL",y.textContent="NULL",E.appendChild(y);let C=document.createElement("button");C.className="btn-secondary btn-batch-patch",C.style.padding="2px 6px",C.title="JSON Patch",C.textContent="{}",E.appendChild(C),m.appendChild(E),r.appendChild(m)}l.appendChild(r)}async function Tn(){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 r=t.tableColumns[a];u(`Invalid JSON for patch in ${r?.name??`column ${a}`}`);return}}let o=Tt(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(i=>({rowId:i.rowId,column:i.column,value:i.value,originalValue:i.originalValue,operation:i.operation}));if(await x.updateCellBatch(t.selectedTable,a,l),!o.some(i=>i.operation==="json_patch"))for(let i of o)t.gridData[i.rowIdx][i.colIdx+L()]=i.value;await S(!1);let r=[];for(let i of t.selectedCells){let c=t.gridData[i.rowIdx][i.colIdx+L()];r.push({...i,value:c})}t.selectedCells=r,z(),u("Batch update completed")}catch(l){console.error("Batch update failed:",l),u(`Batch update failed: ${l.message}`)}}function Bn(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 Rn(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 Ln(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 Nn(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},ke();let o=document.getElementById("tableNameLabel");o&&(o.textContent=e);let l=document.getElementById("filterInput");l&&(l.value=""),await H(),await S(!0,!1),A()}async function Dn(){if(t.isDbConnected)try{u("Reloading..."),await x.refreshFile(),await _(),t.selectedTable&&(await H(),await S()),u("Reloaded")}catch(e){console.error("Reload failed:",e),u(`Reload failed: ${e.message}`)}}function Lt(){document.getElementById("btnExport")?.addEventListener("click",kn),document.getElementById("btnSubmitExport")?.addEventListener("click",Pn),document.getElementById("exportFormat")?.addEventListener("change",Nt)}function kn(){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)})),Nt(),W("exportModal")}function Nt(){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 Pn(){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 Dt(){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,r)=>s-r),o=[...new Set(t.selectedCells.map(s=>s.colIdx))].sort((s,r)=>s-r),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 r=[];for(let i of o){let c=`${s},${i}`,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," ")),r.push(d)}a.push(r.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 kt(){if(t.selectedRowIds.size!==0)try{let e=[];for(let l=0;lc==null?"":c instanceof Uint8Array?"[BLOB]":String(c));e.push(i.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 Pt(){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+L()]=o.value;t.selectedCells=[],t.lastSelectedCell=null,t.selectedColumns.clear(),await S(),D(),u(`${n} - Ctrl+S to save`)}catch(e){console.error("Clear cells failed:",e),u(`Clear failed: ${e.message}`)}}}var me=50*1024*1024,Pe=!1;function $t(){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",$n),e.addEventListener("dragleave",An),e.addEventListener("drop",Mn)}var k=null;function $n(e){if(e.preventDefault(),t.isGridReloading){k&&(k.classList.remove("drag-over"),k=null);return}e.dataTransfer.dropEffect="copy";let n=e.target.closest(".data-cell");n&&!n.classList.contains("row-number")?(k&&k!==n&&k.classList.remove("drag-over"),n.classList.add("drag-over"),k=n):k&&(k.classList.remove("drag-over"),k=null)}function An(e){e.target}async function Mn(e){if(e.preventDefault(),k&&(k.classList.remove("drag-over"),k=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 Fn(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 r=a.split("/");s=decodeURIComponent(r[r.length-1])}catch(r){console.warn("Failed to parse name from URI",r)}await Un(n,s,a);return}}}async function Fn(e,n,o){if(o.size>me){let l=(o.size/1048576).toFixed(1),a=(me/(1024*1024)).toFixed(0);u(`File too large (${l}MB). Maximum is ${a}MB.`);return}try{u(`Reading ${n}...`);let l=await On(o),a=new Uint8Array(l);await At(e,n,a)}catch(l){console.error("File read failed:",l),u(`File read failed: ${l.message}`)}}async function Un(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 At(e,n,a)}catch(l){console.error("URI upload failed:",l),u(`Upload failed: ${l.message}`)}}async function At(e,n,o){if(Pe){u("Upload already in progress...");return}if(o.byteLength>me){let c=(o.byteLength/1048576).toFixed(1),d=(me/(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 r=B(s,l),i=t.tableColumns[a];if(t.selectedTableType!=="table"){u("Cannot upload to a view");return}Pe=!0,t.isLoadingData=!0;try{u(`Uploading ${n} (${zn(o.byteLength)})...`);let c=s[a+L()];await x.updateCell(t.selectedTable,r,i.name,o,c),t.gridData[l][a+L()]=o,jn(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{Pe=!1,t.isLoadingData=!1}}function On(e){return new Promise((n,o)=>{let l=new FileReader;l.onload=()=>n(l.result),l.onerror=()=>o(l.error),l.readAsArrayBuffer(e)})}function zn(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 jn(e,n){let o=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 Mt={async refreshContent(e){return t.isDbConnected&&(await _(),!(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",Ee()):t.selectedTable&&await S(!1)),{success:!0}},async updateColorScheme(e){return document.documentElement.style.colorScheme=e,{success:!0}},async updateCellEditBehavior(e){return t.cellEditBehavior=e,{success:!0}}};function Vn(){window.addEventListener("message",e=>{let n=e.data;if(n&&n.kind==="invoke"){let{correlationId:l,methodName:a,parameters:s}=n,r=Mt[a];typeof r=="function"?Promise.resolve(r.apply(Mt,s||[])).then(i=>{Oe(l,i)}).catch(i=>{we(l,i instanceof Error?i.message:String(i))}):we(l,`Unknown method: ${a}`);return}if(!n||n.channel!=="rpc")return;let o=n.content;o&&o.kind==="response"&&Ue(o)})}Vn();async function Wn(){try{Rt(),Ct(),Lt(),yt(),Et(),He(),ht(),gt(),We(),$t();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 _(),u("Ready"),Ee(),document.addEventListener("keydown",async o=>{if(o.key==="Escape"&&!t.editingCellInfo&&!document.querySelector(".modal-overlay:not(.hidden)")&&se(),(o.metaKey||o.ctrlKey)&&o.key==="c"){if(t.editingCellInfo||document.activeElement.tagName==="INPUT")return;t.selectedCells.length>0?(o.preventDefault(),await Dt()):t.selectedRowIds.size>0&&(o.preventDefault(),await kt())}if((o.metaKey||o.ctrlKey)&&o.key==="a"){if(t.isGridReloading||t.editingCellInfo||document.activeElement.tagName==="INPUT")return;t.selectedTable&&(o.preventDefault(),de(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 ue():t.selectedRowIds.size>0?await ue():t.selectedCells.length>0&&await Pt())}})}catch(e){console.error("Init error:",e),ae(e.message)}}Wn();})();