* feat(objects): add checkbox column toggle for object browser
- Add objectBrowserShowCheckbox setting (default: false) to EditorSettings
- Checkbox column hidden by default; auto-shows when any tables are selected
- Toolbar button toggles multi-select mode (active state highlighted in primary color)
- Clearing the toggle also clears all selections
- Add i18n key objects.toggleCheckbox in en/zh-CN
Closes#2748 (part 2)
* feat(objects): add grid view mode for object browser
- Add objectBrowserViewMode setting (list | grid, default: list) to EditorSettings
- Toolbar segmented control toggles between list and grid views, persisted across sessions
- Grid view renders cards (icon + name + type + row count) in a responsive auto-fill layout
- Reuses existing sort, search, filter, multi-select and context menu
- Partition children not expandable in grid mode (minimal version)
- Add i18n keys objects.viewList/objects.viewGrid across all locales
- Backfill objects.toggleCheckbox in es/it/ja/pt-BR/zh-TW (missed in prior commit)
Refs #2748
* fix(objects): redesign grid view cards for visual polish
- Center-align content (icon + name + metadata) for a proper tile look
- Enlarge type icons (h-7) so color coding is visible at a glance
- Merge type label and row count on one line with separator
- Reduce internal spacing (gap-1.5) and tighten padding
- Replace background hover with border glow + shadow for cleaner feedback
- Narrow min card width (150px) for denser grid, add align-content:start
- Softer rounded-lg corners
Refs #2748
* fix(objects): polish grid view card visual details
- Add colored circle background behind icons (type-matched opacity-10)
- Increase name font from text-xs to text-sm for better legibility
- Separate row count into a primary-tinted badge (only shown when > 0)
- Keep type label clean without mixing row count inline
Refs #2748
* fix(objects): refine grid card min-width, icon shadow, and type label size
* @
feat(object-browser): align tile/grid card metadata with list view columns
Add the metadata categories present in the list view but missing from
the tile/grid card view (objectBrowserViewMode === "grid"):
- Size pill (totalBytes) next to the existing rows pill in the stats row
- Timestamps row showing created_at · updated_at (per-row conditional)
- Comment row (truncated, per-row conditional, with hover tooltip)
Each card now shows: icon, name, type label, rows pill, size pill,
timestamps (when present), and comment (when present) — matching the
same metadata categories the list view displays across its 8 columns.
Also fix a pre-existing bug in the list view where the totalBytes
column tooltip (:title) used formatObjectBrowserCount instead of
formatObjectBrowserBytes, showing a count-formatted number instead
of a byte-formatted size string.
@
* @
feat(object-browser): add sort selector in toolbar for grid/list views
The list view has column header click-to-sort but the grid/tile view
had no way to change sort order. Add a compact sort selector in the
toolbar that works identically in both views:
- Native <select> dropdown with all 7 sort keys (name, type, rows,
size, created, updated, comment) using existing column i18n labels
- ArrowUp/ArrowDown direction toggle button with localized tooltip
- Positioned between schema selector and view toggle in the toolbar
- Shares the existing sortKey/sortDirection/toggleSort logic — list
view column headers continue to work as before
- Accessible: aria-label on select, title on direction button
i18n: added sortAsc/sortDesc/sortBy to en.ts and zh-CN.ts
@
* @
fix(object-browser): make sort key options reactive to available data
sortKeyOptions was a static array that always included created_at and
updated_at even when no row had data for those fields. Sorting by an
empty field is a no-op that silently confuses users.
Convert to a computed that mirrors the list view column visibility logic
(hasCreatedAt / hasUpdatedAt): the two time-based sort options only
appear when at least one loaded row has that field populated.
Follows design decision: sort selector remains visible in both list and
grid views (plan B), acting as a shared sort state indicator.
@
* @
fix(object-browser): reset sortKey when selected option disappears from options
When sortKeyOptions loses created_at or updated_at (e.g. after a schema
switch clears all rows), sortKey could remain set to a key no longer in
the dropdown, causing the <select> to show a blank selection.
Add a watch on sortKeyOptions that resets sortKey to "name" and
sortDirection to "asc" whenever the current key is no longer present.
@
* chore(i18n): autofill new translations
* perf(object-browser): virtualize tile/grid view with RecycleScroller
Replaces the flat v-for over filteredRows with a row-chunked
RecycleScroller, matching the list view. Previously, switching to tile
mode on a schema with thousands of tables mounted every card and its
CustomContextMenu at once, stalling the UI for several seconds.
Changes:
- gridRows computed: chunks filteredRows into rows of gridColumns cards
- ResizeObserver on the grid container drives gridColumns; initial read
uses getComputedStyle to match contentRect.width and avoid a 1-frame
column jump on mount
- objectGridRowHeight computed: item-size adapts to whether the dataset
has timestamp/comment rows, minimising wasted row space
- watch(gridContainerRef) re-attaches the observer across list<->grid
toggles; onBeforeUnmount cleans up
- scrollObjectsToTop() resets scroll position on sort, search,
object-type filter and view-mode changes
- CSS: new .object-browser-grid-wrapper / -scroller / -row classes with
will-change / contain parity with the list scroller
---------
Co-authored-by: dbx-i18n-bot <github-actions[bot]@users.noreply.github.com>
* fix(app): unify import and export icons across sidebar surfaces
Use Upload for import actions and Download for export actions in the
connection sidebar, object browser, connection tree menus, and table
toolbox so icon semantics match the rest of the app.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(i18n): rename import result archive tooltip label
Clarify the editor toolbar action as importing a saved result archive so
it pairs clearly with the save result archive action.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>