Refactor GridManager with new DateColumnDataSource
Introduces DateColumnDataSource to centralize date column generation logic Simplifies GridManager by delegating date calculations to dedicated data source Enhances flexibility for different calendar views and date rendering strategies Improves separation of concerns and makes calendar view management more modular
This commit is contained in:
parent
284c85b2f8
commit
75a2d4913e
6 changed files with 229 additions and 157 deletions
120
src/datasources/DateColumnDataSource.ts
Normal file
120
src/datasources/DateColumnDataSource.ts
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
import { IColumnDataSource } from '../types/ColumnDataSource';
|
||||
import { DateService } from '../utils/DateService';
|
||||
import { Configuration } from '../configurations/CalendarConfig';
|
||||
import { CalendarView } from '../types/CalendarTypes';
|
||||
|
||||
/**
|
||||
* DateColumnDataSource - Provides date-based columns
|
||||
*
|
||||
* Calculates which dates to display based on:
|
||||
* - Current date
|
||||
* - Current view (day/week/month)
|
||||
* - Workweek settings
|
||||
*/
|
||||
export class DateColumnDataSource implements IColumnDataSource {
|
||||
private dateService: DateService;
|
||||
private config: Configuration;
|
||||
private currentDate: Date;
|
||||
private currentView: CalendarView;
|
||||
|
||||
constructor(
|
||||
dateService: DateService,
|
||||
config: Configuration,
|
||||
currentDate: Date,
|
||||
currentView: CalendarView
|
||||
) {
|
||||
this.dateService = dateService;
|
||||
this.config = config;
|
||||
this.currentDate = currentDate;
|
||||
this.currentView = currentView;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get columns (dates) to display
|
||||
*/
|
||||
public getColumns(): Date[] {
|
||||
switch (this.currentView) {
|
||||
case 'week':
|
||||
return this.getWeekDates();
|
||||
case 'month':
|
||||
return this.getMonthDates();
|
||||
case 'day':
|
||||
return [this.currentDate];
|
||||
default:
|
||||
return this.getWeekDates();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get type of datasource
|
||||
*/
|
||||
public getType(): 'date' | 'resource' {
|
||||
return 'date';
|
||||
}
|
||||
|
||||
/**
|
||||
* Update current date
|
||||
*/
|
||||
public setCurrentDate(date: Date): void {
|
||||
this.currentDate = date;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update current view
|
||||
*/
|
||||
public setCurrentView(view: CalendarView): void {
|
||||
this.currentView = view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get dates for week view based on workweek settings
|
||||
*/
|
||||
private getWeekDates(): Date[] {
|
||||
const weekStart = this.getISOWeekStart(this.currentDate);
|
||||
const workWeekSettings = this.config.getWorkWeekSettings();
|
||||
return this.dateService.getWorkWeekDates(weekStart, workWeekSettings.workDays);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all dates in current month
|
||||
*/
|
||||
private getMonthDates(): Date[] {
|
||||
const dates: Date[] = [];
|
||||
const monthStart = this.getMonthStart(this.currentDate);
|
||||
const monthEnd = this.getMonthEnd(this.currentDate);
|
||||
|
||||
const totalDays = Math.ceil((monthEnd.getTime() - monthStart.getTime()) / (1000 * 60 * 60 * 24)) + 1;
|
||||
|
||||
for (let i = 0; i < totalDays; i++) {
|
||||
dates.push(this.dateService.addDays(monthStart, i));
|
||||
}
|
||||
|
||||
return dates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get ISO week start (Monday)
|
||||
*/
|
||||
private getISOWeekStart(date: Date): Date {
|
||||
const weekBounds = this.dateService.getWeekBounds(date);
|
||||
return this.dateService.startOfDay(weekBounds.start);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get month start
|
||||
*/
|
||||
private getMonthStart(date: Date): Date {
|
||||
const year = date.getFullYear();
|
||||
const month = date.getMonth();
|
||||
return this.dateService.startOfDay(new Date(year, month, 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get month end
|
||||
*/
|
||||
private getMonthEnd(date: Date): Date {
|
||||
const nextMonth = this.dateService.addMonths(date, 1);
|
||||
const firstOfNextMonth = this.getMonthStart(nextMonth);
|
||||
return this.dateService.endOfDay(this.dateService.addDays(firstOfNextMonth, -1));
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue