2025-12-07 14:31:16 +01:00
|
|
|
import { CalendarOrchestrator } from '../core/CalendarOrchestrator';
|
|
|
|
|
import { TimeAxisRenderer } from '../features/timeaxis/TimeAxisRenderer';
|
|
|
|
|
import { NavigationAnimator } from '../core/NavigationAnimator';
|
|
|
|
|
import { DateService } from '../core/DateService';
|
2025-12-07 15:08:23 +01:00
|
|
|
import { ScrollManager } from '../core/ScrollManager';
|
2025-12-07 17:44:52 +01:00
|
|
|
import { HeaderDrawerManager } from '../core/HeaderDrawerManager';
|
2025-12-08 00:26:16 +01:00
|
|
|
import { IndexedDBContext } from '../storage/IndexedDBContext';
|
|
|
|
|
import { DataSeeder } from '../workers/DataSeeder';
|
2025-12-09 21:02:44 +01:00
|
|
|
import { ViewConfig } from '../core/ViewConfig';
|
2025-12-10 17:07:03 +01:00
|
|
|
import { DragDropManager } from '../managers/DragDropManager';
|
2025-12-10 19:12:38 +01:00
|
|
|
import { EdgeScrollManager } from '../managers/EdgeScrollManager';
|
2025-12-10 22:16:40 +01:00
|
|
|
import { ResizeManager } from '../managers/ResizeManager';
|
2025-12-11 18:11:11 +01:00
|
|
|
import { EventPersistenceManager } from '../managers/EventPersistenceManager';
|
2025-12-10 23:11:11 +01:00
|
|
|
import { HeaderDrawerRenderer } from '../features/headerdrawer/HeaderDrawerRenderer';
|
2025-12-11 18:11:11 +01:00
|
|
|
import { AuditService } from '../storage/audit/AuditService';
|
2025-12-07 14:31:16 +01:00
|
|
|
|
|
|
|
|
export class DemoApp {
|
|
|
|
|
private animator!: NavigationAnimator;
|
|
|
|
|
private container!: HTMLElement;
|
|
|
|
|
private weekOffset = 0;
|
2025-12-09 22:31:28 +01:00
|
|
|
private currentView: 'day' | 'simple' | 'resource' | 'team' = 'simple';
|
2025-12-07 14:31:16 +01:00
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
|
private orchestrator: CalendarOrchestrator,
|
|
|
|
|
private timeAxisRenderer: TimeAxisRenderer,
|
2025-12-07 15:08:23 +01:00
|
|
|
private dateService: DateService,
|
2025-12-07 17:44:52 +01:00
|
|
|
private scrollManager: ScrollManager,
|
2025-12-08 00:26:16 +01:00
|
|
|
private headerDrawerManager: HeaderDrawerManager,
|
|
|
|
|
private indexedDBContext: IndexedDBContext,
|
2025-12-10 17:07:03 +01:00
|
|
|
private dataSeeder: DataSeeder,
|
2025-12-10 19:12:38 +01:00
|
|
|
private dragDropManager: DragDropManager,
|
2025-12-10 22:16:40 +01:00
|
|
|
private edgeScrollManager: EdgeScrollManager,
|
2025-12-10 23:11:11 +01:00
|
|
|
private resizeManager: ResizeManager,
|
2025-12-11 18:11:11 +01:00
|
|
|
private headerDrawerRenderer: HeaderDrawerRenderer,
|
|
|
|
|
private eventPersistenceManager: EventPersistenceManager,
|
|
|
|
|
private auditService: AuditService
|
2025-12-07 14:31:16 +01:00
|
|
|
) {}
|
|
|
|
|
|
2025-12-08 00:26:16 +01:00
|
|
|
async init(): Promise<void> {
|
2025-12-15 00:33:27 +01:00
|
|
|
// Set base date to match mock data (8. december 2025 = mandag)
|
|
|
|
|
this.dateService.setBaseDate(new Date('2025-12-08'));
|
|
|
|
|
|
2025-12-08 00:26:16 +01:00
|
|
|
// Initialize IndexedDB
|
|
|
|
|
await this.indexedDBContext.initialize();
|
|
|
|
|
console.log('[DemoApp] IndexedDB initialized');
|
|
|
|
|
|
|
|
|
|
// Seed data if empty
|
|
|
|
|
await this.dataSeeder.seedIfEmpty();
|
|
|
|
|
console.log('[DemoApp] Data seeding complete');
|
|
|
|
|
|
2025-12-07 14:31:16 +01:00
|
|
|
this.container = document.querySelector('swp-calendar-container') as HTMLElement;
|
|
|
|
|
|
|
|
|
|
// NavigationAnimator har DOM-dependencies - tilladt med new
|
|
|
|
|
this.animator = new NavigationAnimator(
|
|
|
|
|
document.querySelector('swp-header-track') as HTMLElement,
|
|
|
|
|
document.querySelector('swp-content-track') as HTMLElement
|
|
|
|
|
);
|
|
|
|
|
|
2025-12-07 21:54:12 +01:00
|
|
|
// Render time axis (06:00 - 18:00)
|
|
|
|
|
this.timeAxisRenderer.render(document.getElementById('time-axis') as HTMLElement, 6, 18);
|
2025-12-07 14:31:16 +01:00
|
|
|
|
2025-12-07 15:08:23 +01:00
|
|
|
// Init scroll synkronisering
|
|
|
|
|
this.scrollManager.init(this.container);
|
|
|
|
|
|
2025-12-07 17:44:52 +01:00
|
|
|
// Init header drawer
|
|
|
|
|
this.headerDrawerManager.init(this.container);
|
|
|
|
|
|
2025-12-10 17:07:03 +01:00
|
|
|
// Init drag-drop
|
|
|
|
|
this.dragDropManager.init(this.container);
|
|
|
|
|
|
2025-12-10 19:12:38 +01:00
|
|
|
// Init edge scroll
|
|
|
|
|
const scrollableContent = this.container.querySelector('swp-scrollable-content') as HTMLElement;
|
|
|
|
|
this.edgeScrollManager.init(scrollableContent);
|
|
|
|
|
|
2025-12-10 22:16:40 +01:00
|
|
|
// Init resize
|
|
|
|
|
this.resizeManager.init(this.container);
|
|
|
|
|
|
2025-12-07 14:31:16 +01:00
|
|
|
// Setup event handlers
|
|
|
|
|
this.setupNavigation();
|
2025-12-07 17:44:52 +01:00
|
|
|
this.setupDrawerToggle();
|
2025-12-09 21:02:44 +01:00
|
|
|
this.setupViewSwitching();
|
2025-12-07 14:31:16 +01:00
|
|
|
|
|
|
|
|
// Initial render
|
2025-12-09 21:02:44 +01:00
|
|
|
this.render();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async render(): Promise<void> {
|
|
|
|
|
const viewConfig = this.buildViewConfig();
|
|
|
|
|
await this.orchestrator.render(viewConfig, this.container);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private buildViewConfig(): ViewConfig {
|
2025-12-09 21:24:17 +01:00
|
|
|
const dates = this.dateService.getWeekDates(this.weekOffset, 3);
|
2025-12-09 22:31:28 +01:00
|
|
|
const today = this.dateService.getWeekDates(this.weekOffset, 1);
|
2025-12-09 21:02:44 +01:00
|
|
|
|
|
|
|
|
switch (this.currentView) {
|
2025-12-09 22:31:28 +01:00
|
|
|
case 'day':
|
|
|
|
|
return {
|
|
|
|
|
templateId: 'day',
|
|
|
|
|
groupings: [
|
2025-12-15 00:33:27 +01:00
|
|
|
{ type: 'resource', values: ['EMP001', 'EMP002'], idProperty: 'resourceId' },
|
|
|
|
|
{ type: 'date', values: today, idProperty: 'date', derivedFrom: 'start' }
|
2025-12-09 22:31:28 +01:00
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
|
2025-12-09 21:02:44 +01:00
|
|
|
case 'simple':
|
|
|
|
|
return {
|
|
|
|
|
templateId: 'simple',
|
|
|
|
|
groupings: [
|
2025-12-15 00:33:27 +01:00
|
|
|
{ type: 'date', values: dates, idProperty: 'date', derivedFrom: 'start' }
|
2025-12-09 21:02:44 +01:00
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
case 'resource':
|
|
|
|
|
return {
|
|
|
|
|
templateId: 'resource',
|
|
|
|
|
groupings: [
|
2025-12-15 00:33:27 +01:00
|
|
|
{ type: 'resource', values: ['EMP001', 'EMP002'], idProperty: 'resourceId' },
|
|
|
|
|
{ type: 'date', values: dates, idProperty: 'date', derivedFrom: 'start' }
|
2025-12-09 21:02:44 +01:00
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
case 'team':
|
|
|
|
|
return {
|
|
|
|
|
templateId: 'team',
|
|
|
|
|
groupings: [
|
2025-12-15 00:33:27 +01:00
|
|
|
{ type: 'team', values: ['team1', 'team2'], idProperty: 'teamId' },
|
|
|
|
|
{ type: 'resource', values: ['res1', 'res2', 'res3'], idProperty: 'resourceId' },
|
|
|
|
|
{ type: 'date', values: dates, idProperty: 'date', derivedFrom: 'start' }
|
2025-12-09 21:02:44 +01:00
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
}
|
2025-12-07 14:31:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private setupNavigation(): void {
|
|
|
|
|
document.getElementById('btn-prev')!.onclick = () => {
|
|
|
|
|
this.weekOffset--;
|
2025-12-09 21:02:44 +01:00
|
|
|
this.animator.slide('right', () => this.render());
|
2025-12-07 14:31:16 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
document.getElementById('btn-next')!.onclick = () => {
|
|
|
|
|
this.weekOffset++;
|
2025-12-09 21:02:44 +01:00
|
|
|
this.animator.slide('left', () => this.render());
|
2025-12-07 14:31:16 +01:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-09 21:02:44 +01:00
|
|
|
private setupViewSwitching(): void {
|
2025-12-09 22:31:28 +01:00
|
|
|
document.getElementById('btn-day')?.addEventListener('click', () => {
|
|
|
|
|
this.currentView = 'day';
|
|
|
|
|
this.render();
|
|
|
|
|
});
|
|
|
|
|
|
2025-12-09 21:02:44 +01:00
|
|
|
document.getElementById('btn-simple')?.addEventListener('click', () => {
|
|
|
|
|
this.currentView = 'simple';
|
|
|
|
|
this.render();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
document.getElementById('btn-resource')?.addEventListener('click', () => {
|
|
|
|
|
this.currentView = 'resource';
|
|
|
|
|
this.render();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
document.getElementById('btn-team')?.addEventListener('click', () => {
|
|
|
|
|
this.currentView = 'team';
|
|
|
|
|
this.render();
|
|
|
|
|
});
|
2025-12-07 14:31:16 +01:00
|
|
|
}
|
2025-12-07 17:44:52 +01:00
|
|
|
|
|
|
|
|
private setupDrawerToggle(): void {
|
|
|
|
|
document.getElementById('btn-drawer')!.onclick = () => {
|
|
|
|
|
this.headerDrawerManager.toggle();
|
|
|
|
|
};
|
|
|
|
|
}
|
2025-12-07 14:31:16 +01:00
|
|
|
}
|