Some ignored filles was missing

This commit is contained in:
Janus C. H. Knudsen 2026-02-03 00:02:25 +01:00
parent 7db22245e2
commit fd5ab6bc0d
268 changed files with 31970 additions and 4 deletions

View file

@ -0,0 +1,25 @@
/**
* MonthViewStrategy - Strategy for month view rendering
* Completely different from week view - no time axis, cell-based events
*/
import { ViewStrategy, ViewContext, ViewLayoutConfig } from './ViewStrategy';
export declare class MonthViewStrategy implements ViewStrategy {
private dateCalculator;
constructor();
getLayoutConfig(): ViewLayoutConfig;
renderGrid(context: ViewContext): void;
private createMonthGrid;
private createDayHeaders;
private createDayCells;
private getMonthDates;
private renderMonthEvents;
getNextPeriod(currentDate: Date): Date;
getPreviousPeriod(currentDate: Date): Date;
getPeriodLabel(date: Date): string;
getDisplayDates(baseDate: Date): Date[];
getPeriodRange(baseDate: Date): {
startDate: Date;
endDate: Date;
};
destroy(): void;
}

View file

@ -0,0 +1,124 @@
/**
* MonthViewStrategy - Strategy for month view rendering
* Completely different from week view - no time axis, cell-based events
*/
import { DateCalculator } from '../utils/DateCalculator';
import { calendarConfig } from '../core/CalendarConfig';
export class MonthViewStrategy {
constructor() {
DateCalculator.initialize(calendarConfig);
this.dateCalculator = new DateCalculator();
}
getLayoutConfig() {
return {
needsTimeAxis: false, // No time axis in month view!
columnCount: 7, // Always 7 days (Mon-Sun)
scrollable: false, // Month fits in viewport
eventPositioning: 'cell-based' // Events go in day cells
};
}
renderGrid(context) {
// Clear existing content
context.container.innerHTML = '';
// Create month grid (completely different from week!)
this.createMonthGrid(context);
}
createMonthGrid(context) {
const monthGrid = document.createElement('div');
monthGrid.className = 'month-grid';
monthGrid.style.display = 'grid';
monthGrid.style.gridTemplateColumns = 'repeat(7, 1fr)';
monthGrid.style.gridTemplateRows = 'auto repeat(6, 1fr)';
monthGrid.style.height = '100%';
// Add day headers (Mon, Tue, Wed, etc.)
this.createDayHeaders(monthGrid);
// Add 6 weeks of day cells
this.createDayCells(monthGrid, context.currentDate);
// Render events in day cells (will be handled by EventRendererManager)
// this.renderMonthEvents(monthGrid, context.allDayEvents);
context.container.appendChild(monthGrid);
}
createDayHeaders(container) {
const dayNames = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
dayNames.forEach(dayName => {
const header = document.createElement('div');
header.className = 'month-day-header';
header.textContent = dayName;
header.style.padding = '8px';
header.style.fontWeight = 'bold';
header.style.textAlign = 'center';
header.style.borderBottom = '1px solid #e0e0e0';
container.appendChild(header);
});
}
createDayCells(container, monthDate) {
const dates = this.getMonthDates(monthDate);
dates.forEach(date => {
const cell = document.createElement('div');
cell.className = 'month-day-cell';
cell.dataset.date = DateCalculator.formatISODate(date);
cell.style.border = '1px solid #e0e0e0';
cell.style.minHeight = '100px';
cell.style.padding = '4px';
cell.style.position = 'relative';
// Day number
const dayNumber = document.createElement('div');
dayNumber.className = 'month-day-number';
dayNumber.textContent = date.getDate().toString();
dayNumber.style.fontWeight = 'bold';
dayNumber.style.marginBottom = '4px';
// Check if today
if (DateCalculator.isToday(date)) {
dayNumber.style.color = '#1976d2';
cell.style.backgroundColor = '#f5f5f5';
}
cell.appendChild(dayNumber);
container.appendChild(cell);
});
}
getMonthDates(monthDate) {
// Get first day of month
const firstOfMonth = new Date(monthDate.getFullYear(), monthDate.getMonth(), 1);
// Get Monday of the week containing first day
const startDate = DateCalculator.getISOWeekStart(firstOfMonth);
// Generate 42 days (6 weeks)
const dates = [];
for (let i = 0; i < 42; i++) {
dates.push(DateCalculator.addDays(startDate, i));
}
return dates;
}
renderMonthEvents(container, events) {
// TODO: Implement month event rendering
// Events will be small blocks in day cells
}
getNextPeriod(currentDate) {
return new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);
}
getPreviousPeriod(currentDate) {
return new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, 1);
}
getPeriodLabel(date) {
const monthNames = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'];
return `${monthNames[date.getMonth()]} ${date.getFullYear()}`;
}
getDisplayDates(baseDate) {
return this.getMonthDates(baseDate);
}
getPeriodRange(baseDate) {
// Month view shows events for the entire month grid (including partial weeks)
const firstOfMonth = new Date(baseDate.getFullYear(), baseDate.getMonth(), 1);
// Get Monday of the week containing first day
const startDate = DateCalculator.getISOWeekStart(firstOfMonth);
// End date is 41 days after start (42 total days)
const endDate = DateCalculator.addDays(startDate, 41);
return {
startDate,
endDate
};
}
destroy() {
}
}
//# sourceMappingURL=MonthViewStrategy.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"MonthViewStrategy.js","sourceRoot":"","sources":["../../../src/strategies/MonthViewStrategy.ts"],"names":[],"mappings":"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"}

58
wwwroot/js/strategies/ViewStrategy.d.ts vendored Normal file
View file

@ -0,0 +1,58 @@
/**
* ViewStrategy - Strategy pattern for different calendar view types
* Allows clean separation between week view, month view, day view etc.
*/
import { ResourceCalendarData } from '../types/CalendarTypes';
/**
* Context object passed to strategy methods
*/
export interface ViewContext {
currentDate: Date;
container: HTMLElement;
resourceData: ResourceCalendarData | null;
}
/**
* Layout configuration specific to each view type
*/
export interface ViewLayoutConfig {
needsTimeAxis: boolean;
columnCount: number;
scrollable: boolean;
eventPositioning: 'time-based' | 'cell-based';
}
/**
* Base strategy interface for all view types
*/
export interface ViewStrategy {
/**
* Get the layout configuration for this view
*/
getLayoutConfig(): ViewLayoutConfig;
/**
* Render the grid structure for this view
*/
renderGrid(context: ViewContext): void;
/**
* Calculate next period for navigation
*/
getNextPeriod(currentDate: Date): Date;
/**
* Calculate previous period for navigation
*/
getPreviousPeriod(currentDate: Date): Date;
/**
* Get display label for current period
*/
getPeriodLabel(date: Date): string;
/**
* Get the dates that should be displayed in this view
*/
getDisplayDates(baseDate: Date): Date[];
/**
* Get the period start and end dates for event filtering
*/
getPeriodRange(baseDate: Date): {
startDate: Date;
endDate: Date;
};
}

View file

@ -0,0 +1,6 @@
/**
* ViewStrategy - Strategy pattern for different calendar view types
* Allows clean separation between week view, month view, day view etc.
*/
export {};
//# sourceMappingURL=ViewStrategy.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"ViewStrategy.js","sourceRoot":"","sources":["../../../src/strategies/ViewStrategy.ts"],"names":[],"mappings":"AAAA;;;GAGG"}

View file

@ -0,0 +1,22 @@
/**
* WeekViewStrategy - Strategy for week/day view rendering
* Extracts the time-based grid logic from GridManager
*/
import { ViewStrategy, ViewContext, ViewLayoutConfig } from './ViewStrategy';
export declare class WeekViewStrategy implements ViewStrategy {
private dateCalculator;
private gridRenderer;
private styleManager;
constructor();
getLayoutConfig(): ViewLayoutConfig;
renderGrid(context: ViewContext): void;
getNextPeriod(currentDate: Date): Date;
getPreviousPeriod(currentDate: Date): Date;
getPeriodLabel(date: Date): string;
getDisplayDates(baseDate: Date): Date[];
getPeriodRange(baseDate: Date): {
startDate: Date;
endDate: Date;
};
destroy(): void;
}

View file

@ -0,0 +1,57 @@
/**
* WeekViewStrategy - Strategy for week/day view rendering
* Extracts the time-based grid logic from GridManager
*/
import { DateCalculator } from '../utils/DateCalculator';
import { calendarConfig } from '../core/CalendarConfig';
import { GridRenderer } from '../renderers/GridRenderer';
import { GridStyleManager } from '../renderers/GridStyleManager';
export class WeekViewStrategy {
constructor() {
DateCalculator.initialize(calendarConfig);
this.dateCalculator = new DateCalculator();
this.gridRenderer = new GridRenderer();
this.styleManager = new GridStyleManager();
}
getLayoutConfig() {
return {
needsTimeAxis: true,
columnCount: calendarConfig.getWorkWeekSettings().totalDays,
scrollable: true,
eventPositioning: 'time-based'
};
}
renderGrid(context) {
// Update grid styles
this.styleManager.updateGridStyles(context.resourceData);
// Render the grid structure (time axis + day columns)
this.gridRenderer.renderGrid(context.container, context.currentDate, context.resourceData);
}
getNextPeriod(currentDate) {
return DateCalculator.addWeeks(currentDate, 1);
}
getPreviousPeriod(currentDate) {
return DateCalculator.addWeeks(currentDate, -1);
}
getPeriodLabel(date) {
const weekStart = DateCalculator.getISOWeekStart(date);
const weekEnd = DateCalculator.addDays(weekStart, 6);
const weekNumber = DateCalculator.getWeekNumber(date);
return `Week ${weekNumber}: ${DateCalculator.formatDateRange(weekStart, weekEnd)}`;
}
getDisplayDates(baseDate) {
return DateCalculator.getWorkWeekDates(baseDate);
}
getPeriodRange(baseDate) {
const weekStart = DateCalculator.getISOWeekStart(baseDate);
const weekEnd = DateCalculator.addDays(weekStart, 6);
return {
startDate: weekStart,
endDate: weekEnd
};
}
destroy() {
// Clean up any week-specific resources
}
}
//# sourceMappingURL=WeekViewStrategy.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"WeekViewStrategy.js","sourceRoot":"","sources":["../../../src/strategies/WeekViewStrategy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,OAAO,gBAAgB;IAK3B;QACE,cAAc,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAC1C,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC7C,CAAC;IAED,eAAe;QACb,OAAO;YACL,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,cAAc,CAAC,mBAAmB,EAAE,CAAC,SAAS;YAC3D,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,YAAY;SAC/B,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,OAAoB;QAC7B,qBAAqB;QACrB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAEzD,sDAAsD;QACtD,IAAI,CAAC,YAAY,CAAC,UAAU,CAC1B,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,YAAY,CACrB,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,WAAiB;QAC7B,OAAO,cAAc,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,iBAAiB,CAAC,WAAiB;QACjC,OAAO,cAAc,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,cAAc,CAAC,IAAU;QACvB,MAAM,SAAS,GAAG,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAEtD,OAAO,QAAQ,UAAU,KAAK,cAAc,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;IACrF,CAAC;IAED,eAAe,CAAC,QAAc;QAC5B,OAAO,cAAc,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,cAAc,CAAC,QAAc;QAC3B,MAAM,SAAS,GAAG,cAAc,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAErD,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,OAAO;SACjB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,uCAAuC;IACzC,CAAC;CACF"}