Add PDF export to Activity Log with date range filtering

- Backend: add date_from/date_to query params to timeline, strikes, and logs endpoints
- Frontend: Export PDF button opens a dialog to select child and date range, generates a printable HTML report in a new tab

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 23:18:49 -07:00
parent 68a5e9cb4f
commit 956df11f49
2 changed files with 234 additions and 2 deletions

View File

@@ -22,6 +22,8 @@ router = APIRouter(prefix="/api/logs", tags=["logs"])
async def get_timeline(
child_id: int | None = None,
log_date: date | None = None,
date_from: date | None = None,
date_to: date | None = None,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
@@ -44,6 +46,10 @@ async def get_timeline(
query = query.where(DailySession.child_id == child_id)
if log_date:
query = query.where(DailySession.session_date == log_date)
if date_from:
query = query.where(DailySession.session_date >= date_from)
if date_to:
query = query.where(DailySession.session_date <= date_to)
result = await db.execute(query)
events = result.scalars().all()
@@ -125,6 +131,8 @@ async def delete_timeline_event(
async def get_strike_events(
child_id: int | None = None,
log_date: date | None = None,
date_from: date | None = None,
date_to: date | None = None,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
@@ -139,6 +147,10 @@ async def get_strike_events(
query = query.where(StrikeEvent.child_id == child_id)
if log_date:
query = query.where(func.date(StrikeEvent.occurred_at) == log_date)
if date_from:
query = query.where(func.date(StrikeEvent.occurred_at) >= date_from)
if date_to:
query = query.where(func.date(StrikeEvent.occurred_at) <= date_to)
result = await db.execute(query)
events = result.scalars().all()
@@ -178,6 +190,8 @@ async def delete_strike_event(
async def list_logs(
child_id: int | None = None,
log_date: date | None = None,
date_from: date | None = None,
date_to: date | None = None,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
):
@@ -191,6 +205,10 @@ async def list_logs(
query = query.where(ActivityLog.child_id == child_id)
if log_date:
query = query.where(ActivityLog.log_date == log_date)
if date_from:
query = query.where(ActivityLog.log_date >= date_from)
if date_to:
query = query.where(ActivityLog.log_date <= date_to)
result = await db.execute(query)
return result.scalars().all()