Fix daily summary to display real activity counts and add medicine tracker
## 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:
@@ -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,
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user