дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-08 19:02:17 +02:00
New query, data and schema tools for the Database feature (SQLite, PostgreSQL, MySQL). ## Query console - **Explain Plan** tab: SQLite `EXPLAIN QUERY PLAN`, PostgreSQL `EXPLAIN (FORMAT JSON)`, MySQL `EXPLAIN`, parsed in `ide-db::plan` into an operation tree (Full Scan / Index Scan / Group By / Order By …) under a statement root, with a properties panel. - **Query history**: `ide-db::history` keeps executed statements per project and source in `db-history.json` (deduplicated, newest first, 500 max). The Browse Query History dialog has search, a highlighted preview, Paste and Delete. - Output reports `(execution: X ms, fetching: Y ms)`. ## Results and table editor - Local column filter (value list with counts) and local sort. - Record / Value / Aggregates side panel. - Chart view (bar / line) with X / Y / aggregation settings. - Export Data dialog: extractor, Transpose, headers, preview, file or clipboard. An extractor drop-down sits on the data toolbars. - Import Data from a CSV / TSV file. - Table editor gets a WHERE | ORDER BY row. Column headers fit their names, with filter and sort indicators. Whole SQLite REALs display as `3108`, not `3108.0`. ## Database tree - Triggers under tables. Routines, sequences and materialized views under schemas, with DDL, Quick Documentation and Drop. - Data source options: object filter, show template databases, single database mode (PostgreSQL). - New ▸ Import from Clipboard (connection URLs). ## IPC New commands: `db_schema_objects`, `db_object_ddl`, `db_explain`, `db_history`, `db_remove_history`. Bindings are regenerated. ## Testing - `cargo test -p ide-db`: plan parsing, history store, trigger listing and DDL, explain without executing. - `cargo clippy -p ide-db -p openidea --all-targets -- -D warnings` is clean. - `pnpm typecheck` and eslint pass. `pnpm vitest run src/features/database src/ui`: 226 passed. - Checked in the running app against a SQLite database: - tree with triggers - result grid, local filter, side panel - chart - Explain Plan - history dialog - Export Data dialog - table editor ORDER BY - CSV import Merge follow-up: grouped the new `--chart-series` token under a section comment and added it to the theme plugin template (theme.test.ts on main), regenerated docs/plugins/themes.md. Re-verified after merging main on macOS with a SQLite source: query + result grid with filter/sort headers, Explain Plan tab (Full Scan / Index Scan / Group By / Order By), Query History dialog; `cargo nextest run -p ide-db` 45 passed, bindings unchanged after regeneration. https://claude.ai/code/session_01VUYsdXA2nkF5v6zsC93dpn
144 рядки
4.5 KiB
JSON
144 рядки
4.5 KiB
JSON
// Harbor Night: UI theme. Keys are the CSS variables of src/styles/tokens.css,
|
|
// grouped like its Islands Light block. Delete a line to keep the built-in value
|
|
// of the base named by "kind". Comments are allowed (// and /* */).
|
|
// Full reference: docs/plugins/themes.md.
|
|
{
|
|
"id": "harbor-night",
|
|
"name": "Harbor Night",
|
|
"kind": "dark",
|
|
"tokens": {
|
|
// Surfaces
|
|
"--bg-app": "#14171c",
|
|
"--bg-elev": "#1b2027",
|
|
"--bg-popup": "#1f252e",
|
|
"--bg-hover": "#262c33",
|
|
"--bg-selected": "#22484b",
|
|
"--bg-selected-strong": "#285a5d",
|
|
"--bg-current-line": "#191e25",
|
|
"--bg-debug-line": "#245a5c",
|
|
"--bg-backdrop": "#1f252e",
|
|
"--bg-input": "#14171c",
|
|
|
|
// Lines
|
|
"--border": "#1f252e",
|
|
"--border-popup": "#2a333f",
|
|
"--border-strong": "#36414f",
|
|
"--border-window": "#36414f",
|
|
"--control-off": "#515f72",
|
|
|
|
// Text
|
|
"--fg-strong": "#d9dfe6",
|
|
"--fg-emphasis": "#c9d1dc",
|
|
"--fg": "#c9d1dc",
|
|
"--fg-secondary": "#919fb1",
|
|
"--fg-muted": "#7c8ca0",
|
|
"--fg-subtle": "#637287",
|
|
"--fg-faint": "#515f72",
|
|
"--fg-gutter": "#3f4d60",
|
|
"--fg-icon": "#c6ced9",
|
|
|
|
// Accent
|
|
"--accent": "#2b9e93",
|
|
"--link": "#5cc8bd",
|
|
"--link-hover": "#8adcd3",
|
|
|
|
// Charts
|
|
"--chart-series": "#e07a7c",
|
|
|
|
// Status
|
|
"--danger": "#f57e84",
|
|
"--warning": "#d59637",
|
|
"--success": "#6db083",
|
|
"--db-connected": "#2fe02f",
|
|
"--db-connected-ring": "#1d6b1d",
|
|
"--info": "#4fb0d0",
|
|
|
|
// Vcs
|
|
"--vcs-modified": "#82ede6",
|
|
"--vcs-added": "#73bd79",
|
|
"--vcs-deleted": "#5f6f85",
|
|
"--vcs-untracked": "#e88f89",
|
|
"--vcs-ignored": "#d69a6b",
|
|
"--vcs-conflict": "#de6a66",
|
|
"--gutter-modified": "#469e98",
|
|
"--gutter-added": "#549159",
|
|
"--gutter-deleted": "#75869d",
|
|
|
|
// Shadows and window controls
|
|
"--shadow-popup": "0 6px 20px rgba(0, 0, 0, 0.45)",
|
|
"--shadow-dialog": "0 0 0 0.5px rgba(0, 0, 0, 0.6), 0 10px 24px rgba(0, 0, 0, 0.35), 0 24px 72px rgba(0, 0, 0, 0.45)",
|
|
"--traffic-close": "#ff5f57",
|
|
"--traffic-close-border": "#e0443e",
|
|
"--traffic-close-pressed": "#bf4942",
|
|
"--traffic-glyph": "#4d0000",
|
|
"--traffic-off": "#404955",
|
|
"--traffic-off-border": "#363e49",
|
|
|
|
// Additive
|
|
"--bg-tooltip": "#2a333f",
|
|
"--fg-tooltip": "#c9d1dc",
|
|
"--border-tooltip": "#2a333f",
|
|
"--bg-control": "#1f252e",
|
|
"--bg-control-hover": "#2a333f",
|
|
"--bg-active": "#36414f",
|
|
"--bg-scrim": "rgba(0, 0, 0, 0.45)",
|
|
"--fg-on-accent": "#ffffff",
|
|
"--shadow-tooltip": "0 4px 12px rgba(0, 0, 0, 0.4)",
|
|
"--shadow-balloon": "0 8px 24px rgba(0, 0, 0, 0.45)",
|
|
|
|
// Islands contract
|
|
"--bg-frame": "#1f252e",
|
|
"--bg-island": "#14171c",
|
|
"--bg-stripe-hover": "#ffffff17",
|
|
"--bg-stripe-selected": "#ffffff29",
|
|
"--fg-stripe-selected-active": "#ffffff",
|
|
"--fg-stripe-label": "#919fb1",
|
|
"--bg-tab-selected": "#1e3d40",
|
|
"--border-tab-selected": "#2b9e93",
|
|
"--bg-tab-selected-inactive": "#1f252e",
|
|
"--border-tab-selected-inactive": "#36414f",
|
|
"--bg-tab-hover": "#ffffff17",
|
|
"--border-editor-tabs": "#1f252e",
|
|
"--bg-tree-selected": "#22484b",
|
|
"--bg-tree-selected-inactive": "#2a333f",
|
|
"--bg-tree-hover": "#ffffff10",
|
|
"--bg-toolbar-hover": "#ffffff17",
|
|
"--bg-toolbar-pressed": "#ffffff29",
|
|
"--bg-toolbar-selected": "#285a5d",
|
|
"--bg-toolbar-selected-hover": "#2f6b6e",
|
|
"--bg-button-primary-hover": "#40a8a1",
|
|
"--fg-button-primary": "#ffffff",
|
|
"--bg-button": "transparent",
|
|
"--border-button": "#36414f",
|
|
"--bg-field": "#14171c",
|
|
"--bg-checkbox": "#14171c",
|
|
"--border-checkbox": "#515f72",
|
|
"--bg-toggle-on": "#338555",
|
|
"--fg-toggle-on": "#ffffff",
|
|
"--bg-toggle-off": "#14171c",
|
|
"--fg-toggle-off": "#637287",
|
|
"--border-toggle": "#515f72",
|
|
"--bg-toggle-knob": "#515f72",
|
|
"--focus-ring-soft": "#467c78",
|
|
"--scrollbar-thumb": "#ffffff33",
|
|
"--scrollbar-thumb-hover": "#ffffff59",
|
|
"--bg-search-match": "#ba9752",
|
|
"--bg-search-match-current": "#f2c55c",
|
|
"--fg-search-match": "#14171c",
|
|
"--bg-dialog": "#14171c",
|
|
"--bg-popup-inline": "#1f252e",
|
|
"--bg-popup-advertiser": "#1f252e",
|
|
"--bg-feedback-info": "#2a514f",
|
|
"--border-feedback-info": "#397e79",
|
|
"--bg-feedback-error": "#56272b",
|
|
"--border-feedback-error": "#80383e",
|
|
"--bg-feedback-warning": "#44321d",
|
|
"--border-feedback-warning": "#694820",
|
|
"--bg-feedback-success": "#203b2a",
|
|
"--border-feedback-success": "#29583c",
|
|
"--bg-counter": "#637287",
|
|
"--fg-counter": "#000000",
|
|
"--bg-progress-track": "#36414f"
|
|
}
|
|
}
|