Refactors DateCalculator to be a static class
This change refactors the DateCalculator class to be a static class. This removes the need to instantiate DateCalculator in multiple managers and renderers, simplifying dependency management and ensuring consistent date calculations across the application. The configuration is now initialized once at the application start.
This commit is contained in:
parent
0da875a224
commit
b8b44ddae8
11 changed files with 107 additions and 83 deletions
|
|
@ -32,17 +32,18 @@ export class DateColumnRenderer implements ColumnRenderer {
|
|||
const { currentWeek, config } = context;
|
||||
|
||||
// Initialize date calculator and work hours manager
|
||||
this.dateCalculator = new DateCalculator(config);
|
||||
DateCalculator.initialize(config);
|
||||
this.dateCalculator = new DateCalculator();
|
||||
this.workHoursManager = new WorkHoursManager(config);
|
||||
|
||||
const dates = this.dateCalculator.getWorkWeekDates(currentWeek);
|
||||
const dates = DateCalculator.getWorkWeekDates(currentWeek);
|
||||
const dateSettings = config.getDateViewSettings();
|
||||
const daysToShow = dates.slice(0, dateSettings.weekDays);
|
||||
|
||||
|
||||
daysToShow.forEach((date) => {
|
||||
const column = document.createElement('swp-day-column');
|
||||
(column as any).dataset.date = this.dateCalculator.formatISODate(date);
|
||||
(column as any).dataset.date = DateCalculator.formatISODate(date);
|
||||
|
||||
// Apply work hours styling
|
||||
this.applyWorkHoursToColumn(column, date);
|
||||
|
|
|
|||
|
|
@ -28,7 +28,10 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
|
||||
constructor(config: CalendarConfig, dateCalculator?: DateCalculator) {
|
||||
this.config = config;
|
||||
this.dateCalculator = dateCalculator || new DateCalculator(config);
|
||||
if (!dateCalculator) {
|
||||
DateCalculator.initialize(config);
|
||||
}
|
||||
this.dateCalculator = dateCalculator || new DateCalculator();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -628,7 +631,7 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
private calculateEventGridSpan(event: CalendarEvent, dateToColumnMap: Map<string, number>): { startColumn: number, columnSpan: number } {
|
||||
const startDate = new Date(event.start);
|
||||
const endDate = new Date(event.end);
|
||||
const startDateKey = this.dateCalculator.formatISODate(startDate);
|
||||
const startDateKey = DateCalculator.formatISODate(startDate);
|
||||
const startColumn = dateToColumnMap.get(startDateKey);
|
||||
|
||||
if (!startColumn) {
|
||||
|
|
@ -641,7 +644,7 @@ export abstract class BaseEventRenderer implements EventRendererStrategy {
|
|||
|
||||
while (currentDate <= endDate) {
|
||||
currentDate.setDate(currentDate.getDate() + 1);
|
||||
const dateKey = this.dateCalculator.formatISODate(currentDate);
|
||||
const dateKey = DateCalculator.formatISODate(currentDate);
|
||||
const col = dateToColumnMap.get(dateKey);
|
||||
if (col) {
|
||||
endColumn = col;
|
||||
|
|
@ -696,7 +699,7 @@ export class DateEventRenderer extends BaseEventRenderer {
|
|||
|
||||
const columnEvents = events.filter(event => {
|
||||
const eventDate = new Date(event.start);
|
||||
const eventDateStr = this.dateCalculator.formatISODate(eventDate);
|
||||
const eventDateStr = DateCalculator.formatISODate(eventDate);
|
||||
const matches = eventDateStr === columnDate;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -256,25 +256,26 @@ export class DateHeaderRenderer extends BaseHeaderRenderer {
|
|||
const { currentWeek, config } = context;
|
||||
|
||||
// Initialize date calculator with config
|
||||
this.dateCalculator = new DateCalculator(config);
|
||||
DateCalculator.initialize(config);
|
||||
this.dateCalculator = new DateCalculator();
|
||||
|
||||
const dates = this.dateCalculator.getWorkWeekDates(currentWeek);
|
||||
const dates = DateCalculator.getWorkWeekDates(currentWeek);
|
||||
const weekDays = config.getDateViewSettings().weekDays;
|
||||
const daysToShow = dates.slice(0, weekDays);
|
||||
|
||||
daysToShow.forEach((date, index) => {
|
||||
const header = document.createElement('swp-day-header');
|
||||
if (this.dateCalculator.isToday(date)) {
|
||||
if (DateCalculator.isToday(date)) {
|
||||
(header as any).dataset.today = 'true';
|
||||
}
|
||||
|
||||
const dayName = this.dateCalculator.getDayName(date, 'short');
|
||||
const dayName = DateCalculator.getDayName(date, 'short');
|
||||
|
||||
header.innerHTML = `
|
||||
<swp-day-name>${dayName}</swp-day-name>
|
||||
<swp-day-date>${date.getDate()}</swp-day-date>
|
||||
`;
|
||||
(header as any).dataset.date = this.dateCalculator.formatISODate(date);
|
||||
(header as any).dataset.date = DateCalculator.formatISODate(date);
|
||||
|
||||
calendarHeader.appendChild(header);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ export class NavigationRenderer {
|
|||
this.eventBus = eventBus;
|
||||
this.config = config;
|
||||
this.eventRenderer = eventRenderer;
|
||||
this.dateCalculator = new DateCalculator(config);
|
||||
DateCalculator.initialize(config);
|
||||
this.dateCalculator = new DateCalculator();
|
||||
this.setupEventListeners();
|
||||
}
|
||||
|
||||
|
|
@ -127,7 +128,7 @@ export class NavigationRenderer {
|
|||
* Render a complete container with content and events
|
||||
*/
|
||||
public renderContainer(parentContainer: HTMLElement, weekStart: Date): HTMLElement {
|
||||
const weekEnd = this.dateCalculator.addDays(weekStart, 6);
|
||||
const weekEnd = DateCalculator.addDays(weekStart, 6);
|
||||
|
||||
|
||||
// Create new grid container
|
||||
|
|
@ -179,22 +180,22 @@ export class NavigationRenderer {
|
|||
dayColumns.innerHTML = '';
|
||||
|
||||
// Get dates using DateCalculator
|
||||
const dates = this.dateCalculator.getWorkWeekDates(weekStart);
|
||||
const dates = DateCalculator.getWorkWeekDates(weekStart);
|
||||
|
||||
// Render headers for target week
|
||||
dates.forEach((date, i) => {
|
||||
const headerElement = document.createElement('swp-day-header');
|
||||
if (this.dateCalculator.isToday(date)) {
|
||||
if (DateCalculator.isToday(date)) {
|
||||
headerElement.dataset.today = 'true';
|
||||
}
|
||||
|
||||
const dayName = this.dateCalculator.getDayName(date, 'short');
|
||||
const dayName = DateCalculator.getDayName(date, 'short');
|
||||
|
||||
headerElement.innerHTML = `
|
||||
<swp-day-name>${dayName}</swp-day-name>
|
||||
<swp-day-date>${date.getDate()}</swp-day-date>
|
||||
`;
|
||||
headerElement.dataset.date = this.dateCalculator.formatISODate(date);
|
||||
headerElement.dataset.date = DateCalculator.formatISODate(date);
|
||||
|
||||
header.appendChild(headerElement);
|
||||
});
|
||||
|
|
@ -209,7 +210,7 @@ export class NavigationRenderer {
|
|||
// Render day columns for target week
|
||||
dates.forEach(date => {
|
||||
const column = document.createElement('swp-day-column');
|
||||
column.dataset.date = this.dateCalculator.formatISODate(date);
|
||||
column.dataset.date = DateCalculator.formatISODate(date);
|
||||
|
||||
const eventsLayer = document.createElement('swp-events-layer');
|
||||
column.appendChild(eventsLayer);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue