feat: add detailed specifications for Daily chore scheduler refactor phase 2
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 57s
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 57s
This commit is contained in:
167
.github/specs/feat-calendar-chore/feat-calendar-schedule-refactor-02.md
vendored
Normal file
167
.github/specs/feat-calendar-chore/feat-calendar-schedule-refactor-02.md
vendored
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
# Feature: Daily chore scheduler refactor phase 2
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
**Parent Feature:** .github/feat-calenar-chore/feat-calendar-chore.md
|
||||||
|
|
||||||
|
**Goal:** UI refactor of the 'Every X Days' portion of the chore scheduler so that it is not so complicated and mobile friendly
|
||||||
|
|
||||||
|
**User Story:**
|
||||||
|
|
||||||
|
- As a parent, I will be able to select an assigned chore and configure it to occur on 'Every X Days' as before, except I will be presented with a much easier to use interface.
|
||||||
|
|
||||||
|
**Rules:**
|
||||||
|
|
||||||
|
- Follow instructions from .github/copilot-instructions.md
|
||||||
|
|
||||||
|
**Design:**
|
||||||
|
|
||||||
|
- Do not modify 'Specific Days' pattern or UI. However, reuse code if necessary
|
||||||
|
|
||||||
|
**Architecture:**
|
||||||
|
|
||||||
|
1. Shared Logic & Previewer Architecture
|
||||||
|
The "Brain" remains centralized, but the output is now focused on the immediate next event to reduce cognitive clutter.
|
||||||
|
|
||||||
|
State Variables:
|
||||||
|
|
||||||
|
interval: Integer (Default: 1, Min: 1). "Frequency"
|
||||||
|
|
||||||
|
anchorDate: Date Object (Default: Today). "Start Date"
|
||||||
|
|
||||||
|
deadlineTime: String or Null (Default: null). "Deadline"
|
||||||
|
|
||||||
|
The "Next 1" Previewer Logic:
|
||||||
|
|
||||||
|
Input: anchorDate + interval.
|
||||||
|
|
||||||
|
Calculation: Result = anchorDate + (interval days).
|
||||||
|
|
||||||
|
Formatting: Returns a human-readable string (e.g., "Next occurrence: Friday, Oct 24").
|
||||||
|
|
||||||
|
Calendar Constraints:
|
||||||
|
|
||||||
|
Disable Past Dates: Any date prior to "Today" is disabled (greyed out and non-clickable) to prevent scheduling chores in the past.
|
||||||
|
|
||||||
|
2. Mobile Specification: Bottom Sheet Calendar
|
||||||
|
Design & Calendar Details
|
||||||
|
Interface: A full-width monthly grid inside a slide-up panel.
|
||||||
|
|
||||||
|
Touch Targets: Each day cell is a minimum of 44x44 pixels to meet accessibility standards.
|
||||||
|
|
||||||
|
Month Navigation: Uses large left/right chevron buttons at the top of the sheet.
|
||||||
|
|
||||||
|
Visual Indicators:
|
||||||
|
|
||||||
|
Current Selection: A solid primary-colored circle.
|
||||||
|
|
||||||
|
Today’s Date: A subtle outline or "dot" indicator.
|
||||||
|
|
||||||
|
Disabled Dates: 30% opacity with a "forbidden" cursor state if touched.
|
||||||
|
|
||||||
|
Architecture
|
||||||
|
Gesture Control: The Bottom Sheet can be dismissed by swiping down on the "handle" at the top or tapping the dimmed backdrop.
|
||||||
|
|
||||||
|
Performance: The calendar should lazy-load months to ensure the sheet slides up instantly without lag.
|
||||||
|
|
||||||
|
The Flow
|
||||||
|
When the user taps the "Starting on" row...
|
||||||
|
|
||||||
|
Then the sheet slides up. The current anchorDate is pre-selected and centered.
|
||||||
|
|
||||||
|
When the user taps a new date...
|
||||||
|
|
||||||
|
Then the sheet slides down immediately (Auto-confirm).
|
||||||
|
|
||||||
|
When the sheet closes...
|
||||||
|
|
||||||
|
Then the main UI updates the Next 1 Previewer text.
|
||||||
|
|
||||||
|
3. PC (Desktop) Specification: Tethered Popover Calendar
|
||||||
|
Design & Calendar Details
|
||||||
|
Interface: A compact monthly grid (approx. 250px–300px wide) that floats near the input.
|
||||||
|
|
||||||
|
Month Navigation: Small chevrons in the header. Includes a "Today" button to quickly jump back to the current month.
|
||||||
|
|
||||||
|
Day Headers: Single-letter abbreviations (S, M, T, W, T, F, S) to save space.
|
||||||
|
|
||||||
|
Hover States: As the mouse moves over valid dates, a light background highlight follows the cursor to provide immediate feedback.
|
||||||
|
|
||||||
|
Architecture
|
||||||
|
Tethering: The popover is anchored to the bottom-left of the input field. If the browser window is too small, it intelligently repositions to the top-left.
|
||||||
|
|
||||||
|
Keyboard Support: \* Arrow Keys: Move selection between days.
|
||||||
|
|
||||||
|
Enter: Confirm selection and close.
|
||||||
|
|
||||||
|
Esc: Close without saving changes.
|
||||||
|
|
||||||
|
Focus Management: When the popover opens, focus shifts to the calendar grid. When it closes, focus returns to the "Starting on" input.
|
||||||
|
|
||||||
|
The Flow
|
||||||
|
When the user clicks the "Starting on" field...
|
||||||
|
|
||||||
|
Then the popover appears. No backdrop dimming is used.
|
||||||
|
|
||||||
|
When the user clicks a date...
|
||||||
|
|
||||||
|
Then the popover disappears.
|
||||||
|
|
||||||
|
When the user clicks anywhere outside the popover...
|
||||||
|
|
||||||
|
Then the popover closes (Cancel intent).
|
||||||
|
|
||||||
|
4. Reusable Time Picker Reference
|
||||||
|
Referenced from the 'Specific Days' design. TimePickerPopover.vue
|
||||||
|
|
||||||
|
Logic: 15-minute intervals (00, 15, 30, 45).
|
||||||
|
|
||||||
|
Mobile: Implemented via a Bottom Sheet with three scrollable columns.
|
||||||
|
|
||||||
|
PC: Implemented via a Tethered Popover with three clickable columns.
|
||||||
|
|
||||||
|
## Clear Action: Both versions must include a "Clear" button to set the deadline to null (Anytime).
|
||||||
|
|
||||||
|
## Data Model Changes
|
||||||
|
|
||||||
|
### Backend Models
|
||||||
|
|
||||||
|
### Frontend Models
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frontend Design
|
||||||
|
|
||||||
|
## Backend Implementation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Backend Tests
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frontend Implementation
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frontend Tests
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Future Considerations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Acceptance Criteria (Definition of Done)
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
|
||||||
|
- [ ]
|
||||||
Reference in New Issue
Block a user