Adopt progress buttons and house table conventions #10

Merged
cheapnud merged 1 commit from d/style-controls into master 2026-08-17 00:34:26 +00:00
Owner

Shared ProgressButton (self-disabling, spinner swap, re-entry guard) replaces every awaited button; tables gain Loading, DataLabel stacking, NoRecordsContent and a pager; the documents search field follows the house pattern; one filled CTA per view.

Shared ProgressButton (self-disabling, spinner swap, re-entry guard) replaces every awaited button; tables gain Loading, DataLabel stacking, NoRecordsContent and a pager; the documents search field follows the house pattern; one filled CTA per view.
Adopt progress buttons and house table conventions
All checks were successful
Claude PR Review / AI Code Review (pull_request) Successful in 17s
Build & Test / Build and Test (pull_request) Successful in 2m20s
777a1bcc90

🤖 Claude AI Code Review

  1. Summary — Introduces a shared ProgressButton with re-entry guard and applies house table/button conventions across several pages. Mostly clean, but the busy-state decoupling introduces a real UX regression.

  2. Code Quality
    The ProgressButton abstraction is well-designed with a proper re-entry guard and finally reset.

  3. Issues

🟡 DocumentDetail.razor — Duplicated/inconsistent busy state. ProgressButton now tracks its own internal _busy, but the label text still depends on component fields like _isRerunning, _isExtracting, _isRunningVision. Since those fields are set inside the async handlers and the ProgressButton no longer receives Disabled="_isRerunning" for its own button, the button's disabled/spinner state (_busy) and its label (_isRerunning ? "Analyzing" : "Rerun") are driven by two separate mechanisms — verify they stay in sync and that StateHasChanged still fires so the label updates. Also note RerunClassificationAsync changed from Disabled="@(_isSaving || _isRerunning)" to Disabled="_isSaving", so re-entry now relies solely on the internal guard — fine, but the Edit/other sibling MudButtons still key off _isRerunning, which is set independently.

🟢 ProgressButton.razor — No StateHasChanged is invoked after _busy toggles. This works only because the OnClick await yields back to the renderer, but if OnClick completes fully synchronously (no real await), the busy state may not render. Confirm all handlers actually await I/O.

  1. Verdict: APPROVE

The core abstraction is sound; the flagged items are worth a quick sanity check but don't block merge given handlers are awaiting real async work.


📊 Tokens: 9125 input + 648 output | 💰 Cost: ~$0.0618
Generated by Claude Opus 4.8 via Gitea Actions

## 🤖 Claude AI Code Review 1. **Summary** — Introduces a shared `ProgressButton` with re-entry guard and applies house table/button conventions across several pages. Mostly clean, but the busy-state decoupling introduces a real UX regression. 2. **Code Quality** ⭐⭐⭐⭐☆ The `ProgressButton` abstraction is well-designed with a proper re-entry guard and `finally` reset. 3. **Issues** 🟡 DocumentDetail.razor — Duplicated/inconsistent busy state. `ProgressButton` now tracks its own internal `_busy`, but the label text still depends on component fields like `_isRerunning`, `_isExtracting`, `_isRunningVision`. Since those fields are set inside the async handlers and the ProgressButton no longer receives `Disabled="_isRerunning"` for its own button, the button's disabled/spinner state (`_busy`) and its label (`_isRerunning ? "Analyzing" : "Rerun"`) are driven by two separate mechanisms — verify they stay in sync and that `StateHasChanged` still fires so the label updates. Also note `RerunClassificationAsync` changed from `Disabled="@(_isSaving || _isRerunning)"` to `Disabled="_isSaving"`, so re-entry now relies solely on the internal guard — fine, but the Edit/other sibling `MudButton`s still key off `_isRerunning`, which is set independently. 🟢 ProgressButton.razor — No `StateHasChanged` is invoked after `_busy` toggles. This works only because the `OnClick` await yields back to the renderer, but if `OnClick` completes fully synchronously (no real await), the busy state may not render. Confirm all handlers actually await I/O. 4. **Verdict**: **APPROVE** The core abstraction is sound; the flagged items are worth a quick sanity check but don't block merge given handlers are awaiting real async work. --- 📊 **Tokens**: 9125 input + 648 output | 💰 **Cost**: ~$0.0618 *Generated by Claude Opus 4.8 via Gitea Actions*
cheapnud merged commit fe325a1d4d into master 2026-08-17 00:34:26 +00:00
cheapnud deleted branch d/style-controls 2026-08-17 00:34:26 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
cheapnud/CheapClerk!10
No description provided.