Skip to content

Settings UI restructure + DatabaseToolsModal extraction with per-row upgrade progress and modal-aware banner cycle#553

Merged
NikTilton merged 21 commits into
mainfrom
jschick/modal-coordinator-pr9
May 29, 2026
Merged

Settings UI restructure + DatabaseToolsModal extraction with per-row upgrade progress and modal-aware banner cycle#553
NikTilton merged 21 commits into
mainfrom
jschick/modal-coordinator-pr9

Conversation

@jschick04
Copy link
Copy Markdown
Collaborator

@jschick04 jschick04 commented May 29, 2026

Restructures Settings, extracts database management into DatabaseToolsModal, surfaces per-row upgrade progress, reworks the banner cycle to remain usable while a modal is open, and redesigns the Remove flow with multi-select + cancel-then-remove.

Closes #525.
Closes #526.

Commit summary (~17 commits)

Foundation (pre-split):

  • IA restructure + Settings empty-state placeholder + toggle aria-label improvements
  • IAnnouncementService + AnnouncerHost for SR completion announcements
  • Database entry row affordances (per-row Upgrade / Retry / Restore / RetryClassification action buttons)
  • Radio group component refactor + Toggle base + centralized aria parameters
  • Extract database management from Settings → DatabaseToolsModal Manage tab with Save/Apply pattern, snapshot-based reload detection, ClassificationFailed retry, BackupExists restore

Commit A (polish):

  • AttentionBanner action: Open SettingsOpen Databases, flipped IMenuActionService.OpenDatabaseToolsAsync() from TaskTask<bool>
  • Settings ValueSelect :focus-visible rings no longer clipped
  • Inline-alert overlay paired z-index above sticky save-strip

Commit B (per-row upgrade progress, partial #525):

  • Removed shared ManageDatabasesUpgradeProgressBanner; surface upgrade progress (UpgradePhase verb + batch position + Cancel) per row in DatabaseEntryRow
  • Dual-slot matching (ManageDatabasesProgress + BackgroundProgress)

Commit C (closes #526 Bug 2): Suppress AttentionBanner while DatabaseToolsModal is the active modal

Commit D (closes #526 Bug 1): Lift banner cycle into ModalChrome via singleton IBannerCycleStateService with coordinated open/close swap to eliminate flicker

Commit E (fully closes #525): Permanent redesign of Remove flow — always-visible per-row Remove + multi-select via <div role=\"checkbox\"> + bottom bulk strip + inline confirmation modal with cancel-then-remove during in-flight upgrade

Commit F: Extracted reusable <Checkbox> component (visually-hidden native input pattern matching Toggle) + removed pending blue box-shadow

Round 1 + 2 + 3 review fixes (in response to Copilot bot findings):

  • Nullable event signature on IAnnouncementService
  • Awaited InvokeAsync in 5 Razor click lambdas
  • AttentionBanner routes to Databases modal
  • IsRestoreBlocked dual-signal guard (Coordinator + per-row UpgradeProgress)
  • BannerCycleStateService thread-safety via Lock _stateLock (UI clicks vs background upgrade thread)
  • OnCancelClick fault isolation (try/catch + TraceLogger.Warning)
  • OnRemoveClick awaits OnRemove.InvokeAsync()
  • Bulk-selection cleanup scoped to per-file Remove (was unconditional Clear())
  • Import sticky-flag → close-modal reloads after overwrite
  • Close-and-reopen warning restored in confirmation message
  • Per-file removal failure details surfaced via TraceLogger + announcement
  • outcome.Removed (not Confirmed) for success accounting
  • Modal-wide IsUpgradeBlocked passed unmodified (no per-row narrowing)

History

Originally split into 4 stacked PRs (#553, #554, #555, #556) to fit the Copilot reviewer's diff-size limit. Each PR underwent 4-slot pre-impl + post-impl panels (Opus 4.8, GPT-5.5, GPT-5.4, Sonnet 4.6) before re-collapse. All bot findings addressed across 3 review rounds.

Tests

  • UI: 328 passing
  • Runtime: 1009 passing
  • Filtering: 869 passing

jschick04 and others added 7 commits May 28, 2026 14:00
Reorder DatabaseEntryRow DOM so the trash button is the LAST child of
.db-entry-row (was first child). Trash stays visually pinned to the left
edge via CSS position:absolute; left:0 -- zero muscle-memory regression.
The reorder fixes keyboard tab order so Tab traversal hits name button,
toggle/upgrade action, then trash in the natural left-to-right order.

Painting-order correctness requires z-index:1 on .db-entry-row-content:
both elements at z-index:auto would fall into CSS 2.1 painting group 6
where tree order wins (trash later in DOM would obscure content at rest).
z-index:1 promotes content to group 7 above trash's group 6. Background
fill remains required to cover the trash strip when content is opaque.

Add pending-toggle visual indicator: a 1px box-shadow ring around the
toggle (control-anchored, survives slide-reveal animation) plus an SR
aria-label suffix "(pending toggle, unsaved)". Indicator suppressed on
ActionKind.DisabledToggle so disabled controls don't get a misleading
announcement. Selectors use ::deep to pierce the BooleanSelect component
CSS isolation boundary.

Bump row padding from .15rem to .25rem .5rem .25rem 0 for breathing room.

Tests: UI 191 (+4 new), Runtime 1003 unchanged. Pre-impl 4-slot panel
unanimous READY at R3. Single-agent gpt-5.5 post-impl review READY after
the ::deep fix.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… centralized all aria parameters into base class
…age tab with Save/Apply pattern, snapshot-based reload detection, ClassificationFailed retry, and BackupExists restore
@jschick04 jschick04 requested a review from a team as a code owner May 29, 2026 04:36
Copilot AI review requested due to automatic review settings May 29, 2026 04:36
@jschick04 jschick04 marked this pull request as draft May 29, 2026 04:39
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copilot AI review requested due to automatic review settings May 29, 2026 13:41
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 76 out of 76 changed files in this pull request and generated 5 comments.

Comment thread src/EventLogExpert.Runtime/Announcement/IAnnouncementService.cs Outdated
Comment thread src/EventLogExpert.UI/Database/DatabaseEntryRow.razor Outdated
Comment thread src/EventLogExpert.UI/Database/DatabaseEntryRow.razor Outdated
Comment thread src/EventLogExpert.UI/Database/DatabaseEntryRow.razor Outdated
Comment thread src/EventLogExpert.UI/Settings/SettingsModal.razor
…yRow click lambdas, and routed AttentionBanner action to Databases modal
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 81 out of 81 changed files in this pull request and generated 1 comment.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 81 out of 81 changed files in this pull request and generated 3 comments.

Comment thread src/EventLogExpert.UI/DatabaseTools/Tabs/ManageDatabasesTab.razor Outdated
Comment thread src/EventLogExpert.UI/Database/DatabaseEntryRow.razor Outdated
Comment thread src/EventLogExpert.UI/Database/DatabaseEntryRow.razor Outdated
…modal-wide IsUpgradeBlocked to the recovery row
@jschick04 jschick04 requested a review from Copilot May 29, 2026 17:05
@jschick04 jschick04 marked this pull request as ready for review May 29, 2026 17:52
@NikTilton NikTilton merged commit a71cb0e into main May 29, 2026
6 checks passed
@NikTilton NikTilton deleted the jschick/modal-coordinator-pr9 branch May 29, 2026 18:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants