Refactor CalendarConfig to static configuration class

Converts CalendarConfig to a pure static configuration management class with improved initialization and dependency handling

Removes event bus dependencies and simplifies configuration loading
Adds static methods for config management and initialization
Improves flexibility and reduces class complexity
This commit is contained in:
Janus C. H. Knudsen 2025-10-31 15:26:07 +01:00
parent 8bbb2f05d3
commit 349e1e8293
7 changed files with 3299 additions and 318 deletions

View file

@ -19,10 +19,11 @@ import { ResizeHandleManager } from './managers/ResizeHandleManager';
import { EdgeScrollManager } from './managers/EdgeScrollManager';
import { DragHoverManager } from './managers/DragHoverManager';
import { HeaderManager } from './managers/HeaderManager';
import { ConfigManager } from './managers/ConfigManager';
// Import renderers
import { DateHeaderRenderer, type HeaderRenderer } from './renderers/HeaderRenderer';
import { DateColumnRenderer, type ColumnRenderer } from './renderers/ColumnRenderer';
import { DateHeaderRenderer, ResourceHeaderRenderer, type HeaderRenderer } from './renderers/HeaderRenderer';
import { DateColumnRenderer, ResourceColumnRenderer, type ColumnRenderer } from './renderers/ColumnRenderer';
import { DateEventRenderer, type EventRendererStrategy } from './renderers/EventRenderer';
import { AllDayEventRenderer } from './renderers/AllDayEventRenderer';
import { GridRenderer } from './renderers/GridRenderer';
@ -66,7 +67,8 @@ async function handleDeepLinking(eventManager: EventManager, urlManager: URLMana
*/
async function initializeCalendar(): Promise<void> {
try {
// Use the singleton calendar configuration
// Initialize static calendar configuration
CalendarConfig.initialize();
// Create NovaDI container
const container = new Container();
@ -75,20 +77,25 @@ async function initializeCalendar(): Promise<void> {
// Enable debug mode for development
eventBus.setDebug(true);
builder.registerType(CalendarConfig).as<CalendarConfig>().singleInstance();
// Register CalendarConfig as singleton instance (static class, not instantiated)
builder.registerInstance(CalendarConfig).as<CalendarConfig>();
// Register ConfigManager for event-driven config updates
builder.registerType(ConfigManager).as<ConfigManager>().singleInstance();
// Bind core services as instances
builder.registerInstance(eventBus).as<IEventBus>();
// Register renderers with keyed registration based on calendar mode
// Date mode renderers
builder.registerType(DateHeaderRenderer).as<HeaderRenderer>().keyed('date');
builder.registerType(DateColumnRenderer).as<ColumnRenderer>().keyed('date');
builder.registerType(DateEventRenderer).as<EventRendererStrategy>().keyed('date');
// Resource mode renderers (using same renderers for now)
builder.registerType(DateHeaderRenderer).as<HeaderRenderer>().keyed('resource');
builder.registerType(DateColumnRenderer).as<ColumnRenderer>().keyed('resource');
builder.registerType(DateEventRenderer).as<EventRendererStrategy>().keyed('resource');
// Register renderers based on calendar mode
const calendarMode = CalendarConfig.getCalendarMode();
if (calendarMode === 'resource') {
builder.registerType(ResourceHeaderRenderer).as<HeaderRenderer>().singleInstance();
builder.registerType(ResourceColumnRenderer).as<ColumnRenderer>().singleInstance();
} else {
builder.registerType(DateHeaderRenderer).as<HeaderRenderer>().singleInstance();
builder.registerType(DateColumnRenderer).as<ColumnRenderer>().singleInstance();
}
builder.registerType(DateEventRenderer).as<EventRendererStrategy>().singleInstance();
// Register core services and utilities
builder.registerType(DateService).as<DateService>().singleInstance();
@ -167,9 +174,11 @@ async function initializeCalendar(): Promise<void> {
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);
});
}