feat: implement Story 2.4 — Dashboard Activity Feed with review fixes
Add role-scoped activity feed to the dashboard showing the 20 most recent workspace events. Owners/Managers see all activity (declarations, clients, team changes); Workers see only their assigned declarations. Includes French descriptions, relative timestamps, responsive layout (desktop sidebar, tablet inline, mobile collapsible), and 7 passing Pest tests. Review fixes applied: batch-load declarations/clients/users to eliminate N+1 queries, consistent soft-delete handling in URL resolution, French grammar singular/plural fix, missing icon map entry, and corrected tablet breakpoint per spec. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
43
resources/js/composables/useRelativeTime.ts
Normal file
43
resources/js/composables/useRelativeTime.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
export function formatRelativeTime(isoTimestamp: string): string {
|
||||
const date = new Date(isoTimestamp);
|
||||
const now = new Date();
|
||||
const diffMs = now.getTime() - date.getTime();
|
||||
const diffMinutes = Math.floor(diffMs / (1000 * 60));
|
||||
const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
|
||||
const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
||||
|
||||
if (diffMinutes < 1) {
|
||||
return "à l'instant";
|
||||
}
|
||||
|
||||
if (diffMinutes < 60) {
|
||||
return `il y a ${diffMinutes} min`;
|
||||
}
|
||||
|
||||
if (diffHours < 24) {
|
||||
return `il y a ${diffHours} h`;
|
||||
}
|
||||
|
||||
const yesterday = new Date(now);
|
||||
yesterday.setDate(yesterday.getDate() - 1);
|
||||
if (
|
||||
date.getDate() === yesterday.getDate() &&
|
||||
date.getMonth() === yesterday.getMonth() &&
|
||||
date.getFullYear() === yesterday.getFullYear()
|
||||
) {
|
||||
return 'hier';
|
||||
}
|
||||
|
||||
if (diffDays < 7) {
|
||||
return `il y a ${diffDays} ${diffDays === 1 ? 'jour' : 'jours'}`;
|
||||
}
|
||||
|
||||
const day = String(date.getDate()).padStart(2, '0');
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const year = date.getFullYear();
|
||||
return `${day}/${month}/${year}`;
|
||||
}
|
||||
|
||||
export function useRelativeTime() {
|
||||
return { formatRelativeTime };
|
||||
}
|
||||
Reference in New Issue
Block a user