diff --git a/src/data/store.ts b/src/data/store.ts index 49803ec..e6d981d 100644 --- a/src/data/store.ts +++ b/src/data/store.ts @@ -1756,13 +1756,6 @@ export function reorderDistractionTemplates(orderedIds: string[]): void { // from #32/#33/#34 (pass-back, configurable milestone outcomes), which // hasn't landed yet. -export interface SkillWorkedCount { - checklistItemId: string; - title: string; - phase: Phase; - count: number; -} - export interface DogActivitySummary { dog: Dog; lastWorkedDate: string | null; @@ -1788,12 +1781,6 @@ export interface TrainerHistoryStats { activeDogs: number; graduatedDogs: number; releasedDogs: number; - totalLogs: number; - logsThisWeek: number; - logsThisMonth: number; - milestonesCompleted: number; - skillsWorkedOnTotal: number; - mostWorkedSkills: SkillWorkedCount[]; recentlyWorkedDogs: DogActivitySummary[]; dogsNeedingAttention: DogActivitySummary[]; successRateOverall: SuccessRate; @@ -1808,12 +1795,6 @@ export interface TrainerHistoryStats { graduatedDogsList: Dog[]; } -function daysAgoLocalDate(days: number): string { - const d = new Date(); - d.setDate(d.getDate() - days); - return localSessionDate(d); -} - // Dogs still in progress (neither graduated nor released) never count toward // either side of this ratio โ€” only a decided outcome moves the needle. function computeSuccessRate(dogs: Dog[]): SuccessRate { @@ -1832,7 +1813,7 @@ export function useTrainerHistoryStats(): TrainerHistoryStats { const today = useCurrentLocalDate(); return useMemo(() => { - const { dogs, reports, checklistItems, dogMilestoneCompletions, milestoneTemplates, milestoneOutcomeAttempts } = + const { dogs, reports, dogMilestoneCompletions, milestoneTemplates, milestoneOutcomeAttempts } = state; const graduatedDogs = dogs.filter((d) => d.graduated).length; @@ -1883,30 +1864,6 @@ export function useTrainerHistoryStats(): TrainerHistoryStats { .filter((d) => d.graduated) .sort((a, b) => (b.graduatedDate ?? '').localeCompare(a.graduatedDate ?? '')); - const weekAgo = daysAgoLocalDate(7); - const monthAgo = daysAgoLocalDate(30); - const logsThisWeek = reports.filter((r) => r.sessionDate >= weekAgo).length; - const logsThisMonth = reports.filter((r) => r.sessionDate >= monthAgo).length; - - const milestonesCompleted = dogMilestoneCompletions.filter((c) => c.completed).length; - - const skillCounts = new Map(); - let skillsWorkedOnTotal = 0; - reports.forEach((r) => { - r.skillIds.forEach((id) => { - skillCounts.set(id, (skillCounts.get(id) ?? 0) + 1); - skillsWorkedOnTotal += 1; - }); - }); - const mostWorkedSkills: SkillWorkedCount[] = [...skillCounts.entries()] - .map(([checklistItemId, count]) => { - const item = checklistItems.find((i) => i.id === checklistItemId); - return item ? { checklistItemId, title: item.title, phase: item.phase, count } : null; - }) - .filter((x): x is SkillWorkedCount => x !== null) - .sort((a, b) => b.count - a.count) - .slice(0, 5); - const lastWorkedByDog = new Map(); reports.forEach((r) => { const existing = lastWorkedByDog.get(r.dogId); @@ -1934,12 +1891,6 @@ export function useTrainerHistoryStats(): TrainerHistoryStats { activeDogs, graduatedDogs, releasedDogs, - totalLogs: reports.length, - logsThisWeek, - logsThisMonth, - milestonesCompleted, - skillsWorkedOnTotal, - mostWorkedSkills, recentlyWorkedDogs, dogsNeedingAttention, successRateOverall, diff --git a/src/pages/TrainerHistory.tsx b/src/pages/TrainerHistory.tsx index c8cb969..0734368 100644 --- a/src/pages/TrainerHistory.tsx +++ b/src/pages/TrainerHistory.tsx @@ -114,7 +114,7 @@ function FinalOutcomeBar({ counts }: { counts: FinalOutcomeCounts }) { export function TrainerHistory() { const stats = useTrainerHistoryStats(); const session = useSession(); - const [refinedRate, setRefinedRate] = useState(false); + const [refinedRate, setRefinedRate] = useState(true); const [showGraduatedList, setShowGraduatedList] = useState(false); const pinnedFolderId = usePinnedFolderId(); const pinnedFolder = useFolder(pinnedFolderId); @@ -170,10 +170,64 @@ export function TrainerHistory() {

- A look back at your training career โ€” every dog you've handled on this account. Other - instructors' data isn't included here. + Your assigned dogs and what needs attention today. Other instructors' data isn't included + here.

+
+

+ Needs Attention +

+ {stats.dogsNeedingAttention.length === 0 && ( +

+ {pinnedFolderId ? 'Every currently assigned pinned dog was worked yesterday.' : 'Pin a folder to track which assigned dogs were not worked yesterday.'} +

+ )} +
    + {stats.dogsNeedingAttention.map(({ dog, lastWorkedDate }) => ( +
  • + + + {dog.name} + + + + {formatLastWorked(lastWorkedDate)} + + +
  • + ))} +
+
+ +
+

+ Recently Worked +

+ {stats.recentlyWorkedDogs.length === 0 && ( +

No recent logs for currently assigned dogs.

+ )} +
    + {stats.recentlyWorkedDogs.map(({ dog, lastWorkedDate }) => ( +
  • + + + {dog.name} + + + {formatLastWorked(lastWorkedDate)} + +
  • + ))} +
+
+ {pinnedFolderId && pinnedFolder && (
@@ -258,19 +312,6 @@ export function TrainerHistory() { )}
-
-

- Career Highlights -

-
- - - - - -
-
-

@@ -279,26 +320,26 @@ export function TrainerHistory() {

@@ -326,82 +367,6 @@ export function TrainerHistory() {

)}
- -
-

- Skills You've Worked Most -

- {stats.mostWorkedSkills.length === 0 && ( -

No skills logged as worked on yet.

- )} -
    - {stats.mostWorkedSkills.map((s) => ( -
  • - - {s.title} ยท {s.phase} - - {s.count}ร— -
  • - ))} -
-
- -
-

- Recently Worked -

- {stats.recentlyWorkedDogs.length === 0 && ( -

No recent logs for currently assigned dogs.

- )} -
    - {stats.recentlyWorkedDogs.map(({ dog, lastWorkedDate }) => ( -
  • - - - {dog.name} - - - {formatLastWorked(lastWorkedDate)} - -
  • - ))} -
-
- -
-

- Needs Attention -

- {stats.dogsNeedingAttention.length === 0 && ( -

- {pinnedFolderId ? 'Every currently assigned pinned dog was worked yesterday.' : 'Pin a folder to track which assigned dogs were not worked yesterday.'} -

- )} -
    - {stats.dogsNeedingAttention.map(({ dog, lastWorkedDate }) => ( -
  • - - - {dog.name} - - - - {formatLastWorked(lastWorkedDate)} - - -
  • - ))} -
-
); }