Introduces ViewSelectorManager to handle view state and UI interactions Separates view logic from configuration management Adds explicit tracking of current calendar view Enhances view selection and state management Improves modularity and separation of concerns
206 lines
No EOL
8.6 KiB
TypeScript
206 lines
No EOL
8.6 KiB
TypeScript
// Main entry point for Calendar Plantempus
|
|
import { Container } from '@novadi/core';
|
|
import { eventBus } from './core/EventBus';
|
|
import { ConfigManager } from './configurations/ConfigManager';
|
|
import { Configuration } from './configurations/CalendarConfig';
|
|
import { URLManager } from './utils/URLManager';
|
|
import { IEventBus } from './types/CalendarTypes';
|
|
|
|
// Import all managers
|
|
import { EventManager } from './managers/EventManager';
|
|
import { EventRenderingService } from './renderers/EventRendererManager';
|
|
import { GridManager } from './managers/GridManager';
|
|
import { ScrollManager } from './managers/ScrollManager';
|
|
import { NavigationManager } from './managers/NavigationManager';
|
|
import { ViewSelectorManager } from './managers/ViewSelectorManager';
|
|
import { CalendarManager } from './managers/CalendarManager';
|
|
import { DragDropManager } from './managers/DragDropManager';
|
|
import { AllDayManager } from './managers/AllDayManager';
|
|
import { ResizeHandleManager } from './managers/ResizeHandleManager';
|
|
import { EdgeScrollManager } from './managers/EdgeScrollManager';
|
|
import { HeaderManager } from './managers/HeaderManager';
|
|
import { WorkweekPresetsManager } from './managers/WorkweekPresetsManager';
|
|
|
|
// Import repositories and storage
|
|
import { IEventRepository } from './repositories/IEventRepository';
|
|
import { MockEventRepository } from './repositories/MockEventRepository';
|
|
import { IndexedDBEventRepository } from './repositories/IndexedDBEventRepository';
|
|
import { ApiEventRepository } from './repositories/ApiEventRepository';
|
|
import { IndexedDBService } from './storage/IndexedDBService';
|
|
import { OperationQueue } from './storage/OperationQueue';
|
|
|
|
// Import workers
|
|
import { SyncManager } from './workers/SyncManager';
|
|
|
|
// Import renderers
|
|
import { DateHeaderRenderer, type IHeaderRenderer } from './renderers/DateHeaderRenderer';
|
|
import { DateColumnRenderer, type IColumnRenderer } from './renderers/ColumnRenderer';
|
|
import { DateEventRenderer, type IEventRenderer } from './renderers/EventRenderer';
|
|
import { AllDayEventRenderer } from './renderers/AllDayEventRenderer';
|
|
import { GridRenderer } from './renderers/GridRenderer';
|
|
import { NavigationRenderer } from './renderers/NavigationRenderer';
|
|
|
|
// Import utilities and services
|
|
import { DateService } from './utils/DateService';
|
|
import { TimeFormatter } from './utils/TimeFormatter';
|
|
import { PositionUtils } from './utils/PositionUtils';
|
|
import { AllDayLayoutEngine } from './utils/AllDayLayoutEngine';
|
|
import { WorkHoursManager } from './managers/WorkHoursManager';
|
|
import { EventStackManager } from './managers/EventStackManager';
|
|
import { EventLayoutCoordinator } from './managers/EventLayoutCoordinator';
|
|
|
|
/**
|
|
* Handle deep linking functionality after managers are initialized
|
|
*/
|
|
async function handleDeepLinking(eventManager: EventManager, urlManager: URLManager): Promise<void> {
|
|
try {
|
|
const eventId = urlManager.parseEventIdFromURL();
|
|
|
|
if (eventId) {
|
|
console.log(`Deep linking to event ID: ${eventId}`);
|
|
|
|
// Wait a bit for managers to be fully ready
|
|
setTimeout(async () => {
|
|
const success = await eventManager.navigateToEvent(eventId);
|
|
if (!success) {
|
|
console.warn(`Deep linking failed: Event with ID ${eventId} not found`);
|
|
}
|
|
}, 500);
|
|
}
|
|
} catch (error) {
|
|
console.warn('Deep linking failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize the calendar application using NovaDI
|
|
*/
|
|
async function initializeCalendar(): Promise<void> {
|
|
try {
|
|
// Load configuration from JSON
|
|
const config = await ConfigManager.load();
|
|
|
|
// Create NovaDI container
|
|
const container = new Container();
|
|
const builder = container.builder();
|
|
|
|
// Enable debug mode for development
|
|
eventBus.setDebug(true);
|
|
|
|
// Bind core services as instances
|
|
builder.registerInstance(eventBus).as<IEventBus>();
|
|
|
|
// Register configuration instance
|
|
builder.registerInstance(config).as<Configuration>();
|
|
|
|
// Register storage and repository services
|
|
builder.registerType(IndexedDBService).as<IndexedDBService>();
|
|
builder.registerType(OperationQueue).as<OperationQueue>();
|
|
builder.registerType(ApiEventRepository).as<ApiEventRepository>();
|
|
builder.registerType(IndexedDBEventRepository).as<IEventRepository>();
|
|
|
|
// Register workers
|
|
builder.registerType(SyncManager).as<SyncManager>();
|
|
|
|
// Register renderers
|
|
builder.registerType(DateHeaderRenderer).as<IHeaderRenderer>();
|
|
builder.registerType(DateColumnRenderer).as<IColumnRenderer>();
|
|
builder.registerType(DateEventRenderer).as<IEventRenderer>();
|
|
|
|
// Register core services and utilities
|
|
builder.registerType(DateService).as<DateService>();
|
|
builder.registerType(EventStackManager).as<EventStackManager>();
|
|
builder.registerType(EventLayoutCoordinator).as<EventLayoutCoordinator>();
|
|
builder.registerType(WorkHoursManager).as<WorkHoursManager>();
|
|
builder.registerType(URLManager).as<URLManager>();
|
|
builder.registerType(TimeFormatter).as<TimeFormatter>();
|
|
builder.registerType(PositionUtils).as<PositionUtils>();
|
|
// Note: AllDayLayoutEngine is instantiated per-operation with specific dates, not a singleton
|
|
builder.registerType(NavigationRenderer).as<NavigationRenderer>();
|
|
builder.registerType(AllDayEventRenderer).as<AllDayEventRenderer>();
|
|
|
|
builder.registerType(EventRenderingService).as<EventRenderingService>();
|
|
builder.registerType(GridRenderer).as<GridRenderer>();
|
|
builder.registerType(GridManager).as<GridManager>();
|
|
builder.registerType(ScrollManager).as<ScrollManager>();
|
|
builder.registerType(NavigationManager).as<NavigationManager>();
|
|
builder.registerType(ViewSelectorManager).as<ViewSelectorManager>();
|
|
builder.registerType(DragDropManager).as<DragDropManager>();
|
|
builder.registerType(AllDayManager).as<AllDayManager>();
|
|
builder.registerType(ResizeHandleManager).as<ResizeHandleManager>();
|
|
builder.registerType(EdgeScrollManager).as<EdgeScrollManager>();
|
|
builder.registerType(HeaderManager).as<HeaderManager>();
|
|
builder.registerType(CalendarManager).as<CalendarManager>();
|
|
builder.registerType(WorkweekPresetsManager).as<WorkweekPresetsManager>();
|
|
|
|
builder.registerType(ConfigManager).as<ConfigManager>();
|
|
builder.registerType(EventManager).as<EventManager>();
|
|
|
|
// Build the container
|
|
const app = builder.build();
|
|
|
|
// Get managers from container
|
|
const eb = app.resolveType<IEventBus>();
|
|
const calendarManager = app.resolveType<CalendarManager>();
|
|
const eventManager = app.resolveType<EventManager>();
|
|
const resizeHandleManager = app.resolveType<ResizeHandleManager>();
|
|
const headerManager = app.resolveType<HeaderManager>();
|
|
const dragDropManager = app.resolveType<DragDropManager>();
|
|
const viewSelectorManager = app.resolveType<ViewSelectorManager>();
|
|
const navigationManager = app.resolveType<NavigationManager>();
|
|
const edgeScrollManager = app.resolveType<EdgeScrollManager>();
|
|
const allDayManager = app.resolveType<AllDayManager>();
|
|
const urlManager = app.resolveType<URLManager>();
|
|
const workweekPresetsManager = app.resolveType<WorkweekPresetsManager>();
|
|
const configManager = app.resolveType<ConfigManager>();
|
|
|
|
// Initialize managers
|
|
await calendarManager.initialize?.();
|
|
await resizeHandleManager.initialize?.();
|
|
|
|
// Resolve SyncManager (starts automatically in constructor)
|
|
// Resolve SyncManager (starts automatically in constructor)
|
|
// Resolve SyncManager (starts automatically in constructor)
|
|
// Resolve SyncManager (starts automatically in constructor)
|
|
// Resolve SyncManager (starts automatically in constructor)
|
|
//const syncManager = app.resolveType<SyncManager>();
|
|
|
|
// Handle deep linking after managers are initialized
|
|
await handleDeepLinking(eventManager, urlManager);
|
|
|
|
// Expose to window for debugging (with proper typing)
|
|
(window as Window & {
|
|
calendarDebug?: {
|
|
eventBus: typeof eventBus;
|
|
app: typeof app;
|
|
calendarManager: typeof calendarManager;
|
|
eventManager: typeof eventManager;
|
|
workweekPresetsManager: typeof workweekPresetsManager;
|
|
//syncManager: typeof syncManager;
|
|
};
|
|
}).calendarDebug = {
|
|
eventBus,
|
|
app,
|
|
calendarManager,
|
|
eventManager,
|
|
workweekPresetsManager,
|
|
//syncManager,
|
|
};
|
|
|
|
} catch (error) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
// Initialize when DOM is ready - now handles async properly
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
initializeCalendar().catch(error => {
|
|
console.error('Calendar initialization failed:', error);
|
|
});
|
|
});
|
|
} else {
|
|
initializeCalendar().catch(error => {
|
|
console.error('Calendar initialization failed:', error);
|
|
});
|
|
} |