Row detail dialog was using displayableColumnIndexes instead of
visibleColumnIndexes, causing columns hidden via "hide null columns"
or manual hiding to still appear in the detail view.
* feat(grid): add layer preview for geometry columns with Leaflet map
* fix: restore dev:backend script with env vars and cargo watch
* chore: update pnpm-lock.yaml for leaflet and dom-to-image-more dependencies
---------
Co-authored-by: dqn <someonegdeng@qq.com>
DOM mode: replace box-shadow with outline to avoid stacking with row border-b.
Canvas mode: draw row border before selected cell overlay so selection uses
uniform color on all four sides; clamp top edge to prevent canvas clipping.
- Route SELECT * FROM <index> through /_search for simple browses; aggregates/projections stay on /_sql
- Drive completion columns from /_mapping (flattened dotted fields, multi-fields)
- Switch editor completion to SQL when the active statement starts with SELECT/WITH on ES
- Skip generic SQL semantic diagnostics for ES (hyphenated wildcard indices caused 500s)
- Wire ES into server-side pagination plan; derive completion context from line blocks
- Fix result-grid pagination exceeding in-memory result sets (allRowsLoaded)
The data grid header only showed column names, and column types were
available only via tableMeta (open-table view). Arbitrary query results
(e.g. `select * from pg_depend`) therefore showed no type at all, which
is exactly the case the reporter hit.
Backend: add `column_types` to QueryResult (serde-default, backward
compatible) and populate it for the native drivers where the type is
readily available — PostgreSQL, MySQL, SQL Server, ClickHouse. Other
drivers leave it empty for now (no behavior change); schemaless stores
(Mongo/Redis/ES) have no column types.
Frontend: render a type row under each column name in the grid header,
color-coded by type. The type is resolved from tableMeta first (richer,
includes precision) and falls back to the query result's column_types by
index. Add a `showColumnTypesInHeader` setting (default on) and keep the
msgpack tab-result cache compatible. The source-selection logic is
extracted to lib/dataGridColumnType.ts with unit tests.
Co-authored-by: vrustx <vrustx@vrustxdeMac-mini.local>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The bottom-docked cell detail side panel could not be resized and its
details view still used the old three-block "value / raw value / formatted
JSON" layout, causing the issues reported on macOS:
- bottom layout had no resize handle and a fixed, too-small height
- "value" showed the grid's (truncated) display value while "raw value"
showed the original — redundant for JSON, and shown inconsistently
(only when the two happened to differ)
- the "formatted value" block rendered the grid-truncated display value,
which is incomplete and confusing inside the detail view
Changes:
- side panel bottom layout: add a top-edge row-resize handle and make the
height adjustable (reuse clampCellDetailPanelSize, support vertical drag)
- unify the side panel details view with the cell-detail dialog: a single
value area showing the original value plus a "format JSON" toggle button
- drop the redundant "raw value" / "formatted value" blocks in both the
side panel and the dialog (the dialog change also addresses the #528
follow-up where the truncated "formatted value" block was confusing)
Co-authored-by: vrustx <vrustx@vrustxdeMac-mini.local>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Address the follow-up UI feedback on the data detail dialogs:
- cell detail: toggle between raw value and formatted JSON inside a single
value area (via a "format JSON" button) instead of stacking the value,
formatted value and formatted JSON blocks, removing the redundancy.
- kill horizontal scrollbars: add break-words to the formatted-value block,
and constrain row/column detail value columns with w-full max-w-0 so long
unbroken values wrap instead of overflowing the table.
- row detail: column name uses break-words instead of break-all to stop long
names from wrapping character-by-character.
- unify footer button layout across the three detail dialogs (bulk-copy
actions on the left, copy-name on the right).
- add a search box to row & column detail to filter fields by name / value /
row number (filterDataGridDetailFields + unit tests).
- i18n: add detailSearchPlaceholder / detailSearchNoMatch for all 6 locales.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When a cell is in edit mode, the native paste event was bubbling up to
the grid root's @paste handler, which called preventDefault() and wrote
values directly to the data model instead of the edit input. This caused
the "Pasted!" toast to appear but the input content remained unchanged.
Adding @paste.stop on edit inputs allows the browser's default paste
behavior to insert text into the input field, properly updating editValue
via v-model.
The toolbar refresh, rollback, and post-save reload were passing only
the manual WHERE input to the reload event, discarding structured filter
conditions added via the filter builder popover. Changed all three call
sites to use currentWhereInput() which combines both filter sources.