Fix daily summary to display real activity counts and add medicine tracker
Some checks failed
CI/CD Pipeline / Lint and Test (push) Has been cancelled
CI/CD Pipeline / E2E Tests (push) Has been cancelled
CI/CD Pipeline / Build Application (push) Has been cancelled

## Backend Changes
- Update tracking.service.ts getDailySummary to calculate actual counts
- Import ActivityType enum for proper type comparisons
- Calculate feedingCount, sleepTotalMinutes, diaperCount, medicationCount
- Sleep duration now correctly calculated from startedAt/endedAt timestamps

## Frontend API Changes
- Add medicationCount to DailySummary interface
- Extract endTime from metadata and send as endedAt to backend
- Enables proper sleep duration tracking with start/end times

## Homepage Updates
- Add Medicine and Activities quick action buttons
- Update summary grid from 3 to 4 columns (responsive layout)
- Add medication count display with MedicalServices icon
- Improve grid responsiveness (xs=6, sm=3)
- Replace Analytics button with Activities button

## New Activities Page
- Create /activities page to show recent activity history
- Display last 7 days of activities with color-coded icons
- Show smart timestamps (Today/Yesterday/date format)
- Activity-specific descriptions (feeding amount, sleep duration, etc.)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-02 14:46:18 +00:00
parent 0321025278
commit 788be7cd32
4 changed files with 295 additions and 20 deletions

View File

@@ -6,7 +6,7 @@ import {
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, Between, MoreThanOrEqual, LessThanOrEqual } from 'typeorm';
import { Activity } from '../../database/entities/activity.entity';
import { Activity, ActivityType } from '../../database/entities/activity.entity';
import { Child } from '../../database/entities/child.entity';
import { FamilyMember } from '../../database/entities/family-member.entity';
import { CreateActivityDto } from './dto/create-activity.dto';
@@ -255,31 +255,57 @@ export class TrackingService {
},
});
// Group by type
const summary: Record<string, any> = {
date,
childId,
activities: [],
byType: {},
};
// Calculate summary statistics
let feedingCount = 0;
let sleepTotalMinutes = 0;
let diaperCount = 0;
let medicationCount = 0;
const activityList = [];
const byType: Record<string, any[]> = {};
activities.forEach((activity) => {
summary.activities.push({
const activityData = {
id: activity.id,
type: activity.type,
startedAt: activity.startedAt,
endedAt: activity.endedAt,
notes: activity.notes,
metadata: activity.metadata,
});
};
if (!summary.byType[activity.type]) {
summary.byType[activity.type] = [];
activityList.push(activityData);
if (!byType[activity.type]) {
byType[activity.type] = [];
}
byType[activity.type].push(activity);
summary.byType[activity.type].push(activity);
// Count by type
if (activity.type === ActivityType.FEEDING) {
feedingCount++;
} else if (activity.type === ActivityType.SLEEP) {
// Calculate sleep duration in minutes
if (activity.startedAt && activity.endedAt) {
const durationMs = new Date(activity.endedAt).getTime() - new Date(activity.startedAt).getTime();
sleepTotalMinutes += Math.floor(durationMs / 60000);
}
} else if (activity.type === ActivityType.DIAPER) {
diaperCount++;
} else if (activity.type === ActivityType.MEDICATION) {
medicationCount++;
}
});
return summary;
return {
date,
childId,
feedingCount,
sleepTotalMinutes,
diaperCount,
medicationCount,
activities: activityList,
byType,
};
}
}