Skip to content

feat: draft sprint UX — sidebar section, status badges, start-sprint warning - #460

Merged
pikann merged 3 commits into
masterfrom
feature/improve-sprint-ui
Sep 5, 2026
Merged

feat: draft sprint UX — sidebar section, status badges, start-sprint warning#460
pikann merged 3 commits into
masterfrom
feature/improve-sprint-ui

Conversation

@pikann

@pikann pikann commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Improves sprint lifecycle UX so a newly created sprint is easy to find and understand instead of silently disappearing until it's started (see #456, where a "missing" sprint was reported as a bug).

  • Sidebar: adds a collapsible "Draft Sprints" section (between Open and Completed) so every sprint has a place in the nav, not just active/completed ones.
  • Status badges: new SprintStatusBadge component gives Draft/Active/Completed a consistent look across the backlog column headers, the sprint detail page header, and the Complete Sprint modal's destination-sprint list.
  • Start Sprint dialog: shows a non-blocking warning when another sprint in the project is already active, instead of allowing it silently.
  • Task sprint picker: marks draft (not-yet-started) sprints with a "(not started)" hint in the dropdown, without cluttering the compact assigned-sprint pill.
  • Localization: all of the above translated across all 9 supported locales (en, es, fr, ja, ko, pt-BR, ru, vi, zh-CN).

Notes

  • The sprint's internal status value is unchanged (planned) — only the label shown to users was renamed to "Draft" for clarity. No API or database migration involved.
  • Frontend-only change; no backend/Go changes.

Closes #456.

…s badges

- Implemented collapsible section for planned sprints in the app sidebar.
- Added SprintStatusBadge component to display sprint status.
- Enhanced interaction layout to handle starting sprints with warnings for active sprints.
- Updated various components to support new sprint status features and localization.
@pikann pikann changed the title feat: add planned sprints functionality with collapsible UI and statu… feat: draft sprint UX — sidebar section, status badges, start-sprint warning Sep 4, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

ℹ️ Clean, well-structured UI feature — one minor suggestion inline, nothing blocking.

Reviewed changes — Single commit (1aaf510) touching 28 files in apps/web, all frontend sprint-interactions UI:

  • Sidebar draft-sprints section (app-sidebar.tsx) — New collapsible "Draft Sprints" group with per-project localStorage collapse state, defaulting to expanded and mirroring the existing completedSprintsCollapsed pattern.
  • SprintStatusBadge (new component) — Color-coded, localized status badge reused across the list-group header, sprint detail header, and move-sprint modal.
  • Start-sprint warning — The Start Sprint modal now shows a non-blocking amber warning naming an already-active sprint, threaded through list-view.tsxlist-group.tsxstart-sprint-modal.tsx via otherActiveSprint.
  • handleStartSprint extraction (interaction-layout.tsx) — Behavior-preserving refactor of the inline start handler; still gated at the call site by context === "backlog" && canCreate.
  • Planned-sprint hint (properties-panel.tsx / option-list-button.tsx / types.ts) — Planned sprints show a muted "(not started)" hint via the new optional SelectOption.hint; renders only in the dropdown list.
  • Sprint detail header ($sprintId.tsx) — Status badge now shows for all viewers; edit/complete buttons remain gated by canManageSprints; move-sprint modal swaps raw capitalized text for the badge.
  • i18nplannedSprints, sprintNotStarted, alreadyActiveWarning added and statusPlanned renamed "Planned"→"Draft" consistently across all 9 locales.

I traced the otherActiveSprint wiring end-to-end: ListGroup has no other callers, the modal is only reachable for a planned sprint's start button, and the gate/passthrough logic preserves the prior behavior. No correctness or behavior regressions found.

Pullfrog  | Fix all ➔Fix 👍s ➔View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

Comment thread apps/web/src/components/projects/interactions/list-view.tsx
- Introduced SprintFormModal for handling sprint creation and editing.
- Updated StartSprintModal to utilize SprintFormModal for starting sprints.
- Refactored InteractionLayout, ListGroup, and ListView components to use SprintFormPayload type.
- Enhanced internationalization by adding "startSprint" translations in multiple languages.
- Improved SprintPage component to manage sprint state and modal visibility more effectively.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ No new issues found.

Reviewed changes — Commit 2022ba09 (delta vs the prior pullfrog review at 1aaf510), which refactors the sprint management modals:

  • Extracted SprintFormModal (new component) — a shared mode="start"|"edit" dialog that supersedes both the standalone Start Sprint dialog and the sprint detail page's inline edit modal.
  • New "Start sprint" action on the sprint detail header for planned sprints — wired to StartSprintModal, reusing the otherActiveSprint warning (now computed page-level from allSprints) and the existing updateSprint mutation carrying status: "active".
  • Edit dialog now uses SprintFormModal mode="edit" — the delete action and stacked delete-confirm overlay are retained; suppressEscape={deleteConfirmOpen} plus the page-level Escape handler correctly close only the topmost dialog.
  • Shared SprintFormPayload type — replaces three duplicated inline onSubmit payload shapes across interaction-layout, list-view, list-group, and start-sprint-modal.
  • LocalizationeditSprintModal / editSprint / startSprint keys added; verified the editSprintModal and startSprintModal key sets are byte-identical across all 9 locales.

I re-verified the load-bearing details rather than trusting the diff: UpdateSprintPayload.status is typed SprintStatus so the injected "active" compiles; the delete-confirm overlay and its Esc/backdrop handling remain fully intact; date-range validation, the edit-mode empty-name disable, and the start-mode name fallback are all preserved. StartSprintModal delegating to SprintFormModal keeps behavior identical to the prior inline implementation. Prior review feedback (the .find() warning edge case) was already resolved. No regressions or new issues found.

Pullfrog  | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ No new issues found.

Reviewed changes — Commit 711c1b25 (delta vs the prior pullfrog review at 2022ba09), which adds error handling for the start-sprint flow and completes i18n:

  • Inline start-sprint error handling (list-group.tsx) — New startSprintError state; the modal's onSubmit wraps onStartSprint in try/catch, sets layout.startSprintModal.error on failure, and re-throws. The error is cleared each time the Start button is reopened.
  • Same handling on the sprint detail page ($sprintId.tsx) — The header "Start sprint" button now routes through updateSprintMutation.mutateAsync with an equivalent try/catch + startSprintError re-throw.
  • errorMessage prop threading (start-sprint-modal.tsx) — New optional errorMessage forwarded to SprintFormModal, whose handleSubmit already swallows caller errors (comment: "caller surfaces failures via errorMessage") and keeps the dialog open — so the failure text renders below the fields and the modal doesn't close on a failed start.
  • i18nstartSprintModal.error (plus the already-reviewed alreadyActiveWarning) added in all 9 locales.

I verified the load-bearing details rather than trusting the diff: the t("layout.startSprintModal.error") key referenced by both callers exists, and I confirmed the startSprintModal and sprintDetail.editSprintModal key sets are byte-identical across all 9 locales (en, es, fr, ja, ko, pt-BR, ru, vi, zh-CN). On a failed start, updateSprintMutation's onError also fires setEditError, but that slot belongs to the (closed) edit modal and is cleared on the next edit-open, so it's harmless. The dialog staying open on failure with the error visible is the intended trade-off. No regressions found.

Pullfrog  | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

@pikann
pikann merged commit 980bfe8 into master Sep 5, 2026
2 checks passed
@pikann
pikann deleted the feature/improve-sprint-ui branch September 5, 2026 02:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Issue with sprints

1 participant