feat: implement routines feature for child and parent modes
All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 2m23s

- Added backend models for routines, routine items, and schedules.
- Created API endpoints for managing routines and their items.
- Implemented frontend components for routine creation, detail view, and assignment.
- Integrated routines into child view with a scrolling list and approval workflow.
- Added push notifications for routine confirmations and pending approvals.
- Refactored existing components to accommodate new routines functionality.
- Updated tests to cover new routines feature and ensure proper functionality.
This commit is contained in:
2026-04-28 23:30:52 -04:00
parent c840825549
commit 6bf10fda2f
19 changed files with 422 additions and 126 deletions

View File

@@ -1,51 +0,0 @@
import { test, expect } from '@playwright/test'
test('Simple chore creation test', async ({ page }) => {
// Navigate to chores
await page.goto('/parent/tasks/chores')
// Click the Create Chore FAB
await page.getByRole('button', { name: 'Create Chore' }).click()
// Wait for form to load
await expect(page.locator('text=Chore Name')).toBeVisible()
// Fill form using custom evaluation
await page.evaluate(() => {
// Fill name
const nameInput = document.querySelector('input[type="text"], input:not([type])')
if (nameInput) {
nameInput.value = 'Simple Chore Test'
nameInput.dispatchEvent(new Event('input', { bubbles: true }))
nameInput.dispatchEvent(new Event('change', { bubbles: true }))
}
// Fill points
const pointsInput = document.querySelector('input[type="number"]')
if (pointsInput) {
pointsInput.value = '5'
pointsInput.dispatchEvent(new Event('input', { bubbles: true }))
pointsInput.dispatchEvent(new Event('change', { bubbles: true }))
}
// Click first image to select it
const firstImage = document.querySelector('img[alt*="Image"]')
if (firstImage) {
firstImage.click()
}
})
// Wait a moment for validation to trigger
await page.waitForTimeout(500)
// Click Create button
await page.getByRole('button', { name: 'Create' }).click()
// Verify we're back on the list page and item was created
// locate the name element, then move up to the row container
const choreName = page.locator('text=Simple Chore Test').first()
const choreRow = choreName.locator('..')
await expect(choreRow).toBeVisible()
// the row container should display the correct points value
await expect(choreRow.locator('text=5 pts')).toBeVisible()
})