@uplink-protocol/calendar-controller
Version:
Flexible calendar and time picker API supporting both calendar, date-picker, and time-picker integrations for any JavaScript framework or library
291 lines (237 loc) • 9.29 kB
Markdown
# Event Management System
A comprehensive, modular event management system for calendar applications. This system is designed to work independently or integrate seamlessly with DateController and TimeController.
## Features
- **Complete Event Lifecycle**: Create, read, update, and delete events
- **Advanced Search & Filtering**: Full-text search with faceted filtering
- **Event Validation**: Comprehensive business rule validation
- **Multiple Export Formats**: JSON, CSV, ICS support
- **Flexible Formatting**: Customizable event display formatting
- **Modular Architecture**: Use individual services or the complete controller
- **TypeScript Support**: Full type safety and IntelliSense support
- **Storage Abstraction**: Local storage, memory, or custom storage backends
## Architecture
The Event Management System follows a modular service-oriented architecture:
```
EventController (Main Interface)
├── EventManagerService (Orchestration)
├── EventStorageService (Data Persistence)
├── EventValidationService (Business Rules)
├── EventFormattingService (Display Logic)
└── EventSearchService (Search & Filtering)
```
## Quick Start
### Basic Usage
```typescript
import { EventController } from '@uplink-protocol/calendar-controller';
// Initialize the controller
const eventController = new EventController({
enableAutoSave: true,
enableValidation: true,
enableSearch: true
});
// Create an event
const event = await eventController.createEvent({
title: 'Team Meeting',
description: 'Weekly team sync',
dateTime: {
start: new Date('2025-07-01T14:00:00'),
end: new Date('2025-07-01T15:00:00'),
isAllDay: false,
timeZone: {
id: 'America/New_York',
displayName: 'Eastern Time',
offset: -240
}
},
location: {
name: 'Conference Room A'
},
attendees: [
{ name: 'John Doe', email: 'john@example.com' }
]
});
// Search events
const results = await eventController.searchEvents({
text: 'meeting',
dateRange: {
start: new Date('2025-07-01'),
end: new Date('2025-07-07')
}
});
```
### Advanced Service Usage
```typescript
import {
CalendarEventStorageService,
CalendarEventValidationService,
CalendarEventFormattingService,
CalendarEventSearchService
} from '@uplink-protocol/calendar-controller';
// Use individual services for advanced control
const storageService = new CalendarEventStorageService();
const validationService = new CalendarEventValidationService();
const formattingService = new CalendarEventFormattingService();
const searchService = new CalendarEventSearchService();
// Initialize services with custom configuration
await storageService.initialize({ storageType: 'localStorage' });
validationService.initialize();
formattingService.initialize({ locale: 'en-US', timeZone: 'UTC' });
await searchService.initialize({ enableFuzzySearch: true });
```
## Integration with Date/Time Controllers
The Event Management System is designed to work seamlessly with existing DateController and TimeController:
```typescript
import { CalendarController, TimeController, EventController } from '@uplink-protocol/calendar-controller';
const dateController = CalendarController();
const timeController = TimeController();
const eventController = new EventController();
// Create event from date/time selections
const selectedDate = dateController.getSelectedDate();
const selectedTime = timeController.getSelectedTime();
const event = await eventController.createEvent({
title: 'New Appointment',
dateTime: {
start: combineDateTime(selectedDate, selectedTime),
end: addDuration(combineDateTime(selectedDate, selectedTime), { hours: 1 }),
isAllDay: false,
timeZone: { id: 'UTC', displayName: 'UTC', offset: 0 }
}
});
// Update controllers when event is selected
eventController.on('eventSelected', (event) => {
dateController.setSelectedDate(new Date(event.dateTime.start));
timeController.setSelectedTime({
hours: new Date(event.dateTime.start).getHours(),
minutes: new Date(event.dateTime.start).getMinutes()
});
});
```
## Configuration Options
### EventController Options
```typescript
interface EventControllerOptions {
enableAutoSave?: boolean; // Auto-save changes
autoSaveInterval?: number; // Auto-save interval in ms
enableValidation?: boolean; // Enable event validation
enableSearch?: boolean; // Enable search functionality
enableConflictDetection?: boolean; // Check for conflicts
enableNotifications?: boolean; // Enable notifications (future)
enableRecurrence?: boolean; // Enable recurring events (future)
enableSync?: boolean; // Enable external sync (future)
defaultView?: string; // Default calendar view
timezone?: string; // Default timezone
locale?: string; // Default locale
}
```
### Storage Configuration
```typescript
interface StorageConfig {
storageType: 'memory' | 'localStorage' | 'custom';
keyPrefix?: string; // Key prefix for localStorage
customAdapter?: StorageAdapter; // Custom storage implementation
}
```
### Validation Configuration
```typescript
interface BusinessRuleConfig {
maxDurationMinutes?: number; // Maximum event duration
minDurationMinutes?: number; // Minimum event duration
maxAdvanceBookingDays?: number; // Maximum advance booking
workingHours?: { // Working hours restrictions
start: string;
end: string;
days: number[];
};
maxConcurrentEvents?: number; // Maximum overlapping events
requiredFields?: string[]; // Required event fields
}
```
## Event Types
### CalendarEvent
```typescript
interface CalendarEvent {
id: string;
title: string;
description?: string;
dateTime: EventDateTime;
location?: EventLocation;
attendees?: EventAttendee[];
priority?: 'low' | 'normal' | 'high' | 'urgent';
status?: 'tentative' | 'confirmed' | 'cancelled' | 'completed';
visibility?: 'default' | 'public' | 'private' | 'confidential';
category?: string;
recurrence?: EventRecurrence;
reminders?: EventReminder[];
attachments?: EventAttachment[];
metadata?: EventMetadata;
}
```
### Search and Filtering
```typescript
interface SearchQuery {
text?: string; // Full-text search
fields?: { // Field-specific search
title?: string;
description?: string;
location?: string;
category?: string;
attendees?: string;
};
dateRange?: { // Date range filter
start?: Date;
end?: Date;
type?: 'absolute' | 'relative';
relative?: {
value: number;
unit: 'days' | 'weeks' | 'months';
direction: 'past' | 'future';
};
};
filters?: EventFilter; // Additional filters
sort?: EventSort; // Sort options
}
```
## Examples
See the `Examples/Event/` directory for comprehensive usage examples:
- `event-management-example.js` - Complete system demonstration
- Basic CRUD operations
- Search and filtering
- Event formatting and export
- Integration with Date/Time controllers
## API Reference
### EventController Methods
- `createEvent(input: CreateEventInput): Promise<CalendarEvent>`
- `updateEvent(id: string, updates: UpdateEventInput): Promise<CalendarEvent>`
- `deleteEvent(id: string): Promise<void>`
- `getEvent(id: string): Promise<CalendarEvent | null>`
- `getEvents(filter?: EventFilter): Promise<EventResults>`
- `searchEvents(query: SearchQuery): Promise<SearchResults>`
- `validateEvent(input: CreateEventInput): Promise<EventValidationResult>`
### Events
The EventController emits the following events:
- `eventCreated` - When an event is created
- `eventUpdated` - When an event is updated
- `eventDeleted` - When an event is deleted
- `eventSelected` - When an event is selected
- `validationFailed` - When validation fails
- `errorOccurred` - When an error occurs
## Future Enhancements
The following features are planned for future releases:
- **Recurrence Engine**: Advanced recurring event support
- **Notification System**: Email, push, and in-app notifications
- **Conflict Resolution**: Automatic conflict detection and resolution
- **External Sync**: Google Calendar, Outlook, CalDAV integration
- **Real-time Collaboration**: Multi-user event editing
- **Advanced Analytics**: Usage statistics and insights
- **Custom Field Support**: Extensible event properties
- **Workflow Integration**: Event approval and workflow management
## Contributing
The Event Management System is designed to be extensible. You can:
1. Implement custom storage adapters
2. Add custom validation rules
3. Create custom formatters
4. Extend search capabilities
5. Add new export formats
See the interface definitions in `src/Event/interfaces/` for extension points.
## License
This package is part of the Odyssey Uplink Protocol and follows the same licensing terms.