feat(contacts): integrate contacts into Todo and Calendar apps

- Add ContactSelector, ContactBadge, ContactAvatar to shared-ui
- Add ContactsClient API service to shared-auth
- Add ContactReference, ContactSummary types to shared-types
- Todo: Add assignee and involvedContacts to tasks with UI in TaskEditModal
- Todo: Display contacts in TaskItem and KanbanTaskCard
- Calendar: Add AttendeeSelector with RSVP status support
- Calendar: Integrate attendees in EventForm
- Calendar: Add task drag-drop to calendar views (Day/Week/MultiDay)
- Contacts: Add ContactTasks component to show related tasks
- Backend: Add findByContact endpoint to Todo task service
- UI polish: glassmorphism styling, keyboard navigation, auto-focus

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Till-JS 2025-12-11 16:00:08 +01:00 committed by Wuesteon
parent 307f1ae22e
commit 0ecbf69ebc
50 changed files with 5791 additions and 53 deletions

View file

@ -1,4 +1,5 @@
import type { Label } from './label';
import type { ContactReference } from '@manacore/shared-types';
export type TaskPriority = 'low' | 'medium' | 'high' | 'urgent';
export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'cancelled';
@ -26,6 +27,9 @@ export interface TaskMetadata {
storyPoints?: number | null; // Fibonacci: 1, 2, 3, 5, 8, 13, 21
effectiveDuration?: EffectiveDuration | null; // Actual time spent
funRating?: number | null; // 1-10 scale
// Contact associations
assignee?: ContactReference | null; // Person responsible for the task
involvedContacts?: ContactReference[]; // Other people involved
}
export interface Task {
@ -43,6 +47,12 @@ export interface Task {
dueTime?: string | null; // HH:mm format
startDate?: Date | string | null;
// Time-Blocking (for calendar integration)
scheduledDate?: Date | string | null; // Date when task is scheduled
scheduledStartTime?: string | null; // HH:mm format - when to start
scheduledEndTime?: string | null; // HH:mm format - when to end
estimatedDuration?: number | null; // Duration in minutes
// Priority & Status
priority: TaskPriority;
status: TaskStatus;
@ -84,6 +94,11 @@ export interface CreateTaskInput {
dueDate?: string | null;
dueTime?: string | null;
startDate?: string | null;
// Time-Blocking
scheduledDate?: string | null;
scheduledStartTime?: string | null;
scheduledEndTime?: string | null;
estimatedDuration?: number | null;
priority?: TaskPriority;
recurrenceRule?: string | null;
recurrenceEndDate?: string | null;
@ -100,6 +115,11 @@ export interface UpdateTaskInput {
dueDate?: string | null;
dueTime?: string | null;
startDate?: string | null;
// Time-Blocking
scheduledDate?: string | null;
scheduledStartTime?: string | null;
scheduledEndTime?: string | null;
estimatedDuration?: number | null;
priority?: TaskPriority;
status?: TaskStatus;
isCompleted?: boolean;