angular-comment-mentions/src/app/gantt/views/month.ts
2025-04-24 18:09:00 +02:00

75 lines
2.9 KiB
TypeScript

import { DateTime } from "luxon";
import { defaultAvailable, GanttViewType } from "./base";
import { CellDescriptor, DescriptorSet, IntervalDescriptor, TickDescriptor } from "./descriptors";
export class GanttViewMonth extends GanttViewType {
constructor(date: DateTime) {
super()
this.start = date.startOf('week').startOf('day');
this.viewDuration = this.start.plus({ days: 4 * 7 - 1 }).endOf('day').diff(this.start).as('seconds');
this.cellWidth = this.viewDuration / (4 * 7);
}
override setToday(): void {
this.start = DateTime.now().startOf('week').startOf('day');
}
override calculateIntervalShift(action: "next" | "back"): void {
if (action === 'next')
this.start = this.start.plus({ weeks: 2 });
else
this.start = this.start.minus({ weeks: 2 });
}
override createDescriptorSet(): DescriptorSet { return { interval: this.createIntervals(), cell: this.createCells(), tick: this.createTicks() } };
// get duration of a day in seconds
dayDuration(): number {
return 24 * 3600;
};
private createIntervals(): IntervalDescriptor[] {
return Array.from({ length: 4 }, (_, i) => {
return {
title: `KW ${this.start.plus({ weeks: i }).get('weekNumber')}`,
width: i === 3 ? '0px' : this.durationToWidth(this.start.endOf('week').diff(this.start).as('seconds'))
}
})
}
private createCells(): CellDescriptor[] {
return Array.from({ length: 4 * 7 }, (_, day) => {
let date = this.start.plus({ days: day });
const duration = this.dayDuration();
const sunOrHoliday = this.isDaySunOrHoliday(date);
const weekend = this.isDayOnWeekend(date);
return {
title: date.toFormat('dd.MM'),
subTitle: date.toFormat('EEE'),
width: this.durationToWidth(duration),
firstTickOffset: '0px',
sunOrHoliday,
weekend,
available: defaultAvailable.filter(item => ((!weekend && !sunOrHoliday) || (weekend && !sunOrHoliday) && item.onSaturday) || (sunOrHoliday && item.onSunOrHoliday)).map(item => {
return { offset: this.getOffset(date.startOf('day').plus({ seconds: item.start_day_sec })), duration: this.durationToWidth(item.duration_sec) }
})
}
});
}
private createTicks(): TickDescriptor[] {
// TODO make calculation more sane!!!
let test = Math.floor(24 / Math.ceil((1.2 * 0.8 * this.globalBaseFontSize) / (this.dayDuration() * this.pixelPerSecond / 24)));
return Array.from({ length: test }, (_, i) => i * 24 / test).map(item => {
return <TickDescriptor>{
title: item.toString(),
width: this.durationToWidth(24 / test * 3600)
}
});
}
}