sn-calendar-view 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1498,6 +1498,8 @@ class SnCalendarView {
1498
1498
  <h2 class="text-2xl font-semibold text-slate-800">Edit</h2>
1499
1499
  <button (click)="closeEditPopup()" class="p-2 hover:bg-slate-100 rounded-full transition-colors">
1500
1500
  <!-- <i-lucide [img]="closeIcon" class="w-6 h-6 text-slate-400"></i-lucide> -->
1501
+ <img src="assets/X.svg" alt="Close" class="w-6 h-6 text-slate-400">
1502
+ <img src="sn-calendar-view/assets/X.svg" alt="Close" class="w-6 h-6 text-slate-400">
1501
1503
  </button>
1502
1504
  </div>
1503
1505
 
@@ -1576,7 +1578,7 @@ class SnCalendarView {
1576
1578
  }}</span>
1577
1579
  </div>
1578
1580
  <div class="flex items-center gap-1">
1579
- <img src="assets/Clock.svg" alt="Clock" class="w-4 h-4 text-slate-500">
1581
+ <img src="sn-calendar-view/assets/Clock.svg" alt="Clock" class="w-4 h-4 text-slate-500">
1580
1582
  <button (click)="adjustTime('startTime', 15)"
1581
1583
  class="p-1 hover:bg-slate-100 rounded transition-colors group">
1582
1584
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right-icon lucide-chevron-right text-slate-400 group-hover:text-blue-500"><path d="m9 18 6-6-6-6"/></svg>
@@ -1783,6 +1785,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1783
1785
  <h2 class="text-2xl font-semibold text-slate-800">Edit</h2>
1784
1786
  <button (click)="closeEditPopup()" class="p-2 hover:bg-slate-100 rounded-full transition-colors">
1785
1787
  <!-- <i-lucide [img]="closeIcon" class="w-6 h-6 text-slate-400"></i-lucide> -->
1788
+ <img src="assets/X.svg" alt="Close" class="w-6 h-6 text-slate-400">
1789
+ <img src="sn-calendar-view/assets/X.svg" alt="Close" class="w-6 h-6 text-slate-400">
1786
1790
  </button>
1787
1791
  </div>
1788
1792
 
@@ -1861,7 +1865,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1861
1865
  }}</span>
1862
1866
  </div>
1863
1867
  <div class="flex items-center gap-1">
1864
- <img src="assets/Clock.svg" alt="Clock" class="w-4 h-4 text-slate-500">
1868
+ <img src="sn-calendar-view/assets/Clock.svg" alt="Clock" class="w-4 h-4 text-slate-500">
1865
1869
  <button (click)="adjustTime('startTime', 15)"
1866
1870
  class="p-1 hover:bg-slate-100 rounded transition-colors group">
1867
1871
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right-icon lucide-chevron-right text-slate-400 group-hover:text-blue-500"><path d="m9 18 6-6-6-6"/></svg>
@@ -1 +1 @@
1
- {"version":3,"file":"sn-calendar-view.mjs","sources":["../../../projects/sn-calendar-view/src/lib/components/agenda-view.component.ts","../../../projects/sn-calendar-view/src/lib/components/day-view.component.ts","../../../projects/sn-calendar-view/src/lib/components/header.component.ts","../../../projects/sn-calendar-view/src/lib/components/month-view.component.ts","../../../projects/sn-calendar-view/src/lib/components/sidebar.component.ts","../../../projects/sn-calendar-view/src/lib/components/week-view.component.ts","../../../projects/sn-calendar-view/src/lib/sn-calendar-view.ts","../../../projects/sn-calendar-view/src/public-api.ts","../../../projects/sn-calendar-view/src/sn-calendar-view.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// import { LucideAngularModule, Repeat, Filter } from 'lucide-angular';\r\n\r\n@Component({\r\n selector: 'app-agenda-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 overflow-y-auto bg-white py-4 px-20\">\r\n @for (item of agendaDays; track item.date.getTime()) {\r\n <div\r\n class=\"flex py-10 border-b border-slate-100 last:border-0 hover:bg-slate-50/30 transition-colors group px-6 rounded-2xl\">\r\n <!-- Left: Day Number Circle -->\r\n <div class=\"w-48 shrink-0 flex items-start gap-6\">\r\n <div\r\n class=\"w-20 h-20 rounded-full bg-slate-50 flex items-center justify-center text-4xl font-light text-slate-700 group-hover:bg-blue-50 group-hover:text-blue-600 transition-colors shadow-sm\">\r\n {{ item.dayNum }}\r\n </div>\r\n <div class=\"flex flex-col pt-2\">\r\n <span class=\"text-lg font-semibold text-slate-800\">{{ item.weekday }}</span>\r\n <span class=\"text-sm text-slate-400 font-medium\">{{ item.monthYear }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Middle: Time Information -->\r\n <div class=\"w-64 shrink-0 flex flex-col pt-3 gap-1\">\r\n <span class=\"text-sm font-bold text-slate-400 uppercase tracking-widest\">Global Schedule</span>\r\n @for (e of item.events; track e.id) {\r\n <div class=\"flex flex-col mb-4 last:mb-0\">\r\n @if (e.type === 'bar') {\r\n <span class=\"text-sm font-medium text-slate-600\">All day</span>\r\n } @else {\r\n <span class=\"text-sm font-bold text-slate-700 tracking-tight\">{{ e.startTime }} - {{\r\n e.endTime }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Right: Event List with Tag -->\r\n <div class=\"flex-1 pt-2\">\r\n <div class=\"flex flex-col gap-8\">\r\n <!-- Category Tag -->\r\n <div class=\"flex items-center gap-3\">\r\n <span\r\n class=\"px-4 py-1.5 bg-green-50 text-green-700 rounded-full text-[11px] font-bold uppercase tracking-wider border border-green-100\">\r\n {{ item.events[0].category }} Schedule\r\n </span>\r\n </div>\r\n\r\n <!-- Events List -->\r\n <div class=\"space-y-6\">\r\n @for (e of item.events; track e.id) {\r\n <div class=\"flex items-center gap-4 group/item\">\r\n <div class=\"w-2.5 h-2.5 rounded-full\"\r\n [class.bg-blue-500]=\"e.category === 'Bryntum team' || e.category === 'Hospital'\"\r\n [class.bg-green-500]=\"e.category === 'Clinic'\"\r\n [class.bg-orange-500]=\"e.category === 'Admin'\"\r\n [class.bg-red-500]=\"e.category === 'Surgery'\"\r\n [class.bg-purple-500]=\"e.category === 'Event'\"></div>\r\n <span\r\n class=\"text-[17px] font-medium text-slate-700 group-hover/item:text-blue-600 transition-colors flex items-center gap-2\">\r\n {{ e.title }}\r\n @if (e.repeat && e.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-3.5 h-3.5 text-slate-400\"></i-lucide> -->\r\n }\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-10 shrink-0 flex justify-end items-start pt-2\">\r\n <!-- <i-lucide [img]=\"filterIcon\"\r\n class=\"w-5 h-5 text-slate-200 group-hover:text-slate-400 transition-colors cursor-pointer\"></i-lucide> -->\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: flex;\r\n flex: 1;\r\n min-height: 0;\r\n flex-direction: column;\r\n }\r\n `]\r\n})\r\nexport class AgendaViewComponent {\r\n @Input() agendaDays: any[] = [];\r\n\r\n // repeatIcon = Repeat;\r\n // filterIcon = Filter;\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// import { LucideAngularModule, Clock, Repeat } from 'lucide-angular';\r\n\r\n@Component({\r\n selector: 'app-day-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 flex flex-col overflow-hidden\">\r\n <!-- DAY VIEW HEADER -->\r\n <div class=\"grid grid-cols-[80px_1fr] border-b border-slate-200 shrink-0\">\r\n <div class=\"border-r border-slate-200\"></div>\r\n <div class=\"p-4 bg-white\">\r\n <div class=\"text-[11px] font-bold uppercase tracking-wider text-blue-600 mb-1\">\r\n {{ viewDate | date:'EEEE' }}\r\n </div>\r\n <div class=\"text-3xl font-light text-slate-700\">\r\n {{ viewDate | date:'MMMM d, y' }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- SCROLLABLE GRID BODY -->\r\n <div class=\"flex-1 overflow-y-auto relative scroll-smooth bg-slate-50 pt-6\">\r\n <div class=\"grid grid-cols-[80px_1fr] min-h-full\">\r\n <div class=\"bg-white\">\r\n @for (time of times; track time) {\r\n <div class=\"h-20 border-b border-slate-100 relative\">\r\n <span\r\n class=\"absolute top-0 -translate-y-1/2 right-3 text-[11px] font-bold text-slate-400 bg-white px-1 z-10\">{{time}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grid relative bg-white grid-cols-1\">\r\n <div class=\"absolute left-0 right-0 z-20 pointer-events-none\" [style.top.px]=\"getNowPosition()\">\r\n <div class=\"border-t-2 border-red-500 w-full relative\">\r\n <div class=\"absolute -left-1.5 -top-1.5 w-3 h-3 bg-red-500 rounded-full shadow-sm\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-r border-slate-100 relative group\"\r\n [class.bg-slate-50/30]=\"formatDate(viewDate) < todayStr\"\r\n [class.cursor-not-allowed]=\"formatDate(viewDate) < todayStr\"\r\n [class.opacity-70]=\"formatDate(viewDate) < todayStr\">\r\n @for (time of times; track time) {\r\n <div (contextmenu)=\"handleRightClick($event, formatDate(viewDate), time.split(' ')[0] + ':00')\"\r\n class=\"h-20 border-b border-slate-100 transition-colors\"\r\n [class.hover:bg-slate-50/50]=\"formatDate(viewDate) >= todayStr\"></div>\r\n }\r\n @for (appt of getFilteredAppointments(); track appt.id) {\r\n <div class=\"absolute left-4 right-4 rounded-xl border-l-8 shadow-md transition-all hover:z-10 hover:shadow-xl cursor-pointer overflow-hidden\"\r\n [class.p-6]=\"appt.duration > 0.25\" [class.p-2]=\"appt.duration <= 0.25\"\r\n [ngClass]=\"[appt.color, appt.borderColor, appt.textColor]\"\r\n [style.top.px]=\"getAppTop(appt.startTime)\"\r\n [style.height.px]=\"getAppHeight(appt.duration)\">\r\n <div class=\"flex flex-col\" [class.gap-2]=\"appt.duration > 0.25\"\r\n [class.justify-center]=\"appt.duration <= 0.25\" [style.height.%]=\"100\">\r\n @if(appt.duration > 0.25) {\r\n <span\r\n class=\"text-xs font-bold opacity-70 uppercase tracking-widest\">{{appt.startTime}}</span>\r\n }\r\n <div class=\"flex items-center justify-between\">\r\n <p class=\"font-bold leading-tight\" [class.text-lg]=\"appt.duration > 0.25\"\r\n [class.text-sm]=\"appt.duration <= 0.25\">{{appt.title}}</p>\r\n @if (appt.repeat && appt.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" [class.w-5]=\"appt.duration > 0.25\"\r\n [class.h-5]=\"appt.duration > 0.25\" [class.w-3]=\"appt.duration <= 0.25\"\r\n [class.h-3]=\"appt.duration <= 0.25\" class=\"opacity-40\"></i-lucide> -->\r\n }\r\n </div>\r\n @if(appt.duration > 0.5) {\r\n <div class=\"flex items-center gap-2\">\r\n <!-- <i-lucide [img]=\"clockIcon\" class=\"w-4 h-4 opacity-40\"></i-lucide> -->\r\n <span class=\"text-sm opacity-60 font-medium\">{{appt.duration}} hours</span>\r\n </div>\r\n <p class=\"text-sm opacity-60 font-medium truncate\">{{appt.category}}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: flex;\r\n flex: 1;\r\n min-height: 0;\r\n flex-direction: column;\r\n }\r\n `]\r\n})\r\nexport class DayViewComponent {\r\n @Input() viewDate: Date = new Date();\r\n @Input() currentTime: Date = new Date();\r\n @Input() appointments: any[] = [];\r\n @Input() todayStr: string = '';\r\n @Input() times: string[] = [];\r\n\r\n @Output() onRightClick = new EventEmitter<any>();\r\n\r\n // clockIcon = Clock;\r\n // repeatIcon = Repeat;\r\n\r\n getFilteredAppointments() {\r\n const dStr = this.formatDate(this.viewDate);\r\n return this.appointments.filter(a => a.date === dStr);\r\n }\r\n\r\n formatDate(d: Date) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getAppTop(startTime: string) {\r\n const [hours, minutes] = startTime.split(':').map(Number);\r\n return (hours * 80) + (minutes / 60 * 80);\r\n }\r\n\r\n getAppHeight(duration: number) {\r\n return Math.max(duration * 80, 24);\r\n }\r\n\r\n getNowPosition() {\r\n return (this.currentTime.getHours() * 80) + (this.currentTime.getMinutes() / 60 * 80);\r\n }\r\n\r\n handleRightClick(event: MouseEvent, dateStr: string, timeSlot: string) {\r\n this.onRightClick.emit({ event, dateStr, timeSlot });\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-header',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <header class=\"h-16 border-b border-slate-200 flex items-center justify-between px-6 shrink-0\">\r\n <div class=\"flex items-center gap-6\">\r\n <button (click)=\"onGoToToday.emit()\"\r\n class=\"flex items-center gap-2 bg-blue-50 text-blue-600 px-4 py-2 rounded-lg font-medium hover:bg-blue-100 transition-colors\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-calendar-icon lucide-calendar\"><path d=\"M8 2v4\"/><path d=\"M16 2v4\"/><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"/><path d=\"M3 10h18\"/></svg>\r\n Today\r\n </button>\r\n <button (click)=\"onCreateEvent.emit($event)\"\r\n class=\"flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg font-medium hover:bg-blue-700 transition-shadow shadow-md\">\r\n <span class=\"text-xl leading-none\">+</span>\r\n Create\r\n </button>\r\n <div class=\"flex items-center gap-2\">\r\n <button (click)=\"onPrev.emit()\" class=\"p-2 hover:bg-slate-50 rounded-full text-slate-400\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <button (click)=\"onNext.emit()\" class=\"p-2 hover:bg-slate-50 rounded-full text-slate-400\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n <h1 class=\"text-xl font-semibold text-slate-800 tracking-tight\">\r\n {{ view === 'week' ? 'Week ' + weekNumber + ', ' : '' }}{{ displayMonth }}\r\n </h1>\r\n </div>\r\n\r\n <div class=\"flex bg-slate-100 p-1 rounded-xl\">\r\n <button (click)=\"onSetView.emit('day')\" [class.bg-white]=\"view==='day'\" [class.shadow-sm]=\"view==='day'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Day</button>\r\n <button (click)=\"onSetView.emit('week')\" [class.bg-white]=\"view==='week'\" [class.shadow-sm]=\"view==='week'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Week</button>\r\n <button (click)=\"onSetView.emit('month')\" [class.bg-white]=\"view==='month'\"\r\n [class.shadow-sm]=\"view==='month'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Month</button>\r\n <button (click)=\"onSetView.emit('agenda')\" [class.bg-white]=\"view==='agenda'\"\r\n [class.shadow-sm]=\"view==='agenda'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Agenda</button>\r\n </div>\r\n </header>\r\n `\r\n})\r\nexport class HeaderComponent {\r\n @Input() view: string = 'week';\r\n @Input() weekNumber: number = 0;\r\n @Input() displayMonth: string = '';\r\n\r\n @Output() onGoToToday = new EventEmitter<void>();\r\n @Output() onCreateEvent = new EventEmitter<MouseEvent>();\r\n @Output() onPrev = new EventEmitter<void>();\r\n @Output() onNext = new EventEmitter<void>();\r\n @Output() onSetView = new EventEmitter<'day' | 'week' | 'month' | 'agenda'>();\r\n\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// import { LucideAngularModule, Repeat } from 'lucide-angular';\r\n\r\n@Component({\r\n selector: 'app-month-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 flex flex-col min-h-0 bg-white overflow-hidden\">\r\n <div class=\"grid border-b border-slate-200 shrink-0\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (d of mainCalendarHeaders; track $index) {\r\n <div class=\"py-3 text-[11px] font-bold uppercase tracking-wider text-center\"\r\n [class.text-red-500]=\"(d === 'Sun' || d === 'Sat') && showWeekends\"\r\n [class.text-slate-400]=\"d !== 'Sun' && d !== 'Sat'\">\r\n {{d}}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"flex-1 grid min-h-0 overflow-hidden border-b border-slate-100\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\"\r\n [class.grid-rows-6]=\"showWeekends\" [style.grid-template-rows]=\"!showWeekends ? 'repeat(auto-fill, minmax(0, 1fr))' : ''\">\r\n @for (d of monthDays; track d.date.getTime(); let i = $index) {\r\n <div (contextmenu)=\"handleRightClick($event, d.dateStr)\"\r\n class=\"border-r border-b border-slate-100 relative group p-1 min-h-[100px] transition-colors\"\r\n [class.hover:bg-slate-50/50]=\"d.dateStr >= todayStr\"\r\n [class.bg-slate-50/30]=\"d.dateStr < todayStr\" [class.cursor-not-allowed]=\"d.dateStr < todayStr\"\r\n [class.opacity-50]=\"d.dateStr < todayStr\">\r\n @if (d.weekNum) {\r\n <div class=\"absolute left-1 top-2 text-[10px] font-bold text-slate-300\">\r\n {{d.weekNum}}\r\n </div>\r\n }\r\n <div class=\"text-right p-1\">\r\n <span class=\"text-[12px] font-medium\" [class.text-slate-300]=\"!d.current\"\r\n [class.text-slate-800]=\"d.current && !d.isFirstOfMonth\"\r\n [class.font-bold]=\"d.isFirstOfMonth\">\r\n {{d.label}}\r\n </span>\r\n </div>\r\n @for (appt of getFilteredAppointments(d.date); track appt.id) {\r\n @if (appt.type === 'bar') {\r\n <div class=\"absolute left-0 right-0 z-10 transition-all\" [style.top.px]=\"34\">\r\n <div class=\"border-l-4 text-[11px] font-medium px-2 py-1 mx-1 rounded shadow-sm opacity-90 hover:opacity-100 cursor-pointer flex items-center justify-between\"\r\n [ngClass]=\"[appt.color, appt.borderColor, appt.textColor]\">\r\n <span class=\"truncate\">{{ appt.title }}</span>\r\n @if (appt.repeat && appt.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-2.5 h-2.5 opacity-60 shrink-0 ml-1\"></i-lucide> -->\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if (getFilteredAppointments(d.date).length > 0) {\r\n <div class=\"mt-10 text-center\">\r\n <span (click)=\"onMoreClick.emit(d)\"\r\n class=\"text-[10px] text-slate-400 font-bold cursor-pointer hover:text-blue-500 hover:bg-slate-50 px-2 py-0.5 rounded transition-colors\">\r\n +{{ getFilteredAppointments(d.date).length }} more\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `\r\n})\r\nexport class MonthViewComponent {\r\n @Input() viewDate: Date = new Date();\r\n @Input() appointments: any[] = [];\r\n @Input() todayStr: string = '';\r\n @Input() showWeekends: boolean = true;\r\n @Input() monthDays: any[] = [];\r\n @Input() mainCalendarHeaders: string[] = [];\r\n\r\n @Output() onRightClick = new EventEmitter<any>();\r\n @Output() onMoreClick = new EventEmitter<any>();\r\n\r\n // repeatIcon = Repeat;\r\n\r\n formatDate(d: Date) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getFilteredAppointments(date: Date) {\r\n const dStr = this.formatDate(date);\r\n return this.appointments.filter(a => a.date === dStr);\r\n }\r\n\r\n handleRightClick(event: MouseEvent, dateStr: string) {\r\n this.onRightClick.emit({ event, dateStr });\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-sidebar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <aside class=\"w-72 bg-white flex flex-col border-r border-slate-200\">\r\n <div class=\"p-6\">\r\n <div class=\"flex items-center justify-between mb-6\">\r\n <div class=\"flex items-center gap-2 font-semibold text-slate-800\">\r\n <button (click)=\"onPrevMonth.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Previous Month\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <span>{{ displayMonth }}</span>\r\n <button (click)=\"onNextMonth.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Next Month\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n <div class=\"flex gap-1\">\r\n <button (click)=\"onPrevYear.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Previous Year\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <button (click)=\"onNextYear.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Next Year\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- MINI CALENDAR -->\r\n <div class=\"grid text-center text-[11px] mb-2 font-medium text-slate-400\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (d of miniCalendarHeaders; track $index) {\r\n <div>{{d}}</div>\r\n }\r\n </div>\r\n <div class=\"grid text-center text-xs gap-y-1\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (d of monthDays; track d.date.getTime()) {\r\n <div (click)=\"onSelectDate.emit(d.date)\"\r\n class=\"p-1.5 flex items-center justify-center cursor-pointer hover:bg-slate-100 rounded-full transition-colors\"\r\n [class.text-slate-300]=\"!d.current\" [class.bg-blue-600]=\"d.active\" [class.text-white]=\"d.active\">\r\n {{d.day}}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- FILTER -->\r\n <div class=\"mt-8\">\r\n <div class=\"relative mb-6\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-search-icon lucide-search absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"><path d=\"m21 21-4.34-4.34\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/></svg>\r\n <!-- <i-lucide [img]=\"searchIcon\"\r\n class=\"w-4 h-4 absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"></i-lucide> -->\r\n <input placeholder=\"Filter events\"\r\n class=\"w-full bg-slate-50 border border-slate-200 rounded-lg pl-10 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\" />\r\n </div>\r\n\r\n <div class=\"space-y-4\">\r\n <label class=\"flex items-center gap-3 cursor-pointer group\">\r\n <div\r\n class=\"w-5 h-5 border-2 border-blue-500 rounded bg-blue-500 flex items-center justify-center\">\r\n <div class=\"w-2.5 h-2.5 bg-white rounded-sm\"></div>\r\n </div>\r\n <span class=\"text-sm font-medium group-hover:text-blue-600 transition-colors\">Bryntum\r\n team</span>\r\n </label>\r\n <label class=\"flex items-center gap-3 cursor-pointer group\">\r\n <div\r\n class=\"w-5 h-5 border-2 border-orange-500 rounded bg-orange-500 flex items-center justify-center\">\r\n <div class=\"w-2.5 h-2.5 bg-white rounded-sm\"></div>\r\n </div>\r\n <span class=\"text-sm font-medium group-hover:text-orange-600 transition-colors\">Hospital</span>\r\n </label>\r\n <label class=\"flex items-center gap-3 cursor-pointer group\">\r\n <div\r\n class=\"w-5 h-5 border-2 border-red-500 rounded bg-red-500 flex items-center justify-center\">\r\n <div class=\"w-2.5 h-2.5 bg-white rounded-sm\"></div>\r\n </div>\r\n <span class=\"text-sm font-medium group-hover:text-red-600 transition-colors\">Surgery</span>\r\n </label>\r\n </div>\r\n\r\n <!-- WEEKEND TOGGLE -->\r\n <div class=\"mt-10 pt-6 border-t border-slate-100\">\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-sm font-semibold text-slate-700\">Show Weekends</span>\r\n <button (click)=\"onToggleWeekends.emit()\"\r\n class=\"w-10 h-5 rounded-full relative transition-colors duration-200\"\r\n [class.bg-slate-200]=\"!showWeekends\" [class.bg-blue-500]=\"showWeekends\">\r\n <div class=\"absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full transition-transform duration-200 shadow-sm\"\r\n [class.translate-x-5]=\"showWeekends\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </aside>\r\n `\r\n})\r\nexport class SidebarComponent {\r\n @Input() displayMonth: string = '';\r\n @Input() monthDays: any[] = [];\r\n @Input() miniCalendarHeaders: string[] = [];\r\n @Input() showWeekends: boolean = true;\r\n\r\n @Output() onPrevMonth = new EventEmitter<void>();\r\n @Output() onNextMonth = new EventEmitter<void>();\r\n @Output() onPrevYear = new EventEmitter<void>();\r\n @Output() onNextYear = new EventEmitter<void>();\r\n @Output() onSelectDate = new EventEmitter<Date>();\r\n @Output() onToggleWeekends = new EventEmitter<void>();\r\n\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-week-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 flex flex-col overflow-hidden\">\r\n <!-- Week View Header -->\r\n <div class=\"grid grid-cols-[80px_1fr] border-b border-slate-200 shrink-0\">\r\n <div class=\"border-r border-slate-200\"></div>\r\n <div class=\"grid\" [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (day of weekDates; track day.date.getTime()) {\r\n <div class=\"text-center py-4 border-r border-slate-100 last:border-r-0\">\r\n <div class=\"text-[11px] font-bold uppercase tracking-wider mb-1\"\r\n [class.text-red-500]=\"day.label === 'Sun' || day.label === 'Sat'\"\r\n [class.text-slate-400]=\"day.label !== 'Sun' && day.label !== 'Sat'\">\r\n {{day.label}}\r\n </div>\r\n <div class=\"text-2xl font-light text-slate-700 flex items-center justify-center\">\r\n <span [class.bg-blue-600]=\"day.active\" [class.text-white]=\"day.active\"\r\n [class.w-10]=\"day.active\" [class.h-10]=\"day.active\" [class.rounded-full]=\"day.active\"\r\n class=\"flex items-center justify-center transition-all\">\r\n {{day.day}}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto relative scroll-smooth bg-slate-50 pt-6\">\r\n <div class=\"grid grid-cols-[80px_1fr] min-h-full\">\r\n <div class=\"bg-white\">\r\n @for (time of times; track time) {\r\n <div class=\"h-20 border-b border-slate-100 relative\">\r\n <span\r\n class=\"absolute top-0 -translate-y-1/2 right-3 text-[11px] font-bold text-slate-400 bg-white px-1 z-10\">{{time}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grid relative bg-white\" \r\n [class.grid-cols-7]=\"showWeekends\"\r\n [class.grid-cols-5]=\"!showWeekends\">\r\n <div class=\"absolute left-0 right-0 z-20 pointer-events-none\" [style.top.px]=\"getNowPosition()\">\r\n <div class=\"border-t-2 border-red-500 w-full relative\">\r\n <div class=\"absolute -left-1.5 -top-1.5 w-3 h-3 bg-red-500 rounded-full shadow-sm\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @for (day of weekDates; track day.date.getTime()) {\r\n <div class=\"border-r border-slate-100 relative group\"\r\n [class.bg-slate-50/30]=\"formatDate(day.date) < todayStr\"\r\n [class.cursor-not-allowed]=\"formatDate(day.date) < todayStr\"\r\n [class.opacity-70]=\"formatDate(day.date) < todayStr\">\r\n @for (time of times; track time) {\r\n <div (contextmenu)=\"handleRightClick($event, formatDate(day.date), time.split(' ')[0] + ':00')\"\r\n class=\"h-20 border-b border-slate-100 transition-colors\"\r\n [class.hover:bg-slate-50/50]=\"formatDate(day.date) >= todayStr\"></div>\r\n }\r\n @for (appt of getAppointmentsForDate(day.date); track appt.id) {\r\n <div class=\"absolute left-1 right-1 rounded-md border-l-4 shadow-sm transition-all hover:z-10 hover:shadow-md cursor-pointer overflow-hidden\"\r\n [class.p-3]=\"appt.duration > 0.25\" [class.p-1]=\"appt.duration <= 0.25\"\r\n [class.bg-blue-50]=\"true\" [ngClass]=\"[appt.color, appt.borderColor, appt.textColor]\"\r\n [style.top.px]=\"getAppTop(appt.startTime)\"\r\n [style.height.px]=\"getAppHeight(appt.duration)\">\r\n <div class=\"flex flex-col\" [class.gap-0.5]=\"appt.duration > 0.25\"\r\n [class.justify-center]=\"appt.duration <= 0.25\" [style.height.%]=\"100\">\r\n @if (appt.duration > 0.25) {\r\n <span\r\n class=\"text-[10px] font-bold opacity-70 uppercase tracking-widest\">{{appt.startTime}}</span>\r\n }\r\n <div class=\"flex items-center justify-between gap-1\">\r\n <p class=\"text-[13px] font-semibold leading-tight truncate\">{{appt.title}}</p>\r\n @if (appt.repeat && appt.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-3 h-3 text-slate-400 shrink-0\"></i-lucide> -->\r\n }\r\n </div>\r\n @if (appt.duration > 0.4) {\r\n <p class=\"text-[11px] opacity-60 font-medium truncate\">{{appt.category}}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: flex;\r\n flex: 1;\r\n min-height: 0;\r\n flex-direction: column;\r\n }\r\n `]\r\n})\r\nexport class WeekViewComponent {\r\n @Input() viewDate: Date = new Date();\r\n @Input() currentTime: Date = new Date();\r\n @Input() appointments: any[] = [];\r\n @Input() todayStr: string = '';\r\n @Input() showWeekends: boolean = true;\r\n @Input() weekDates: any[] = [];\r\n @Input() times: string[] = [];\r\n\r\n @Output() onRightClick = new EventEmitter<any>();\r\n\r\n // repeatIcon = Repeat;\r\n\r\n formatDate(d: Date) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getAppointmentsForDate(date: Date) {\r\n const dStr = this.formatDate(date);\r\n return this.appointments.filter(a => a.date === dStr);\r\n }\r\n\r\n getAppTop(startTime: string) {\r\n const [hours, minutes] = startTime.split(':').map(Number);\r\n return (hours * 80) + (minutes / 60 * 80);\r\n }\r\n\r\n getAppHeight(duration: number) {\r\n return Math.max(duration * 80, 24);\r\n }\r\n\r\n getNowPosition() {\r\n return (this.currentTime.getHours() * 80) + (this.currentTime.getMinutes() / 60 * 80);\r\n }\r\n\r\n handleRightClick(event: MouseEvent, dateStr: string, timeSlot: string) {\r\n this.onRightClick.emit({ event, dateStr, timeSlot });\r\n }\r\n}\r\n","import { Component, computed, effect, ElementRef, EventEmitter, HostListener, Input, Output, signal, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AgendaViewComponent } from './components/agenda-view.component';\r\nimport { DayViewComponent } from './components/day-view.component';\r\nimport { HeaderComponent } from './components/header.component';\r\nimport { MonthViewComponent } from './components/month-view.component';\r\nimport { SidebarComponent } from './components/sidebar.component';\r\nimport { WeekViewComponent } from './components/week-view.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Appointment } from './modals/appointment';\r\n\r\n@Component({\r\n selector: 'lib-sn-calendar-view',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n SidebarComponent,\r\n HeaderComponent,\r\n DayViewComponent,\r\n WeekViewComponent,\r\n MonthViewComponent,\r\n AgendaViewComponent\r\n ],\r\n template: `\r\n <div class=\"h-screen flex bg-[#f8fafc] text-[#475569]\">\r\n\r\n <!-- SIDEBAR -->\r\n <app-sidebar [displayMonth]=\"displayMonth()\" [monthDays]=\"monthDays()\" [miniCalendarHeaders]=\"miniCalendarHeaders()\"\r\n [showWeekends]=\"showWeekends()\" (onPrevMonth)=\"prevMonth()\" (onNextMonth)=\"nextMonth()\"\r\n (onPrevYear)=\"prevYear()\" (onNextYear)=\"nextYear()\" (onSelectDate)=\"selectDate($event)\"\r\n (onToggleWeekends)=\"showWeekends.set(!showWeekends())\">\r\n </app-sidebar>\r\n\r\n <!-- MAIN CONTENT -->\r\n <main class=\"flex-1 flex flex-col min-w-0 bg-white overflow-hidden\">\r\n <!-- TOP NAVBAR -->\r\n <app-header [view]=\"view()\" [weekNumber]=\"weekNumber()\" [displayMonth]=\"displayMonth()\"\r\n (onGoToToday)=\"goToToday()\" (onCreateEvent)=\"onRightClick($event)\" (onPrev)=\"prev()\" (onNext)=\"next()\"\r\n (onSetView)=\"setView($event)\">\r\n </app-header>\r\n\r\n <!-- CALENDAR GRID -->\r\n @if (view() === 'day') {\r\n <app-day-view [viewDate]=\"viewDate()\" [currentTime]=\"currentTime()\" [appointments]=\"appointments()\"\r\n [todayStr]=\"todayStr\" [times]=\"times\"\r\n (onRightClick)=\"onRightClick($event.event, $event.dateStr, $event.timeSlot)\">\r\n </app-day-view>\r\n } @else if (view() === 'week') {\r\n <app-week-view [viewDate]=\"viewDate()\" [currentTime]=\"currentTime()\" [appointments]=\"appointments()\"\r\n [todayStr]=\"todayStr\" [showWeekends]=\"showWeekends()\" [weekDates]=\"weekDates()\" [times]=\"times\"\r\n (onRightClick)=\"onRightClick($event.event, $event.dateStr, $event.timeSlot)\">\r\n </app-week-view>\r\n } @else if (view() === 'month') {\r\n <app-month-view [viewDate]=\"viewDate()\" [appointments]=\"appointments()\" [todayStr]=\"todayStr\"\r\n [showWeekends]=\"showWeekends()\" [monthDays]=\"monthDays()\" [mainCalendarHeaders]=\"mainCalendarHeaders()\"\r\n (onRightClick)=\"onRightClick($event.event, $event.dateStr)\" (onMoreClick)=\"handleMoreClick($event)\">\r\n </app-month-view>\r\n } @else if (view() === 'agenda') {\r\n <app-agenda-view [agendaDays]=\"agendaDays()\">\r\n </app-agenda-view>\r\n }\r\n </main>\r\n\r\n <!-- EVENT DETAILS POPUP -->\r\n @if(selectedPopupDate()) {\r\n <div class=\"fixed inset-0 bg-black/10 backdrop-blur-[1px] z-[100] flex items-center justify-center\"\r\n (click)=\"closePopup()\">\r\n <div class=\"bg-white rounded-2xl shadow-2xl w-[400px] overflow-hidden p-6 relative animate-in fade-in zoom-in duration-200\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"flex justify-between items-center mb-6\">\r\n <h3 class=\"text-lg font-semibold text-slate-800\">{{ selectedPopupDate()?.date | date:'EEEE, MMM d' }}\r\n </h3>\r\n <button (click)=\"closePopup()\" class=\"p-1 hover:bg-slate-100 rounded-full transition-colors\">\r\n <!-- <i-lucide [img]=\"closeIcon\" class=\"w-5 h-5 text-slate-400\"></i-lucide> -->\r\n <img src=\"sn-calendar-view/assets/X.svg\" alt=\"\">\r\n </button>\r\n </div>\r\n <div class=\"space-y-4 max-h-[400px] overflow-y-auto pr-2\">\r\n @for(event of selectedPopupDate()?.events; track $index) {\r\n <div\r\n class=\"flex items-center gap-3 group cursor-pointer hover:bg-slate-50 p-1.5 rounded-lg transition-colors\">\r\n <div class=\"w-2.5 h-2.5 rounded-full shrink-0\" [ngClass]=\"event.color\"></div>\r\n <span class=\"text-sm font-medium text-slate-700 flex-1\">{{ event.title }}</span>\r\n @if (event.repeat && event.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-3.5 h-3.5 text-slate-400\"></i-lucide> -->\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- CREATE/EDIT EVENT POPUP -->\r\n @if(showEditPopup()) {\r\n <div class=\"fixed inset-0 bg-black/20 backdrop-blur-[2px] z-[150] flex items-center justify-center\"\r\n (click)=\"closeEditPopup()\">\r\n <div class=\"bg-white rounded-[24px] shadow-2xl w-[480px] p-8 relative animate-in fade-in zoom-in duration-200\"\r\n (click)=\"$event.stopPropagation()\">\r\n <!-- Popup Header -->\r\n <div class=\"flex justify-between items-center mb-8\">\r\n <h2 class=\"text-2xl font-semibold text-slate-800\">Edit</h2>\r\n <button (click)=\"closeEditPopup()\" class=\"p-2 hover:bg-slate-100 rounded-full transition-colors\">\r\n <!-- <i-lucide [img]=\"closeIcon\" class=\"w-6 h-6 text-slate-400\"></i-lucide> -->\r\n </button>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"space-y-6\">\r\n <!-- Name field -->\r\n <div class=\"relative\">\r\n <div class=\"absolute -top-2.5 left-4 bg-white px-1 text-xs font-medium text-blue-500 z-10\">Name\r\n </div>\r\n <input [(ngModel)]=\"editForm().title\"\r\n class=\"w-full border-2 border-blue-500 rounded-xl px-4 py-3.5 focus:outline-none text-slate-700 font-medium text-lg tracking-tight\"\r\n placeholder=\" \" />\r\n </div>\r\n\r\n <!-- Calendar Select -->\r\n <div class=\"relative\">\r\n <div class=\"absolute -top-2.5 left-4 bg-white px-1 text-[11px] font-medium text-slate-400 z-10\">\r\n Calendar</div>\r\n <div (click)=\"toggleDropdown('calendar', $event)\"\r\n class=\"dropdown-trigger w-full border border-slate-200 rounded-xl px-4 py-3.5 flex items-center justify-between cursor-pointer hover:border-slate-300 transition-colors\">\r\n <div class=\"flex items-center gap-3\">\r\n <div class=\"w-3.5 h-3.5 rounded-sm\" [ngClass]=\"getCategoryColor(editForm().category)\"></div>\r\n <span class=\"font-medium text-slate-700\">{{ editForm().category }}</span>\r\n </div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" [class.rotate-180]=\"activeDropdown() === 'calendar'\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-down-icon lucide-chevron-down text-slate-400 transition-transform duration-200\"><path d=\"m6 9 6 6 6-6\"/></svg>\r\n </div>\r\n\r\n @if (activeDropdown() === 'calendar') {\r\n <div [ngClass]=\"dropdownDirection() === 'top' ? 'bottom-full mb-2' : 'top-full mt-2'\"\r\n class=\"active-dropdown-menu absolute left-0 right-0 bg-white border border-slate-200 rounded-xl shadow-xl z-[200] py-2 overflow-hidden animate-in duration-200\">\r\n @for (cat of categories; track cat) {\r\n <div (click)=\"selectCategory(cat)\"\r\n class=\"px-4 py-3 hover:bg-slate-50 flex items-center gap-3 cursor-pointer transition-colors\">\r\n <div class=\"w-3 h-3 rounded-full\" [ngClass]=\"getCategoryColor(cat)\"></div>\r\n <span class=\"text-sm font-medium text-slate-700\">{{cat}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- All Day Toggle -->\r\n <div class=\"flex items-center gap-4 py-2\">\r\n <button (click)=\"toggleAllDay()\"\r\n class=\"w-12 h-6 rounded-full relative transition-colors duration-200 p-0 shadow-inner\"\r\n [class.bg-slate-300]=\"!editForm().allDay\" [class.bg-blue-500]=\"editForm().allDay\">\r\n <div class=\"absolute top-1 left-1 w-4 h-4 bg-white rounded-full transition-transform duration-200 shadow-md\"\r\n [class.translate-x-6]=\"editForm().allDay\"></div>\r\n </button>\r\n <span class=\"text-[17px] font-medium text-slate-700\">All day</span>\r\n </div>\r\n\r\n <div class=\"grid gap-4\" [class.grid-cols-2]=\"!editForm().allDay\">\r\n <div class=\"relative\" [class.col-span-2]=\"editForm().allDay\">\r\n <div class=\"absolute -top-2 font-medium text-[11px] text-slate-400 left-3 bg-white px-1\">Start\r\n </div>\r\n <div\r\n class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between relative overflow-hidden\">\r\n <input type=\"date\" [(ngModel)]=\"editForm().startDate\" (ngModelChange)=\"onStartDateChange()\"\r\n [min]=\"todayStr\" class=\"absolute inset-0 opacity-0 cursor-pointer z-20 w-full h-full\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ editForm().startDate | date:'MM/dd/yyyy'\r\n }}</span>\r\n <img src=\"assets/Calendar.svg\" alt=\"Calendar\" class=\"w-4 h-4 text-slate-500\">\r\n </div>\r\n </div>\r\n @if (!editForm().allDay) {\r\n <div class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between\">\r\n <button (click)=\"adjustTime('startTime', -15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left text-slate-400 group-hover:text-blue-500\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <div class=\"relative flex-1 text-center group\">\r\n <input type=\"time\" [(ngModel)]=\"editForm().startTime\"\r\n class=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full z-20\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ formatTime12h(editForm().startTime)\r\n }}</span>\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n <img src=\"assets/Clock.svg\" alt=\"Clock\" class=\"w-4 h-4 text-slate-500\">\r\n <button (click)=\"adjustTime('startTime', 15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right text-slate-400 group-hover:text-blue-500\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grid gap-4\" [class.grid-cols-2]=\"!editForm().allDay\">\r\n <div class=\"relative\" [class.col-span-2]=\"editForm().allDay\">\r\n <div class=\"absolute -top-2 font-medium text-[11px] text-slate-400 left-3 bg-white px-1\">End\r\n </div>\r\n <div\r\n class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between relative overflow-hidden\">\r\n <input type=\"date\" [(ngModel)]=\"editForm().endDate\" [min]=\"editForm().startDate\"\r\n class=\"absolute inset-0 opacity-0 cursor-pointer z-20 w-full h-full\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ editForm().endDate | date:'MM/dd/yyyy'\r\n }}</span>\r\n <img src=\"assets/Calendar.svg\" alt=\"Calendar\" class=\"w-4 h-4 text-slate-500\">\r\n </div>\r\n </div>\r\n @if (!editForm().allDay) {\r\n <div class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between\">\r\n <button (click)=\"adjustTime('endTime', -15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left text-slate-400 group-hover:text-blue-500\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <div class=\"relative flex-1 text-center group\">\r\n <input type=\"time\" [(ngModel)]=\"editForm().endTime\"\r\n class=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full z-20\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ formatTime12h(editForm().endTime)\r\n }}</span>\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n <!-- <i-lucide [img]=\"clockIcon\" class=\"w-4 h-4 text-slate-500\"></i-lucide> -->\r\n <button (click)=\"adjustTime('endTime', 15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right text-slate-400 group-hover:text-blue-500\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Repeat Select -->\r\n <div class=\"relative\">\r\n <div class=\"absolute -top-2 font-medium text-[11px] text-slate-400 left-3 bg-white px-1\">Repeat\r\n </div>\r\n <div (click)=\"toggleDropdown('repeat', $event)\"\r\n class=\"dropdown-trigger w-full border border-slate-200 rounded-xl px-4 py-3.5 flex items-center justify-between cursor-pointer hover:border-slate-300 transition-colors\">\r\n <span class=\"font-medium text-slate-700\">{{ editForm().repeat }}</span>\r\n <!-- <i-lucide [img]=\"chevronDown\" class=\"w-4 h-4 text-slate-400 transition-transform duration-200\"\r\n [class.rotate-180]=\"activeDropdown() === 'repeat'\"></i-lucide> -->\r\n </div>\r\n\r\n @if (activeDropdown() === 'repeat') {\r\n <div [ngClass]=\"dropdownDirection() === 'top' ? 'bottom-full mb-2' : 'top-full mt-2'\"\r\n class=\"active-dropdown-menu absolute left-0 right-0 bg-white border border-slate-200 rounded-xl shadow-xl z-[200] py-2 overflow-hidden animate-in duration-200\">\r\n @for (rep of repeatOptions(); track rep) {\r\n <div (click)=\"selectRepeat(rep)\"\r\n class=\"px-4 py-3 hover:bg-slate-50 cursor-pointer transition-colors\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{rep}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Buttons -->\r\n <div class=\"flex gap-4 mt-10\">\r\n <button (click)=\"saveEvent()\"\r\n class=\"flex-1 bg-blue-600 hover:bg-blue-700 text-white font-bold py-4 rounded-[18px] shadow-lg shadow-blue-200 transition-all text-lg\">\r\n Save\r\n </button>\r\n <button (click)=\"closeEditPopup()\"\r\n class=\"flex-1 bg-blue-50 hover:bg-blue-100 text-blue-700 font-bold py-4 rounded-[18px] transition-all text-lg\">\r\n Cancel\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- NOTIFICATION TOASTS -->\r\n <div class=\"fixed bottom-6 right-6 z-[300] flex flex-col gap-3 pointer-events-none\">\r\n @for (note of activeNotifications(); track note.id) {\r\n <div\r\n class=\"pointer-events-auto bg-white border-l-4 border-blue-600 rounded-xl shadow-2xl p-4 w-80 flex gap-4 animate-in slide-in-from-right duration-300\">\r\n <div class=\"w-10 h-10 rounded-full bg-blue-50 flex items-center justify-center shrink-0\">\r\n <!-- <i-lucide [img]=\"bellIcon\" class=\"w-5 h-5 text-blue-600 animate-bounce\"></i-lucide> -->\r\n </div>\r\n <div class=\"flex-1\">\r\n <div class=\"flex justify-between items-start mb-1\">\r\n <h4 class=\"text-xs font-bold text-slate-400 uppercase tracking-wider\">Reminder</h4>\r\n <button (click)=\"dismissNotification(note.id)\"\r\n class=\"text-slate-300 hover:text-slate-500 transition-colors\">\r\n <!-- <i-lucide [img]=\"closeIcon\" class=\"w-4 h-4\"></i-lucide> -->\r\n </button>\r\n </div>\r\n <p class=\"text-[15px] font-bold text-slate-800 leading-tight\">{{ note.title }}</p>\r\n <div class=\"flex items-center gap-1.5 mt-2\">\r\n <!-- <i-lucide [img]=\"clockIcon\" class=\"w-3.5 h-3.5 text-blue-500\"></i-lucide> -->\r\n <span class=\"text-[11px] font-bold text-blue-600\">Starts at {{ formatTime12h(note.startTime)\r\n }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n styles: ``,\r\n})\r\nexport class SnCalendarView {\r\n @Input() set initialAppointments(value: Appointment[]) {\r\n if (value) this.appointments.set(value);\r\n }\r\n @Input() categories = ['Bryntum team', 'Hospital', 'Clinic', 'Admin', 'Surgery', 'Event'];\r\n @Input() defaultView: 'day' | 'week' | 'month' | 'agenda' = 'week';\r\n\r\n @Output() onSaveEvent = new EventEmitter<any>();\r\n @Output() viewChanged = new EventEmitter<string>();\r\n\r\n appointments = signal<Appointment[]>([]);\r\n view = signal<'day' | 'week' | 'month' | 'agenda'>('week');\r\n viewDate = signal(new Date());\r\n currentTime = signal(new Date());\r\n activeDropdown = signal<'calendar' | 'repeat' | null>(null);\r\n dropdownDirection = signal<'top' | 'bottom'>('bottom');\r\n showWeekends = signal(true);\r\n todayStr = this.formatDate(new Date());\r\n selectedPopupDate = signal<{ date: Date, events: any[] } | null>(null);\r\n showEditPopup = signal(false);\r\n\r\n editForm = signal({\r\n title: '',\r\n category: 'Bryntum team',\r\n allDay: false,\r\n startDate: '',\r\n startTime: '09:00',\r\n endDate: '',\r\n endTime: '10:00',\r\n repeat: 'None'\r\n });\r\n\r\n // Icons\r\n // chevronDown = ChevronDown;\r\n // chevronLeft = ChevronLeft;\r\n // chevronRight = ChevronRight;\r\n // calendarIcon = Calendar;\r\n // clockIcon = Clock;\r\n // searchIcon = Search;\r\n // filterIcon = Filter;\r\n // closeIcon = X;\r\n // repeatIcon = Repeat;\r\n // bellIcon = Bell;\r\n\r\n activeNotifications = signal<any[]>([]);\r\n notifiedEventIds = new Set<number>();\r\n\r\n constructor(private el: ElementRef) {\r\n effect(() => {\r\n this.viewChanged.emit(this.view());\r\n });\r\n }\r\n // constructor() {\r\n\r\n // }\r\n ngOnInit() {\r\n this.view.set(this.defaultView);\r\n setInterval(() => {\r\n this.currentTime.set(new Date());\r\n this.checkUpcomingEvents();\r\n }, 60000);\r\n setTimeout(() => this.checkUpcomingEvents(), 2000);\r\n }\r\n\r\n checkUpcomingEvents() {\r\n const now = new Date();\r\n const todayStr = this.formatDate(now);\r\n const currentTotalMins = now.getHours() * 60 + now.getMinutes();\r\n\r\n const upcoming = this.appointments().filter(appt => {\r\n if (appt.date !== todayStr || this.notifiedEventIds.has(appt.id)) return false;\r\n const [h, m] = appt.startTime.split(':').map(Number);\r\n const apptTotalMins = h * 60 + m;\r\n const diff = apptTotalMins - currentTotalMins;\r\n return diff <= 15 && diff > 0;\r\n });\r\n\r\n if (upcoming.length > 0) {\r\n upcoming.forEach(event => {\r\n this.notifiedEventIds.add(event.id);\r\n this.activeNotifications.update(n => [...n, event]);\r\n setTimeout(() => this.dismissNotification(event.id), 10000);\r\n });\r\n }\r\n }\r\n\r\n dismissNotification(id: number) {\r\n this.activeNotifications.update(n => n.filter(e => e.id !== id));\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (!this.activeDropdown()) return;\r\n const target = event.target as HTMLElement;\r\n if (!target.closest('.active-dropdown-menu') && !target.closest('.dropdown-trigger')) {\r\n this.activeDropdown.set(null);\r\n }\r\n }\r\n\r\n miniCalendarHeaders = computed(() => this.showWeekends() ? ['S', 'M', 'T', 'W', 'T', 'F', 'S'] : ['M', 'T', 'W', 'T', 'F']);\r\n mainCalendarHeaders = computed(() => this.showWeekends() ? ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']);\r\n\r\n repeatOptions = computed(() => {\r\n const d = new Date(this.editForm().startDate || this.todayStr);\r\n const weekday = d.toLocaleString('default', { weekday: 'long' });\r\n const month = d.toLocaleString('default', { month: 'long' });\r\n const day = d.getDate();\r\n const getOrdinal = (n: number) => {\r\n const s = [\"th\", \"st\", \"nd\", \"rd\"];\r\n const v = n % 100;\r\n return n + (s[(v - 20) % 10] || s[v] || s[0]);\r\n };\r\n const occurrenceNames = [\"first\", \"second\", \"third\", \"fourth\", \"last\"];\r\n const occurrenceIndex = Math.floor((day - 1) / 7);\r\n return ['None', 'Daily', `Weekly on ${weekday}`, `Monthly on ${getOrdinal(day)}`, `Yearly on ${getOrdinal(day)} of ${month}`, `Monthly on the ${occurrenceNames[occurrenceIndex]} ${weekday}`, `Yearly on the ${occurrenceNames[occurrenceIndex]} ${weekday} of ${month}`];\r\n });\r\n\r\n daysShort = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\n displayMonth = computed(() => this.viewDate().toLocaleString('default', { month: 'long', year: 'numeric' }));\r\n weekNumber = computed(() => this.getWeekNumber(this.viewDate()));\r\n times = Array.from({ length: 24 }, (_, i) => {\r\n const hour = i === 0 ? 12 : i > 12 ? i - 12 : i;\r\n return `${hour} ${i < 12 ? 'AM' : 'PM'}`;\r\n });\r\n\r\n weekDates = computed(() => {\r\n const start = new Date(this.viewDate());\r\n start.setDate(start.getDate() - start.getDay());\r\n const dates = Array.from({ length: 7 }, (_, i) => {\r\n const d = new Date(start);\r\n d.setDate(start.getDate() + i);\r\n return { date: d, label: this.daysShort[d.getDay()], day: d.getDate(), active: d.toDateString() === this.viewDate().toDateString() };\r\n });\r\n return this.showWeekends() ? dates : dates.filter(d => d.date.getDay() !== 0 && d.date.getDay() !== 6);\r\n });\r\n\r\n monthDays = computed(() => {\r\n const year = this.viewDate().getFullYear();\r\n const month = this.viewDate().getMonth();\r\n const startDate = new Date(year, month, 1);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n const days = [];\r\n for (let i = 0; i < 42; i++) {\r\n const d = new Date(startDate);\r\n d.setDate(startDate.getDate() + i);\r\n if (!this.showWeekends() && (d.getDay() === 0 || d.getDay() === 6)) continue;\r\n const isFirstOfMonth = d.getDate() === 1;\r\n days.push({\r\n date: new Date(d), day: d.getDate(), dateStr: this.formatDate(d),\r\n label: isFirstOfMonth ? d.toLocaleString('default', { month: 'short' }) + ' ' + d.getDate() : String(d.getDate()),\r\n current: d.getMonth() === month, active: d.toDateString() === new Date().toDateString(),\r\n weekNum: d.getDay() === (this.showWeekends() ? 0 : 1) ? this.getWeekNumber(d) : null, isFirstOfMonth\r\n });\r\n }\r\n return days;\r\n });\r\n\r\n agendaDays = computed(() => {\r\n const days = [];\r\n const baseDate = new Date(this.viewDate());\r\n for (let i = 0; i < 30; i++) {\r\n const d = new Date(baseDate);\r\n d.setDate(baseDate.getDate() + i);\r\n if (!this.showWeekends() && (d.getDay() === 0 || d.getDay() === 6)) continue;\r\n const events = this.getAppointmentsForDate(d);\r\n if (events.length > 0) {\r\n days.push({\r\n date: d, dayNum: d.getDate(), weekday: d.toLocaleString('default', { weekday: 'long' }),\r\n monthYear: d.toLocaleString('default', { month: 'short', year: 'numeric' }),\r\n events: events.map(e => ({ ...e, endTime: this.addHour(e.startTime) }))\r\n });\r\n }\r\n }\r\n return days;\r\n });\r\n\r\n formatDate(d: Date) { return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`; }\r\n getWeekNumber(d: Date): number {\r\n const tempDate = new Date(d.getTime());\r\n tempDate.setHours(0, 0, 0, 0);\r\n tempDate.setDate(tempDate.getDate() + 4 - (tempDate.getDay() || 7));\r\n const yearStart = new Date(tempDate.getFullYear(), 0, 1);\r\n return Math.ceil((((tempDate.getTime() - yearStart.getTime()) / 86400000) + 1) / 7);\r\n }\r\n\r\n setView(v: 'day' | 'week' | 'month' | 'agenda') { this.view.set(v); }\r\n prev() {\r\n const d = new Date(this.viewDate());\r\n if (this.view() === 'month') d.setMonth(d.getMonth() - 1);\r\n else if (this.view() === 'week') d.setDate(d.getDate() - 7);\r\n else { d.setDate(d.getDate() - 1); if (!this.showWeekends()) while (d.getDay() === 0 || d.getDay() === 6) d.setDate(d.getDate() - 1); }\r\n this.viewDate.set(d);\r\n }\r\n next() {\r\n const d = new Date(this.viewDate());\r\n if (this.view() === 'month') d.setMonth(d.getMonth() + 1);\r\n else if (this.view() === 'week') d.setDate(d.getDate() + 7);\r\n else { d.setDate(d.getDate() + 1); if (!this.showWeekends()) while (d.getDay() === 0 || d.getDay() === 6) d.setDate(d.getDate() + 1); }\r\n this.viewDate.set(d);\r\n }\r\n prevMonth() { const d = new Date(this.viewDate()); d.setMonth(d.getMonth() - 1); this.viewDate.set(d); }\r\n nextMonth() { const d = new Date(this.viewDate()); d.setMonth(d.getMonth() + 1); this.viewDate.set(d); }\r\n prevYear() { const d = new Date(this.viewDate()); d.setFullYear(d.getFullYear() - 1); this.viewDate.set(d); }\r\n nextYear() { const d = new Date(this.viewDate()); d.setFullYear(d.getFullYear() + 1); this.viewDate.set(d); }\r\n\r\n getAppointmentsForDate(date: Date) { return this.appointments().filter(a => a.date === this.formatDate(date)); }\r\n addMinutes(time: string, mins: number) {\r\n const [h, m] = time.split(':').map(Number);\r\n let total = (h * 60 + m + mins) % (24 * 60);\r\n if (total < 0) total += 24 * 60;\r\n return `${String(Math.floor(total / 60)).padStart(2, '0')}:${String(total % 60).padStart(2, '0')}`;\r\n }\r\n addHour(time: string) { return this.addMinutes(time, 60); }\r\n\r\n adjustTime(field: 'startTime' | 'endTime', amount: number) {\r\n this.editForm.update(f => {\r\n const newTime = this.addMinutes(f[field], amount);\r\n return { ...f, [field]: newTime };\r\n });\r\n this.validateTimeOrder();\r\n }\r\n\r\n private validateTimeOrder() {\r\n const form = this.editForm();\r\n if (form.startDate !== form.endDate) return;\r\n const [sH, sM] = form.startTime.split(':').map(Number);\r\n const [eH, eM] = form.endTime.split(':').map(Number);\r\n if ((eH * 60 + eM) < (sH * 60 + sM + 15)) {\r\n this.editForm.update(f => ({ ...f, endTime: this.addMinutes(f.startTime, 15) }));\r\n }\r\n }\r\n\r\n formatTime12h(time: string) {\r\n if (!time) return '';\r\n const [h, m] = time.split(':').map(Number);\r\n return `${h % 12 || 12}:${String(m).padStart(2, '0')} ${h >= 12 ? 'PM' : 'AM'}`;\r\n }\r\n\r\n toggleDropdown(type: 'calendar' | 'repeat', event: MouseEvent) {\r\n if (this.activeDropdown() === type) { this.activeDropdown.set(null); return; }\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\r\n this.dropdownDirection.set((window.innerHeight - rect.bottom) < 240 ? 'top' : 'bottom');\r\n this.activeDropdown.set(type);\r\n }\r\n\r\n selectCategory(cat: string) { this.editForm.update(f => ({ ...f, category: cat })); this.activeDropdown.set(null); }\r\n selectRepeat(rep: string) { this.editForm.update(f => ({ ...f, repeat: rep })); this.activeDropdown.set(null); }\r\n getCategoryColor(cat: string): string {\r\n const colors: Record<string, string> = { 'Bryntum team': 'bg-blue-500', 'Hospital': 'bg-blue-500', 'Clinic': 'bg-green-500', 'Admin': 'bg-orange-500', 'Surgery': 'bg-red-500', 'Event': 'bg-purple-500' };\r\n return colors[cat] || 'bg-slate-400';\r\n }\r\n\r\n saveEvent() {\r\n this.onSaveEvent.emit(this.editForm());\r\n this.showEditPopup.set(false);\r\n }\r\n\r\n closeEditPopup() { this.showEditPopup.set(false); }\r\n goToToday() { this.viewDate.set(new Date()); }\r\n onStartDateChange() {\r\n if (this.editForm().endDate < this.editForm().startDate) {\r\n this.editForm.update(f => ({ ...f, endDate: f.startDate }));\r\n }\r\n }\r\n selectDate(d: Date) { this.viewDate.set(new Date(d)); }\r\n toggleAllDay() {\r\n this.editForm.update(f => ({\r\n ...f, allDay: !f.allDay,\r\n startTime: !f.allDay ? '00:00' : '09:00',\r\n endTime: !f.allDay ? '00:00' : '09:30'\r\n }));\r\n }\r\n\r\n onRightClick(event: MouseEvent, dateStr?: string, timeSlot?: string) {\r\n event.preventDefault();\r\n const targetDate = dateStr || this.formatDate(new Date());\r\n if (targetDate < this.todayStr) return;\r\n let finalStartTime = timeSlot || '09:00';\r\n if (timeSlot) {\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\r\n const minutesToAdd = Math.min(45, Math.floor((event.clientY - rect.top) / 20) * 15);\r\n if (minutesToAdd > 0) finalStartTime = this.addMinutes(timeSlot, minutesToAdd);\r\n }\r\n this.editForm.set({ title: '', category: 'Bryntum team', allDay: false, startDate: targetDate, startTime: finalStartTime, endDate: targetDate, endTime: this.addMinutes(finalStartTime, 30), repeat: 'None' });\r\n this.showEditPopup.set(true);\r\n }\r\n\r\n handleMoreClick(day: any) {\r\n this.selectedPopupDate.set({\r\n date: day.date,\r\n events: this.getAppointmentsForDate(day.date).map(e => ({\r\n title: e.title,\r\n type: e.type || (e.duration >= 24 ? 'bar' : 'dot'),\r\n color: e.type === 'bar' ? `${e.color} ${e.textColor} ${e.borderColor}` : (e.color.indexOf('orange') !== -1 ? 'bg-orange-500' : e.color.indexOf('green') !== -1 ? 'bg-green-500' : e.color.indexOf('red') !== -1 ? 'bg-red-500' : 'bg-blue-500'),\r\n repeat: e.repeat\r\n }))\r\n });\r\n }\r\n closePopup() { this.selectedPopupDate.set(null); }\r\n}\r\n","/*\r\n * Public API Surface of sn-calendar-view\r\n */\r\n\r\nexport * from './lib/sn-calendar-view';\r\nexport * from './lib/components/month-view.component';\r\nexport * from './lib/components/sidebar.component';\r\nexport * from './lib/components/week-view.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sn-calendar-view.mjs","sources":["../../../projects/sn-calendar-view/src/lib/components/agenda-view.component.ts","../../../projects/sn-calendar-view/src/lib/components/day-view.component.ts","../../../projects/sn-calendar-view/src/lib/components/header.component.ts","../../../projects/sn-calendar-view/src/lib/components/month-view.component.ts","../../../projects/sn-calendar-view/src/lib/components/sidebar.component.ts","../../../projects/sn-calendar-view/src/lib/components/week-view.component.ts","../../../projects/sn-calendar-view/src/lib/sn-calendar-view.ts","../../../projects/sn-calendar-view/src/public-api.ts","../../../projects/sn-calendar-view/src/sn-calendar-view.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// import { LucideAngularModule, Repeat, Filter } from 'lucide-angular';\r\n\r\n@Component({\r\n selector: 'app-agenda-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 overflow-y-auto bg-white py-4 px-20\">\r\n @for (item of agendaDays; track item.date.getTime()) {\r\n <div\r\n class=\"flex py-10 border-b border-slate-100 last:border-0 hover:bg-slate-50/30 transition-colors group px-6 rounded-2xl\">\r\n <!-- Left: Day Number Circle -->\r\n <div class=\"w-48 shrink-0 flex items-start gap-6\">\r\n <div\r\n class=\"w-20 h-20 rounded-full bg-slate-50 flex items-center justify-center text-4xl font-light text-slate-700 group-hover:bg-blue-50 group-hover:text-blue-600 transition-colors shadow-sm\">\r\n {{ item.dayNum }}\r\n </div>\r\n <div class=\"flex flex-col pt-2\">\r\n <span class=\"text-lg font-semibold text-slate-800\">{{ item.weekday }}</span>\r\n <span class=\"text-sm text-slate-400 font-medium\">{{ item.monthYear }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Middle: Time Information -->\r\n <div class=\"w-64 shrink-0 flex flex-col pt-3 gap-1\">\r\n <span class=\"text-sm font-bold text-slate-400 uppercase tracking-widest\">Global Schedule</span>\r\n @for (e of item.events; track e.id) {\r\n <div class=\"flex flex-col mb-4 last:mb-0\">\r\n @if (e.type === 'bar') {\r\n <span class=\"text-sm font-medium text-slate-600\">All day</span>\r\n } @else {\r\n <span class=\"text-sm font-bold text-slate-700 tracking-tight\">{{ e.startTime }} - {{\r\n e.endTime }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Right: Event List with Tag -->\r\n <div class=\"flex-1 pt-2\">\r\n <div class=\"flex flex-col gap-8\">\r\n <!-- Category Tag -->\r\n <div class=\"flex items-center gap-3\">\r\n <span\r\n class=\"px-4 py-1.5 bg-green-50 text-green-700 rounded-full text-[11px] font-bold uppercase tracking-wider border border-green-100\">\r\n {{ item.events[0].category }} Schedule\r\n </span>\r\n </div>\r\n\r\n <!-- Events List -->\r\n <div class=\"space-y-6\">\r\n @for (e of item.events; track e.id) {\r\n <div class=\"flex items-center gap-4 group/item\">\r\n <div class=\"w-2.5 h-2.5 rounded-full\"\r\n [class.bg-blue-500]=\"e.category === 'Bryntum team' || e.category === 'Hospital'\"\r\n [class.bg-green-500]=\"e.category === 'Clinic'\"\r\n [class.bg-orange-500]=\"e.category === 'Admin'\"\r\n [class.bg-red-500]=\"e.category === 'Surgery'\"\r\n [class.bg-purple-500]=\"e.category === 'Event'\"></div>\r\n <span\r\n class=\"text-[17px] font-medium text-slate-700 group-hover/item:text-blue-600 transition-colors flex items-center gap-2\">\r\n {{ e.title }}\r\n @if (e.repeat && e.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-3.5 h-3.5 text-slate-400\"></i-lucide> -->\r\n }\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-10 shrink-0 flex justify-end items-start pt-2\">\r\n <!-- <i-lucide [img]=\"filterIcon\"\r\n class=\"w-5 h-5 text-slate-200 group-hover:text-slate-400 transition-colors cursor-pointer\"></i-lucide> -->\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: flex;\r\n flex: 1;\r\n min-height: 0;\r\n flex-direction: column;\r\n }\r\n `]\r\n})\r\nexport class AgendaViewComponent {\r\n @Input() agendaDays: any[] = [];\r\n\r\n // repeatIcon = Repeat;\r\n // filterIcon = Filter;\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// import { LucideAngularModule, Clock, Repeat } from 'lucide-angular';\r\n\r\n@Component({\r\n selector: 'app-day-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 flex flex-col overflow-hidden\">\r\n <!-- DAY VIEW HEADER -->\r\n <div class=\"grid grid-cols-[80px_1fr] border-b border-slate-200 shrink-0\">\r\n <div class=\"border-r border-slate-200\"></div>\r\n <div class=\"p-4 bg-white\">\r\n <div class=\"text-[11px] font-bold uppercase tracking-wider text-blue-600 mb-1\">\r\n {{ viewDate | date:'EEEE' }}\r\n </div>\r\n <div class=\"text-3xl font-light text-slate-700\">\r\n {{ viewDate | date:'MMMM d, y' }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- SCROLLABLE GRID BODY -->\r\n <div class=\"flex-1 overflow-y-auto relative scroll-smooth bg-slate-50 pt-6\">\r\n <div class=\"grid grid-cols-[80px_1fr] min-h-full\">\r\n <div class=\"bg-white\">\r\n @for (time of times; track time) {\r\n <div class=\"h-20 border-b border-slate-100 relative\">\r\n <span\r\n class=\"absolute top-0 -translate-y-1/2 right-3 text-[11px] font-bold text-slate-400 bg-white px-1 z-10\">{{time}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grid relative bg-white grid-cols-1\">\r\n <div class=\"absolute left-0 right-0 z-20 pointer-events-none\" [style.top.px]=\"getNowPosition()\">\r\n <div class=\"border-t-2 border-red-500 w-full relative\">\r\n <div class=\"absolute -left-1.5 -top-1.5 w-3 h-3 bg-red-500 rounded-full shadow-sm\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"border-r border-slate-100 relative group\"\r\n [class.bg-slate-50/30]=\"formatDate(viewDate) < todayStr\"\r\n [class.cursor-not-allowed]=\"formatDate(viewDate) < todayStr\"\r\n [class.opacity-70]=\"formatDate(viewDate) < todayStr\">\r\n @for (time of times; track time) {\r\n <div (contextmenu)=\"handleRightClick($event, formatDate(viewDate), time.split(' ')[0] + ':00')\"\r\n class=\"h-20 border-b border-slate-100 transition-colors\"\r\n [class.hover:bg-slate-50/50]=\"formatDate(viewDate) >= todayStr\"></div>\r\n }\r\n @for (appt of getFilteredAppointments(); track appt.id) {\r\n <div class=\"absolute left-4 right-4 rounded-xl border-l-8 shadow-md transition-all hover:z-10 hover:shadow-xl cursor-pointer overflow-hidden\"\r\n [class.p-6]=\"appt.duration > 0.25\" [class.p-2]=\"appt.duration <= 0.25\"\r\n [ngClass]=\"[appt.color, appt.borderColor, appt.textColor]\"\r\n [style.top.px]=\"getAppTop(appt.startTime)\"\r\n [style.height.px]=\"getAppHeight(appt.duration)\">\r\n <div class=\"flex flex-col\" [class.gap-2]=\"appt.duration > 0.25\"\r\n [class.justify-center]=\"appt.duration <= 0.25\" [style.height.%]=\"100\">\r\n @if(appt.duration > 0.25) {\r\n <span\r\n class=\"text-xs font-bold opacity-70 uppercase tracking-widest\">{{appt.startTime}}</span>\r\n }\r\n <div class=\"flex items-center justify-between\">\r\n <p class=\"font-bold leading-tight\" [class.text-lg]=\"appt.duration > 0.25\"\r\n [class.text-sm]=\"appt.duration <= 0.25\">{{appt.title}}</p>\r\n @if (appt.repeat && appt.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" [class.w-5]=\"appt.duration > 0.25\"\r\n [class.h-5]=\"appt.duration > 0.25\" [class.w-3]=\"appt.duration <= 0.25\"\r\n [class.h-3]=\"appt.duration <= 0.25\" class=\"opacity-40\"></i-lucide> -->\r\n }\r\n </div>\r\n @if(appt.duration > 0.5) {\r\n <div class=\"flex items-center gap-2\">\r\n <!-- <i-lucide [img]=\"clockIcon\" class=\"w-4 h-4 opacity-40\"></i-lucide> -->\r\n <span class=\"text-sm opacity-60 font-medium\">{{appt.duration}} hours</span>\r\n </div>\r\n <p class=\"text-sm opacity-60 font-medium truncate\">{{appt.category}}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: flex;\r\n flex: 1;\r\n min-height: 0;\r\n flex-direction: column;\r\n }\r\n `]\r\n})\r\nexport class DayViewComponent {\r\n @Input() viewDate: Date = new Date();\r\n @Input() currentTime: Date = new Date();\r\n @Input() appointments: any[] = [];\r\n @Input() todayStr: string = '';\r\n @Input() times: string[] = [];\r\n\r\n @Output() onRightClick = new EventEmitter<any>();\r\n\r\n // clockIcon = Clock;\r\n // repeatIcon = Repeat;\r\n\r\n getFilteredAppointments() {\r\n const dStr = this.formatDate(this.viewDate);\r\n return this.appointments.filter(a => a.date === dStr);\r\n }\r\n\r\n formatDate(d: Date) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getAppTop(startTime: string) {\r\n const [hours, minutes] = startTime.split(':').map(Number);\r\n return (hours * 80) + (minutes / 60 * 80);\r\n }\r\n\r\n getAppHeight(duration: number) {\r\n return Math.max(duration * 80, 24);\r\n }\r\n\r\n getNowPosition() {\r\n return (this.currentTime.getHours() * 80) + (this.currentTime.getMinutes() / 60 * 80);\r\n }\r\n\r\n handleRightClick(event: MouseEvent, dateStr: string, timeSlot: string) {\r\n this.onRightClick.emit({ event, dateStr, timeSlot });\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-header',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <header class=\"h-16 border-b border-slate-200 flex items-center justify-between px-6 shrink-0\">\r\n <div class=\"flex items-center gap-6\">\r\n <button (click)=\"onGoToToday.emit()\"\r\n class=\"flex items-center gap-2 bg-blue-50 text-blue-600 px-4 py-2 rounded-lg font-medium hover:bg-blue-100 transition-colors\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-calendar-icon lucide-calendar\"><path d=\"M8 2v4\"/><path d=\"M16 2v4\"/><rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\"/><path d=\"M3 10h18\"/></svg>\r\n Today\r\n </button>\r\n <button (click)=\"onCreateEvent.emit($event)\"\r\n class=\"flex items-center gap-2 bg-blue-600 text-white px-4 py-2 rounded-lg font-medium hover:bg-blue-700 transition-shadow shadow-md\">\r\n <span class=\"text-xl leading-none\">+</span>\r\n Create\r\n </button>\r\n <div class=\"flex items-center gap-2\">\r\n <button (click)=\"onPrev.emit()\" class=\"p-2 hover:bg-slate-50 rounded-full text-slate-400\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <button (click)=\"onNext.emit()\" class=\"p-2 hover:bg-slate-50 rounded-full text-slate-400\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n <h1 class=\"text-xl font-semibold text-slate-800 tracking-tight\">\r\n {{ view === 'week' ? 'Week ' + weekNumber + ', ' : '' }}{{ displayMonth }}\r\n </h1>\r\n </div>\r\n\r\n <div class=\"flex bg-slate-100 p-1 rounded-xl\">\r\n <button (click)=\"onSetView.emit('day')\" [class.bg-white]=\"view==='day'\" [class.shadow-sm]=\"view==='day'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Day</button>\r\n <button (click)=\"onSetView.emit('week')\" [class.bg-white]=\"view==='week'\" [class.shadow-sm]=\"view==='week'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Week</button>\r\n <button (click)=\"onSetView.emit('month')\" [class.bg-white]=\"view==='month'\"\r\n [class.shadow-sm]=\"view==='month'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Month</button>\r\n <button (click)=\"onSetView.emit('agenda')\" [class.bg-white]=\"view==='agenda'\"\r\n [class.shadow-sm]=\"view==='agenda'\"\r\n class=\"px-4 py-1.5 rounded-lg text-sm font-medium transition-all cursor-pointer\">Agenda</button>\r\n </div>\r\n </header>\r\n `\r\n})\r\nexport class HeaderComponent {\r\n @Input() view: string = 'week';\r\n @Input() weekNumber: number = 0;\r\n @Input() displayMonth: string = '';\r\n\r\n @Output() onGoToToday = new EventEmitter<void>();\r\n @Output() onCreateEvent = new EventEmitter<MouseEvent>();\r\n @Output() onPrev = new EventEmitter<void>();\r\n @Output() onNext = new EventEmitter<void>();\r\n @Output() onSetView = new EventEmitter<'day' | 'week' | 'month' | 'agenda'>();\r\n\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// import { LucideAngularModule, Repeat } from 'lucide-angular';\r\n\r\n@Component({\r\n selector: 'app-month-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 flex flex-col min-h-0 bg-white overflow-hidden\">\r\n <div class=\"grid border-b border-slate-200 shrink-0\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (d of mainCalendarHeaders; track $index) {\r\n <div class=\"py-3 text-[11px] font-bold uppercase tracking-wider text-center\"\r\n [class.text-red-500]=\"(d === 'Sun' || d === 'Sat') && showWeekends\"\r\n [class.text-slate-400]=\"d !== 'Sun' && d !== 'Sat'\">\r\n {{d}}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"flex-1 grid min-h-0 overflow-hidden border-b border-slate-100\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\"\r\n [class.grid-rows-6]=\"showWeekends\" [style.grid-template-rows]=\"!showWeekends ? 'repeat(auto-fill, minmax(0, 1fr))' : ''\">\r\n @for (d of monthDays; track d.date.getTime(); let i = $index) {\r\n <div (contextmenu)=\"handleRightClick($event, d.dateStr)\"\r\n class=\"border-r border-b border-slate-100 relative group p-1 min-h-[100px] transition-colors\"\r\n [class.hover:bg-slate-50/50]=\"d.dateStr >= todayStr\"\r\n [class.bg-slate-50/30]=\"d.dateStr < todayStr\" [class.cursor-not-allowed]=\"d.dateStr < todayStr\"\r\n [class.opacity-50]=\"d.dateStr < todayStr\">\r\n @if (d.weekNum) {\r\n <div class=\"absolute left-1 top-2 text-[10px] font-bold text-slate-300\">\r\n {{d.weekNum}}\r\n </div>\r\n }\r\n <div class=\"text-right p-1\">\r\n <span class=\"text-[12px] font-medium\" [class.text-slate-300]=\"!d.current\"\r\n [class.text-slate-800]=\"d.current && !d.isFirstOfMonth\"\r\n [class.font-bold]=\"d.isFirstOfMonth\">\r\n {{d.label}}\r\n </span>\r\n </div>\r\n @for (appt of getFilteredAppointments(d.date); track appt.id) {\r\n @if (appt.type === 'bar') {\r\n <div class=\"absolute left-0 right-0 z-10 transition-all\" [style.top.px]=\"34\">\r\n <div class=\"border-l-4 text-[11px] font-medium px-2 py-1 mx-1 rounded shadow-sm opacity-90 hover:opacity-100 cursor-pointer flex items-center justify-between\"\r\n [ngClass]=\"[appt.color, appt.borderColor, appt.textColor]\">\r\n <span class=\"truncate\">{{ appt.title }}</span>\r\n @if (appt.repeat && appt.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-2.5 h-2.5 opacity-60 shrink-0 ml-1\"></i-lucide> -->\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n @if (getFilteredAppointments(d.date).length > 0) {\r\n <div class=\"mt-10 text-center\">\r\n <span (click)=\"onMoreClick.emit(d)\"\r\n class=\"text-[10px] text-slate-400 font-bold cursor-pointer hover:text-blue-500 hover:bg-slate-50 px-2 py-0.5 rounded transition-colors\">\r\n +{{ getFilteredAppointments(d.date).length }} more\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `\r\n})\r\nexport class MonthViewComponent {\r\n @Input() viewDate: Date = new Date();\r\n @Input() appointments: any[] = [];\r\n @Input() todayStr: string = '';\r\n @Input() showWeekends: boolean = true;\r\n @Input() monthDays: any[] = [];\r\n @Input() mainCalendarHeaders: string[] = [];\r\n\r\n @Output() onRightClick = new EventEmitter<any>();\r\n @Output() onMoreClick = new EventEmitter<any>();\r\n\r\n // repeatIcon = Repeat;\r\n\r\n formatDate(d: Date) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getFilteredAppointments(date: Date) {\r\n const dStr = this.formatDate(date);\r\n return this.appointments.filter(a => a.date === dStr);\r\n }\r\n\r\n handleRightClick(event: MouseEvent, dateStr: string) {\r\n this.onRightClick.emit({ event, dateStr });\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-sidebar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <aside class=\"w-72 bg-white flex flex-col border-r border-slate-200\">\r\n <div class=\"p-6\">\r\n <div class=\"flex items-center justify-between mb-6\">\r\n <div class=\"flex items-center gap-2 font-semibold text-slate-800\">\r\n <button (click)=\"onPrevMonth.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Previous Month\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <span>{{ displayMonth }}</span>\r\n <button (click)=\"onNextMonth.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Next Month\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n <div class=\"flex gap-1\">\r\n <button (click)=\"onPrevYear.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Previous Year\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <button (click)=\"onNextYear.emit()\" class=\"p-1 hover:bg-slate-100 rounded\" title=\"Next Year\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- MINI CALENDAR -->\r\n <div class=\"grid text-center text-[11px] mb-2 font-medium text-slate-400\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (d of miniCalendarHeaders; track $index) {\r\n <div>{{d}}</div>\r\n }\r\n </div>\r\n <div class=\"grid text-center text-xs gap-y-1\"\r\n [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (d of monthDays; track d.date.getTime()) {\r\n <div (click)=\"onSelectDate.emit(d.date)\"\r\n class=\"p-1.5 flex items-center justify-center cursor-pointer hover:bg-slate-100 rounded-full transition-colors\"\r\n [class.text-slate-300]=\"!d.current\" [class.bg-blue-600]=\"d.active\" [class.text-white]=\"d.active\">\r\n {{d.day}}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- FILTER -->\r\n <div class=\"mt-8\">\r\n <div class=\"relative mb-6\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-search-icon lucide-search absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"><path d=\"m21 21-4.34-4.34\"/><circle cx=\"11\" cy=\"11\" r=\"8\"/></svg>\r\n <!-- <i-lucide [img]=\"searchIcon\"\r\n class=\"w-4 h-4 absolute left-3 top-1/2 -translate-y-1/2 text-slate-400\"></i-lucide> -->\r\n <input placeholder=\"Filter events\"\r\n class=\"w-full bg-slate-50 border border-slate-200 rounded-lg pl-10 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\" />\r\n </div>\r\n\r\n <div class=\"space-y-4\">\r\n <label class=\"flex items-center gap-3 cursor-pointer group\">\r\n <div\r\n class=\"w-5 h-5 border-2 border-blue-500 rounded bg-blue-500 flex items-center justify-center\">\r\n <div class=\"w-2.5 h-2.5 bg-white rounded-sm\"></div>\r\n </div>\r\n <span class=\"text-sm font-medium group-hover:text-blue-600 transition-colors\">Bryntum\r\n team</span>\r\n </label>\r\n <label class=\"flex items-center gap-3 cursor-pointer group\">\r\n <div\r\n class=\"w-5 h-5 border-2 border-orange-500 rounded bg-orange-500 flex items-center justify-center\">\r\n <div class=\"w-2.5 h-2.5 bg-white rounded-sm\"></div>\r\n </div>\r\n <span class=\"text-sm font-medium group-hover:text-orange-600 transition-colors\">Hospital</span>\r\n </label>\r\n <label class=\"flex items-center gap-3 cursor-pointer group\">\r\n <div\r\n class=\"w-5 h-5 border-2 border-red-500 rounded bg-red-500 flex items-center justify-center\">\r\n <div class=\"w-2.5 h-2.5 bg-white rounded-sm\"></div>\r\n </div>\r\n <span class=\"text-sm font-medium group-hover:text-red-600 transition-colors\">Surgery</span>\r\n </label>\r\n </div>\r\n\r\n <!-- WEEKEND TOGGLE -->\r\n <div class=\"mt-10 pt-6 border-t border-slate-100\">\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-sm font-semibold text-slate-700\">Show Weekends</span>\r\n <button (click)=\"onToggleWeekends.emit()\"\r\n class=\"w-10 h-5 rounded-full relative transition-colors duration-200\"\r\n [class.bg-slate-200]=\"!showWeekends\" [class.bg-blue-500]=\"showWeekends\">\r\n <div class=\"absolute top-0.5 left-0.5 w-4 h-4 bg-white rounded-full transition-transform duration-200 shadow-sm\"\r\n [class.translate-x-5]=\"showWeekends\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </aside>\r\n `\r\n})\r\nexport class SidebarComponent {\r\n @Input() displayMonth: string = '';\r\n @Input() monthDays: any[] = [];\r\n @Input() miniCalendarHeaders: string[] = [];\r\n @Input() showWeekends: boolean = true;\r\n\r\n @Output() onPrevMonth = new EventEmitter<void>();\r\n @Output() onNextMonth = new EventEmitter<void>();\r\n @Output() onPrevYear = new EventEmitter<void>();\r\n @Output() onNextYear = new EventEmitter<void>();\r\n @Output() onSelectDate = new EventEmitter<Date>();\r\n @Output() onToggleWeekends = new EventEmitter<void>();\r\n\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-week-view',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"flex-1 flex flex-col overflow-hidden\">\r\n <!-- Week View Header -->\r\n <div class=\"grid grid-cols-[80px_1fr] border-b border-slate-200 shrink-0\">\r\n <div class=\"border-r border-slate-200\"></div>\r\n <div class=\"grid\" [class.grid-cols-7]=\"showWeekends\" [class.grid-cols-5]=\"!showWeekends\">\r\n @for (day of weekDates; track day.date.getTime()) {\r\n <div class=\"text-center py-4 border-r border-slate-100 last:border-r-0\">\r\n <div class=\"text-[11px] font-bold uppercase tracking-wider mb-1\"\r\n [class.text-red-500]=\"day.label === 'Sun' || day.label === 'Sat'\"\r\n [class.text-slate-400]=\"day.label !== 'Sun' && day.label !== 'Sat'\">\r\n {{day.label}}\r\n </div>\r\n <div class=\"text-2xl font-light text-slate-700 flex items-center justify-center\">\r\n <span [class.bg-blue-600]=\"day.active\" [class.text-white]=\"day.active\"\r\n [class.w-10]=\"day.active\" [class.h-10]=\"day.active\" [class.rounded-full]=\"day.active\"\r\n class=\"flex items-center justify-center transition-all\">\r\n {{day.day}}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex-1 overflow-y-auto relative scroll-smooth bg-slate-50 pt-6\">\r\n <div class=\"grid grid-cols-[80px_1fr] min-h-full\">\r\n <div class=\"bg-white\">\r\n @for (time of times; track time) {\r\n <div class=\"h-20 border-b border-slate-100 relative\">\r\n <span\r\n class=\"absolute top-0 -translate-y-1/2 right-3 text-[11px] font-bold text-slate-400 bg-white px-1 z-10\">{{time}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grid relative bg-white\" \r\n [class.grid-cols-7]=\"showWeekends\"\r\n [class.grid-cols-5]=\"!showWeekends\">\r\n <div class=\"absolute left-0 right-0 z-20 pointer-events-none\" [style.top.px]=\"getNowPosition()\">\r\n <div class=\"border-t-2 border-red-500 w-full relative\">\r\n <div class=\"absolute -left-1.5 -top-1.5 w-3 h-3 bg-red-500 rounded-full shadow-sm\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @for (day of weekDates; track day.date.getTime()) {\r\n <div class=\"border-r border-slate-100 relative group\"\r\n [class.bg-slate-50/30]=\"formatDate(day.date) < todayStr\"\r\n [class.cursor-not-allowed]=\"formatDate(day.date) < todayStr\"\r\n [class.opacity-70]=\"formatDate(day.date) < todayStr\">\r\n @for (time of times; track time) {\r\n <div (contextmenu)=\"handleRightClick($event, formatDate(day.date), time.split(' ')[0] + ':00')\"\r\n class=\"h-20 border-b border-slate-100 transition-colors\"\r\n [class.hover:bg-slate-50/50]=\"formatDate(day.date) >= todayStr\"></div>\r\n }\r\n @for (appt of getAppointmentsForDate(day.date); track appt.id) {\r\n <div class=\"absolute left-1 right-1 rounded-md border-l-4 shadow-sm transition-all hover:z-10 hover:shadow-md cursor-pointer overflow-hidden\"\r\n [class.p-3]=\"appt.duration > 0.25\" [class.p-1]=\"appt.duration <= 0.25\"\r\n [class.bg-blue-50]=\"true\" [ngClass]=\"[appt.color, appt.borderColor, appt.textColor]\"\r\n [style.top.px]=\"getAppTop(appt.startTime)\"\r\n [style.height.px]=\"getAppHeight(appt.duration)\">\r\n <div class=\"flex flex-col\" [class.gap-0.5]=\"appt.duration > 0.25\"\r\n [class.justify-center]=\"appt.duration <= 0.25\" [style.height.%]=\"100\">\r\n @if (appt.duration > 0.25) {\r\n <span\r\n class=\"text-[10px] font-bold opacity-70 uppercase tracking-widest\">{{appt.startTime}}</span>\r\n }\r\n <div class=\"flex items-center justify-between gap-1\">\r\n <p class=\"text-[13px] font-semibold leading-tight truncate\">{{appt.title}}</p>\r\n @if (appt.repeat && appt.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-3 h-3 text-slate-400 shrink-0\"></i-lucide> -->\r\n }\r\n </div>\r\n @if (appt.duration > 0.4) {\r\n <p class=\"text-[11px] opacity-60 font-medium truncate\">{{appt.category}}</p>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: flex;\r\n flex: 1;\r\n min-height: 0;\r\n flex-direction: column;\r\n }\r\n `]\r\n})\r\nexport class WeekViewComponent {\r\n @Input() viewDate: Date = new Date();\r\n @Input() currentTime: Date = new Date();\r\n @Input() appointments: any[] = [];\r\n @Input() todayStr: string = '';\r\n @Input() showWeekends: boolean = true;\r\n @Input() weekDates: any[] = [];\r\n @Input() times: string[] = [];\r\n\r\n @Output() onRightClick = new EventEmitter<any>();\r\n\r\n // repeatIcon = Repeat;\r\n\r\n formatDate(d: Date) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getAppointmentsForDate(date: Date) {\r\n const dStr = this.formatDate(date);\r\n return this.appointments.filter(a => a.date === dStr);\r\n }\r\n\r\n getAppTop(startTime: string) {\r\n const [hours, minutes] = startTime.split(':').map(Number);\r\n return (hours * 80) + (minutes / 60 * 80);\r\n }\r\n\r\n getAppHeight(duration: number) {\r\n return Math.max(duration * 80, 24);\r\n }\r\n\r\n getNowPosition() {\r\n return (this.currentTime.getHours() * 80) + (this.currentTime.getMinutes() / 60 * 80);\r\n }\r\n\r\n handleRightClick(event: MouseEvent, dateStr: string, timeSlot: string) {\r\n this.onRightClick.emit({ event, dateStr, timeSlot });\r\n }\r\n}\r\n","import { Component, computed, effect, ElementRef, EventEmitter, HostListener, Input, Output, signal, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AgendaViewComponent } from './components/agenda-view.component';\r\nimport { DayViewComponent } from './components/day-view.component';\r\nimport { HeaderComponent } from './components/header.component';\r\nimport { MonthViewComponent } from './components/month-view.component';\r\nimport { SidebarComponent } from './components/sidebar.component';\r\nimport { WeekViewComponent } from './components/week-view.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Appointment } from './modals/appointment';\r\n\r\n@Component({\r\n selector: 'lib-sn-calendar-view',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n SidebarComponent,\r\n HeaderComponent,\r\n DayViewComponent,\r\n WeekViewComponent,\r\n MonthViewComponent,\r\n AgendaViewComponent\r\n ],\r\n template: `\r\n <div class=\"h-screen flex bg-[#f8fafc] text-[#475569]\">\r\n\r\n <!-- SIDEBAR -->\r\n <app-sidebar [displayMonth]=\"displayMonth()\" [monthDays]=\"monthDays()\" [miniCalendarHeaders]=\"miniCalendarHeaders()\"\r\n [showWeekends]=\"showWeekends()\" (onPrevMonth)=\"prevMonth()\" (onNextMonth)=\"nextMonth()\"\r\n (onPrevYear)=\"prevYear()\" (onNextYear)=\"nextYear()\" (onSelectDate)=\"selectDate($event)\"\r\n (onToggleWeekends)=\"showWeekends.set(!showWeekends())\">\r\n </app-sidebar>\r\n\r\n <!-- MAIN CONTENT -->\r\n <main class=\"flex-1 flex flex-col min-w-0 bg-white overflow-hidden\">\r\n <!-- TOP NAVBAR -->\r\n <app-header [view]=\"view()\" [weekNumber]=\"weekNumber()\" [displayMonth]=\"displayMonth()\"\r\n (onGoToToday)=\"goToToday()\" (onCreateEvent)=\"onRightClick($event)\" (onPrev)=\"prev()\" (onNext)=\"next()\"\r\n (onSetView)=\"setView($event)\">\r\n </app-header>\r\n\r\n <!-- CALENDAR GRID -->\r\n @if (view() === 'day') {\r\n <app-day-view [viewDate]=\"viewDate()\" [currentTime]=\"currentTime()\" [appointments]=\"appointments()\"\r\n [todayStr]=\"todayStr\" [times]=\"times\"\r\n (onRightClick)=\"onRightClick($event.event, $event.dateStr, $event.timeSlot)\">\r\n </app-day-view>\r\n } @else if (view() === 'week') {\r\n <app-week-view [viewDate]=\"viewDate()\" [currentTime]=\"currentTime()\" [appointments]=\"appointments()\"\r\n [todayStr]=\"todayStr\" [showWeekends]=\"showWeekends()\" [weekDates]=\"weekDates()\" [times]=\"times\"\r\n (onRightClick)=\"onRightClick($event.event, $event.dateStr, $event.timeSlot)\">\r\n </app-week-view>\r\n } @else if (view() === 'month') {\r\n <app-month-view [viewDate]=\"viewDate()\" [appointments]=\"appointments()\" [todayStr]=\"todayStr\"\r\n [showWeekends]=\"showWeekends()\" [monthDays]=\"monthDays()\" [mainCalendarHeaders]=\"mainCalendarHeaders()\"\r\n (onRightClick)=\"onRightClick($event.event, $event.dateStr)\" (onMoreClick)=\"handleMoreClick($event)\">\r\n </app-month-view>\r\n } @else if (view() === 'agenda') {\r\n <app-agenda-view [agendaDays]=\"agendaDays()\">\r\n </app-agenda-view>\r\n }\r\n </main>\r\n\r\n <!-- EVENT DETAILS POPUP -->\r\n @if(selectedPopupDate()) {\r\n <div class=\"fixed inset-0 bg-black/10 backdrop-blur-[1px] z-[100] flex items-center justify-center\"\r\n (click)=\"closePopup()\">\r\n <div class=\"bg-white rounded-2xl shadow-2xl w-[400px] overflow-hidden p-6 relative animate-in fade-in zoom-in duration-200\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"flex justify-between items-center mb-6\">\r\n <h3 class=\"text-lg font-semibold text-slate-800\">{{ selectedPopupDate()?.date | date:'EEEE, MMM d' }}\r\n </h3>\r\n <button (click)=\"closePopup()\" class=\"p-1 hover:bg-slate-100 rounded-full transition-colors\">\r\n <!-- <i-lucide [img]=\"closeIcon\" class=\"w-5 h-5 text-slate-400\"></i-lucide> -->\r\n <img src=\"sn-calendar-view/assets/X.svg\" alt=\"\">\r\n </button>\r\n </div>\r\n <div class=\"space-y-4 max-h-[400px] overflow-y-auto pr-2\">\r\n @for(event of selectedPopupDate()?.events; track $index) {\r\n <div\r\n class=\"flex items-center gap-3 group cursor-pointer hover:bg-slate-50 p-1.5 rounded-lg transition-colors\">\r\n <div class=\"w-2.5 h-2.5 rounded-full shrink-0\" [ngClass]=\"event.color\"></div>\r\n <span class=\"text-sm font-medium text-slate-700 flex-1\">{{ event.title }}</span>\r\n @if (event.repeat && event.repeat !== 'None') {\r\n <!-- <i-lucide [img]=\"repeatIcon\" class=\"w-3.5 h-3.5 text-slate-400\"></i-lucide> -->\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- CREATE/EDIT EVENT POPUP -->\r\n @if(showEditPopup()) {\r\n <div class=\"fixed inset-0 bg-black/20 backdrop-blur-[2px] z-[150] flex items-center justify-center\"\r\n (click)=\"closeEditPopup()\">\r\n <div class=\"bg-white rounded-[24px] shadow-2xl w-[480px] p-8 relative animate-in fade-in zoom-in duration-200\"\r\n (click)=\"$event.stopPropagation()\">\r\n <!-- Popup Header -->\r\n <div class=\"flex justify-between items-center mb-8\">\r\n <h2 class=\"text-2xl font-semibold text-slate-800\">Edit</h2>\r\n <button (click)=\"closeEditPopup()\" class=\"p-2 hover:bg-slate-100 rounded-full transition-colors\">\r\n <!-- <i-lucide [img]=\"closeIcon\" class=\"w-6 h-6 text-slate-400\"></i-lucide> -->\r\n <img src=\"assets/X.svg\" alt=\"Close\" class=\"w-6 h-6 text-slate-400\">\r\n <img src=\"sn-calendar-view/assets/X.svg\" alt=\"Close\" class=\"w-6 h-6 text-slate-400\">\r\n </button>\r\n </div>\r\n\r\n <!-- Form Content -->\r\n <div class=\"space-y-6\">\r\n <!-- Name field -->\r\n <div class=\"relative\">\r\n <div class=\"absolute -top-2.5 left-4 bg-white px-1 text-xs font-medium text-blue-500 z-10\">Name\r\n </div>\r\n <input [(ngModel)]=\"editForm().title\"\r\n class=\"w-full border-2 border-blue-500 rounded-xl px-4 py-3.5 focus:outline-none text-slate-700 font-medium text-lg tracking-tight\"\r\n placeholder=\" \" />\r\n </div>\r\n\r\n <!-- Calendar Select -->\r\n <div class=\"relative\">\r\n <div class=\"absolute -top-2.5 left-4 bg-white px-1 text-[11px] font-medium text-slate-400 z-10\">\r\n Calendar</div>\r\n <div (click)=\"toggleDropdown('calendar', $event)\"\r\n class=\"dropdown-trigger w-full border border-slate-200 rounded-xl px-4 py-3.5 flex items-center justify-between cursor-pointer hover:border-slate-300 transition-colors\">\r\n <div class=\"flex items-center gap-3\">\r\n <div class=\"w-3.5 h-3.5 rounded-sm\" [ngClass]=\"getCategoryColor(editForm().category)\"></div>\r\n <span class=\"font-medium text-slate-700\">{{ editForm().category }}</span>\r\n </div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" [class.rotate-180]=\"activeDropdown() === 'calendar'\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-down-icon lucide-chevron-down text-slate-400 transition-transform duration-200\"><path d=\"m6 9 6 6 6-6\"/></svg>\r\n </div>\r\n\r\n @if (activeDropdown() === 'calendar') {\r\n <div [ngClass]=\"dropdownDirection() === 'top' ? 'bottom-full mb-2' : 'top-full mt-2'\"\r\n class=\"active-dropdown-menu absolute left-0 right-0 bg-white border border-slate-200 rounded-xl shadow-xl z-[200] py-2 overflow-hidden animate-in duration-200\">\r\n @for (cat of categories; track cat) {\r\n <div (click)=\"selectCategory(cat)\"\r\n class=\"px-4 py-3 hover:bg-slate-50 flex items-center gap-3 cursor-pointer transition-colors\">\r\n <div class=\"w-3 h-3 rounded-full\" [ngClass]=\"getCategoryColor(cat)\"></div>\r\n <span class=\"text-sm font-medium text-slate-700\">{{cat}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- All Day Toggle -->\r\n <div class=\"flex items-center gap-4 py-2\">\r\n <button (click)=\"toggleAllDay()\"\r\n class=\"w-12 h-6 rounded-full relative transition-colors duration-200 p-0 shadow-inner\"\r\n [class.bg-slate-300]=\"!editForm().allDay\" [class.bg-blue-500]=\"editForm().allDay\">\r\n <div class=\"absolute top-1 left-1 w-4 h-4 bg-white rounded-full transition-transform duration-200 shadow-md\"\r\n [class.translate-x-6]=\"editForm().allDay\"></div>\r\n </button>\r\n <span class=\"text-[17px] font-medium text-slate-700\">All day</span>\r\n </div>\r\n\r\n <div class=\"grid gap-4\" [class.grid-cols-2]=\"!editForm().allDay\">\r\n <div class=\"relative\" [class.col-span-2]=\"editForm().allDay\">\r\n <div class=\"absolute -top-2 font-medium text-[11px] text-slate-400 left-3 bg-white px-1\">Start\r\n </div>\r\n <div\r\n class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between relative overflow-hidden\">\r\n <input type=\"date\" [(ngModel)]=\"editForm().startDate\" (ngModelChange)=\"onStartDateChange()\"\r\n [min]=\"todayStr\" class=\"absolute inset-0 opacity-0 cursor-pointer z-20 w-full h-full\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ editForm().startDate | date:'MM/dd/yyyy'\r\n }}</span>\r\n <img src=\"assets/Calendar.svg\" alt=\"Calendar\" class=\"w-4 h-4 text-slate-500\">\r\n </div>\r\n </div>\r\n @if (!editForm().allDay) {\r\n <div class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between\">\r\n <button (click)=\"adjustTime('startTime', -15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left text-slate-400 group-hover:text-blue-500\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <div class=\"relative flex-1 text-center group\">\r\n <input type=\"time\" [(ngModel)]=\"editForm().startTime\"\r\n class=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full z-20\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ formatTime12h(editForm().startTime)\r\n }}</span>\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n <img src=\"sn-calendar-view/assets/Clock.svg\" alt=\"Clock\" class=\"w-4 h-4 text-slate-500\">\r\n <button (click)=\"adjustTime('startTime', 15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right text-slate-400 group-hover:text-blue-500\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"grid gap-4\" [class.grid-cols-2]=\"!editForm().allDay\">\r\n <div class=\"relative\" [class.col-span-2]=\"editForm().allDay\">\r\n <div class=\"absolute -top-2 font-medium text-[11px] text-slate-400 left-3 bg-white px-1\">End\r\n </div>\r\n <div\r\n class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between relative overflow-hidden\">\r\n <input type=\"date\" [(ngModel)]=\"editForm().endDate\" [min]=\"editForm().startDate\"\r\n class=\"absolute inset-0 opacity-0 cursor-pointer z-20 w-full h-full\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ editForm().endDate | date:'MM/dd/yyyy'\r\n }}</span>\r\n <img src=\"assets/Calendar.svg\" alt=\"Calendar\" class=\"w-4 h-4 text-slate-500\">\r\n </div>\r\n </div>\r\n @if (!editForm().allDay) {\r\n <div class=\"border border-slate-200 rounded-xl px-4 py-3 flex items-center justify-between\">\r\n <button (click)=\"adjustTime('endTime', -15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-left-icon lucide-chevron-left text-slate-400 group-hover:text-blue-500\"><path d=\"m15 18-6-6 6-6\"/></svg>\r\n </button>\r\n <div class=\"relative flex-1 text-center group\">\r\n <input type=\"time\" [(ngModel)]=\"editForm().endTime\"\r\n class=\"absolute inset-0 opacity-0 cursor-pointer w-full h-full z-20\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{ formatTime12h(editForm().endTime)\r\n }}</span>\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n <!-- <i-lucide [img]=\"clockIcon\" class=\"w-4 h-4 text-slate-500\"></i-lucide> -->\r\n <button (click)=\"adjustTime('endTime', 15)\"\r\n class=\"p-1 hover:bg-slate-100 rounded transition-colors group\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-chevron-right-icon lucide-chevron-right text-slate-400 group-hover:text-blue-500\"><path d=\"m9 18 6-6-6-6\"/></svg>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Repeat Select -->\r\n <div class=\"relative\">\r\n <div class=\"absolute -top-2 font-medium text-[11px] text-slate-400 left-3 bg-white px-1\">Repeat\r\n </div>\r\n <div (click)=\"toggleDropdown('repeat', $event)\"\r\n class=\"dropdown-trigger w-full border border-slate-200 rounded-xl px-4 py-3.5 flex items-center justify-between cursor-pointer hover:border-slate-300 transition-colors\">\r\n <span class=\"font-medium text-slate-700\">{{ editForm().repeat }}</span>\r\n <!-- <i-lucide [img]=\"chevronDown\" class=\"w-4 h-4 text-slate-400 transition-transform duration-200\"\r\n [class.rotate-180]=\"activeDropdown() === 'repeat'\"></i-lucide> -->\r\n </div>\r\n\r\n @if (activeDropdown() === 'repeat') {\r\n <div [ngClass]=\"dropdownDirection() === 'top' ? 'bottom-full mb-2' : 'top-full mt-2'\"\r\n class=\"active-dropdown-menu absolute left-0 right-0 bg-white border border-slate-200 rounded-xl shadow-xl z-[200] py-2 overflow-hidden animate-in duration-200\">\r\n @for (rep of repeatOptions(); track rep) {\r\n <div (click)=\"selectRepeat(rep)\"\r\n class=\"px-4 py-3 hover:bg-slate-50 cursor-pointer transition-colors\">\r\n <span class=\"text-sm font-medium text-slate-700\">{{rep}}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Buttons -->\r\n <div class=\"flex gap-4 mt-10\">\r\n <button (click)=\"saveEvent()\"\r\n class=\"flex-1 bg-blue-600 hover:bg-blue-700 text-white font-bold py-4 rounded-[18px] shadow-lg shadow-blue-200 transition-all text-lg\">\r\n Save\r\n </button>\r\n <button (click)=\"closeEditPopup()\"\r\n class=\"flex-1 bg-blue-50 hover:bg-blue-100 text-blue-700 font-bold py-4 rounded-[18px] transition-all text-lg\">\r\n Cancel\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- NOTIFICATION TOASTS -->\r\n <div class=\"fixed bottom-6 right-6 z-[300] flex flex-col gap-3 pointer-events-none\">\r\n @for (note of activeNotifications(); track note.id) {\r\n <div\r\n class=\"pointer-events-auto bg-white border-l-4 border-blue-600 rounded-xl shadow-2xl p-4 w-80 flex gap-4 animate-in slide-in-from-right duration-300\">\r\n <div class=\"w-10 h-10 rounded-full bg-blue-50 flex items-center justify-center shrink-0\">\r\n <!-- <i-lucide [img]=\"bellIcon\" class=\"w-5 h-5 text-blue-600 animate-bounce\"></i-lucide> -->\r\n </div>\r\n <div class=\"flex-1\">\r\n <div class=\"flex justify-between items-start mb-1\">\r\n <h4 class=\"text-xs font-bold text-slate-400 uppercase tracking-wider\">Reminder</h4>\r\n <button (click)=\"dismissNotification(note.id)\"\r\n class=\"text-slate-300 hover:text-slate-500 transition-colors\">\r\n <!-- <i-lucide [img]=\"closeIcon\" class=\"w-4 h-4\"></i-lucide> -->\r\n </button>\r\n </div>\r\n <p class=\"text-[15px] font-bold text-slate-800 leading-tight\">{{ note.title }}</p>\r\n <div class=\"flex items-center gap-1.5 mt-2\">\r\n <!-- <i-lucide [img]=\"clockIcon\" class=\"w-3.5 h-3.5 text-blue-500\"></i-lucide> -->\r\n <span class=\"text-[11px] font-bold text-blue-600\">Starts at {{ formatTime12h(note.startTime)\r\n }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n styles: ``,\r\n})\r\nexport class SnCalendarView {\r\n @Input() set initialAppointments(value: Appointment[]) {\r\n if (value) this.appointments.set(value);\r\n }\r\n @Input() categories = ['Bryntum team', 'Hospital', 'Clinic', 'Admin', 'Surgery', 'Event'];\r\n @Input() defaultView: 'day' | 'week' | 'month' | 'agenda' = 'week';\r\n\r\n @Output() onSaveEvent = new EventEmitter<any>();\r\n @Output() viewChanged = new EventEmitter<string>();\r\n\r\n appointments = signal<Appointment[]>([]);\r\n view = signal<'day' | 'week' | 'month' | 'agenda'>('week');\r\n viewDate = signal(new Date());\r\n currentTime = signal(new Date());\r\n activeDropdown = signal<'calendar' | 'repeat' | null>(null);\r\n dropdownDirection = signal<'top' | 'bottom'>('bottom');\r\n showWeekends = signal(true);\r\n todayStr = this.formatDate(new Date());\r\n selectedPopupDate = signal<{ date: Date, events: any[] } | null>(null);\r\n showEditPopup = signal(false);\r\n\r\n editForm = signal({\r\n title: '',\r\n category: 'Bryntum team',\r\n allDay: false,\r\n startDate: '',\r\n startTime: '09:00',\r\n endDate: '',\r\n endTime: '10:00',\r\n repeat: 'None'\r\n });\r\n\r\n // Icons\r\n // chevronDown = ChevronDown;\r\n // chevronLeft = ChevronLeft;\r\n // chevronRight = ChevronRight;\r\n // calendarIcon = Calendar;\r\n // clockIcon = Clock;\r\n // searchIcon = Search;\r\n // filterIcon = Filter;\r\n // closeIcon = X;\r\n // repeatIcon = Repeat;\r\n // bellIcon = Bell;\r\n\r\n activeNotifications = signal<any[]>([]);\r\n notifiedEventIds = new Set<number>();\r\n\r\n constructor(private el: ElementRef) {\r\n effect(() => {\r\n this.viewChanged.emit(this.view());\r\n });\r\n }\r\n // constructor() {\r\n\r\n // }\r\n ngOnInit() {\r\n this.view.set(this.defaultView);\r\n setInterval(() => {\r\n this.currentTime.set(new Date());\r\n this.checkUpcomingEvents();\r\n }, 60000);\r\n setTimeout(() => this.checkUpcomingEvents(), 2000);\r\n }\r\n\r\n checkUpcomingEvents() {\r\n const now = new Date();\r\n const todayStr = this.formatDate(now);\r\n const currentTotalMins = now.getHours() * 60 + now.getMinutes();\r\n\r\n const upcoming = this.appointments().filter(appt => {\r\n if (appt.date !== todayStr || this.notifiedEventIds.has(appt.id)) return false;\r\n const [h, m] = appt.startTime.split(':').map(Number);\r\n const apptTotalMins = h * 60 + m;\r\n const diff = apptTotalMins - currentTotalMins;\r\n return diff <= 15 && diff > 0;\r\n });\r\n\r\n if (upcoming.length > 0) {\r\n upcoming.forEach(event => {\r\n this.notifiedEventIds.add(event.id);\r\n this.activeNotifications.update(n => [...n, event]);\r\n setTimeout(() => this.dismissNotification(event.id), 10000);\r\n });\r\n }\r\n }\r\n\r\n dismissNotification(id: number) {\r\n this.activeNotifications.update(n => n.filter(e => e.id !== id));\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (!this.activeDropdown()) return;\r\n const target = event.target as HTMLElement;\r\n if (!target.closest('.active-dropdown-menu') && !target.closest('.dropdown-trigger')) {\r\n this.activeDropdown.set(null);\r\n }\r\n }\r\n\r\n miniCalendarHeaders = computed(() => this.showWeekends() ? ['S', 'M', 'T', 'W', 'T', 'F', 'S'] : ['M', 'T', 'W', 'T', 'F']);\r\n mainCalendarHeaders = computed(() => this.showWeekends() ? ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']);\r\n\r\n repeatOptions = computed(() => {\r\n const d = new Date(this.editForm().startDate || this.todayStr);\r\n const weekday = d.toLocaleString('default', { weekday: 'long' });\r\n const month = d.toLocaleString('default', { month: 'long' });\r\n const day = d.getDate();\r\n const getOrdinal = (n: number) => {\r\n const s = [\"th\", \"st\", \"nd\", \"rd\"];\r\n const v = n % 100;\r\n return n + (s[(v - 20) % 10] || s[v] || s[0]);\r\n };\r\n const occurrenceNames = [\"first\", \"second\", \"third\", \"fourth\", \"last\"];\r\n const occurrenceIndex = Math.floor((day - 1) / 7);\r\n return ['None', 'Daily', `Weekly on ${weekday}`, `Monthly on ${getOrdinal(day)}`, `Yearly on ${getOrdinal(day)} of ${month}`, `Monthly on the ${occurrenceNames[occurrenceIndex]} ${weekday}`, `Yearly on the ${occurrenceNames[occurrenceIndex]} ${weekday} of ${month}`];\r\n });\r\n\r\n daysShort = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\n displayMonth = computed(() => this.viewDate().toLocaleString('default', { month: 'long', year: 'numeric' }));\r\n weekNumber = computed(() => this.getWeekNumber(this.viewDate()));\r\n times = Array.from({ length: 24 }, (_, i) => {\r\n const hour = i === 0 ? 12 : i > 12 ? i - 12 : i;\r\n return `${hour} ${i < 12 ? 'AM' : 'PM'}`;\r\n });\r\n\r\n weekDates = computed(() => {\r\n const start = new Date(this.viewDate());\r\n start.setDate(start.getDate() - start.getDay());\r\n const dates = Array.from({ length: 7 }, (_, i) => {\r\n const d = new Date(start);\r\n d.setDate(start.getDate() + i);\r\n return { date: d, label: this.daysShort[d.getDay()], day: d.getDate(), active: d.toDateString() === this.viewDate().toDateString() };\r\n });\r\n return this.showWeekends() ? dates : dates.filter(d => d.date.getDay() !== 0 && d.date.getDay() !== 6);\r\n });\r\n\r\n monthDays = computed(() => {\r\n const year = this.viewDate().getFullYear();\r\n const month = this.viewDate().getMonth();\r\n const startDate = new Date(year, month, 1);\r\n startDate.setDate(startDate.getDate() - startDate.getDay());\r\n const days = [];\r\n for (let i = 0; i < 42; i++) {\r\n const d = new Date(startDate);\r\n d.setDate(startDate.getDate() + i);\r\n if (!this.showWeekends() && (d.getDay() === 0 || d.getDay() === 6)) continue;\r\n const isFirstOfMonth = d.getDate() === 1;\r\n days.push({\r\n date: new Date(d), day: d.getDate(), dateStr: this.formatDate(d),\r\n label: isFirstOfMonth ? d.toLocaleString('default', { month: 'short' }) + ' ' + d.getDate() : String(d.getDate()),\r\n current: d.getMonth() === month, active: d.toDateString() === new Date().toDateString(),\r\n weekNum: d.getDay() === (this.showWeekends() ? 0 : 1) ? this.getWeekNumber(d) : null, isFirstOfMonth\r\n });\r\n }\r\n return days;\r\n });\r\n\r\n agendaDays = computed(() => {\r\n const days = [];\r\n const baseDate = new Date(this.viewDate());\r\n for (let i = 0; i < 30; i++) {\r\n const d = new Date(baseDate);\r\n d.setDate(baseDate.getDate() + i);\r\n if (!this.showWeekends() && (d.getDay() === 0 || d.getDay() === 6)) continue;\r\n const events = this.getAppointmentsForDate(d);\r\n if (events.length > 0) {\r\n days.push({\r\n date: d, dayNum: d.getDate(), weekday: d.toLocaleString('default', { weekday: 'long' }),\r\n monthYear: d.toLocaleString('default', { month: 'short', year: 'numeric' }),\r\n events: events.map(e => ({ ...e, endTime: this.addHour(e.startTime) }))\r\n });\r\n }\r\n }\r\n return days;\r\n });\r\n\r\n formatDate(d: Date) { return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`; }\r\n getWeekNumber(d: Date): number {\r\n const tempDate = new Date(d.getTime());\r\n tempDate.setHours(0, 0, 0, 0);\r\n tempDate.setDate(tempDate.getDate() + 4 - (tempDate.getDay() || 7));\r\n const yearStart = new Date(tempDate.getFullYear(), 0, 1);\r\n return Math.ceil((((tempDate.getTime() - yearStart.getTime()) / 86400000) + 1) / 7);\r\n }\r\n\r\n setView(v: 'day' | 'week' | 'month' | 'agenda') { this.view.set(v); }\r\n prev() {\r\n const d = new Date(this.viewDate());\r\n if (this.view() === 'month') d.setMonth(d.getMonth() - 1);\r\n else if (this.view() === 'week') d.setDate(d.getDate() - 7);\r\n else { d.setDate(d.getDate() - 1); if (!this.showWeekends()) while (d.getDay() === 0 || d.getDay() === 6) d.setDate(d.getDate() - 1); }\r\n this.viewDate.set(d);\r\n }\r\n next() {\r\n const d = new Date(this.viewDate());\r\n if (this.view() === 'month') d.setMonth(d.getMonth() + 1);\r\n else if (this.view() === 'week') d.setDate(d.getDate() + 7);\r\n else { d.setDate(d.getDate() + 1); if (!this.showWeekends()) while (d.getDay() === 0 || d.getDay() === 6) d.setDate(d.getDate() + 1); }\r\n this.viewDate.set(d);\r\n }\r\n prevMonth() { const d = new Date(this.viewDate()); d.setMonth(d.getMonth() - 1); this.viewDate.set(d); }\r\n nextMonth() { const d = new Date(this.viewDate()); d.setMonth(d.getMonth() + 1); this.viewDate.set(d); }\r\n prevYear() { const d = new Date(this.viewDate()); d.setFullYear(d.getFullYear() - 1); this.viewDate.set(d); }\r\n nextYear() { const d = new Date(this.viewDate()); d.setFullYear(d.getFullYear() + 1); this.viewDate.set(d); }\r\n\r\n getAppointmentsForDate(date: Date) { return this.appointments().filter(a => a.date === this.formatDate(date)); }\r\n addMinutes(time: string, mins: number) {\r\n const [h, m] = time.split(':').map(Number);\r\n let total = (h * 60 + m + mins) % (24 * 60);\r\n if (total < 0) total += 24 * 60;\r\n return `${String(Math.floor(total / 60)).padStart(2, '0')}:${String(total % 60).padStart(2, '0')}`;\r\n }\r\n addHour(time: string) { return this.addMinutes(time, 60); }\r\n\r\n adjustTime(field: 'startTime' | 'endTime', amount: number) {\r\n this.editForm.update(f => {\r\n const newTime = this.addMinutes(f[field], amount);\r\n return { ...f, [field]: newTime };\r\n });\r\n this.validateTimeOrder();\r\n }\r\n\r\n private validateTimeOrder() {\r\n const form = this.editForm();\r\n if (form.startDate !== form.endDate) return;\r\n const [sH, sM] = form.startTime.split(':').map(Number);\r\n const [eH, eM] = form.endTime.split(':').map(Number);\r\n if ((eH * 60 + eM) < (sH * 60 + sM + 15)) {\r\n this.editForm.update(f => ({ ...f, endTime: this.addMinutes(f.startTime, 15) }));\r\n }\r\n }\r\n\r\n formatTime12h(time: string) {\r\n if (!time) return '';\r\n const [h, m] = time.split(':').map(Number);\r\n return `${h % 12 || 12}:${String(m).padStart(2, '0')} ${h >= 12 ? 'PM' : 'AM'}`;\r\n }\r\n\r\n toggleDropdown(type: 'calendar' | 'repeat', event: MouseEvent) {\r\n if (this.activeDropdown() === type) { this.activeDropdown.set(null); return; }\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\r\n this.dropdownDirection.set((window.innerHeight - rect.bottom) < 240 ? 'top' : 'bottom');\r\n this.activeDropdown.set(type);\r\n }\r\n\r\n selectCategory(cat: string) { this.editForm.update(f => ({ ...f, category: cat })); this.activeDropdown.set(null); }\r\n selectRepeat(rep: string) { this.editForm.update(f => ({ ...f, repeat: rep })); this.activeDropdown.set(null); }\r\n getCategoryColor(cat: string): string {\r\n const colors: Record<string, string> = { 'Bryntum team': 'bg-blue-500', 'Hospital': 'bg-blue-500', 'Clinic': 'bg-green-500', 'Admin': 'bg-orange-500', 'Surgery': 'bg-red-500', 'Event': 'bg-purple-500' };\r\n return colors[cat] || 'bg-slate-400';\r\n }\r\n\r\n saveEvent() {\r\n this.onSaveEvent.emit(this.editForm());\r\n this.showEditPopup.set(false);\r\n }\r\n\r\n closeEditPopup() { this.showEditPopup.set(false); }\r\n goToToday() { this.viewDate.set(new Date()); }\r\n onStartDateChange() {\r\n if (this.editForm().endDate < this.editForm().startDate) {\r\n this.editForm.update(f => ({ ...f, endDate: f.startDate }));\r\n }\r\n }\r\n selectDate(d: Date) { this.viewDate.set(new Date(d)); }\r\n toggleAllDay() {\r\n this.editForm.update(f => ({\r\n ...f, allDay: !f.allDay,\r\n startTime: !f.allDay ? '00:00' : '09:00',\r\n endTime: !f.allDay ? '00:00' : '09:30'\r\n }));\r\n }\r\n\r\n onRightClick(event: MouseEvent, dateStr?: string, timeSlot?: string) {\r\n event.preventDefault();\r\n const targetDate = dateStr || this.formatDate(new Date());\r\n if (targetDate < this.todayStr) return;\r\n let finalStartTime = timeSlot || '09:00';\r\n if (timeSlot) {\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\r\n const minutesToAdd = Math.min(45, Math.floor((event.clientY - rect.top) / 20) * 15);\r\n if (minutesToAdd > 0) finalStartTime = this.addMinutes(timeSlot, minutesToAdd);\r\n }\r\n this.editForm.set({ title: '', category: 'Bryntum team', allDay: false, startDate: targetDate, startTime: finalStartTime, endDate: targetDate, endTime: this.addMinutes(finalStartTime, 30), repeat: 'None' });\r\n this.showEditPopup.set(true);\r\n }\r\n\r\n handleMoreClick(day: any) {\r\n this.selectedPopupDate.set({\r\n date: day.date,\r\n events: this.getAppointmentsForDate(day.date).map(e => ({\r\n title: e.title,\r\n type: e.type || (e.duration >= 24 ? 'bar' : 'dot'),\r\n color: e.type === 'bar' ? `${e.color} ${e.textColor} ${e.borderColor}` : (e.color.indexOf('orange') !== -1 ? 'bg-orange-500' : e.color.indexOf('green') !== -1 ? 'bg-green-500' : e.color.indexOf('red') !== -1 ? 'bg-red-500' : 'bg-blue-500'),\r\n repeat: e.repeat\r\n }))\r\n });\r\n }\r\n closePopup() { this.selectedPopupDate.set(null); }\r\n}\r\n","/*\r\n * Public API Surface of sn-calendar-view\r\n */\r\n\r\nexport * from './lib/sn-calendar-view';\r\nexport * from './lib/components/month-view.component';\r\nexport * from './lib/components/sidebar.component';\r\nexport * from './lib/components/week-view.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "name": "Sachin Budni",
5
5
  "email": "sachinbudnibnt@gmail.com"
6
6
  },
7
- "version": "0.0.2",
7
+ "version": "0.0.3",
8
8
  "peerDependencies": {
9
9
  "@angular/common": "^20.3.0",
10
10
  "@angular/core": "^20.3.0",