Implements dynamic renderer injection
Uses dependency injection to dynamically resolve renderers based on the calendar mode. This change decouples the HeaderManager from specific renderer implementations, allowing for more flexible configuration and easier addition of new calendar types. The appropriate renderer is bound to a token in the DI container at startup.
This commit is contained in:
parent
f7c67e6253
commit
bf4b9b5064
4 changed files with 58 additions and 17 deletions
|
|
@ -1,8 +1,7 @@
|
|||
import { eventBus } from '../core/EventBus';
|
||||
import { calendarConfig } from '../core/CalendarConfig';
|
||||
import { CalendarTypeFactory } from '../factories/CalendarTypeFactory';
|
||||
import { CoreEvents } from '../constants/CoreEvents';
|
||||
import { HeaderRenderContext } from '../renderers/HeaderRenderer';
|
||||
import { HeaderRenderer, HeaderRenderContext } from '../renderers/HeaderRenderer';
|
||||
import { ResourceCalendarData } from '../types/CalendarTypes';
|
||||
import { DragMouseEnterHeaderEventPayload, DragMouseLeaveHeaderEventPayload, HeaderReadyEventPayload } from '../types/EventTypes';
|
||||
import { ColumnDetectionUtils } from '../utils/ColumnDetectionUtils';
|
||||
|
|
@ -10,10 +9,14 @@ import { ColumnDetectionUtils } from '../utils/ColumnDetectionUtils';
|
|||
/**
|
||||
* HeaderManager - Handles all header-related event logic
|
||||
* Separates event handling from rendering concerns
|
||||
* Uses dependency injection for renderer strategy
|
||||
*/
|
||||
export class HeaderManager {
|
||||
private headerRenderer: HeaderRenderer;
|
||||
|
||||
constructor(headerRenderer: HeaderRenderer) {
|
||||
this.headerRenderer = headerRenderer;
|
||||
|
||||
constructor() {
|
||||
// Bind handler methods for event listeners
|
||||
this.handleDragMouseEnterHeader = this.handleDragMouseEnterHeader.bind(this);
|
||||
this.handleDragMouseLeaveHeader = this.handleDragMouseLeaveHeader.bind(this);
|
||||
|
|
@ -62,10 +65,7 @@ export class HeaderManager {
|
|||
cloneElement: !!cloneElement
|
||||
});
|
||||
|
||||
if (targetDate) {
|
||||
const calendarType = calendarConfig.getCalendarMode();
|
||||
const headerRenderer = CalendarTypeFactory.getHeaderRenderer(calendarType);
|
||||
}
|
||||
// Header renderer already injected - ready to use if needed
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -109,23 +109,31 @@ export class HeaderManager {
|
|||
* Update header content for navigation
|
||||
*/
|
||||
private updateHeader(currentDate: Date, resourceData: ResourceCalendarData | null = null): void {
|
||||
console.log('🎯 HeaderManager.updateHeader called', {
|
||||
currentDate,
|
||||
hasResourceData: !!resourceData,
|
||||
rendererType: this.headerRenderer.constructor.name
|
||||
});
|
||||
|
||||
const calendarHeader = this.getOrCreateCalendarHeader();
|
||||
if (!calendarHeader) return;
|
||||
if (!calendarHeader) {
|
||||
console.warn('❌ HeaderManager: No calendar header found!');
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear existing content
|
||||
calendarHeader.innerHTML = '';
|
||||
|
||||
// Render new header content
|
||||
const calendarType = calendarConfig.getCalendarMode();
|
||||
const headerRenderer = CalendarTypeFactory.getHeaderRenderer(calendarType);
|
||||
|
||||
// Render new header content using injected renderer
|
||||
const context: HeaderRenderContext = {
|
||||
currentWeek: currentDate,
|
||||
config: calendarConfig,
|
||||
resourceData: resourceData
|
||||
};
|
||||
|
||||
headerRenderer.render(calendarHeader, context);
|
||||
console.log('🎨 HeaderManager: Calling renderer.render()', context);
|
||||
this.headerRenderer.render(calendarHeader, context);
|
||||
console.log('✅ HeaderManager: Renderer completed');
|
||||
|
||||
// Setup event listeners on the new content
|
||||
this.setupHeaderDragListeners();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue