From 9854ea97117f37a2f58cf9a9f20102c01d2ef5bb Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Fri, 9 Oct 2026 09:48:00 +0300 Subject: [PATCH 1/2] refactor(erd): ErdView takes an ErdSource only (#1147) The Diagram tab of the SQL workspace passes its delegate and dialect as a SqlErdSource, so ErdView no longer carries a delegate and dialect pair next to the source. The table browser already passes its own source; the tests build the same SqlErdSource. --- lib/features/erd/erd_view.dart | 23 +++++----------- .../workspace/generic_sql_workspace.dart | 4 +-- test/features/erd/erd_test.dart | 26 +++++++++---------- 3 files changed, 20 insertions(+), 33 deletions(-) diff --git a/lib/features/erd/erd_view.dart b/lib/features/erd/erd_view.dart index f7933b09..4fc5e230 100644 --- a/lib/features/erd/erd_view.dart +++ b/lib/features/erd/erd_view.dart @@ -24,7 +24,6 @@ import 'package:querya_desktop/shared/widgets/querya_action_menu.dart'; import 'package:querya_desktop/shared/widgets/querya_empty_state.dart'; import 'package:querya_desktop/shared/widgets/querya_search_field.dart'; import 'package:querya_desktop/features/workspace/sql_editor_chrome.dart'; -import 'package:querya_desktop/features/workspace/sql_execution_delegate.dart'; import 'package:querya_desktop/shared/widgets/querya_action_button.dart'; import 'package:querya_desktop/shared/widgets/querya_spinner.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; @@ -51,20 +50,14 @@ enum _ExportAction { mermaid, svg, png, copyMermaid } class ErdView extends material.StatefulWidget { const ErdView({ super.key, - this.delegate, - this.dialect, + required this.source, this.databaseName = '', - this.source, this.focusTable, this.neighbourhoodDepth, this.onOpenTable, this.onOpenFullDiagram, this.onSaveFile, - }) : assert(source != null || (delegate != null && dialect != null)); - - /// Query runner and dialect, used when [source] is not given. - final SqlExecutionDelegate? delegate; - final SqlDialect? dialect; + }); /// Draw only [focusTable] and the tables within this many foreign keys. final int? neighbourhoodDepth; @@ -72,8 +65,8 @@ class ErdView extends material.StatefulWidget { /// Opens the diagram's full schema, from a neighbourhood's empty state. final material.VoidCallback? onOpenFullDiagram; - /// Where the tables come from; the delegate and dialect when omitted. - final ErdSource? source; + /// Where the tables come from. + final ErdSource source; /// Table to pick and centre once the schema is drawn. final String? focusTable; @@ -155,8 +148,8 @@ class _ErdViewState extends material.State { final depth = widget.neighbourhoodDepth; final focus = widget.focusTable; final schema = depth != null && focus != null - ? await _source.loadNeighbourhood(focus, depth: depth) - : await _source.loadSchema(); + ? await widget.source.loadNeighbourhood(focus, depth: depth) + : await widget.source.loadSchema(); if (!mounted) return; setState(() { _schema = schema; @@ -188,10 +181,6 @@ class _ErdViewState extends material.State { : ErdRouter.route(_visibleOf(schema), layout); } - ErdSource get _source => - widget.source ?? - SqlErdSource(delegate: widget.delegate!, dialect: widget.dialect!); - /// The focused table as named in [schema]: `public.orders` falls back to /// `orders` when the current schema names it without a prefix. String? _focusIn(ErdSchema schema) { diff --git a/lib/features/workspace/generic_sql_workspace.dart b/lib/features/workspace/generic_sql_workspace.dart index 01a9813e..97b6515e 100644 --- a/lib/features/workspace/generic_sql_workspace.dart +++ b/lib/features/workspace/generic_sql_workspace.dart @@ -9,6 +9,7 @@ import 'package:querya_desktop/core/storage/mutation_audit_recorder.dart'; import 'package:querya_desktop/core/actions/sql_editor_actions.dart'; import 'package:querya_desktop/core/actions/sql_editor_command_bridge.dart'; import 'package:querya_desktop/core/database/destructive_sql_detector.dart'; +import 'package:querya_desktop/features/erd/erd_source.dart'; import 'package:querya_desktop/core/database/sql_table_target_extractor.dart'; import 'package:querya_desktop/core/database/table_mutation_engine.dart'; import 'package:querya_desktop/core/layout/vertical_split_pane.dart'; @@ -1179,8 +1180,7 @@ class GenericSqlWorkspaceState extends material.State { if (session.isDiagram) { return ErdView( key: material.ValueKey(session.id), - delegate: widget.delegate, - dialect: widget.dialect, + source: SqlErdSource(delegate: widget.delegate, dialect: widget.dialect), databaseName: effectiveDatabase, onOpenTable: _openTableFromDiagram, ); diff --git a/test/features/erd/erd_test.dart b/test/features/erd/erd_test.dart index e68e3132..b16ff10a 100644 --- a/test/features/erd/erd_test.dart +++ b/test/features/erd/erd_test.dart @@ -11,6 +11,7 @@ import 'package:querya_desktop/features/erd/erd_layout.dart'; import 'package:querya_desktop/features/erd/erd_model.dart'; import 'package:querya_desktop/features/erd/erd_router.dart'; import 'package:querya_desktop/features/erd/erd_view.dart'; +import 'package:querya_desktop/features/erd/erd_source.dart'; import 'package:querya_desktop/features/workspace/sql_execution_delegate.dart'; import '../../support/fake_sql_execution_delegate.dart'; @@ -489,8 +490,7 @@ void main() { final saved = {}; await t.pumpWidget(queryaThemeTestShell( child: ErdView( - delegate: delegate(), - dialect: SqlDialect.sqlite, + source: SqlErdSource(delegate: delegate(), dialect: SqlDialect.sqlite), onOpenTable: (n) => opened = n, onSaveFile: (n, b) async => saved[n] = b, ), @@ -528,7 +528,7 @@ void main() { await t.binding.setSurfaceSize(const material.Size(1200, 800)); addTearDown(() => t.binding.setSurfaceSize(null)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(delegate: delegate(), dialect: SqlDialect.sqlite), + child: ErdView(source: SqlErdSource(delegate: delegate(), dialect: SqlDialect.sqlite))), )); await t.pump(); await t.pump(); @@ -568,7 +568,7 @@ void main() { ]); }); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(delegate: junction, dialect: SqlDialect.sqlite), + child: ErdView(source: SqlErdSource(delegate: junction, dialect: SqlDialect.sqlite))), )); await t.pump(); await t.pump(); @@ -613,7 +613,7 @@ void main() { testWidgets('zoom buttons change the zoom label', (t) async { await t.binding.setSurfaceSize(const material.Size(1200, 800)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(delegate: delegate(), dialect: SqlDialect.sqlite), + child: ErdView(source: SqlErdSource(delegate: delegate(), dialect: SqlDialect.sqlite))), )); await t.pump(); await t.pump(); @@ -632,7 +632,7 @@ void main() { (t) async { await t.binding.setSurfaceSize(const material.Size(1200, 800)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(delegate: threeTables(), dialect: SqlDialect.sqlite), + child: ErdView(source: SqlErdSource(delegate: threeTables(), dialect: SqlDialect.sqlite))), )); await t.pump(); await t.pump(); @@ -652,7 +652,7 @@ void main() { (t) async { await t.binding.setSurfaceSize(const material.Size(1200, 800)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(delegate: threeTables(), dialect: SqlDialect.sqlite), + child: ErdView(source: SqlErdSource(delegate: threeTables(), dialect: SqlDialect.sqlite))), )); await t.pump(); await t.pump(); @@ -693,7 +693,7 @@ void main() { ]); }); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(delegate: wide, dialect: SqlDialect.sqlite), + child: ErdView(source: SqlErdSource(delegate: wide, dialect: SqlDialect.sqlite))), )); await t.pump(); await t.pump(); @@ -712,9 +712,8 @@ void main() { testWidgets('a failed load shows a titled state with Retry', (t) async { await t.pumpWidget(queryaThemeTestShell( child: ErdView( - delegate: FakeSqlExecutionDelegate( - onExecute: (sql) => throw StateError('no access')), - dialect: SqlDialect.sqlite, + source: SqlErdSource(delegate: FakeSqlExecutionDelegate( + onExecute: (sql) => throw StateError('no access')), dialect: SqlDialect.sqlite), ), )); await t.pump(); @@ -726,9 +725,8 @@ void main() { testWidgets('shows empty state', (t) async { await t.pumpWidget(queryaThemeTestShell( child: ErdView( - delegate: FakeSqlExecutionDelegate( - onExecute: (_) => const SqlExecutionResult()), - dialect: SqlDialect.postgres, + source: SqlErdSource(delegate: FakeSqlExecutionDelegate( + onExecute: (_) => const SqlExecutionResult()), dialect: SqlDialect.postgres), ), )); await t.pump(); From 3b8468788772e6e37aca11cf6f5397c3c571ce23 Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Fri, 9 Oct 2026 09:51:08 +0300 Subject: [PATCH 2/2] fix(erd): close the ErdView calls in the tests, drop an unused import (#1147) --- lib/features/erd/erd_view.dart | 1 - test/features/erd/erd_test.dart | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/features/erd/erd_view.dart b/lib/features/erd/erd_view.dart index 4fc5e230..b94263a6 100644 --- a/lib/features/erd/erd_view.dart +++ b/lib/features/erd/erd_view.dart @@ -9,7 +9,6 @@ import 'package:flutter/material.dart' as material; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart' show Clipboard, ClipboardData, LogicalKeyboardKey; -import 'package:querya_desktop/core/database/table_mutation_engine.dart'; import 'package:querya_desktop/core/theme/querya_theme_scope.dart'; import 'package:querya_desktop/core/theme/querya_typography.dart'; import 'package:querya_desktop/features/erd/erd_canvas_controls.dart'; diff --git a/test/features/erd/erd_test.dart b/test/features/erd/erd_test.dart index b16ff10a..edf18bba 100644 --- a/test/features/erd/erd_test.dart +++ b/test/features/erd/erd_test.dart @@ -528,7 +528,7 @@ void main() { await t.binding.setSurfaceSize(const material.Size(1200, 800)); addTearDown(() => t.binding.setSurfaceSize(null)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(source: SqlErdSource(delegate: delegate(), dialect: SqlDialect.sqlite))), + child: ErdView(source: SqlErdSource(delegate: delegate(), dialect: SqlDialect.sqlite)), )); await t.pump(); await t.pump(); @@ -568,7 +568,7 @@ void main() { ]); }); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(source: SqlErdSource(delegate: junction, dialect: SqlDialect.sqlite))), + child: ErdView(source: SqlErdSource(delegate: junction, dialect: SqlDialect.sqlite)), )); await t.pump(); await t.pump(); @@ -613,7 +613,7 @@ void main() { testWidgets('zoom buttons change the zoom label', (t) async { await t.binding.setSurfaceSize(const material.Size(1200, 800)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(source: SqlErdSource(delegate: delegate(), dialect: SqlDialect.sqlite))), + child: ErdView(source: SqlErdSource(delegate: delegate(), dialect: SqlDialect.sqlite)), )); await t.pump(); await t.pump(); @@ -632,7 +632,7 @@ void main() { (t) async { await t.binding.setSurfaceSize(const material.Size(1200, 800)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(source: SqlErdSource(delegate: threeTables(), dialect: SqlDialect.sqlite))), + child: ErdView(source: SqlErdSource(delegate: threeTables(), dialect: SqlDialect.sqlite)), )); await t.pump(); await t.pump(); @@ -652,7 +652,7 @@ void main() { (t) async { await t.binding.setSurfaceSize(const material.Size(1200, 800)); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(source: SqlErdSource(delegate: threeTables(), dialect: SqlDialect.sqlite))), + child: ErdView(source: SqlErdSource(delegate: threeTables(), dialect: SqlDialect.sqlite)), )); await t.pump(); await t.pump(); @@ -693,7 +693,7 @@ void main() { ]); }); await t.pumpWidget(queryaThemeTestShell( - child: ErdView(source: SqlErdSource(delegate: wide, dialect: SqlDialect.sqlite))), + child: ErdView(source: SqlErdSource(delegate: wide, dialect: SqlDialect.sqlite)), )); await t.pump(); await t.pump();