Add V3-to-V4 database upgrade with recovery and SettingsModal redesign#511
Add V3-to-V4 database upgrade with recovery and SettingsModal redesign#511
Conversation
There was a problem hiding this comment.
Pull request overview
Adds a V4 provider-database schema and end-to-end upgrade/recovery UX, including new banner slices (attention + upgrade progress) and a redesigned Settings modal database list with per-entry actions.
Changes:
- Introduces provider DB schema v4 detection/upgrade (including duplicate-merge and schema validation) and updates tooling to reject unknown/obsolete schemas.
- Refactors database management to per-entry state/status with upgrade batching + recovery workflow surfaced via banners and dialogs.
- Redesigns SettingsModal database list UI (row actions, upgrade progress banner, WCAG contrast tweaks) and updates banner host cycling/pagination.
Reviewed changes
Copilot reviewed 111 out of 112 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/EventLogExpert/wwwroot/css/app.css | Adds inset surface + status-fill contrast variables; adjusts highlight colors for contrast. |
| src/EventLogExpert/_Imports.razor | Imports new EventLogExpert.Components.Base namespace. |
| src/EventLogExpert/Shared/UnhandledExceptionHandler.razor.cs | Routes UI unhandled exceptions to critical banner path. |
| src/EventLogExpert/Shared/Components/ValueSelect.razor.cs | Switches base input component namespace to Components.Base. |
| src/EventLogExpert/Shared/Components/ValueSelect.razor | Removes now-unneeded local @using for base components. |
| src/EventLogExpert/Shared/Components/TextInput.razor.cs | Switches base input component namespace to Components.Base. |
| src/EventLogExpert/Shared/Components/TextInput.razor | Updates @inherits to new base input component import. |
| src/EventLogExpert/Shared/Components/SettingsModal.razor.css | Adds “classification pending” spinner styling. |
| src/EventLogExpert/Shared/Components/SettingsModal.razor | Integrates upgrade banner + new DatabaseEntryRow list rendering. |
| src/EventLogExpert/Shared/Components/Filters/FilterRow.razor.cs | Updates usings (services → interfaces). |
| src/EventLogExpert/Shared/Components/Filters/FilterGroupModal.razor.cs | Updates usings (services → interfaces). |
| src/EventLogExpert/Shared/Components/Filters/FilterGroup.razor.cs | Updates usings (services → interfaces). |
| src/EventLogExpert/Shared/Components/Filters/FilterCacheModal.razor.cs | Updates usings (services → interfaces). |
| src/EventLogExpert/Shared/Base/ModalBase.cs | Uses Components.Base chrome/types; removes stale inline-alert comment. |
| src/EventLogExpert/Shared/Base/FooterPreset.cs | Removes old footer preset enum (moved to Components.Base). |
| src/EventLogExpert/Services/MauiMenuActionService.cs | Returns success/failure for opening Settings modal. |
| src/EventLogExpert/Services/KeyboardShortcutService.cs | Adds explanatory exception comments for teardown paths. |
| src/EventLogExpert/MauiProgram.cs | Rebinds DatabaseService as single owner; wires ILogReloadCoordinator; eagerly instantiates banner service. |
| src/EventLogExpert/MainPage.xaml.cs | Removes legacy DB-loaded event wiring and related providers. |
| src/EventLogExpert/Main.razor | Adds DatabaseRecoveryHost inside error handler; clarifies component placement. |
| src/EventLogExpert/Components/EventTable.razor.cs | Adds explanatory comments for JS disconnect teardown. |
| src/EventLogExpert/Components/DetailsPane.razor.css | Prevents horizontal overflow and improves wrapping behavior. |
| src/EventLogExpert/Components/DetailsPane.razor.cs | Adds defensive comments for CTS cancel/dispose and JS disconnect. |
| src/EventLogExpert/App.xaml.cs | Removes legacy DB provider dependencies from app wiring. |
| src/EventLogExpert.slnx | Adds new EventDbTool test project to solution. |
| src/EventLogExpert.UI/Store/EventLog/LiveLogWatcherService.cs | Makes log removal async + disposes watchers off UI thread to avoid deadlocks. |
| src/EventLogExpert.UI/Store/EventLog/ILogReloadCoordinator.cs | Adds coordinator abstraction for log close/reopen around DB removal. |
| src/EventLogExpert.UI/Services/ModalAlertDialogService.cs | Routes “error alerts” to banner service with optional action button. |
| src/EventLogExpert.UI/Services/EnabledDatabaseCollectionProvider.cs | Removes legacy enabled-db provider (DatabaseService becomes the source of truth). |
| src/EventLogExpert.UI/Services/BannerViewSelector.cs | Replaces single-view selector with cycle builder (errors/attention/progress/infos). |
| src/EventLogExpert.UI/Services/BannerService.cs | Adds attention + upgrade progress slices; refactors critical/error handling and robust StateChanged dispatch. |
| src/EventLogExpert.UI/Services/AlertPresentation.cs | Adds missing using for interface references. |
| src/EventLogExpert.UI/Services/AlertDialogService.cs | Removes old interface definition (moved to UI.Interfaces). |
| src/EventLogExpert.UI/Models/UpgradeProgressScope.cs | Adds enum for background vs settings-triggered upgrade progress. |
| src/EventLogExpert.UI/Models/UpgradePhase.cs | Adds enum for upgrade phases. |
| src/EventLogExpert.UI/Models/UpgradeFailure.cs | Adds failure record for upgrade results. |
| src/EventLogExpert.UI/Models/UpgradeBatchStartedEventArgs.cs | Adds started event args with safe cancellation wrapper. |
| src/EventLogExpert.UI/Models/UpgradeBatchResult.cs | Adds batch result record (succeeded/cancelled/failed). |
| src/EventLogExpert.UI/Models/UpgradeBatchProgressEventArgs.cs | Adds progress event args. |
| src/EventLogExpert.UI/Models/UpgradeBatchCompletedEventArgs.cs | Adds completion event args. |
| src/EventLogExpert.UI/Models/ImportResult.cs | Adds import result record (imported + failures). |
| src/EventLogExpert.UI/Models/ImportFailure.cs | Replaces prior CriticalAlertEntry model with ImportFailure record. |
| src/EventLogExpert.UI/Models/ErrorBannerEntry.cs | Adds error banner entry model (optional action). |
| src/EventLogExpert.UI/Models/DatabaseEntry.cs | Adds per-entry DB model with status + backup marker. |
| src/EventLogExpert.UI/Models/BannerProgressEntry.cs | Adds banner progress model for upgrades. |
| src/EventLogExpert.UI/Interfaces/IMenuActionService.cs | Changes OpenSettingsAsync to return success boolean. |
| src/EventLogExpert.UI/Interfaces/IDatabaseService.cs | Redesigns DB service API (entries/status/upgrade/import/remove/recovery + events). |
| src/EventLogExpert.UI/Interfaces/IBannerService.cs | Redesigns banner API (critical/error/attention/progress slices). |
| src/EventLogExpert.UI/Interfaces/IAlertDialogService.cs | Moves/defines alert dialog interface in UI.Interfaces; adds ShowErrorAlert with action support. |
| src/EventLogExpert.UI/Enums.cs | Adds DatabaseStatus enum for classification/upgrade states. |
| src/EventLogExpert.UI/DatabaseStatusLabels.cs | Adds centralized status/badge labeling helpers. |
| src/EventLogExpert.UI.Tests/TestUtils/DatabaseSeedUtils.cs | Adds helpers to seed multiple historical DB schemas for tests. |
| src/EventLogExpert.UI.Tests/Services/ModalAlertDialogServiceTests.cs | Updates tests for ShowErrorAlert + action passthrough behavior. |
| src/EventLogExpert.UI.Tests/Services/EnabledDatabaseCollectionProviderTests.cs | Removes tests for deleted legacy provider. |
| src/EventLogExpert.UI.Tests/Services/BannerViewSelectorTests.cs | Rewrites tests for new cycle-based banner selection behavior. |
| src/EventLogExpert.UI.Tests/DatabaseStatusLabelsTests.cs | Adds tests for new status label helpers. |
| src/EventLogExpert.Eventing/Readers/EventLogWatcher.cs | Ensures Unregister waits for in-flight callbacks to finish to release resolver scopes/SQLite handles. |
| src/EventLogExpert.Eventing/Providers/ProviderDetails.cs | Maps ResolvedFromOwningPublisher into DB; updates IsEmpty semantics accordingly. |
| src/EventLogExpert.Eventing/EventResolvers/IDatabaseCollectionProvider.cs | Removes mutating setter from provider collection interface. |
| src/EventLogExpert.Eventing/EventResolvers/EventResolver.cs | Distinguishes unknown vs obsolete DB schemas; relies on NOCASE collation for provider name lookup. |
| src/EventLogExpert.Eventing/EventProviderDatabase/ProviderDetailsMerger.cs | Adds case-insensitive duplicate merge for provider rows with conflict detection. |
| src/EventLogExpert.Eventing/EventProviderDatabase/ProviderDatabaseSchemaVersion.cs | Defines current/unknown schema versions (v4). |
| src/EventLogExpert.Eventing/EventProviderDatabase/ProviderDatabaseSchemaState.cs | Adds schema state record with NeedsUpgrade helper. |
| src/EventLogExpert.Eventing/EventProviderDatabase/EventProviderDbContext.cs | Adds schema version detection, v4 upgrade path, NOCASE collation, and controlled EnsureCreated behavior. |
| src/EventLogExpert.Eventing/EventProviderDatabase/DatabaseUpgradeException.cs | Adds explicit exception type for upgrade/schema errors. |
| src/EventLogExpert.Eventing.Tests/Providers/ProviderDetailsTests.cs | Adds tests for IsEmpty semantics with new field. |
| src/EventLogExpert.Eventing.Tests/EventProviderDatabase/ProviderDetailsMergerTests.cs | Adds coverage for duplicate merging and conflict detection rules. |
| src/EventLogExpert.EventDbTool/UpgradeDatabaseCommand.cs | Updates tool’s upgrade-needed detection to schema state API. |
| src/EventLogExpert.EventDbTool/ProviderSource.cs | Adds schema validation for source DBs; refuses unknown/obsolete schemas during load/diff/merge. |
| src/EventLogExpert.EventDbTool/Properties/AssemblyInfo.cs | Exposes internals to new EventDbTool test project. |
| src/EventLogExpert.EventDbTool/MergeDatabaseCommand.cs | Validates target schema before merge; relies on NOCASE schema for name matching. |
| src/EventLogExpert.EventDbTool/DiffDatabaseCommand.cs | Validates source schemas before diff; preserves full ProviderDetails entities. |
| src/EventLogExpert.EventDbTool.Tests/TestUtils/DatabaseTestUtils.cs | Adds helpers to create v3/v4/unknown-shape DBs for tests. |
| src/EventLogExpert.EventDbTool.Tests/TestUtils/Constants/Constants.Database.cs | Adds shared provider-name constants for EventDbTool tests. |
| src/EventLogExpert.EventDbTool.Tests/ProviderSourceTests.cs | Adds tests for schema validation behavior over files/directories. |
| src/EventLogExpert.EventDbTool.Tests/GlobalUsings.cs | Adds xUnit global using. |
| src/EventLogExpert.EventDbTool.Tests/EventLogExpert.EventDbTool.Tests.csproj | Adds new test project for EventDbTool. |
| src/EventLogExpert.EventDbTool.Tests/DiffDatabaseCommandTests.cs | Adds regression test ensuring new ProviderDetails field is preserved in diff output. |
| src/EventLogExpert.Components/SettingsUpgradeProgressBanner.razor.css | Styles sticky in-settings upgrade progress banner. |
| src/EventLogExpert.Components/SettingsUpgradeProgressBanner.razor.cs | Implements banner component subscribing to IBannerService changes and cancel handler. |
| src/EventLogExpert.Components/SettingsUpgradeProgressBanner.razor | Renders settings-scoped upgrade progress with cancel action. |
| src/EventLogExpert.Components/DatabaseRecoveryHost.razor.cs | Adds host that raises recovery banner and opens recovery dialog when backups exist. |
| src/EventLogExpert.Components/DatabaseRecoveryHost.razor | Renders recovery dialog when open flag is set. |
| src/EventLogExpert.Components/DatabaseRecoveryDialog.razor.css | Styles recovery dialog list and failure highlighting. |
| src/EventLogExpert.Components/DatabaseRecoveryDialog.razor.cs | Implements apply/restore/delete recovery workflow with per-row selection. |
| src/EventLogExpert.Components/DatabaseRecoveryDialog.razor | Renders recovery UI with bulk actions and per-db restore/delete choice. |
| src/EventLogExpert.Components/DatabaseEntryRow.razor.css | Adds redesigned DB row with revealable recessed trash strip and action states. |
| src/EventLogExpert.Components/DatabaseEntryRow.razor.cs | Computes badge/action rendering logic for per-entry DB state. |
| src/EventLogExpert.Components/DatabaseEntryRow.razor | Renders per-entry row (toggle/upgrade/retry/spinner/badge + remove). |
| src/EventLogExpert.Components/BooleanSelect.razor.css | Improves status-fill contrast and disabled toggle affordance. |
| src/EventLogExpert.Components/BooleanSelect.razor.cs | Moves component to Components namespace; adds Disabled parameter. |
| src/EventLogExpert.Components/BooleanSelect.razor | Applies Disabled to radio inputs and updates base import. |
| src/EventLogExpert.Components/Base/ModalChrome.razor.css | Refines inline-alert layout/wrapping and dialog overflow behavior. |
| src/EventLogExpert.Components/Base/ModalChrome.razor.cs | Moves to Components.Base; adds FooterDisabled; refactors inline-alert focus logic. |
| src/EventLogExpert.Components/Base/ModalChrome.razor | Disables footer buttons when FooterDisabled; keeps inline-alert behavior intact. |
| src/EventLogExpert.Components/Base/InputComponent.cs | Moves base input component to Components.Base namespace. |
| src/EventLogExpert.Components/Base/FooterPreset.cs | Reintroduces FooterPreset enum under Components.Base. |
| src/EventLogExpert.Components/BannerHost.razor.css | Adds styling for attention/progress banners and cycle navigation/buttons. |
| src/EventLogExpert.Components/BannerHost.razor.cs | Adds cycle/pagination logic; integrates attention banner and settings launcher. |
| src/EventLogExpert.Components/BannerHost.razor | Renders critical/error/attention/progress/info via cycle selection. |
| src/EventLogExpert.Components.Tests/SettingsUpgradeProgressBannerTests.cs | Adds bUnit tests for settings upgrade progress banner rendering and cancel behavior. |
| src/EventLogExpert.Components.Tests/DatabaseRecoveryHostTests.cs | Adds bUnit tests for recovery banner lifecycle and dialog opening behavior. |
| src/EventLogExpert.Components.Tests/DatabaseEntryRowTests.cs | Adds bUnit tests for per-status action/badge rendering and callbacks. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 114 out of 115 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 114 out of 115 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…or interrupted upgrades
…ttingsModal toggle confirmation
…ntrast on status fills
ea79b65 to
2958101
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 114 out of 115 changed files in this pull request and generated 4 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
2958101 to
c145edc
Compare
Adds the V4 provider database schema along with the surrounding upgrade flow, recovery handling for interrupted upgrades, and a redesigned SettingsModal database list.
Schema and storage
ResolvedFromOwningPublisherand a merge helper.EventResolverdistinguishes obsolete vs unrecognized provider DB formats;EventDbToolrejects both for write commands.DatabaseServicerestructured to a single-owner model with per-entry import, per-entry status, andBackupExistssurfacing.ProviderDetailsis treated as Unknown schema.Channel-basedUpgradeBatchAsyncwith progress events; freshly-imported DBs default to disabled and V3 entries auto-upgrade.Recovery for interrupted upgrades
.upgrade.bakmarker detected during classification.DatabaseRecoveryDialog(built onModalChromewith newFooterDisabledsupport).DatabaseRecoveryHostsurfaces a banner and opens the dialog.DatabaseService;Removeno longer wildcards user-created.bakfiles.Banner system
Attentionslice with reset-on-growth dismiss semantics.UpgradeProgressslice driven by upgrade-batch events.BannerHostpaginates attention/upgrade-progress slices in a flat cycle.SettingsModal UX
HandleOpenLogguarded by classification await and resolver try/catch.:focus-visible. Dialog confirm wording adapts to whether logs are open.Testing
EventLogExpert.Components.Tests: 113/113 passing.EventLogExpert.UI.Tests: 1005/1005 passing.Notes
@keyon the database row foreach (now fixed).jschick/refactor_combinedview); the three overlapping files (EventLogEffects.cs,EventLogEffectsTests.cs,EventTable.razor.cs) auto-merge cleanly in either direction.