feat(sprints): milestone date fields + Timeline view #111

Merged
zaelgohary merged 5 commits from fix/sprints_round2 into development 2026-04-22 08:27:10 +00:00
Member

Summary

Two feature gaps the round-1 audit flagged as out-of-scope: the milestone form had no way to set due_date/target_date despite both being in the Milestone struct, and SprintsView::Timeline silently routed to ListView as a placeholder. Also fixes a native/custom icon collision on every DateField.

Closes #62
Closes #115

Changes

  • archipelagos/productivity/sprints/src/views/milestone_form.rs
    • add two DateField inputs (Due Date / Target Date) in a side-by-side row between Status/Priority and Deliverables
    • ymd_to_ts / ts_to_ymd helpers bridge YYYY-MM-DD ↔ Unix seconds so existing milestones show their stored dates on edit
    • handle_submit writes both fields back on save
  • archipelagos/productivity/sprints/src/views/timeline_view.rs (new)
    • groups milestones by due-date month, renders each group with the existing MilestoneCard, sorted chronologically; undated milestones bucket into a trailing "No date" section
  • archipelagos/productivity/sprints/src/views/mod.rs
    • register timeline_view + re-export TimelineView
  • archipelagos/productivity/sprints/src/island.rs
    • route SprintsView::Timeline to the real TimelineView instead of the old ListView stub
  • archipelagos/productivity/sprints/Cargo.toml
    • add chrono workspace dep (used by the date helpers + timeline month labels)
  • core/src/island.css
    • hide Chrome's native ::-webkit-calendar-picker-indicator on .form-control-date so the custom SVG overlay does not collide with it

Test Results

  • cargo check -p hero_archipelagos_sprints: pass
  • cargo fmt -p hero_archipelagos_sprints: pass
  • dx build --package hero_os_app --web --features web: pass, deployed to the shared test instance

UI-only features — covered by manual verification below.

Manual verification

  • Create a new milestone with Due Date 2026-05-01 and Target Date 2026-06-01, save, reopen — both dates pre-fill in the edit form
  • Leave dates blank, save — backend receives None for both, detail view shows no date
  • Open the Timeline view — milestones are grouped by due-date month and sorted chronologically
  • A milestone without any date shows up under "No date" at the end of the timeline
  • Every date field renders a single calendar icon on Chrome (the custom SVG, not the native indicator too)
  • Regression: List view unchanged, MilestoneCard click still opens detail from both List and Timeline
## Summary Two feature gaps the round-1 audit flagged as out-of-scope: the milestone form had no way to set `due_date`/`target_date` despite both being in the Milestone struct, and `SprintsView::Timeline` silently routed to `ListView` as a placeholder. Also fixes a native/custom icon collision on every `DateField`. ## Related Issues Closes #62 Closes #115 ## Changes - `archipelagos/productivity/sprints/src/views/milestone_form.rs` - add two `DateField` inputs (Due Date / Target Date) in a side-by-side row between Status/Priority and Deliverables - `ymd_to_ts` / `ts_to_ymd` helpers bridge `YYYY-MM-DD` ↔ Unix seconds so existing milestones show their stored dates on edit - `handle_submit` writes both fields back on save - `archipelagos/productivity/sprints/src/views/timeline_view.rs` (new) - groups milestones by due-date month, renders each group with the existing `MilestoneCard`, sorted chronologically; undated milestones bucket into a trailing "No date" section - `archipelagos/productivity/sprints/src/views/mod.rs` - register `timeline_view` + re-export `TimelineView` - `archipelagos/productivity/sprints/src/island.rs` - route `SprintsView::Timeline` to the real `TimelineView` instead of the old `ListView` stub - `archipelagos/productivity/sprints/Cargo.toml` - add `chrono` workspace dep (used by the date helpers + timeline month labels) - `core/src/island.css` - hide Chrome's native `::-webkit-calendar-picker-indicator` on `.form-control-date` so the custom SVG overlay does not collide with it ## Test Results - `cargo check -p hero_archipelagos_sprints`: pass - `cargo fmt -p hero_archipelagos_sprints`: pass - `dx build --package hero_os_app --web --features web`: pass, deployed to the shared test instance UI-only features — covered by manual verification below. ## Manual verification - [ ] Create a new milestone with Due Date `2026-05-01` and Target Date `2026-06-01`, save, reopen — both dates pre-fill in the edit form - [ ] Leave dates blank, save — backend receives `None` for both, detail view shows no date - [ ] Open the Timeline view — milestones are grouped by due-date month and sorted chronologically - [ ] A milestone without any date shows up under "No date" at the end of the timeline - [ ] Every date field renders a single calendar icon on Chrome (the custom SVG, not the native indicator too) - [ ] Regression: List view unchanged, MilestoneCard click still opens detail from both List and Timeline
feat(sprints): milestone date fields + Timeline view
All checks were successful
Build and Test / build (pull_request) Successful in 5m26s
328c8be6df
- milestone_form: add due_date and target_date DateField inputs (closes #62)
- new TimelineView groups milestones by due-date month and replaces the
  ListView placeholder previously routed under SprintsView::Timeline
- sprints crate: add chrono workspace dep used for date<->timestamp helpers
Chrome paints its own icon on input type=date in addition to the
component's custom overlay, so every DateField rendered two calendar
icons side by side. Zero out the native indicator; the native picker
still opens on click since the input area is clickable.
merge development
All checks were successful
Build and Test / build (pull_request) Successful in 5m30s
d496f8e37e
fix(sprints): render formatted due date on MilestoneCard
All checks were successful
Build and Test / build (pull_request) Successful in 6m12s
8e23f23e34
The card used to show the literal text "Due date set" whenever a
milestone had a due_date, without the date itself. Format the value as
"Mon D, YYYY" (due_date wins over target_date; both stored as Unix
seconds) and drop the label when neither is set or the stored value is 0.
zaelgohary merged commit d5f0ed177a into development 2026-04-22 08:27:10 +00:00
zaelgohary deleted branch fix/sprints_round2 2026-04-22 08:27:11 +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!111
No description provided.