Skip to content

feat: ER Diagram visualization for PostgreSQL, MySQL, SQLite#209

Merged
kix007 merged 2 commits into
mainfrom
feat/er-diagram
Jun 1, 2026
Merged

feat: ER Diagram visualization for PostgreSQL, MySQL, SQLite#209
kix007 merged 2 commits into
mainfrom
feat/er-diagram

Conversation

@kix007
Copy link
Copy Markdown
Collaborator

@kix007 kix007 commented Jun 1, 2026

Summary

Interactive ER Diagram visualization for PostgreSQL, MySQL/MariaDB, and SQLite with compact view by default, table selector to prevent freezing on large schemas, and connection-aware opening that resolves the active editor tab's target database.

Related issue

Fixes #208
Fixes #204
Fixes #131

Changes

  • New ER Diagram dialog with @xyflow/react v12 canvas and dagre auto-layout
  • Table selector dialog before generation — users pick which tables to include (no freeze)
  • Compact view (PK/FK columns only) enabled by default
  • PostgreSQL introspection via pg_attribute/pg_index/pg_constraint bulk queries
  • MySQL/MariaDB introspection via information_schema
  • SQLite introspection via batched PRAGMA table_info/foreign_key_list (Promise.all)
  • FK relationship rendering with direct system catalog fallback when schemaItems.foreignKeys is null
  • Public schema prefix normalization for PostgreSQL column/FK matching
  • Schema data cache with 30-second TTL for instant re-open
  • SVG export via Tauri native save dialog
  • Auto-save now updates originalQuery on write to prevent spurious dirty prompts
  • Session restore handles null originalQuery migration from old session files
  • "Discard" on close overwrites session with clean state so prompt doesn't re-fire
  • Action buttons adapter fix in ActivityMonitor (table alias handling)
  • CLI PostgreSQL connection string builder fix (double-slash issue)
  • Docs page for ER diagram feature

Testing notes

  • Frontend typecheck: npx tsc --noEmit — passes
  • Rust build: cargo check — passes
  • ER Diagram tested with PostgreSQL, MySQL, SQLite schema introspection
  • Auto-save originalQuery sync verified across tab close/reopen cycle
  • Session restore tested with existing session files containing null originalQuery

Checklist

  • I built the app locally (npm run tauri dev or npm run tauri build) and verified the change works.
  • Frontend typecheck passes (npx tsc --noEmit).
  • Rust build passes (cargo check --manifest-path src-tauri/Cargo.toml).
  • If I added a new #[tauri::command], I registered it in src-tauri/src/lib.rs's generate_handler!.
  • If user-visible: I added a line to CHANGELOG.md under ## [Unreleased].
  • If this touches storage.rs, updater.rs, capabilities/, or the AI assistant code path, I flagged it in the summary above.

Summary by CodeRabbit

Release Notes

  • New Features

    • Full ER diagram viewer with table selection, filtering, and SVG export capabilities
    • Ctrl+PageUp/Down keyboard shortcuts for tab navigation
    • Auto-save directory picker and .sql file auto-save support
    • pgAdmin-style login and group role management
    • Help menu Master Key status indicator
    • Activity Monitor now defaults to live auto-refresh
  • Bug Fixes

    • Fixed unsaved changes prompting and session persistence
    • Improved ER diagram foreign key relationship rendering and performance
    • Enhanced PostgreSQL detection on Windows systems
  • Documentation

    • Added comprehensive ER diagram user guide

- Interactive entity-relationship diagram with @xyflow/react + dagre auto-layout
- Table selector dialog before generation to prevent freeze on large schemas
- Compact view (PK/FK columns only) by default
- PostgreSQL: bulk introspection via pg_attribute/pg_index/pg_constraint
- MySQL/MariaDB: information_schema-based column and FK extraction
- SQLite: batched PRAGMA queries with Promise.all for performance
- Schema data cache (30s TTL) for instant re-open
- FK relationship rendering with direct system catalog fallback queries
- Connection-aware opening — diagram uses the active editor tab's database
- Public schema prefix handling for PostgreSQL column/FK matching
- SVG export via Tauri native save dialog
- Docs page for ER diagram feature
- Auto-save now updates originalQuery on write to prevent spurious dirty prompts
- Session restore handles null originalQuery migration from old files
- Discard on close overwrites session with clean state
- Compact view enabled by default
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
queryden Ready Ready Preview, Comment Jun 1, 2026 9:25am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 1, 2026

Review Change Stack

Warning

Review limit reached

@kix007, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 43 minutes and 37 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 039c47cf-bc53-446a-8351-a451615ca593

📥 Commits

Reviewing files that changed from the base of the PR and between f96d8d8 and e11ca19.

📒 Files selected for processing (6)
  • src-tauri/src/cli.rs
  • src/components/help/HelpDialog.tsx
  • src/components/layout/MainContent.tsx
  • src/components/tools/ActivityMonitor.tsx
  • src/components/tools/ERDCanvas.tsx
  • src/components/tools/useERData.ts
📝 Walkthrough

Walkthrough

This PR delivers a complete ER Diagram visualization system with React Flow, alongside fixes for session management (originalQuery syncing), CLI tool detection improvements for Windows, enhanced drag-and-drop in the explorer tree, and supporting UX improvements and documentation.

Changes

Full Feature Release

Layer / File(s) Summary
ER Diagram dependencies and styling foundation
package.json, src/styles/erd.css
Adds @xyflow/react and @types/dagre to support the ER diagram visualization layer, and defines React Flow theme overrides for transparent canvas, node/edge selection styling, and control/minimap customization.
ER Diagram data fetching and layout
src/components/tools/useERData.ts
Implements useERData hook that fetches columns and foreign keys from PostgreSQL, MySQL, and SQLite backends using provider-specific queries, correlates FK columns, builds node/edge models, computes left-to-right Dagre layout, and caches results per connection with TTL support and abort-on-unmount cleanup.
ER Diagram React Flow components
src/components/tools/TableNode.tsx, src/components/tools/RelationshipEdge.tsx, src/components/tools/ERDCanvas.tsx
Builds React Flow node and edge components: TableNode renders table headers with column rows showing PK/FK/nullable icons and connection handles, RelationshipEdge renders FK relationships with smooth paths and dual labels, and ERDCanvas provides the root React Flow provider with theme-aware colors, zoom controls, minimap, and delete-key suppression.
ER Diagram dialog, table selection, and SVG export
src/components/tools/TableSelectorDialog.tsx, src/components/tools/ERDDialog.tsx
Implements ERDDialog with interactive table selection (via TableSelectorDialog), schema/search filtering, PK-only/compact/full column display toggles, related-table auto-visibility, and SVG export by capturing and wrapping the React Flow canvas in an SVG foreignObject then saving via Tauri APIs; handles SQLite by fetching tables from sqlite_master.
ER Diagram toolbar integration and modal rendering
src/components/layout/MainContent.tsx (imports, toolbar button, modal render)
Adds lazy-loaded ERDDialog import, showERDDialog state flag, a Table icon toolbar button that checks connection status before opening, and conditional modal rendering based on visibility flag.
Session management and auto-save fixes
src/components/layout/MainContent.tsx (auto-save, session restore/persist), CHANGELOG.md
Tracks successfully written tab IDs during auto-save and updates only those tabs' originalQuery, falls back to query when restoring originalQuery from session, persists a clean session snapshot when user discards changes so unsaved-change prompts don't re-trigger on next load.
CLI tool detection with Windows psql fallback
src-tauri/src/cli.rs, src/components/layout/MainContent.tsx (tool status retry)
Adds find_windows_psql_path helper to check common Program Files directories for psql.exe, integrates it into find_available before bundled lookups, updates psql documentation/hints with Windows instructions, rewires cli_detect_pg_version to use manager availability detection, and adds a retry loop in MainContent that re-checks tool status after user installs.
Explorer drag-and-drop with auto-expand and root drop target
src/components/explorer/DatabaseExplorer.tsx
Enables row-level drag initiation with grab/grabbing cursor feedback, implements drop-target validation that only highlights the current hover node, adds auto-expand timer when dragging over folders (cleared on leave/drop), and introduces a sticky root-drop hint panel for moving items to the top level.
Supporting updates and documentation
src/components/tools/ActivityMonitor.tsx, src/components/help/HelpDialog.tsx, src-tauri/.cargo/config.toml, CHANGELOG.md, website/src/content/docs/editor/er-diagram.mdx
Enables ActivityMonitor auto-refresh by default and on dialog open, updates HelpDialog to link external docs URL instead of local /docs.html, configures Windows MSVC builds to use rust-lld linker for speed, and documents the ER Diagram feature including table selection, column toggles, controls, navigation, and database support.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant MainContent
  participant ERDDialog
  participant useERData
  participant Backend

  User->>MainContent: Click ER Diagram button
  MainContent->>ERDDialog: Open (showERDDialog=true)
  User->>ERDDialog: Select tables in TableSelectorDialog
  ERDDialog->>useERData: Fetch schema for selected tables
  useERData->>Backend: Query columns & foreign keys (provider-specific)
  Backend-->>useERData: Return metadata
  useERData->>useERData: Correlate FKs, build nodes/edges, run Dagre layout
  useERData-->>ERDDialog: Return ERData with positioned nodes
  ERDDialog->>ERDDialog: Filter nodes/edges by visibility & display mode
  ERDDialog->>ERDCanvas: Render with processed nodes/edges
  User->>ERDDialog: Export SVG / Adjust filters
  ERDDialog->>User: Save file / Update diagram
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related issues

Possibly related PRs

  • openidle-dev/queryden#203: Overlaps in MainContent.tsx auto-save logic and session persistence handling, and DatabaseExplorer.tsx drag-and-drop move implementation.

Poem

🐰 A diagram springs to life with flowing lines,
Where tables dance and foreign keys align!
Drag and drop with grace, the folders slide,
Sessions remember, as the queries ride.
✨ This release brings order to the database wild!

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning PR addresses #208 (ER Diagram visualization) with full implementation but partially addresses #204 (AutoSave extensions) and #131 (drag-and-drop). Database explorer drag-and-drop enhancements for connections/folders are implemented per #131; AutoSave location discoverability and configurability from #204 are not implemented. AutoSave extensions (#204) requirements—right-click tab 'Open File Location' and UI settings to configure autosave directory—are not addressed in this PR and should be implemented separately or confirmed as out-of-scope.
Out of Scope Changes check ⚠️ Warning Multiple changes appear outside the ER Diagram feature scope: CLI psql detection enhancements, Windows linker configuration, ActivityMonitor auto-refresh defaults, HelpDialog documentation URL changes, and session restoration fixes for originalQuery. Clarify whether CLI enhancements, build configuration, ActivityMonitor tweaks, and session management fixes are intentional dependencies of the ER Diagram feature or should be separated into different PRs.
Docstring Coverage ⚠️ Warning Docstring coverage is 29.41% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main feature: ER Diagram visualization support for PostgreSQL, MySQL, and SQLite databases.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/er-diagram

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src-tauri/src/cli.rs (1)

229-244: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Restrict system PATH lookup for ToolKind::Psql to psql only.

find_available(ToolKind::Psql) currently iterates kind.all_binaries() (["psql","pg_dump","pg_restore","pg_dumpall"]) and returns the first one found on PATH; if only pg_dump/pg_restore/pg_dumpall is present, cli_detect_pg_version will execute that binary with psql flags (SELECT version()), failing version detection. The bundled-dir logic already uses kind.primary_binary(), so align the PATH/system lookup similarly (also applies at 765-772).

Proposed fix
 async fn find_available(&self, kind: ToolKind) -> Option<(PathBuf, u32)> {
-    for binary in kind.all_binaries() {
-        if which::which(binary).is_ok() {
-            return which::which(binary).ok().map(|p| (p, 0)); // version 0 = system
-        }
+    if let Ok(path) = which::which(kind.primary_binary()) {
+        return Some((path, 0)); // version 0 = system
     }
 
     // Windows: check common install paths (psql.exe often not on PATH)
     #[cfg(target_os = "windows")]
     if kind == ToolKind::Psql {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src-tauri/src/cli.rs` around lines 229 - 244, The PATH lookup for
ToolKind::Psql currently checks kind.all_binaries(), which can pick
pg_dump/pg_restore/pg_dumpall and break cli_detect_pg_version; change the logic
in find_available (and the similar block around the other occurrence) so that
when kind == ToolKind::Psql you only probe kind.primary_binary() on PATH (use
which::which for that single name and return its PathBuf with version 0),
otherwise keep existing all_binaries() behavior; ensure references to
find_available, ToolKind::Psql, kind.all_binaries(), kind.primary_binary(), and
cli_detect_pg_version are used to locate the affected code.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src-tauri/src/cli.rs`:
- Around line 195-227: The Windows fallback find_windows_psql_path currently
hardcodes C:\Program Files paths and should instead read %ProgramFiles% and
%ProgramFiles(x86)% environment variables and join the
PostgreSQL\<version>\bin\psql.exe paths so installs on other drives are found;
update find_windows_psql_path to iterate a versions list but prefix each with
env::var_os("ProgramFiles") and env::var_os("ProgramFiles(x86)") (if present) to
build PathBufs and check exists(). Also fix find_available so when
ToolKind::Psql is requested it only probes the "psql" executable (not
"pg_dump"/"pg_restore"/"pg_dumpall") to avoid returning a dump tool; ensure
callers like cli_detect_pg_version receive a true psql path.

In `@src/components/help/HelpDialog.tsx`:
- Line 167: The fallback call to window.open in the HelpDialog component
currently uses window.open(url, "_blank") which leaves the new page access to
window.opener; update that fallback to pass a feature string that includes
"noopener,noreferrer" (e.g., window.open(url, "_blank", "noopener,noreferrer"))
so the opened docs page cannot access window.opener or send referrer
information; locate the window.open call in HelpDialog.tsx (inside the
HelpDialog component / handler that opens documentation) and replace the
second-argument-only call with the three-argument form including
"noopener,noreferrer".

In `@src/components/layout/MainContent.tsx`:
- Around line 2621-2628: The ERD dialog is opened regardless of whether
connectToDatabase(...) succeeded, causing stale schema to show; update the logic
so setShowERDDialog(true) only runs when the connection switch succeeds: call
setShowERDDialog(true) inside the try block after await
connectToDatabase(activeTab.target.connectionId, activeTab.target.database), or
rethrow/return from the catch to prevent falling through; reference the
activeTab, connectToDatabase, setShowERDDialog, activeConnection and
selectedDatabase variables to locate and modify the conditional flow.

In `@src/components/tools/ActivityMonitor.tsx`:
- Line 106: The effect in ActivityMonitor resets targetDb via setTargetDb("")
and immediately calls fetchStats(), but fetchStats is memoized with targetDb in
its closure (useCallback(..., [currentDb, activeConnection, targetDb])) so it
can still read the previous targetDb; change the logic so fetchStats runs with
the updated targetDb: either call a variant of fetchStats that accepts an
explicit targetDb argument (pass "") or move the fetchStats invocation into a
separate useEffect that depends on targetDb (i.e., call fetchStats when targetDb
changes), and update references to the useCallback/memoized fetchStats
accordingly to ensure it uses the current targetDb value; update useEffect (the
one with isOpen) to only set state (setTargetDb, setSearchTerm, etc.) and not
directly call fetchStats.

In `@src/components/tools/ERDCanvas.tsx`:
- Around line 35-40: FitViewHelper currently calls fitView on every render
because useEffect has no dependency array; change the effect to run only once or
only when the fitView reference changes by adding a dependency array (e.g.,
[fitView]) so it schedules requestAnimationFrame/f fitView only on mount or when
fitView changes, preventing repeated refitting during ERDFlow updates and
preserving user pan/zoom.

In `@src/components/tools/ERDDialog.tsx`:
- Around line 244-264: The exported SVG currently only injects a tiny static
<style> block (built around svgData using clone/inner/rect in ERDDialog.tsx), so
Tailwind classes, React Flow CSS and theme variables are missing and the SVG
appears unstyled; fix by collecting and embedding the required CSS into the SVG:
gather computed styles for cloned nodes (using getComputedStyle on elements in
clone) and/or inline critical styles into the cloned HTML, and also concatenate
the app’s stylesheet rules (filter document.styleSheets for Tailwind/React
Flow/theme sheets and serialize their CSSText) into a <style> tag injected into
svgData so the foreignObject contains all necessary CSS for correct rendering
outside the app.
- Around line 285-290: The hasNoTables check in ERDDialog incorrectly uses
data.tables.length and misses the case where filters/search hide all tables;
update the logic to use the actual visible/filtered tables collection (e.g., the
variable or selector that represents tables after applying search/schema filters
— or derive visibleTables by applying the same filtering used to render the ERD)
and change both occurrences (the hasNoTables declaration and the similar check
at lines ~460-468) to test visibleTables.length === 0 so the dialog shows the
"No tables match the current filters" state instead of an empty canvas.

In `@src/components/tools/TableSelectorDialog.tsx`:
- Around line 155-162: In TableSelectorDialog.tsx inside the filteredTables.map
callback, the current code checks exec(table)?.groups but the regex
/^(.*?)\.(.*)$/ has no named groups so it always falls back to schema "",
tableName table; fix by extracting captures directly: call const match =
/^(.*?)\.(.*)$/.exec(table) and if match set schema = match[1] and tableName =
match[2], otherwise schema = "" and tableName = table (or alternatively use
table.split(".", 2) to derive schema and tableName). Update the block around
filteredTables.map to use this match-based extraction and remove the
.groups-based check.

In `@src/components/tools/useERData.ts`:
- Around line 283-315: The shared abortRef in buildERData allows older in-flight
requests to overwrite newer results; change to a per-request token (e.g., a
requestIdRef counter or a local unique token captured by the async closure) and
compare that token before applying results or cache updates so only the latest
request writes state; update the same pattern used around the other fetch block
(lines referenced near 534-539) so both places create and check a per-request
token instead of toggling abortRef.current.
- Around line 285-288: The check for CockroachDB is wrong: in useERData.ts the
dbType variable (from connectionType) is compared against "cockroachdb" in the
isPostgres array, but the codebase uses "cockroach"; update the isPostgres
determination so Cockroach connections match the PostgreSQL branch (e.g.,
include "cockroach" alongside "cockroachdb" in the array used by isPostgres or
normalize connectionType to a canonical value before the includes check) so the
ERD loader follows the PostgreSQL path when connectionType is "cockroach".
- Around line 119-121: The schemaClause interpolation is vulnerable because
schemas are inserted raw; update the branch that builds schemaClause (the
schemas variable and schemaClause constant) to escape single quotes in each
schema name (e.g., replace ' with '') before wrapping in single quotes, or reuse
the same escaping helper used by fetchPostgresColumns(), so schemas.map(...)
produces safely quoted values and then join(",") to build the IN list for
schemaClause.
- Around line 125-135: The current SQL in useERData.ts pairs source and target
columns incorrectly for composite foreign keys because it joins pg_attribute to
ANY(c.conkey)/ANY(c.confkey) independently; replace those joins with
unnest(c.conkey) WITH ORDINALITY AS src(colnum, ord) and unnest(c.confkey) WITH
ORDINALITY AS tgt(colnum, ord), join src.ord = tgt.ord and then join
pg_attribute AS a ON a.attrelid = c.conrelid AND a.attnum = src.colnum and
pg_attribute AS af ON af.attrelid = c.confrelid AND af.attnum = tgt.colnum so
column ordering is preserved for multi-column FKs and source/target columns are
paired correctly.
- Around line 478-485: The current dedup logic in the loop over fkRelationships
collapses multiple distinct FKs between the same tables because edgeKey is only
`${src}->${tgt}`; update the key to include a unique identifier from the FK
(e.g., fk.constraintName or the joined fk.sourceColumns/fk.targetColumns) so
parallel relationships are preserved. Locate the loop using fkRelationships,
normalizeTableName, nodeIdSet, edgeKey and edgeSet and change edgeKey generation
to include the FK-specific fields (fallback to column lists if constraintName is
absent) before checking/adding to edgeSet.

---

Outside diff comments:
In `@src-tauri/src/cli.rs`:
- Around line 229-244: The PATH lookup for ToolKind::Psql currently checks
kind.all_binaries(), which can pick pg_dump/pg_restore/pg_dumpall and break
cli_detect_pg_version; change the logic in find_available (and the similar block
around the other occurrence) so that when kind == ToolKind::Psql you only probe
kind.primary_binary() on PATH (use which::which for that single name and return
its PathBuf with version 0), otherwise keep existing all_binaries() behavior;
ensure references to find_available, ToolKind::Psql, kind.all_binaries(),
kind.primary_binary(), and cli_detect_pg_version are used to locate the affected
code.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 00bd49e0-a0da-47ee-ab10-686d321c1ce5

📥 Commits

Reviewing files that changed from the base of the PR and between 8444024 and f96d8d8.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (17)
  • .github/workflows/beta.yml
  • CHANGELOG.md
  • package.json
  • src-tauri/.cargo/config.toml
  • src-tauri/src/cli.rs
  • src/components/explorer/DatabaseExplorer.tsx
  • src/components/help/HelpDialog.tsx
  • src/components/layout/MainContent.tsx
  • src/components/tools/ActivityMonitor.tsx
  • src/components/tools/ERDCanvas.tsx
  • src/components/tools/ERDDialog.tsx
  • src/components/tools/RelationshipEdge.tsx
  • src/components/tools/TableNode.tsx
  • src/components/tools/TableSelectorDialog.tsx
  • src/components/tools/useERData.ts
  • src/styles/erd.css
  • website/src/content/docs/editor/er-diagram.mdx

Comment thread src-tauri/src/cli.rs
Comment thread src/components/help/HelpDialog.tsx Outdated
Comment thread src/components/layout/MainContent.tsx
Comment thread src/components/tools/ActivityMonitor.tsx Outdated
Comment thread src/components/tools/ERDCanvas.tsx
Comment thread src/components/tools/useERData.ts Outdated
Comment thread src/components/tools/useERData.ts
Comment thread src/components/tools/useERData.ts Outdated
Comment thread src/components/tools/useERData.ts
Comment thread src/components/tools/useERData.ts
- cli: Windows PSQL path uses %ProgramFiles% env vars (not hardcoded C:\)
- cli: ToolKind::Psql.all_binaries narrowed to just ["psql"]
- HelpDialog: window.open fallback gets noopener,noreferrer
- MainContent: ERD dialog return on failed connection switch
- ActivityMonitor: stale targetDb fixed via optional override param + ref
- ERDCanvas: FitViewHelper useEffect gets [] deps
- useERData: escape schema names in FK query SQL injection
- useERData: composite FK query uses unnest WITH ORDINALITY (fix cross-join)
- useERData: abortRef -> generationRef to prevent stale writes
- useERData: cockroachdb -> cockroach engine string typo
- useERData: edge dedup key includes column names (parallel FKs preserved)
@kix007 kix007 merged commit 91201bc into main Jun 1, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ER Diagram AutoSave extensions feat(explorer): drag-and-drop connections and folders in the explorer tree

2 participants