fix(sprints): parallel list + ConfirmDialog + SDK #29 workaround #104

Merged
zaelgohary merged 1 commit from fix/sprints_round1 into development 2026-04-22 05:26:54 +00:00
Member

Summary

Round-1 hardening of the Sprints island, mirroring Tasks (#99) / Stories (#100). Fetch milestones in parallel, guard destructive delete behind a ConfirmDialog, and tolerate the SDK bool-vs-String deserialization bug so users don't see a scary invalid type: boolean after a successful delete.

Closes #103

Changes

  • archipelagos/productivity/sprints/src/services/milestone_service.rs
    • list: replace sequential for sid in sids { get(&sid).await } with futures::future::join_all so all milestones fetch in parallel
    • delete: catch the invalid type: boolean error (hero_osis #29) and return Ok(())
  • archipelagos/productivity/sprints/src/views/milestone_detail_view.rs
    • import ConfirmDialog, add show_delete_confirm signal
    • handle_delete now opens the dialog; the async delete runs from on_confirm
    • inject ConfirmDialog at the top of the render tree

Test Results

  • cargo check -p hero_archipelagos_sprints: pass
  • cargo fmt -p hero_archipelagos_sprints: pass

UI-only change; covered by manual verification below.

Manual verification

  • Sprints list with 10+ milestones loads in one round-trip (check devtools: one milestone.list + concurrent milestone.get calls)
  • Click Delete on a milestone → ConfirmDialog appears, Cancel keeps it, Confirm deletes
  • Delete a milestone — no invalid type: boolean error surfaces in the UI
  • Regression: single-milestone list still renders, edit flow unchanged
## Summary Round-1 hardening of the Sprints island, mirroring Tasks (#99) / Stories (#100). Fetch milestones in parallel, guard destructive delete behind a ConfirmDialog, and tolerate the SDK bool-vs-String deserialization bug so users don't see a scary `invalid type: boolean` after a successful delete. ## Related Issue Closes https://forge.ourworld.tf/lhumina_code/hero_archipelagos/issues/103 ## Changes - `archipelagos/productivity/sprints/src/services/milestone_service.rs` - `list`: replace sequential `for sid in sids { get(&sid).await }` with `futures::future::join_all` so all milestones fetch in parallel - `delete`: catch the `invalid type: boolean` error (hero_osis #29) and return `Ok(())` - `archipelagos/productivity/sprints/src/views/milestone_detail_view.rs` - import `ConfirmDialog`, add `show_delete_confirm` signal - `handle_delete` now opens the dialog; the async delete runs from `on_confirm` - inject `ConfirmDialog` at the top of the render tree ## Test Results - `cargo check -p hero_archipelagos_sprints`: pass - `cargo fmt -p hero_archipelagos_sprints`: pass UI-only change; covered by manual verification below. ## Manual verification - [ ] Sprints list with 10+ milestones loads in one round-trip (check devtools: one `milestone.list` + concurrent `milestone.get` calls) - [ ] Click Delete on a milestone → ConfirmDialog appears, Cancel keeps it, Confirm deletes - [ ] Delete a milestone — no `invalid type: boolean` error surfaces in the UI - [ ] Regression: single-milestone list still renders, edit flow unchanged
fix(sprints): parallel list + ConfirmDialog + SDK #29 workaround (#103)
All checks were successful
Build and Test / build (pull_request) Successful in 5m25s
c0c089c5cb
- milestone_service::list(): join_all for parallel per-sid fetches
- milestone_service::delete(): tolerate SDK boolean deserialization bug
- milestone_detail_view: route delete through ConfirmDialog before running
zaelgohary merged commit 77f0234c43 into development 2026-04-22 05:26:54 +00:00
zaelgohary deleted branch fix/sprints_round1 2026-04-22 05:26:54 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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
lhumina_code/hero_archipelagos!104
No description provided.