@acorex/components 19.14.0-next.0 → 19.14.0-next.1
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.
- package/fesm2022/acorex-components-action-sheet.mjs +10 -10
- package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
- package/fesm2022/acorex-components-alert.mjs +7 -7
- package/fesm2022/acorex-components-alert.mjs.map +1 -1
- package/fesm2022/acorex-components-audio-wave.mjs +7 -7
- package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
- package/fesm2022/acorex-components-autocomplete.mjs +7 -7
- package/fesm2022/acorex-components-autocomplete.mjs.map +1 -1
- package/fesm2022/acorex-components-avatar.mjs +10 -10
- package/fesm2022/acorex-components-avatar.mjs.map +1 -1
- package/fesm2022/acorex-components-badge.mjs +7 -7
- package/fesm2022/acorex-components-badge.mjs.map +1 -1
- package/fesm2022/acorex-components-bottom-navigation.mjs +10 -10
- package/fesm2022/acorex-components-bottom-navigation.mjs.map +1 -1
- package/fesm2022/acorex-components-breadcrumbs.mjs +10 -10
- package/fesm2022/acorex-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/acorex-components-button-group.mjs +10 -10
- package/fesm2022/acorex-components-button-group.mjs.map +1 -1
- package/fesm2022/acorex-components-button.mjs +13 -13
- package/fesm2022/acorex-components-button.mjs.map +1 -1
- package/fesm2022/acorex-components-calendar.mjs +13 -13
- package/fesm2022/acorex-components-calendar.mjs.map +1 -1
- package/fesm2022/acorex-components-check-box.mjs +7 -7
- package/fesm2022/acorex-components-check-box.mjs.map +1 -1
- package/fesm2022/acorex-components-chips.mjs +7 -7
- package/fesm2022/acorex-components-chips.mjs.map +1 -1
- package/fesm2022/acorex-components-circular-progress.mjs +7 -7
- package/fesm2022/acorex-components-circular-progress.mjs.map +1 -1
- package/fesm2022/acorex-components-collapse.mjs +10 -10
- package/fesm2022/acorex-components-collapse.mjs.map +1 -1
- package/fesm2022/acorex-components-color-box.mjs +7 -7
- package/fesm2022/acorex-components-color-box.mjs.map +1 -1
- package/fesm2022/acorex-components-color-palette.mjs +25 -25
- package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
- package/fesm2022/acorex-components-comment.mjs +28 -28
- package/fesm2022/acorex-components-comment.mjs.map +1 -1
- package/fesm2022/acorex-components-common.mjs +91 -91
- package/fesm2022/acorex-components-common.mjs.map +1 -1
- package/fesm2022/acorex-components-conversation.mjs +49 -49
- package/fesm2022/acorex-components-conversation.mjs.map +1 -1
- package/fesm2022/acorex-components-cron-job.mjs +46 -46
- package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
- package/fesm2022/acorex-components-data-pager.mjs +31 -31
- package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
- package/fesm2022/acorex-components-data-table.mjs +37 -37
- package/fesm2022/acorex-components-data-table.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-box.mjs +7 -7
- package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-input.mjs +7 -7
- package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-picker.mjs +7 -7
- package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-decorators.mjs +25 -25
- package/fesm2022/acorex-components-decorators.mjs.map +1 -1
- package/fesm2022/acorex-components-dialog.mjs +10 -10
- package/fesm2022/acorex-components-dialog.mjs.map +1 -1
- package/fesm2022/acorex-components-drawer.mjs +13 -13
- package/fesm2022/acorex-components-drawer.mjs.map +1 -1
- package/fesm2022/acorex-components-dropdown-button.mjs +7 -7
- package/fesm2022/acorex-components-dropdown-button.mjs.map +1 -1
- package/fesm2022/acorex-components-dropdown.mjs +13 -13
- package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
- package/fesm2022/acorex-components-file-explorer.mjs +25 -25
- package/fesm2022/acorex-components-file-explorer.mjs.map +1 -1
- package/fesm2022/acorex-components-flow-chart.mjs +16 -16
- package/fesm2022/acorex-components-flow-chart.mjs.map +1 -1
- package/fesm2022/acorex-components-form.mjs +16 -16
- package/fesm2022/acorex-components-form.mjs.map +1 -1
- package/fesm2022/acorex-components-grid-layout-builder.mjs +10 -10
- package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-components-image-editor.mjs +34 -34
- package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
- package/fesm2022/acorex-components-image.mjs +7 -7
- package/fesm2022/acorex-components-image.mjs.map +1 -1
- package/fesm2022/acorex-components-json-viewer.mjs +7 -7
- package/fesm2022/acorex-components-json-viewer.mjs.map +1 -1
- package/fesm2022/acorex-components-kbd.mjs +10 -10
- package/fesm2022/acorex-components-kbd.mjs.map +1 -1
- package/fesm2022/acorex-components-label.mjs +7 -7
- package/fesm2022/acorex-components-label.mjs.map +1 -1
- package/fesm2022/acorex-components-list.mjs +7 -7
- package/fesm2022/acorex-components-list.mjs.map +1 -1
- package/fesm2022/acorex-components-loading-dialog.mjs +10 -10
- package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
- package/fesm2022/acorex-components-loading.mjs +16 -16
- package/fesm2022/acorex-components-loading.mjs.map +1 -1
- package/fesm2022/acorex-components-map.mjs +10 -10
- package/fesm2022/acorex-components-map.mjs.map +1 -1
- package/fesm2022/acorex-components-media-viewer.mjs +34 -34
- package/fesm2022/acorex-components-media-viewer.mjs.map +1 -1
- package/fesm2022/acorex-components-menu.mjs +16 -16
- package/fesm2022/acorex-components-menu.mjs.map +1 -1
- package/fesm2022/{acorex-components-modal-acorex-components-modal-B4nBGqa3.mjs → acorex-components-modal-acorex-components-modal-C83n2Gqn.mjs} +21 -21
- package/fesm2022/{acorex-components-modal-acorex-components-modal-B4nBGqa3.mjs.map → acorex-components-modal-acorex-components-modal-C83n2Gqn.mjs.map} +1 -1
- package/fesm2022/{acorex-components-modal-modal-content.component-oWerCvDI.mjs → acorex-components-modal-modal-content.component-YrM5Oi9b.mjs} +5 -5
- package/fesm2022/{acorex-components-modal-modal-content.component-oWerCvDI.mjs.map → acorex-components-modal-modal-content.component-YrM5Oi9b.mjs.map} +1 -1
- package/fesm2022/acorex-components-modal.mjs +1 -1
- package/fesm2022/acorex-components-navbar.mjs +7 -7
- package/fesm2022/acorex-components-navbar.mjs.map +1 -1
- package/fesm2022/acorex-components-notification.mjs +10 -10
- package/fesm2022/acorex-components-notification.mjs.map +1 -1
- package/fesm2022/acorex-components-number-box.mjs +7 -7
- package/fesm2022/acorex-components-number-box.mjs.map +1 -1
- package/fesm2022/acorex-components-otp.mjs +7 -7
- package/fesm2022/acorex-components-otp.mjs.map +1 -1
- package/fesm2022/acorex-components-page.mjs +10 -10
- package/fesm2022/acorex-components-page.mjs.map +1 -1
- package/fesm2022/acorex-components-paint.mjs +25 -25
- package/fesm2022/acorex-components-paint.mjs.map +1 -1
- package/fesm2022/acorex-components-password-box.mjs +10 -10
- package/fesm2022/acorex-components-password-box.mjs.map +1 -1
- package/fesm2022/acorex-components-pdf-reader.mjs +7 -7
- package/fesm2022/acorex-components-pdf-reader.mjs.map +1 -1
- package/fesm2022/acorex-components-phone-box.mjs +7 -7
- package/fesm2022/acorex-components-phone-box.mjs.map +1 -1
- package/fesm2022/acorex-components-picker.mjs +13 -13
- package/fesm2022/acorex-components-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-popover.mjs +7 -7
- package/fesm2022/acorex-components-popover.mjs.map +1 -1
- package/fesm2022/acorex-components-popup.mjs +10 -10
- package/fesm2022/acorex-components-popup.mjs.map +1 -1
- package/fesm2022/acorex-components-progress-bar.mjs +7 -7
- package/fesm2022/acorex-components-progress-bar.mjs.map +1 -1
- package/fesm2022/acorex-components-qrcode.mjs +7 -7
- package/fesm2022/acorex-components-qrcode.mjs.map +1 -1
- package/fesm2022/acorex-components-query-builder.mjs +8 -8
- package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
- package/fesm2022/acorex-components-radio.mjs +7 -7
- package/fesm2022/acorex-components-radio.mjs.map +1 -1
- package/fesm2022/acorex-components-rail-navigation.mjs +13 -13
- package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
- package/fesm2022/acorex-components-range-slider.mjs +7 -7
- package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
- package/fesm2022/acorex-components-rate-picker.mjs +7 -7
- package/fesm2022/acorex-components-rate-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-rest-api-generator.mjs +22 -22
- package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
- package/fesm2022/acorex-components-result.mjs +7 -7
- package/fesm2022/acorex-components-result.mjs.map +1 -1
- package/fesm2022/acorex-components-routing-progress.mjs +7 -7
- package/fesm2022/acorex-components-routing-progress.mjs.map +1 -1
- package/fesm2022/acorex-components-scheduler.mjs +157 -45
- package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
- package/fesm2022/acorex-components-scss.mjs +4 -4
- package/fesm2022/acorex-components-scss.mjs.map +1 -1
- package/fesm2022/acorex-components-search-box.mjs +7 -7
- package/fesm2022/acorex-components-search-box.mjs.map +1 -1
- package/fesm2022/acorex-components-select-box.mjs +22 -10
- package/fesm2022/acorex-components-select-box.mjs.map +1 -1
- package/fesm2022/acorex-components-selection-list.mjs +7 -7
- package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
- package/fesm2022/acorex-components-side-menu.mjs +13 -13
- package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
- package/fesm2022/acorex-components-skeleton.mjs +7 -7
- package/fesm2022/acorex-components-skeleton.mjs.map +1 -1
- package/fesm2022/acorex-components-slider.mjs +7 -7
- package/fesm2022/acorex-components-slider.mjs.map +1 -1
- package/fesm2022/acorex-components-sliding-item.mjs +13 -13
- package/fesm2022/acorex-components-sliding-item.mjs.map +1 -1
- package/fesm2022/acorex-components-step-wizard.mjs +13 -13
- package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
- package/fesm2022/acorex-components-switch.mjs +10 -10
- package/fesm2022/acorex-components-switch.mjs.map +1 -1
- package/fesm2022/acorex-components-tabs.mjs +13 -13
- package/fesm2022/acorex-components-tabs.mjs.map +1 -1
- package/fesm2022/acorex-components-tag-box.mjs +7 -7
- package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
- package/fesm2022/acorex-components-tag.mjs +7 -7
- package/fesm2022/acorex-components-tag.mjs.map +1 -1
- package/fesm2022/acorex-components-text-area.mjs +7 -7
- package/fesm2022/acorex-components-text-area.mjs.map +1 -1
- package/fesm2022/acorex-components-text-box.mjs +10 -10
- package/fesm2022/acorex-components-text-box.mjs.map +1 -1
- package/fesm2022/acorex-components-time-duration.mjs +247 -0
- package/fesm2022/acorex-components-time-duration.mjs.map +1 -0
- package/fesm2022/acorex-components-time-line.mjs +10 -10
- package/fesm2022/acorex-components-time-line.mjs.map +1 -1
- package/fesm2022/acorex-components-toast.mjs +10 -10
- package/fesm2022/acorex-components-toast.mjs.map +1 -1
- package/fesm2022/acorex-components-toolbar.mjs +7 -7
- package/fesm2022/acorex-components-toolbar.mjs.map +1 -1
- package/fesm2022/acorex-components-tooltip.mjs +10 -10
- package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
- package/fesm2022/acorex-components-tree-view.mjs +10 -10
- package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
- package/fesm2022/acorex-components-uploader.mjs +22 -22
- package/fesm2022/acorex-components-uploader.mjs.map +1 -1
- package/fesm2022/acorex-components-video-player.mjs +7 -7
- package/fesm2022/acorex-components-video-player.mjs.map +1 -1
- package/fesm2022/acorex-components-wysiwyg.mjs +31 -31
- package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
- package/package.json +5 -1
- package/scheduler/lib/scheduler.class.d.ts +4 -0
- package/scheduler/lib/scheduler.component.d.ts +5 -3
- package/scheduler/lib/views/agenda/scheduler-agenda-view.component.d.ts +5 -2
- package/scheduler/lib/views/day/scheduler-day-view.component.d.ts +7 -3
- package/scheduler/lib/views/month/scheduler-month-view.component.d.ts +5 -2
- package/scheduler/lib/views/timeline-day/scheduler-timeline-day-view.component.d.ts +5 -2
- package/scheduler/lib/views/timeline-month/scheduler-timeline-month-view.component.d.ts +5 -2
- package/scheduler/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.d.ts +3 -2
- package/scheduler/lib/views/week/scheduler-week-view.component.d.ts +6 -2
- package/time-duration/README.md +3 -0
- package/time-duration/index.d.ts +3 -0
- package/time-duration/lib/time-duration.component.d.ts +29 -0
- package/time-duration/lib/time-duration.module.d.ts +7 -0
- package/time-duration/lib/time-duration.type.d.ts +1 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"acorex-components-scheduler.mjs","sources":["../../../../libs/components/scheduler/src/lib/scheduler.service.ts","../../../../libs/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.ts","../../../../libs/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.html","../../../../libs/components/scheduler/src/lib/views/day/scheduler-day-view.component.ts","../../../../libs/components/scheduler/src/lib/views/day/scheduler-day-view.component.html","../../../../libs/components/scheduler/src/lib/views/month/scheduler-month-view.component.ts","../../../../libs/components/scheduler/src/lib/views/month/scheduler-month-view.component.html","../../../../libs/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.ts","../../../../libs/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.html","../../../../libs/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.ts","../../../../libs/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.html","../../../../libs/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.ts","../../../../libs/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.html","../../../../libs/components/scheduler/src/lib/views/week/scheduler-week-view.component.ts","../../../../libs/components/scheduler/src/lib/views/week/scheduler-week-view.component.html","../../../../libs/components/scheduler/src/lib/scheduler.component.ts","../../../../libs/components/scheduler/src/lib/scheduler.component.html","../../../../libs/components/scheduler/src/lib/scheduler.module.ts","../../../../libs/components/scheduler/src/acorex-components-scheduler.ts"],"sourcesContent":["import { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { inject, Injectable } from '@angular/core';\nimport {\n AXDayOfWeekName,\n AXSchedulerActiveAppointmentsInBlock,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentsByStartBlock,\n AXSchedulerAppointmentType,\n AXSchedulerBlockIdentifier,\n AXSchedulerSlotEvent,\n AXSchedulerView,\n} from './scheduler.class';\n\n@Injectable({\n providedIn: 'root', // Provide service application-wide\n})\nexport class AXSchedulerService {\n private formatService = inject(AXFormatService);\n\n readonly HOURS_PER_DAY = 24;\n readonly MINUTES_PER_HOUR = 60;\n readonly BLOCK_DURATION_MINUTES = 30;\n readonly MILLISECONDS_PER_MINUTE = 60 * 1000;\n readonly MILLISECONDS_PER_DAY = this.HOURS_PER_DAY * this.MINUTES_PER_HOUR * this.MILLISECONDS_PER_MINUTE;\n\n /**\n * Checks if two appointments overlap in time.\n */\n doAppointmentsOverlap(appointmentA: AXSchedulerAppointmentType, appointmentB: AXSchedulerAppointmentType): boolean {\n if (!appointmentA?.startDate || !appointmentA.endDate || !appointmentB?.startDate || !appointmentB.endDate) {\n return false;\n }\n const startA = appointmentA.startDate.date.getTime();\n const endA = appointmentA.endDate.date.getTime();\n const startB = appointmentB.startDate.date.getTime();\n const endB = appointmentB.endDate.date.getTime();\n // Uses strict overlap check (change < / > to <= / >= if touching boundaries count)\n return startA < endB && endA > startB;\n }\n\n /**\n * Calculates appointment duration in minutes.\n */\n calculateDurationInMinutes(Appointment: AXSchedulerAppointmentType): number {\n if (!Appointment?.startDate || !Appointment.endDate) return 0;\n const durationMillis = Appointment.endDate.date.getTime() - Appointment.startDate.date.getTime();\n return Math.max(0, durationMillis / this.MILLISECONDS_PER_MINUTE);\n }\n\n /**\n * Calculates appointment duration in blocks (default 30 min).\n */\n calculateDurationInBlocks(appointment: AXSchedulerAppointmentType): number {\n const durationMinutes = this.calculateDurationInMinutes(appointment);\n return Math.ceil(durationMinutes / this.BLOCK_DURATION_MINUTES);\n }\n\n /**\n * Gets the day index (relative to view start) and block index (relative to start hour)\n * for a given date time within the view context. Returns null if outside view.\n */\n getBlockIdentifier(\n dateTime: AXDateTime,\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number, // Exclusive end hour\n viewTotalDays = 1, // Default to 1 for day view\n ): AXSchedulerBlockIdentifier | null {\n if (!viewStartDate || !dateTime || typeof startHour !== 'number' || typeof endHour !== 'number') {\n return null;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Calculate exclusive end date\n\n // Check if dateTime is within the view's date and time range\n if (\n dateTime.compare(viewStartDate, 'day') < 0 ||\n dateTime.compare(viewEndDate, 'day') >= 0 || // Check against exclusive end date\n dateTime.hour < startHour ||\n dateTime.hour >= endHour // Check against exclusive end hour\n ) {\n return null;\n }\n\n // Calculate day index relative to view start\n const dayIndex = Math.floor((dateTime.date.getTime() - viewStartDate.date.getTime()) / this.MILLISECONDS_PER_DAY);\n\n // Ensure dayIndex is valid for the view duration\n if (dayIndex < 0 || dayIndex >= viewTotalDays) {\n return null;\n }\n\n const minutesIntoDay = dateTime.hour * this.MINUTES_PER_HOUR + dateTime.minute;\n const minutesIntoViewHours = minutesIntoDay - startHour * this.MINUTES_PER_HOUR;\n\n // This check should be redundant due to initial hour check, but safe to keep\n if (minutesIntoViewHours < 0) return null;\n\n const blockIndex = Math.floor(minutesIntoViewHours / this.BLOCK_DURATION_MINUTES);\n\n return { dayIndex, blockIndex };\n }\n\n /**\n * Groups appointments by the blocks they are ACTIVE in for a given view.\n * @param viewTotalDays - Number of days in the current view (1 for Day, 7 for Week, etc.)\n */\n calculateActiveAppointmentsInBlock(\n singleDayAppointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n viewTotalDays: number, // Now required\n ): AXSchedulerActiveAppointmentsInBlock {\n const blocks: AXSchedulerActiveAppointmentsInBlock = {};\n if (!viewStartDate || typeof startHour !== 'number' || typeof endHour !== 'number' || viewTotalDays <= 0) {\n return blocks;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Exclusive end date\n // Calculate total blocks based on consistent block duration\n const totalBlocksPerDay = Math.max(\n 0,\n (endHour - startHour) * (this.MINUTES_PER_HOUR / this.BLOCK_DURATION_MINUTES),\n );\n\n singleDayAppointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.key) return;\n\n // Clamp appointment start/end times to the view boundaries (days and hours)\n let effectiveStart = appointment.startDate.compare(viewStartDate) < 0 ? viewStartDate : appointment.startDate;\n if (effectiveStart.hour < startHour) effectiveStart = effectiveStart.set('hour', startHour).set('minute', 0);\n\n let effectiveEnd = appointment.endDate.compare(viewEndDate) >= 0 ? viewEndDate : appointment.endDate;\n if (effectiveEnd.hour >= endHour) {\n const endDayBase = effectiveEnd.compare(viewEndDate) >= 0 ? viewEndDate.add('day', -1) : effectiveEnd;\n effectiveEnd = endDayBase.set('hour', endHour).set('minute', 0);\n }\n\n // Get start block info using the specified viewTotalDays\n const startInfo = this.getBlockIdentifier(effectiveStart, viewStartDate, startHour, endHour, viewTotalDays);\n if (!startInfo) return; // Appointment starts completely outside view\n\n // Get end block info (last block occupied) using the specified viewTotalDays\n const timeBeforeEnd = effectiveEnd.add('minute', -1);\n const endInfo = this.getBlockIdentifier(timeBeforeEnd, viewStartDate, startHour, endHour, viewTotalDays);\n // If endInfo is null, it means the appointment ends before the viewable part starts,\n // or exactly at the start, so it occupies no blocks. Handle this case.\n if (\n !endInfo ||\n endInfo.dayIndex < startInfo.dayIndex ||\n (endInfo.dayIndex === startInfo.dayIndex && endInfo.blockIndex < startInfo.blockIndex)\n ) {\n return; // Appointment effectively has no duration within the viewable blocks\n }\n\n // Iterate through the days and blocks the appointment spans within the view\n for (let dIdx = startInfo.dayIndex; dIdx <= endInfo.dayIndex; dIdx++) {\n // Clamp day index just in case (should be handled by getBlockIdentifier checks)\n if (dIdx < 0 || dIdx >= viewTotalDays) continue;\n\n const startBlock = dIdx === startInfo.dayIndex ? startInfo.blockIndex : 0;\n // Make sure endBlock doesn't exceed the calculated totalBlocksPerDay\n const endBlock = dIdx === endInfo.dayIndex ? endInfo.blockIndex : totalBlocksPerDay - 1;\n\n if (!blocks[dIdx]) blocks[dIdx] = {};\n\n for (let bIdx = startBlock; bIdx <= endBlock; bIdx++) {\n // Final check for block index validity\n if (bIdx >= 0 && bIdx < totalBlocksPerDay) {\n if (!blocks[dIdx][bIdx]) blocks[dIdx][bIdx] = [];\n // Avoid duplicates if the same appointment is processed multiple times (shouldn't happen with outer loop)\n if (!blocks[dIdx][bIdx].some((e) => e.key === appointment.key)) {\n blocks[dIdx][bIdx].push(appointment);\n }\n }\n }\n }\n });\n return blocks;\n }\n\n /**\n * Calculates max concurrency and effective total columns for Day View appointments.\n */\n calculateDayViewConcurrencyInfo(\n singleDayAppointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime, // Need start date for context\n startHour: number,\n endHour: number,\n ): Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> {\n const concurrencyInfo = new Map<any, { maxConcurrency: number; effectiveTotalColumns: number }>();\n if (singleDayAppointments.length === 0) return concurrencyInfo;\n\n // Use the consolidated function for day view (viewTotalDays = 1)\n // It returns ActiveAppointmentsInBlock, which has dayIndex 0 for Day view\n const activeAppointmentsMap = this.calculateActiveAppointmentsInBlock(\n singleDayAppointments,\n viewStartDate,\n startHour,\n endHour,\n 1,\n );\n const blocks = activeAppointmentsMap[0] ?? {}; // Extract blocks for the single day (dayIndex 0)\n\n // --- The rest of the logic remains the same, using the 'blocks' derived above ---\n\n // 1. Calculate maxConcurrency for each appointment based on blocks it occupies\n const maxConcurrencyMap: Record<any, number> = {};\n singleDayAppointments.forEach((appointment) => {\n let maxOverlap = 0;\n // Recalculate block range for *this specific appointment* relative to view hours\n const startMinutes = appointment.startDate.hour * this.MINUTES_PER_HOUR + appointment.startDate.minute;\n const endMinutes = appointment.endDate.hour * this.MINUTES_PER_HOUR + appointment.endDate.minute;\n const startBlockOffset = Math.max(0, startMinutes - startHour * this.MINUTES_PER_HOUR);\n const endBlockOffset = Math.min(\n (endHour - startHour) * this.MINUTES_PER_HOUR,\n endMinutes - startHour * this.MINUTES_PER_HOUR,\n );\n const startBlockIndex = Math.floor(startBlockOffset / this.BLOCK_DURATION_MINUTES);\n const endBlockIndex = Math.ceil(endBlockOffset / this.BLOCK_DURATION_MINUTES);\n\n for (let blockIdx = startBlockIndex; blockIdx < endBlockIndex; blockIdx++) {\n const blockData = blocks[blockIdx]; // Access block data using block index\n if (blockData) {\n // blockData now contains appointment objects, use length directly\n maxOverlap = Math.max(maxOverlap, blockData.length);\n }\n }\n // Edge case handling (use blockData.length)\n const startBlockData = blocks[startBlockIndex];\n if (startBlockData) {\n if (startBlockIndex === endBlockIndex - 1 || startBlockIndex >= endBlockIndex) {\n maxOverlap = Math.max(maxOverlap, startBlockData.length);\n }\n }\n\n maxConcurrencyMap[appointment.key] = maxOverlap || 1;\n });\n\n // 2. Calculate effectiveTotalColumns by checking overlaps\n singleDayAppointments.forEach((appointment) => {\n const appointmentKey = appointment.key;\n let effectiveTotalColumns = maxConcurrencyMap[appointmentKey] || 1;\n\n for (const otherAppointment of singleDayAppointments) {\n if (appointmentKey === otherAppointment.key) continue;\n if (this.doAppointmentsOverlap(appointment, otherAppointment)) {\n const otherMaxConcurrency = maxConcurrencyMap[otherAppointment.key] || 1;\n effectiveTotalColumns = Math.max(effectiveTotalColumns, otherMaxConcurrency);\n }\n }\n concurrencyInfo.set(appointmentKey, {\n maxConcurrency: maxConcurrencyMap[appointmentKey] || 1, // Keep original max concurrency\n effectiveTotalColumns: effectiveTotalColumns,\n });\n });\n\n return concurrencyInfo;\n }\n\n /**\n * Groups appointments by the block they START in for Week View.\n */\n calculateWeekViewAppointmentsByStartBlock(\n singleDayAppointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n ): AXSchedulerAppointmentsByStartBlock {\n const blocks: AXSchedulerAppointmentsByStartBlock = {};\n singleDayAppointments.forEach((appointment) => {\n if (!appointment.startDate) return;\n const startInfo = this.getBlockIdentifier(appointment.startDate, viewStartDate, startHour, endHour, 7);\n if (startInfo) {\n const { dayIndex, blockIndex } = startInfo;\n if (!blocks[dayIndex]) blocks[dayIndex] = {};\n if (!blocks[dayIndex][blockIndex]) blocks[dayIndex][blockIndex] = [];\n blocks[dayIndex][blockIndex].push(appointment);\n }\n });\n return blocks;\n }\n\n /**\n * Groups appointments by the day(s) they occur on within a given date range.\n * Returns a Map where the key is the date string ('YYYY-MM-DD') and the value is an array of appointments.\n */\n groupAppointmentsByDay(\n appointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime, // First day visible in the grid\n viewEndDate: AXDateTime, // Last day visible in the grid\n ): Map<string, AXSchedulerAppointmentType[]> {\n const groupedAppointments = new Map<string, AXSchedulerAppointmentType[]>();\n if (!appointments || appointments.length === 0 || !viewStartDate || !viewEndDate) {\n return groupedAppointments;\n }\n\n // Pre-calculate the end date for comparison (exclusive)\n const exclusiveViewEndDate = viewEndDate.add('day', 1);\n\n appointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.key) return;\n\n // Determine the effective start and end dates of the appointment clamped by the view range\n const appointmentStart = appointment.startDate;\n const appointmentEnd = appointment.endDate;\n\n // Skip if appointment ends before the view starts or starts after the view ends\n if (\n appointmentEnd.compare(viewStartDate, 'day') < 0 ||\n appointmentStart.compare(exclusiveViewEndDate, 'day') >= 0\n ) {\n return;\n }\n\n // Clamp start date to the view start date\n let currentDay =\n appointmentStart.compare(viewStartDate, 'day') < 0 ? viewStartDate : appointmentStart.startOf('day');\n\n // Loop through each day the appointment spans within the view range\n let safeCount = 0; // Prevent infinite loops\n while (\n currentDay.compare(appointmentEnd, 'day') <= 0 &&\n currentDay.compare(exclusiveViewEndDate, 'day') < 0 &&\n safeCount < 100\n ) {\n const dateString = this.formatService.format(currentDay, 'datetime', { format: 'YYYY-MM-DD' }); // Use a consistent key format\n\n if (!groupedAppointments.has(dateString)) {\n groupedAppointments.set(dateString, []);\n }\n // Add the appointment if it's not already in the list for that day\n if (!groupedAppointments.get(dateString).some((e) => e.key === appointment.key)) {\n groupedAppointments.get(dateString).push(appointment);\n }\n\n currentDay = currentDay.add('day', 1);\n safeCount++;\n }\n if (safeCount >= 100) {\n console.warn('Safety break hit in groupAppointmentsByDay loop for appointment:', appointment.key);\n }\n });\n\n return groupedAppointments;\n }\n\n getDayOfWeekNumber(dayName: AXDayOfWeekName): number {\n switch (dayName) {\n case 'Sunday':\n return 1;\n case 'Monday':\n return 2;\n case 'Tuesday':\n return 3;\n case 'Wednesday':\n return 4;\n case 'Thursday':\n return 5;\n case 'Friday':\n return 6;\n case 'Saturday':\n return 7;\n default:\n console.warn(`Invalid day name: ${dayName}. Defaulting to Sunday (1).`);\n return 1;\n }\n }\n\n getSlotData(\n startDate: AXDateTime,\n view: AXSchedulerView,\n ): { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } {\n let endDate: AXDateTime;\n switch (view) {\n case 'day':\n case 'week':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES);\n break;\n case 'timelineDay':\n case 'timelineMultiDay':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES * 2);\n break;\n case 'month':\n case 'agenda':\n case 'timelineMonth':\n startDate = startDate.startOf('day');\n endDate = startDate.endOf('day');\n break;\n }\n return { startDate, endDate, view };\n }\n\n handleEvent(\n event: AXSchedulerSlotEvent | AXSchedulerAppointmentEvent,\n eventOutputMap,\n eventType: 'appointment' | 'slot',\n ) {\n const mouseEvent = event.event;\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n if (eventType === 'appointment') {\n const appointmentOutputMap = eventOutputMap[eventType];\n const emitter = appointmentOutputMap[mouseEvent.type as keyof typeof appointmentOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerAppointmentEvent);\n }\n if (eventType === 'slot') {\n const slotOutputMap = eventOutputMap[eventType];\n const emitter = slotOutputMap[mouseEvent.type as keyof typeof slotOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerSlotEvent);\n }\n }\n\n // --- Timeline Specific Helpers ---\n\n calculateTimelineLayout(\n appt: AXSchedulerAppointmentType,\n startHour: number,\n endHour: number,\n ): { left: string; width: string } | null {\n if (\n !appt?.startDate ||\n !appt.endDate ||\n typeof startHour !== 'number' ||\n typeof endHour !== 'number' ||\n startHour >= endHour\n ) {\n console.warn('calculateTimelinePixelLayout: Invalid input', { appt, startHour, endHour });\n return null;\n }\n\n const startMinutes = appt.startDate.hour * 60 + appt.startDate.minute;\n const startBlockOffset = startMinutes - startHour * 60;\n const xBlock = startBlockOffset / 60;\n const left = `calc(var(--ax-comp-scheduler-timeline-view-blocks-width) * ${xBlock} + 1px)`;\n\n const durationMillis = appt.endDate.date.getTime() - appt.startDate.date.getTime();\n const durationMinutes = Math.max(0, durationMillis / (1000 * 60));\n const widthBlock = durationMinutes / 60;\n const blockWidthExpr = `var(--ax-comp-scheduler-timeline-view-blocks-width)`;\n const width = `calc(${blockWidthExpr} * ${widthBlock})`;\n\n return { left, width };\n }\n}\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerMultiDayViewAppointmentType,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-agenda-view',\n templateUrl: './scheduler-agenda-view.component.html',\n styleUrl: './scheduler-agenda-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, AXFormatPipe, AXDecoratorGenericComponent],\n})\nexport class AXSchedulerAgendaViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n multiDayAppointments = computed<AXSchedulerMultiDayViewAppointmentType[]>(() => {\n const current = this.date();\n const mapped = this.appointments();\n const daysCount = this.daysCount();\n\n return Array.from({ length: daysCount }, (_, i): AXSchedulerMultiDayViewAppointmentType => {\n const dayStart = current.add('day', i).add('hour', this.startHour());\n const dayEnd = dayStart.add('day', 1).add('hour', this.endHour() - this.startHour());\n const appointmentsForDay = mapped.filter(\n (appt) =>\n (appt.endDate.compare(dayStart, 'day') >= 0 &&\n appt.startDate.compare(dayEnd, 'day') < 0 &&\n appt.endDate.compare(dayStart, 'hour') >= 0 &&\n appt.startDate.compare(dayEnd, 'hour') < 0) ||\n (appt.endDate.compare(dayStart, 'day') >= 0 && appt.startDate.compare(dayEnd, 'day') < 0 && appt.allDay),\n );\n return {\n appointments: appointmentsForDay,\n date: dayStart,\n };\n });\n\n return [];\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'month');\n if (slotData) {\n this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n }\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-agenda-container\">\n @for (appt of multiDayAppointments(); track appt.appointments) {\n <div\n [class.ax-today]=\"isToday(appt.date)\"\n class=\"ax-scheduler-agenda-view-container\"\n (click)=\"handleSlotEvent($event, appt.date)\"\n (dblclick)=\"handleSlotEvent($event, appt.date)\"\n (contextmenu)=\"handleSlotEvent($event, appt.date)\"\n >\n <div class=\"ax-scheduler-agenda-header-date-day\">\n <span class=\"ax-scheduler-agenda-header-date-day-char\">\n {{ appt.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-agenda-header-date-day-num\">\n {{ appt.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <div class=\"ax-scheduler-agenda-appointment-container\">\n @for (appointment of appt.appointments; track appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-agenda-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerDayAppointmentLayout,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-day-view',\n templateUrl: './scheduler-day-view.component.html',\n styleUrl: './scheduler-day-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXDecoratorGenericComponent, AsyncPipe, AXTranslatorPipe, AXPopoverComponent, AXFormatPipe],\n})\nexport class AXSchedulerDayViewComponent extends MXBaseComponent {\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n allDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.allDay) ?? []);\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSingleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime, minuteIndex: number) {\n startDate = startDate.add('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'day');\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n handleAllDaySlotEvent(mouseEvent: MouseEvent) {\n const endDate = this.date().endOf('day');\n const startDate = this.date().startOf('day');\n const slotData = { startDate, endDate, view: 'day' as const };\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n\n hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startHour()).set('minute', 0).set('second', 0);\n const hours = [time];\n while (time.hour < this.endHour()) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n appointmentLayouts = computed(() => {\n const layouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n const sAppointments = this.singleDayAppointments();\n const viewDate = this.date(); // Get the start date for the view\n const startH = this.startHour();\n const endH = this.endHour();\n\n // Add check for viewDate\n if (sAppointments.length === 0 || !viewDate || typeof startH !== 'number' || typeof endH !== 'number') {\n return layouts;\n }\n\n // Pass viewDate to the service method\n const concurrencyInfo = this.schedulerService.calculateDayViewConcurrencyInfo(\n sAppointments,\n viewDate,\n startH,\n endH,\n );\n\n // Sort for greedy placement\n const sortedAppointments = orderBy(\n sAppointments,\n [(e) => e.startDate.date.getTime(), (e) => e.endDate.date.getTime()],\n ['asc', 'desc'],\n );\n\n // --- First Pass: Assign Columns Greedily (remains in component) ---\n const columnEndTimes = new Map<number, AXDateTime>();\n const assignedColumns = new Map<any, number>(); // Store assigned col index per appointment key\n\n for (const appointment of sortedAppointments) {\n let assignedColumn = -1;\n let colIdx = 0;\n while (assignedColumn < 0) {\n const lastAppointmentEndTimeInColumn = columnEndTimes.get(colIdx);\n // Use service overlap check? (Optional, simple comparison is fine here)\n if (\n !lastAppointmentEndTimeInColumn ||\n lastAppointmentEndTimeInColumn.compare(appointment.startDate, 'minute') <= 0\n ) {\n assignedColumn = colIdx;\n } else {\n colIdx++;\n }\n // Safety break\n if (colIdx > sAppointments.length * 2 && assignedColumn < 0) {\n console.warn(`DayView: Safety break assigning column 0 for appointment ${appointment.key}`);\n assignedColumn = 0;\n break;\n }\n }\n assignedColumns.set(appointment.key, assignedColumn); // Store assignment\n\n // Update end time for the assigned column\n const currentEndTimeInColumn = columnEndTimes.get(assignedColumn);\n if (!currentEndTimeInColumn || appointment.endDate.compare(currentEndTimeInColumn, 'minute') > 0) {\n columnEndTimes.set(assignedColumn, appointment.endDate);\n }\n }\n\n // --- Combine results ---\n sAppointments.forEach((appointment) => {\n const appointmentKey = appointment.key;\n const assignedCol = assignedColumns.get(appointmentKey);\n const effectiveCols = concurrencyInfo.get(appointmentKey)?.effectiveTotalColumns;\n\n // Ensure we have both pieces of info\n if (typeof assignedCol === 'number' && typeof effectiveCols === 'number') {\n layouts.set(appointmentKey, {\n columnIndex: assignedCol,\n effectiveTotalColumns: effectiveCols,\n });\n } else {\n console.warn(`DayView: Missing layout info for appointment ${appointmentKey}. Assigning default.`);\n // Provide a fallback default layout?\n layouts.set(appointmentKey, { columnIndex: 0, effectiveTotalColumns: 1 });\n }\n });\n\n return layouts;\n });\n\n // --- Style Calculation Functions (depend on appointmentLayouts - no change needed) ---\n getAppointmentLayout(key: any): AXSchedulerDayAppointmentLayout | undefined {\n return this.appointmentLayouts().get(key);\n }\n\n getAppointmentLeft(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n const C = layout.columnIndex;\n if (C === 0 || N <= 1) return '0px';\n const leftPercent = C * (100 / N);\n const gapOffsetPx = C * this.GAP_PX;\n return `calc(${leftPercent}% + ${gapOffsetPx}px)`;\n }\n return '0px';\n }\n\n getAppointmentWidth(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n const C = layout.columnIndex;\n if (N <= 0) return '0%';\n if (N === 1) return '100%';\n const widthPercent = (1 / N) * 100;\n const isLastColumn = C + 1 === N;\n if (!isLastColumn) {\n return `calc(${widthPercent}% - ${this.GAP_PX}px)`;\n } else {\n const cumulativeGapPx = (N - 1) * this.GAP_PX;\n return `calc(${widthPercent}% - ${cumulativeGapPx}px)`;\n }\n }\n return '0%';\n }\n\n getAppointmentTop(key: any): string {\n const appointment = this.appointments().find((e) => e.key === key);\n const layout = this.getAppointmentLayout(key);\n if (appointment?.singleDay && layout) {\n const startMinutes = appointment.startDate.hour * 60 + appointment.startDate.minute;\n const startBlockOffset = startMinutes - this.startHour() * 60;\n const yBlock = startBlockOffset / 30;\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${yBlock} + 1px)`;\n }\n return '';\n }\n\n getAppointmentHeight(key: any): string {\n const appointment = this.appointments().find((e) => e.key === key);\n if (appointment?.singleDay) {\n const durationMillis = appointment.endDate.date.getTime() - appointment.startDate.date.getTime();\n const durationMinutes = Math.max(0, durationMillis / (1000 * 60));\n const heightBlock = durationMinutes / 30;\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height)`;\n return `calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_PX}px)`;\n }\n return '0px';\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-day-header\">\n <div class=\"ax-scheduler-day-header-table\" aria-hidden=\"true\">\n <div>\n {{ 'dateTime.duration.all-day' | translate | async }}\n </div>\n </div>\n <div\n class=\"ax-scheduler-day-header-table-container\"\n (click)=\"handleAllDaySlotEvent($event)\"\n (dblclick)=\"handleAllDaySlotEvent($event)\"\n (contextmenu)=\"handleAllDaySlotEvent($event)\"\n >\n <div class=\"ax-scheduler-day-header-appointment-container\">\n @if (allDayAppointments().length) {\n <div\n (click)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (dblclick)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n [class.ax-draggable]=\"draggable()\"\n [title]=\"allDayAppointments()[0].title\"\n class=\"ax-scheduler-header-day-appointment\"\n [style.color]=\"allDayAppointments()[0].textColor\"\n [style.background-color]=\"allDayAppointments()[0].backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ allDayAppointments()[0].title }}</ax-title>\n </div>\n }\n @if (allDayAppointments().length > 1) {\n <div\n #moreAppointments\n class=\"ax-scheduler-day-header-more-tag\"\n [style.color]=\"allDayAppointments()[1].textColor\"\n [style.background-color]=\"allDayAppointments()[1].backgroundColor\"\n >\n {{ 'more-items' | translate: { params: { number: allDayAppointments().length - 1 } } | async }}\n </div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\">\n @for (appointment of allDayAppointments(); track appointment.key; let first = $first) {\n @if (!first) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n class=\"ax-scheduler-popover-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-day-time-container\">\n <table class=\"ax-scheduler-day-time\" aria-hidden=\"true\" [border]=\"1\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </table>\n <div class=\"ax-scheduler-day-table-container\">\n <div class=\"ax-scheduler-day-appointment-container\">\n @for (appointment of singleDayAppointments(); track appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n class=\"ax-scheduler-day-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.width]=\"getAppointmentWidth(appointment.key)\"\n [style.height]=\"getAppointmentHeight(appointment.key)\"\n [style.background-color]=\"appointment.backgroundColor\"\n [style.inset-block-start]=\"getAppointmentTop(appointment.key)\"\n [style.inset-inline-start]=\"getAppointmentLeft(appointment.key)\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-day-slot\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n (click)=\"handleSingleSlotEvent($event, time, 0)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, 0)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, 0)\"\n ></div>\n <div\n (click)=\"handleSingleSlotEvent($event, time, 1)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, 1)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, 1)\"\n ></div>\n }\n </div>\n </div>\n</div>\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe, AXFormatService } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXDayOfWeekName,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class'; // Adjust path\nimport { AXSchedulerService } from '../../scheduler.service'; // Adjust path\n\n// --- Types specific to Month View Layout ---\n// Represents a single day cell in the month grid\nexport type AXSchedulerMonthDayCell = {\n date: AXDateTime;\n isCurrentMonth: boolean;\n isToday: boolean;\n appointments: AXSchedulerAppointmentType[]; // All appointments for this day\n visibleAppointments: AXSchedulerAppointmentType[]; // Appointments to display as chips\n hiddenAppointments: AXSchedulerAppointmentType[]; // Appointments hidden behind the badge\n overflowCount: number; // Count of hidden appointments (length of hiddenAppointments)\n};\n\n@Component({\n selector: 'ax-scheduler-month-view',\n templateUrl: './scheduler-month-view.component.html',\n styleUrl: './scheduler-month-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, AXTranslatorPipe, AXPopoverComponent, AXFormatPipe, AsyncPipe],\n})\nexport class AXSchedulerMonthViewComponent extends MXBaseComponent {\n private formatService = inject(AXFormatService);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n // --- Inputs ---\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n date = input.required<AXDateTime>(); // A date within the target month\n appointments = input<AXSchedulerAppointmentType[]>([]);\n firstDayOfWeek = input<AXDayOfWeekName>('Saturday'); // Match scheduler component default\n\n // --- Constants ---\n readonly DAYS_IN_WEEK = 7;\n readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 2;\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'month');\n if (slotData) {\n this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n }\n\n // --- Base Computeds ---\n // Calculate the start of the month based on the input date\n monthStartDate = computed(() => {\n const d = this.date();\n return d ? d.startOf('month') : null;\n });\n\n // Generate the list of weekday names based on the firstDayOfWeek\n daysArray = computed(() => {\n const firstDayNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const dayNames: AXDateTime[] = [];\n\n const currentDate = this.date();\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n let date = currentDate.add('day', -daysToSubtract);\n date = date.add('day', firstDayNum - 1);\n for (let i = 0; i < 7; i++) {\n dayNames.push(date);\n date = date.add('day', 1);\n }\n return dayNames;\n });\n\n // --- Calendar Grid Calculation ---\n calendarDaysInfo = computed(() => {\n const monthStart = this.monthStartDate();\n if (!monthStart) return { days: [], weeksNeeded: 0 }; // Return object\n\n const firstDayOfMonth = monthStart;\n const lastDayOfMonth = monthStart.endOf('month');\n const daysInMonth = lastDayOfMonth.dayOfMonth; // Get number of days in the month\n\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n\n const leadingDays = (firstDisplayedDayOfWeek - firstDayGridNum + this.DAYS_IN_WEEK) % this.DAYS_IN_WEEK;\n const firstDayOfGrid = firstDayOfMonth.add('day', -leadingDays);\n\n // Calculate total cells needed (leading days + days in month)\n const totalCells = leadingDays + daysInMonth;\n // Calculate weeks needed (round up)\n const weeksNeeded = Math.ceil(totalCells / this.DAYS_IN_WEEK);\n // Ensure a minimum of 4 and maximum of 6 weeks for reasonable display, adjust if needed\n const actualWeeksToShow = Math.max(4, Math.min(weeksNeeded, 6));\n const totalDaysToGenerate = actualWeeksToShow * this.DAYS_IN_WEEK;\n\n const days: AXSchedulerMonthDayCell[] = [];\n const today = this.calendarService.create(new Date());\n let currentDay = firstDayOfGrid;\n\n for (let i = 0; i < totalDaysToGenerate; i++) {\n days.push({\n date: currentDay,\n isCurrentMonth: currentDay.monthOfYear === monthStart.monthOfYear,\n isToday: currentDay.equal(today, 'day'),\n appointments: [],\n visibleAppointments: [],\n hiddenAppointments: [],\n overflowCount: 0,\n });\n currentDay = currentDay.add('day', 1);\n }\n // Return both days array and weeks needed\n return { days: days, weeksNeeded: actualWeeksToShow };\n });\n\n // --- Appointment Grouping ---\n appointmentsGroupedByDay = computed(() => {\n const { days } = this.calendarDaysInfo(); // Destructure to get days array\n if (days.length === 0) return new Map<string, AXSchedulerAppointmentType[]>();\n\n const viewStartDate = days[0].date;\n const viewEndDate = days[days.length - 1].date;\n const relevantAppointments = this.appointments();\n\n return this.schedulerService.groupAppointmentsByDay(relevantAppointments, viewStartDate, viewEndDate);\n });\n\n // --- Day Cell Layout Calculation ---\n dayCellLayouts = computed((): AXSchedulerMonthDayCell[] => {\n // Get initial day info (date, isCurrentMonth, isToday)\n const { days: initialDaysInfo } = this.calendarDaysInfo();\n // Get appointments grouped by YYYY-MM-DD string\n const groupedAppointments = this.appointmentsGroupedByDay();\n\n return initialDaysInfo.map((dayInfo) => {\n const dateString = this.formatService.format(dayInfo.date, 'datetime', {\n format: 'YYYY-MM-DD',\n calendar: this.calendar(),\n });\n const appointmentsForDay = groupedAppointments.get(dateString) ?? [];\n\n // Sort appointments (all-day first, then by time)\n const sortedAppointments = orderBy(\n appointmentsForDay,\n [(e) => (e.allDay ? 0 : 1), (e) => e.startDate.date.getTime()],\n ['asc', 'asc'],\n );\n\n // Determine visible and hidden appointments\n const visibleAppointments = sortedAppointments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedAppointments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY); // Get the actual hidden ones\n const overflowCount = hiddenAppointments.length; // Count is simply the length\n\n return {\n ...dayInfo, // Keep date, isCurrentMonth, isToday\n appointments: sortedAppointments, // Store all sorted appointments\n visibleAppointments: visibleAppointments,\n hiddenAppointments: hiddenAppointments, // **** STORE HIDDEN APPOINTMENTS ****\n overflowCount: overflowCount,\n };\n });\n });\n\n // --- Dynamic Grid Rows ---\n gridTemplateRowsStyle = computed(() => {\n const { weeksNeeded } = this.calendarDaysInfo();\n if (!weeksNeeded || weeksNeeded <= 0) {\n return `repeat(6, minmax(5rem, 1fr))`; // Default fallback\n }\n // Use the calculated number of weeks\n return `repeat(${weeksNeeded}, minmax(5rem, 1fr))`;\n });\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-month-container\">\n <!-- Weekday Header -->\n <div class=\"ax-scheduler-month-weekdays\">\n <!-- Use daysArray for header, assuming it provides correct names/order -->\n @for (day of daysArray(); track day.date.getTime()) {\n <div class=\"ax-scheduler-month-weekday\">\n {{ day | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <!-- Calendar Grid - Add dynamic style -->\n <div class=\"ax-scheduler-month-grid\" [style.gridTemplateRows]=\"gridTemplateRowsStyle()\">\n <!-- Iterate over the final layout data -->\n @for (dayCell of dayCellLayouts(); track dayCell.date.date.getTime()) {\n <div\n (click)=\"handleSlotEvent($event, dayCell.date)\"\n (dblclick)=\"handleSlotEvent($event, dayCell.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayCell.date)\"\n [class.ax-today]=\"dayCell.isToday\"\n class=\"ax-scheduler-month-day-cell\"\n [class.ax-other-month]=\"!dayCell.isCurrentMonth\"\n >\n <div class=\"ax-scheduler-month-day-header\">\n <span class=\"ax-scheduler-month-day-number\">{{ dayCell.date.dayOfMonth }}</span>\n </div>\n <div class=\"ax-scheduler-month-day-appointments\">\n <!-- Visible Appointment Chips -->\n @for (appointment of dayCell.visibleAppointments; track appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-month-appointment-chip\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <!-- Optionally show time for non-all-day appointments -->\n <!-- @if (!appointment.allDay) {\n <span class=\"ax-appointment-chip-time\">\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </span>\n } -->\n <span class=\"ax-appointment-chip-title ax-scheduler-truncate\">{{ appointment.title }}</span>\n </div>\n }\n @if (dayCell.overflowCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\">\n +{{ 'more-items' | translate: { params: { number: dayCell.overflowCount } } | async }}\n </div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (appointment of dayCell.hiddenAppointments; track appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n class=\"ax-scheduler-popover-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <span class=\"ax-appointment-chip-title ax-scheduler-truncate\">{{ appointment.title }}</span>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentType,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-timeline-day-view',\n templateUrl: './scheduler-timeline-day-view.component.html',\n styleUrl: './scheduler-timeline-day-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXDecoratorGenericComponent, AXFormatPipe, AsyncPipe],\n})\nexport class AXSchedulerTimelineDayViewComponent extends MXBaseComponent {\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'timelineDay');\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n\n hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startHour()).set('minute', 0).set('second', 0);\n const hours = [time];\n while (time.hour < this.endHour()) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n // --- Appointment Layout Calculation ---\n appointmentLayouts = computed((): AXSchedulerAppointmentLayout[] => {\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const startH = this.startHour();\n const endH = this.endHour();\n const appointmentsToLayout = this.singleDayAppointments(); // Use filtered appointments\n\n if (typeof startH !== 'number' || typeof endH !== 'number' || appointmentsToLayout.length === 0) {\n return finalLayouts;\n }\n\n // Sort by start time first for processing order\n const sortedAppointments = orderBy(\n appointmentsToLayout,\n [(a) => a.startDate.date.getTime(), (a) => a.endDate.date.getTime()],\n ['asc', 'desc'], // Process earlier events first\n );\n\n const rowEndTimes: number[] = []; // Stores end minute (relative to view start) of last appt in each row\n\n for (const appointment of sortedAppointments) {\n // Calculate horizontal percentage position and width using the service\n const horiz = this.schedulerService.calculateTimelineLayout(appointment, startH, endH);\n // Skip if appointment is outside the viewable hour range horizontally\n if (!horiz) continue;\n\n // Calculate start/end minutes relative to the start of the view hours for overlap check\n const apptStartMinutes = Math.max(\n 0,\n appointment.startDate.hour * 60 + appointment.startDate.minute - startH * 60,\n );\n // Ensure duration is calculated correctly based on potentially clamped start/end within view hours\n const effectiveStartMinutes = Math.max(\n startH * 60,\n appointment.startDate.hour * 60 + appointment.startDate.minute,\n );\n const effectiveEndMinutes = Math.min(endH * 60, appointment.endDate.hour * 60 + appointment.endDate.minute);\n const durationMinutes = Math.max(0, effectiveEndMinutes - effectiveStartMinutes);\n const apptEndMinutes = apptStartMinutes + durationMinutes; // End minute relative to startHour\n\n // Find the first available vertical row (rowIndex) for stacking\n let assignedRowIndex = -1;\n for (let i = 0; i < rowEndTimes.length; i++) {\n // If this appointment starts AFTER OR AT the time the row becomes free\n // Using >= allows appointments starting exactly when another ends to potentially share a row if desired.\n // Using > would force a new row if they touch exactly. Let's use >= for packing.\n if (apptStartMinutes >= rowEndTimes[i]) {\n assignedRowIndex = i;\n break;\n }\n }\n\n // If no available row found, add a new row\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(apptEndMinutes); // Add end time for the new row\n } else {\n // Update the end time for the assigned row ONLY if this one ends later\n rowEndTimes[assignedRowIndex] = Math.max(rowEndTimes[assignedRowIndex], apptEndMinutes);\n }\n\n // Height is directly the CSS variable\n const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)';\n // Calculate layout styles\n const layoutLeft = horiz.left;\n // Apply the 1px gap by subtracting it from the width\n const layoutWidth = `calc(${horiz.width} - ${this.GAP_PX}px)`;\n // Calculate top using calc() with the CSS variable and the VERTICAL gap\n const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`;\n\n finalLayouts.push({\n appointment: appointment, // Store original appointment data\n layoutLeft,\n layoutWidth,\n layoutTop,\n layoutHeight,\n });\n }\n\n // No second pass implemented here for simplicity, greedy approach used.\n // If vertical packing needs further optimization, a second pass could be added.\n return finalLayouts;\n });\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-timeline-header\">\n @for (hour of hoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-header-hours\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n</div>\n\n<div class=\"ax-scheduler-timeline-content\">\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (layout of appointmentLayouts(); track layout.appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n [title]=\"layout.appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n [style.width]=\"layout.layoutWidth\"\n [style.height]=\"layout.layoutHeight\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.insetBlockStart]=\"layout.layoutTop\"\n [style.color]=\"layout.appointment.textColor\"\n [style.insetInlineStart]=\"layout.layoutLeft\"\n [style.background-color]=\"layout.appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</ax-title>\n <ax-subtitle>\n {{ layout.appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ layout.appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n class=\"ax-scheduler-timeline-slot-cell\"\n (click)=\"handleSlotEvent($event, time)\"\n (dblclick)=\"handleSlotEvent($event, time)\"\n (contextmenu)=\"handleSlotEvent($event, time)\"\n ></div>\n }\n </div>\n</div>\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { AXSchedulerAppointmentEvent, AXSchedulerAppointmentType, AXSchedulerSlotEvent } from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface MultiDayViewDayData {\n date: AXDateTime;\n visibleAppointments: AXSchedulerAppointmentType[];\n hiddenAppointments: AXSchedulerAppointmentType[];\n moreCount: number;\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-month-view',\n templateUrl: './scheduler-timeline-month-view.component.html',\n styleUrl: './scheduler-timeline-month-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXDecoratorGenericComponent, AXFormatPipe, AsyncPipe, AXTranslatorPipe, AXPopoverComponent],\n})\nexport class AXSchedulerTimelineMonthViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n monthAppointments = computed<MultiDayViewDayData[]>(() => {\n const mapped = this.appointments();\n const current = this.date().startOf('month');\n const daysCount = current.endOf('month').dayOfMonth;\n\n return Array.from({ length: daysCount }, (_, i): MultiDayViewDayData => {\n const dayStart = current.add('day', i).add('hour', this.startHour());\n const dayEnd = dayStart.add('day', 1).add('hour', this.endHour() - this.startHour());\n const appointmentsForDay = mapped.filter(\n (appt) =>\n !appt.allDay &&\n appt.singleDay &&\n appt.endDate.compare(dayStart, 'day') >= 0 &&\n appt.startDate.compare(dayEnd, 'day') < 0 &&\n appt.endDate.compare(dayStart, 'hour') >= 0 &&\n appt.startDate.compare(dayEnd, 'hour') < 0,\n );\n\n const visibleAppointments = appointmentsForDay.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = appointmentsForDay.slice(\n this.MAX_VISIBLE_APPOINTMENTS_PER_DAY,\n appointmentsForDay.length,\n );\n\n return {\n date: dayStart,\n visibleAppointments,\n hiddenAppointments,\n moreCount: hiddenAppointments.length,\n };\n });\n\n return [];\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'month');\n if (slotData) {\n this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n }\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-timeline-month-container\">\n @for (appt of monthAppointments(); track appt.visibleAppointments) {\n <div>\n <div class=\"ax-scheduler-timeline-header\">\n <div class=\"ax-scheduler-month-header-date-day\" [class.ax-today]=\"isToday(appt.date)\">\n <span class=\"ax-scheduler-month-header-date-day-char\">\n {{ appt.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-month-header-date-day-num\">\n {{ appt.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n\n <div\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, appt.date)\"\n (dblclick)=\"handleSlotEvent($event, appt.date)\"\n (contextmenu)=\"handleSlotEvent($event, appt.date)\"\n >\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (appointment of appt.visibleAppointments; track appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n @if (appt.moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\">\n +{{ 'more-items' | translate: { params: { number: appt.moreCount } } | async }}\n </div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (appointment of appt.hiddenAppointments; track appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-popover-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <span class=\"ax-appointment-chip-title ax-scheduler-truncate\">{{ appointment.title }}</span>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n </div>\n }\n</div>\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, output } from '@angular/core';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerMultiDayViewAppointmentType,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerTimelineDayViewComponent } from '../timeline-day/scheduler-timeline-day-view.component';\n\n@Component({\n selector: 'ax-scheduler-timeline-multi-day-view',\n templateUrl: './scheduler-timeline-multi-day-view.component.html',\n styleUrl: './scheduler-timeline-multi-day-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXSchedulerTimelineDayViewComponent, AsyncPipe, AXFormatPipe],\n})\nexport class AXSchedulerTimelineMultiDayViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n multiDayAppointments = computed<AXSchedulerMultiDayViewAppointmentType[]>(() => {\n const mapped = this.appointments();\n const current = this.date();\n const daysCount = this.daysCount();\n\n return Array.from({ length: daysCount }, (_, i): AXSchedulerMultiDayViewAppointmentType => {\n const dayStart = current.add('day', i).add('hour', this.startHour());\n const dayEnd = dayStart.add('day', 1).add('hour', this.endHour() - this.startHour());\n const appointmentsForDay = mapped.filter(\n (appt) =>\n !appt.allDay &&\n appt.singleDay &&\n appt.endDate.compare(dayStart, 'day') >= 0 &&\n appt.startDate.compare(dayEnd, 'day') < 0 &&\n appt.endDate.compare(dayStart, 'hour') >= 0 &&\n appt.startDate.compare(dayEnd, 'hour') < 0,\n );\n return {\n appointments: appointmentsForDay,\n date: dayStart,\n };\n });\n\n return [];\n });\n\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n}\n","<div class=\"ax-scheduler-timeline-day-view-container\">\n @for (appt of multiDayAppointments(); track appt.appointments) {\n <div>\n <div class=\"ax-scheduler-week-header-date-day\" [class.ax-today]=\"isToday(appt.date)\">\n <span class=\"ax-scheduler-week-header-date-day-char\">\n {{ appt.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ appt.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <ax-scheduler-timeline-day-view\n [date]=\"appt.date\"\n [endHour]=\"endHour()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [appointments]=\"appt.appointments\"\n (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n >\n </ax-scheduler-timeline-day-view>\n </div>\n }\n</div>\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerActiveAppointmentsInBlock,\n AXSchedulerAllDaySlotData,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentsByStartBlock,\n AXSchedulerAppointmentType,\n AXSchedulerOverflowBadge,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\ntype AXSchedulerGridBadgeInfo = AXSchedulerOverflowBadge & {\n hiddenAppointments: AXSchedulerAppointmentType[];\n};\n\n@Component({\n selector: 'ax-scheduler-week-view',\n templateUrl: './scheduler-week-view.component.html',\n styleUrl: './scheduler-week-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXDecoratorGenericComponent, AsyncPipe, AXTranslatorPipe, AXPopoverComponent, AXFormatPipe],\n})\nexport class AXSchedulerWeekViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n allDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.allDay) ?? []);\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSingleSlotEvent(mouseEvent: MouseEvent, hour: AXDateTime, day: AXDateTime, minuteIndex: number) {\n const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'week');\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n handleAllDaySlotEvent(mouseEvent: MouseEvent, day: AXDateTime) {\n const startDate = day.startOf('day');\n const endDate = day.endOf('day');\n const slotData = { startDate, endDate, view: 'week' as const };\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n\n hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startHour()).set('minute', 0).set('second', 0);\n const hours = [time];\n while (time.hour < this.endHour()) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n daysArray = computed(() => {\n const time = this.date();\n if (!time) return [];\n const days = [time];\n for (let index = 1; index <= 6; index++) {\n days.push(time.add('day', index));\n }\n return days;\n });\n\n totalBlocksPerViewDay = computed(() => {\n const startH = this.startHour();\n const endH = this.endHour();\n if (typeof startH !== 'number' || typeof endH !== 'number') return 0;\n return Math.max(0, (endH - startH) * (60 / 30));\n });\n\n appointmentsByStartBlock = computed((): AXSchedulerAppointmentsByStartBlock => {\n const viewDate = this.date();\n const startH = this.startHour();\n const endH = this.endHour();\n if (!viewDate || typeof startH !== 'number' || typeof endH !== 'number') return {};\n return this.schedulerService.calculateWeekViewAppointmentsByStartBlock(\n this.singleDayAppointments(),\n viewDate,\n startH,\n endH,\n );\n });\n\n activeAppointmentsInBlock = computed((): AXSchedulerActiveAppointmentsInBlock => {\n const viewDate = this.date();\n const startH = this.startHour();\n const endH = this.endHour();\n if (!viewDate || typeof startH !== 'number' || typeof endH !== 'number') return {};\n return this.schedulerService.calculateActiveAppointmentsInBlock(\n this.singleDayAppointments(),\n viewDate,\n startH,\n endH,\n 7, // Specify 7 days for week view\n );\n });\n\n visibleAppointmentsLayout = computed((): AXSchedulerAppointmentLayout[] => {\n const layouts: AXSchedulerAppointmentLayout[] = [];\n const startingBlocks = this.appointmentsByStartBlock();\n const daysCount = 7;\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N: number = daysCount;\n const occupiedBlocks: Record<number, Record<number, any>> = {};\n\n for (let dayIndex = 0; dayIndex < daysCount; dayIndex++) {\n const dayBlocks = startingBlocks[dayIndex] ?? {};\n for (let blockIndex = 0; blockIndex < totalBlocksPerDay; blockIndex++) {\n if (occupiedBlocks[dayIndex]?.[blockIndex]) continue;\n\n const startingAppointments = dayBlocks[blockIndex] ?? [];\n if (startingAppointments.length > 0) {\n const appointmentToShow = orderBy(startingAppointments, [(e) => e.endDate.date.getTime()], ['desc'])[0];\n\n const C = dayIndex;\n let layoutLeft = '0px';\n if (C > 0 && N > 1) layoutLeft = `calc(${C * (100 / N)}%)`;\n const layoutTop = `calc(${blockHeightExpr} * ${blockIndex})`;\n let layoutHeight = '0px';\n let appointmentDurationMinutes = 0;\n if (appointmentToShow.endDate && appointmentToShow.startDate) {\n appointmentDurationMinutes = this.schedulerService.calculateDurationInMinutes(appointmentToShow);\n if (appointmentDurationMinutes > 0) {\n const heightBlock = appointmentDurationMinutes / 30;\n layoutHeight = `max(0px, calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_PX}px))`;\n }\n }\n\n layouts.push({\n layoutTop,\n layoutLeft,\n layoutHeight,\n appointment: appointmentToShow,\n layoutWidth: 'calc(100% / 7 - 2rem)',\n });\n\n const blocksToOccupy = Math.ceil(appointmentDurationMinutes / 30);\n for (let i = 0; i < blocksToOccupy; i++) {\n const occupiedBlockIndex = blockIndex + i;\n if (occupiedBlockIndex < totalBlocksPerDay) {\n if (!occupiedBlocks[dayIndex]) occupiedBlocks[dayIndex] = {};\n if (!occupiedBlocks[dayIndex][occupiedBlockIndex]) {\n occupiedBlocks[dayIndex][occupiedBlockIndex] = appointmentToShow.key;\n }\n } else {\n break;\n }\n }\n }\n }\n }\n return layouts;\n });\n\n visualOccupancyMap = computed(() => {\n const map = new Map<string, any>();\n const visibleLayouts = this.visibleAppointmentsLayout();\n const viewStartDate = this.date();\n const startH = this.startHour();\n const endH = this.endHour();\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n\n if (!viewStartDate || typeof startH !== 'number' || typeof endH !== 'number') return map;\n\n for (const appointmentLayout of visibleLayouts) {\n const startInfo = this.schedulerService.getBlockIdentifier(\n appointmentLayout.appointment.startDate,\n viewStartDate,\n startH,\n endH,\n 7,\n );\n if (!startInfo) continue;\n\n const durationMinutes = this.schedulerService.calculateDurationInMinutes(appointmentLayout.appointment);\n const blocksToOccupy = Math.ceil(durationMinutes / 30);\n\n for (let i = 0; i < blocksToOccupy; i++) {\n const occupiedBlockIndex = startInfo.blockIndex + i;\n if (occupiedBlockIndex >= 0 && occupiedBlockIndex < totalBlocksPerDay) {\n const mapKey = `${startInfo.dayIndex}-${occupiedBlockIndex}`;\n if (!map.has(mapKey)) {\n map.set(mapKey, appointmentLayout.appointment.key);\n }\n } else {\n break;\n }\n }\n }\n return map;\n });\n\n overflowBadges = computed((): AXSchedulerOverflowBadge[] => {\n const badges: AXSchedulerOverflowBadge[] = [];\n const activeBlocks = this.activeAppointmentsInBlock();\n const occupancyMap = this.visualOccupancyMap();\n const daysCount = 7;\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N: number = daysCount;\n\n if (!activeBlocks || !occupancyMap || totalBlocksPerDay === 0) return badges;\n\n const countedHiddenAppointmentKeysToday = new Map<number, Set<any>>();\n\n for (let dayIndex = 0; dayIndex < daysCount; dayIndex++) {\n countedHiddenAppointmentKeysToday.set(dayIndex, new Set());\n for (let blockIndex = 0; blockIndex < totalBlocksPerDay; blockIndex++) {\n const blockMapKey = `${dayIndex}-${blockIndex}`;\n const activeAppointments = activeBlocks[dayIndex]?.[blockIndex] ?? [];\n if (activeAppointments.length === 0) continue;\n\n const visibleAppointmentKey = occupancyMap.get(blockMapKey);\n const hiddenAppointments = activeAppointments.filter(\n (appointment) => appointment.key !== visibleAppointmentKey,\n );\n const newlyHidden = hiddenAppointments.filter(\n (e) => !countedHiddenAppointmentKeysToday.get(dayIndex).has(e.key),\n );\n\n if (newlyHidden.length > 0) {\n const C = dayIndex;\n let baseColLeft = '0px';\n if (C > 0 && N > 1) baseColLeft = `calc(${C * (100 / N)}%)`;\n const baseTop = `calc(${blockHeightExpr} * ${blockIndex})`;\n const badgeLeft = `calc(${baseColLeft} + calc(100% / ${N} - 1.75rem))`;\n const badgeTop = `calc(${baseTop} + 0.75rem)`;\n\n badges.push({ key: blockMapKey, count: newlyHidden.length, badgeTop, badgeLeft });\n newlyHidden.forEach((e) => countedHiddenAppointmentKeysToday.get(dayIndex).add(e.key));\n }\n }\n }\n return badges;\n });\n\n allDayAppointmentsPerDay = computed((): AXSchedulerAllDaySlotData[] => {\n const days = this.daysArray();\n const allDayAppointments = this.allDayAppointments(); // Use renamed type if needed\n const result: AXSchedulerAllDaySlotData[] = [];\n\n if (days.length !== 7) return result; // Should always be 7 for week view\n\n days.forEach((day) => {\n const dayStart = day.startOf('day');\n const dayEnd = day.endOf('day');\n const appointmentsForThisDay: AXSchedulerAppointmentType[] = []; // Use renamed type\n\n allDayAppointments.forEach((appointment) => {\n // Check if the appointment overlaps with the current day\n if (appointment.startDate.compare(dayEnd) <= 0 && appointment.endDate.compare(dayStart) >= 0) {\n appointmentsForThisDay.push(appointment);\n }\n });\n\n // Sort appointments for this day\n appointmentsForThisDay.sort((a, b) => a.startDate.date.getTime() - b.startDate.date.getTime());\n\n result.push({\n day: day, // Include the AXDateTime object for the day\n appointments: appointmentsForThisDay,\n });\n });\n\n return result;\n });\n\n overflowBadgesWithData = computed((): AXSchedulerGridBadgeInfo[] => {\n const badgesInfo: AXSchedulerGridBadgeInfo[] = [];\n const activeBlocks = this.activeAppointmentsInBlock();\n const occupancyMap = this.visualOccupancyMap();\n const daysCount = 7;\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N: number = daysCount;\n\n if (!activeBlocks || !occupancyMap || totalBlocksPerDay === 0) return badgesInfo;\n\n const countedHiddenAppointmentKeysToday = new Map<number, Set<any>>();\n\n for (let dayIndex = 0; dayIndex < daysCount; dayIndex++) {\n countedHiddenAppointmentKeysToday.set(dayIndex, new Set());\n for (let blockIndex = 0; blockIndex < totalBlocksPerDay; blockIndex++) {\n const blockMapKey = `${dayIndex}-${blockIndex}`;\n const activeAppointments = activeBlocks[dayIndex]?.[blockIndex] ?? [];\n if (activeAppointments.length === 0) continue;\n\n const visibleAppointmentKey = occupancyMap.get(blockMapKey);\n // Find all hidden appointments for this specific block\n const hiddenAppointments = activeAppointments.filter(\n (appointment) => appointment.key !== visibleAppointmentKey,\n );\n // Find which of those hidden ones haven't been counted today yet\n const newlyHidden = hiddenAppointments.filter(\n (e) => !countedHiddenAppointmentKeysToday.get(dayIndex).has(e.key),\n );\n\n if (newlyHidden.length > 0) {\n const C = dayIndex;\n let baseColLeft = '0px';\n if (C > 0 && N > 1) baseColLeft = `calc(${C * (100 / N)}%)`;\n const baseTop = `calc(${blockHeightExpr} * ${blockIndex})`;\n // Keep your positioning logic for the badge itself\n const badgeLeft = `calc(${baseColLeft} + calc(100% / ${N} - 1.75rem))`;\n const badgeTop = `calc(${baseTop} + 0.75rem)`;\n\n // Store the badge info *and* the list of appointments it represents\n badgesInfo.push({\n key: blockMapKey,\n count: newlyHidden.length,\n badgeTop,\n badgeLeft,\n hiddenAppointments: newlyHidden, // Store the actual hidden appointments\n });\n\n // Mark these as counted for today\n newlyHidden.forEach((e) => countedHiddenAppointmentKeysToday.get(dayIndex).add(e.key));\n }\n }\n }\n // Sort the badges by top then left for consistent rendering order? (Optional)\n // badgesInfo.sort((a, b) => {\n // const topCompare = a.badgeTop.localeCompare(b.badgeTop);\n // if (topCompare !== 0) return topCompare;\n // return a.badgeLeft.localeCompare(b.badgeLeft);\n // });\n return badgesInfo;\n });\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-week-header\">\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\"></div>\n <div class=\"ax-scheduler-week-header-date\" aria-hidden=\"true\">\n @for (day of daysArray(); track day.date.getTime()) {\n <div class=\"ax-scheduler-week-header-date-day\" [class.ax-today]=\"isToday(day)\">\n <span class=\"ax-scheduler-week-header-date-day-char\">\n {{ day | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ day | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\">{{ 'dateTime.duration.all-day' | translate | async }}</div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-week-header-date\">\n @for (slotData of allDayAppointmentsPerDay(); track slotData.day.date.getTime()) {\n <div\n class=\"ax-scheduler-all-day-slot\"\n (click)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (dblclick)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (contextmenu)=\"handleAllDaySlotEvent($event, slotData.day)\"\n >\n @if (slotData.appointments.length > 0) {\n <div\n (click)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (dblclick)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n [title]=\"slotData.appointments[0].title\"\n class=\"ax-scheduler-header-week-appointment\"\n [style.color]=\"slotData.appointments[0].textColor\"\n [style.background-color]=\"slotData.appointments[0].backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ slotData.appointments[0].title }}</ax-title>\n </div>\n }\n @if (slotData.appointments.length > 1) {\n <div #moreAppointments class=\"ax-scheduler-appointment-badge\">+{{ slotData.appointments.length - 1 }}</div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\">\n @for (appointment of slotData.appointments; track appointment.key; let first = $first) {\n @if (!first) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n class=\"ax-scheduler-popover-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-week-time-container\">\n <div class=\"ax-scheduler-week-time\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-week-table-container\">\n <div class=\"ax-scheduler-week-appointment-container\">\n @for (appt of visibleAppointmentsLayout(); track appt.appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appt.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appt.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appt.appointment)\"\n [title]=\"appt.appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n [style.height]=\"appt.layoutHeight\"\n class=\"ax-scheduler-week-appointment\"\n [style.color]=\"appt.appointment.textColor\"\n [style.inset-block-start]=\"appt.layoutTop\"\n [style.inset-inline-start]=\"appt.layoutLeft\"\n [style.background-color]=\"appt.appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appt.appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appt.appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appt.appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n\n <!-- Overflow Badges with Popovers -->\n @for (badge of overflowBadgesWithData(); track badge.key) {\n <!-- Wrap badge and popover for targeting -->\n <div\n style=\"position: absolute\"\n class=\"ax-scheduler-badge-wrapper\"\n [style.inset-block-start]=\"badge.badgeTop\"\n [style.inset-inline-start]=\"badge.badgeLeft\"\n >\n <!-- The Badge itself -->\n <div #actionButton class=\"ax-scheduler-appointment-badge\">+{{ badge.count }}</div>\n <!-- The Popover -->\n <ax-popover [target]=\"actionButton\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\">\n @for (appointment of badge.hiddenAppointments; track appointment.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [class.ax-draggable]=\"draggable()\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-popover-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n </div>\n }\n </div>\n\n <table aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr>\n @for (day of daysArray(); track day.date.getTime()) {\n <td\n (click)=\"handleSingleSlotEvent($event, time, day, 0)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day, 0)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day, 0)\"\n ></td>\n }\n </tr>\n <tr>\n @for (day of daysArray(); track day.date.getTime()) {\n <td\n (click)=\"handleSingleSlotEvent($event, time, day, 1)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day, 1)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day, 1)\"\n ></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n","import { AXButtonComponent } from '@acorex/components/button';\nimport { AXCalendarComponent } from '@acorex/components/calendar';\nimport {\n AXDataSource,\n AXValueChangedEvent,\n convertArrayToDataSource,\n MXBaseComponent,\n} from '@acorex/components/common';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXSelectBoxComponent } from '@acorex/components/select-box';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXHtmlUtil, AXUnsubscriber } from '@acorex/core/utils';\nimport { isPlatformBrowser, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n model,\n OnInit,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { distinctUntilChanged, map, Observable, of, startWith, switchMap } from 'rxjs';\nimport {\n AXDayOfWeekName,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerSlotEvent,\n AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerService } from './scheduler.service';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineMultiDayViewComponent } from './views/timeline-multi-day/scheduler-timeline-multi-day-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\n@Component({\n selector: 'ax-scheduler',\n templateUrl: './scheduler.component.html',\n styleUrls: ['./scheduler.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n FormsModule,\n AXSelectBoxComponent,\n AXDecoratorIconComponent,\n AXButtonComponent,\n NgClass,\n AXPopoverComponent,\n AXCalendarComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerTimelineDayViewComponent,\n AXSchedulerTimelineMultiDayViewComponent,\n AXSchedulerTimelineMonthViewComponent,\n AXSchedulerAgendaViewComponent,\n ],\n providers: [AXUnsubscriber],\n})\nexport class AXSchedulerComponent extends MXBaseComponent implements OnInit {\n private platformId = inject(PLATFORM_ID);\n private unsubscriber = inject(AXUnsubscriber);\n private formatService = inject(AXFormatService);\n private localeService = inject(AXLocaleService);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n private translationService = inject(AXTranslationService);\n\n private viewModeSelectbox = viewChild(AXSelectBoxComponent);\n\n displayViews: Record<AXSchedulerView, string> = {\n day: 'daily',\n week: 'weekly',\n month: 'monthly',\n timelineDay: 'daily-timeline',\n timelineMultiDay: 'multi-day-timeline',\n timelineMonth: 'monthly-timeline',\n agenda: 'agenda',\n };\n\n calendar = input<'gregorian' | 'solar-hijri' | string>();\n calendarType = linkedSignal<'gregorian' | 'solar-hijri' | string>(\n () => this.calendar() ?? this.localeService.activeProfile().calendar.system,\n );\n\n startingDate = input<Date>(new Date());\n currentDate = linkedSignal<AXDateTime>(() =>\n this.calendarService\n .create(this.startingDate(), this.calendarType())\n .set('hour', 0)\n .set('minute', 0)\n .set('second', 0),\n );\n\n draggable = signal(false); // TODO\n\n rtl = signal(false);\n isLoading = signal(false);\n isFullScreen = signal(false);\n viewsDataSource = signal<{ id: string; text: string }[]>([]);\n oldDate = signal<AXDateTime>(this.calendarService.create(new Date(), this.calendarType()));\n\n endHour = input(23);\n startHour = input(8);\n keyField = input('id');\n readonly = input(false);\n titleField = input('title');\n allDayField = input('allDay');\n allowFullScreen = input(true);\n endDateField = input('endDate');\n multiDayViewDaysCount = input(7);\n readonlyField = input('readonly');\n startDateField = input('startDate');\n textColorField = input('textColor');\n descriptionField = input('description');\n backgroundColorField = input('backgroundColor');\n dataSource = input<AXDataSource<any> | any[]>([]);\n firstDayOfWeek = input<AXDayOfWeekName>('Sunday');\n views = input<AXSchedulerView[]>([\n 'day',\n 'week',\n 'month',\n 'timelineDay',\n 'timelineMultiDay',\n 'timelineMonth',\n 'agenda',\n ]);\n\n selectedView = model<AXSchedulerView>(this.views()[0]);\n\n // --- Public Outputs ---\n onSlotClicked = output<AXSchedulerSlotEvent>();\n onSlotDblClicked = output<AXSchedulerSlotEvent>();\n onSlotRightClick = output<AXSchedulerSlotEvent>();\n onAppointmentClicked = output<AXSchedulerAppointmentEvent>();\n onAppointmentDblClicked = output<AXSchedulerAppointmentEvent>();\n onAppointmentRightClick = output<AXSchedulerAppointmentEvent>();\n\n // --- Internal Handlers for View Outputs ---\n protected handleSlotClickInternal(eventData: AXSchedulerSlotEvent) {\n this.onSlotClicked.emit(eventData);\n }\n protected handleSlotDblClickInternal(eventData: AXSchedulerSlotEvent) {\n this.onSlotDblClicked.emit(eventData);\n }\n protected handleSlotRightClickInternal(eventData: AXSchedulerSlotEvent) {\n this.onSlotRightClick.emit(eventData);\n }\n protected handleAppointmentClickInternal(eventData: AXSchedulerAppointmentEvent) {\n this.onAppointmentClicked.emit(eventData);\n }\n protected handleAppointmentDblClickInternal(eventData: AXSchedulerAppointmentEvent) {\n this.onAppointmentDblClicked.emit(eventData);\n }\n protected handleAppointmentRightClickInternal(eventData: AXSchedulerAppointmentEvent) {\n this.onAppointmentRightClick.emit(eventData);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n\n this.calendarService.calendarChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n this.currentDate.set(this.calendarService.create(this.currentDate().date, this.calendarType()));\n this.appointmentsList().refresh();\n });\n\n this.translationService.langChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(async () => {\n await this.fillDataSource();\n this.viewModeSelectbox().selectItems(this.viewsDataSource().find((c) => c.id == this.selectedView()));\n this.currentDate.set(this.calendarService.create(this.currentDate().date, this.calendarType()));\n });\n\n if (isPlatformBrowser(this.platformId)) this.rtl.set(AXHtmlUtil.isRtl(this.getHostElement()));\n this.fillDataSource();\n }\n\n async fillDataSource() {\n const result = [];\n for await (const c of this.views()) {\n const text = await this.translationService.translateAsync(`dateTime.duration.${this.displayViews[c]}`);\n result.push({ text, id: c });\n }\n this.viewsDataSource.set(result);\n }\n\n private getGridDateRange(dateInMonth: AXDateTime): { gridStartDate: AXDateTime; gridEndDate: AXDateTime } {\n const firstDayOfMonth = dateInMonth.startOf('month');\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n const daysFromPrevMonth = (firstDisplayedDayOfWeek - firstDayGridNum + 7) % 7;\n const gridStartDate = firstDayOfMonth.add('day', -daysFromPrevMonth);\n // Calculate end date based on standard 6 weeks for safety, or calculate dynamically if preferred\n const gridEndDate = gridStartDate.add('day', 6 * 7 - 1);\n return { gridStartDate, gridEndDate };\n }\n\n appointmentsList = computed(() => {\n const v = this.dataSource();\n let ds: AXDataSource<any>;\n if (Array.isArray(v)) {\n ds = convertArrayToDataSource(v, { key: this.keyField(), pageSize: 9999 });\n } else {\n ds = v as AXDataSource<any>;\n }\n // ds.refresh();\n return ds;\n });\n\n private dataSourceItemsSignal = toSignal(\n new Observable<AXDataSource<any> | null>((subscriber) => {\n const watcher = effect(() => {\n const dsInstance = this.appointmentsList();\n subscriber.next(dsInstance);\n });\n return () => {\n watcher.destroy();\n };\n }).pipe(\n distinctUntilChanged(),\n switchMap((dsInstance) => {\n if (!dsInstance) return of([]);\n return dsInstance.onChanged.pipe(\n map((event) => event.items ?? []),\n startWith(dsInstance.items ?? []),\n );\n }),\n ),\n { initialValue: [] },\n );\n\n #updatedDataSource = effect(() => {\n const ds = this.appointmentsList();\n untracked(() => {\n if (ds) ds.refresh();\n });\n });\n\n currentDateText = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'timelineDay':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n case 'week': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(this.currentDate().add('week', 1).add('day', -1), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'agenda':\n case 'timelineMultiDay': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(\n this.currentDate().add('day', this.multiDayViewDaysCount() - 1),\n 'datetime',\n {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n },\n );\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'month':\n case 'timelineMonth':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'MMMM yyyy',\n calendar: this.calendarType(),\n });\n }\n });\n\n calendarDepth = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'week':\n case 'agenda':\n case 'timelineMultiDay':\n return 'day';\n case 'month':\n case 'timelineMonth':\n return 'month';\n case 'timelineDay':\n return 'day';\n }\n });\n\n mappedAppointments = computed(() => {\n const items = this.dataSourceItemsSignal();\n const keyField = this.keyField();\n const titleField = this.titleField();\n const allDayField = this.allDayField();\n const readonlyField = this.readonlyField();\n const textColorField = this.textColorField();\n const descriptionField = this.descriptionField();\n const backgroundColorField = this.backgroundColorField();\n const startDateField = this.startDateField();\n const endDateField = this.endDateField();\n\n return items\n .map((item) => {\n const startDate = this.calendarService.create(item[startDateField], this.calendarType());\n const endDate = this.calendarService.create(item[endDateField], this.calendarType());\n // Basic validation\n if (!startDate?.date || !endDate?.date) {\n console.warn('Scheduler: Skipping item due to invalid date fields:', item);\n return null;\n }\n // Check if dates are valid after creation\n if (isNaN(startDate.date.getTime()) || isNaN(endDate.date.getTime())) {\n console.warn('Scheduler: Skipping item due to invalid parsed date (NaN):', item);\n return null;\n }\n\n // Calculate singleDay based on *calendar day*, not just time\n const isSingleDay = startDate.equal(endDate, 'day');\n\n const appointment: AXSchedulerAppointmentType = {\n key: item[keyField],\n title: item[titleField],\n startDate,\n endDate,\n allDay: !!item[allDayField], // Ensure boolean\n singleDay: isSingleDay, // Use calculated singleDay\n readonly: !!item[readonlyField],\n textColor: item[textColorField],\n description: item[descriptionField],\n backgroundColor: item[backgroundColorField],\n };\n return appointment;\n })\n .filter((appt): appt is AXSchedulerAppointmentType => appt !== null); // Filter out nulls from invalid dates\n });\n\n viewAppointments = computed<AXSchedulerAppointmentType[]>(() => {\n const mapped = this.mappedAppointments();\n const view = this.selectedView();\n const current = this.currentDate();\n\n if (!current || mapped.length === 0) return [];\n\n switch (view) {\n case 'day':\n case 'timelineDay': {\n const dayStart = current.startOf('day');\n const dayEnd = current.endOf('day');\n return mapped.filter(\n (appt) => appt.endDate.compare(dayStart, 'day') >= 0 && appt.startDate.compare(dayEnd, 'day') <= 0,\n );\n }\n case 'week': {\n const weekStart = current;\n const weekEnd = weekStart.add('day', 7);\n return mapped.filter(\n (appt) => appt.startDate.compare(weekEnd, 'day') < 0 && appt.endDate.compare(weekStart, 'day') >= 0,\n );\n }\n case 'month': {\n const { gridStartDate, gridEndDate } = this.getGridDateRange(current);\n const exclusiveGridEndDate = gridEndDate.add('day', 1);\n return mapped.filter(\n (appt) =>\n appt.startDate.compare(exclusiveGridEndDate, 'day') < 0 && appt.endDate.compare(gridStartDate, 'day') >= 0,\n );\n }\n case 'timelineMonth': {\n const dayStart = current.startOf('month');\n const dayEnd = dayStart.endOf('month');\n return mapped.filter(\n (appt) => appt.startDate.compare(dayEnd, 'day') < 0 && appt.endDate.compare(dayStart, 'day') >= 0,\n );\n }\n case 'agenda':\n case 'timelineMultiDay': {\n const dayStart = current;\n const dayEnd = dayStart.add('day', this.multiDayViewDaysCount());\n return mapped.filter(\n (appt) => appt.startDate.compare(dayEnd, 'day') < 0 && appt.endDate.compare(dayStart, 'day') >= 0,\n );\n }\n }\n });\n\n viewChanged(e: AXValueChangedEvent<AXSchedulerView>) {\n const newView = e.value;\n const oldView = e.oldValue;\n this.selectedView.set(newView);\n\n if (oldView === 'week') {\n const oldDayOfWeek = this.oldDate().dayOfWeek % 7;\n const date = this.currentDate().add('day', oldDayOfWeek - 1);\n this.currentDate.set(date);\n }\n\n this.oldDate.set(this.currentDate());\n\n if (newView === 'week') {\n const currentDate = this.currentDate();\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n const startOfWeekDate = currentDate.add('day', -daysToSubtract);\n this.currentDate.set(startOfWeekDate);\n }\n }\n\n nextClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timelineDay':\n this.currentDate.set(this.currentDate().add('day', 1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', 1));\n break;\n\n case 'agenda':\n case 'timelineMultiDay':\n this.currentDate.set(this.currentDate().add('day', this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timelineMonth':\n this.currentDate.set(this.currentDate().add('month', 1));\n break;\n }\n }\n\n prevClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timelineDay':\n this.currentDate.set(this.currentDate().add('day', -1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', -1));\n break;\n\n case 'agenda':\n case 'timelineMultiDay':\n this.currentDate.set(this.currentDate().add('day', -this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timelineMonth':\n this.currentDate.set(this.currentDate().add('month', -1));\n break;\n }\n }\n\n calendarDateChanged(e: any) {\n let currentDate = this.calendarService.create(e, this.calendarType());\n if (this.selectedView() === 'week') {\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n currentDate = currentDate.add('day', -daysToSubtract);\n }\n this.currentDate.set(currentDate);\n }\n\n handleFullScreen() {\n if (!this.isFullScreen()) this.getHostElement().classList.add('ax-full-screen-container');\n if (this.isFullScreen()) this.getHostElement().classList.remove('ax-full-screen-container');\n this.isFullScreen.set(!this.isFullScreen());\n }\n}\n","<div class=\"ax-scheduler-container\">\n <div class=\"ax-scheduler-header\">\n <div class=\"ax-scheduler-date\">\n <ax-button look=\"blank\" (onClick)=\"prevClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-left': !rtl(),\n 'ax-icon-chevron-right': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"currentDateText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"nextClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-right': !rtl(),\n 'ax-icon-chevron-left': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-popover [target]=\"date\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [ngModel]=\"currentDate()\"\n (ngModelChange)=\"calendarDateChanged($event)\"\n ></ax-calendar>\n </div>\n </ax-popover>\n </div>\n <div class=\"ax-scheduler-actions\">\n <ax-select-box\n [dropdownWidth]=\"200\"\n [ngModel]=\"selectedView()\"\n [dataSource]=\"viewsDataSource()\"\n (onValueChanged)=\"viewChanged($event)\"\n ></ax-select-box>\n\n @if (allowFullScreen()) {\n <ax-button look=\"blank\" (onClick)=\"handleFullScreen()\">\n <ax-icon>\n <i\n class=\"fa-solid fa-expand\"\n [ngClass]=\"{ 'fa-compress': isFullScreen(), 'fa-expand': !isFullScreen() }\"\n ></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n </div>\n <div class=\"ax-scheduler-views-container\">\n @switch (selectedView()) {\n @case ('day') {\n <ax-scheduler-day-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-day-view>\n }\n @case ('week') {\n <ax-scheduler-week-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-week-view>\n }\n @case ('month') {\n <ax-scheduler-month-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-month-view>\n }\n @case ('timelineDay') {\n <ax-scheduler-timeline-day-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-day-view>\n }\n @case ('timelineMultiDay') {\n <ax-scheduler-timeline-multi-day-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n [daysCount]=\"multiDayViewDaysCount()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-multi-day-view>\n }\n @case ('timelineMonth') {\n <ax-scheduler-timeline-month-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-month-view>\n }\n @case ('agenda') {\n <ax-scheduler-agenda-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-agenda-view>\n }\n }\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { AXSchedulerComponent } from './scheduler.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nconst COMPONENT = [\n AXSchedulerComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerTimelineDayViewComponent,\n];\n\n@NgModule({\n imports: [...COMPONENT],\n exports: [...COMPONENT],\n providers: [],\n})\nexport class AXSchedulerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"acorex-components-scheduler.mjs","sources":["../../../../libs/components/scheduler/src/lib/scheduler.service.ts","../../../../libs/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.ts","../../../../libs/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.html","../../../../libs/components/scheduler/src/lib/views/day/scheduler-day-view.component.ts","../../../../libs/components/scheduler/src/lib/views/day/scheduler-day-view.component.html","../../../../libs/components/scheduler/src/lib/views/month/scheduler-month-view.component.ts","../../../../libs/components/scheduler/src/lib/views/month/scheduler-month-view.component.html","../../../../libs/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.ts","../../../../libs/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.html","../../../../libs/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.ts","../../../../libs/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.html","../../../../libs/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.ts","../../../../libs/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.html","../../../../libs/components/scheduler/src/lib/views/week/scheduler-week-view.component.ts","../../../../libs/components/scheduler/src/lib/views/week/scheduler-week-view.component.html","../../../../libs/components/scheduler/src/lib/scheduler.component.ts","../../../../libs/components/scheduler/src/lib/scheduler.component.html","../../../../libs/components/scheduler/src/lib/scheduler.module.ts","../../../../libs/components/scheduler/src/acorex-components-scheduler.ts"],"sourcesContent":["import { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { inject, Injectable } from '@angular/core';\nimport {\n AXDayOfWeekName,\n AXSchedulerActiveAppointmentsInBlock,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentsByStartBlock,\n AXSchedulerAppointmentType,\n AXSchedulerBlockIdentifier,\n AXSchedulerSlotEvent,\n AXSchedulerView,\n} from './scheduler.class';\n\n@Injectable({\n providedIn: 'root', // Provide service application-wide\n})\nexport class AXSchedulerService {\n private formatService = inject(AXFormatService);\n\n readonly HOURS_PER_DAY = 24;\n readonly MINUTES_PER_HOUR = 60;\n readonly BLOCK_DURATION_MINUTES = 30;\n readonly MILLISECONDS_PER_MINUTE = 60 * 1000;\n readonly MILLISECONDS_PER_DAY = this.HOURS_PER_DAY * this.MINUTES_PER_HOUR * this.MILLISECONDS_PER_MINUTE;\n\n /**\n * Checks if two appointments overlap in time.\n */\n doAppointmentsOverlap(appointmentA: AXSchedulerAppointmentType, appointmentB: AXSchedulerAppointmentType): boolean {\n if (!appointmentA?.startDate || !appointmentA.endDate || !appointmentB?.startDate || !appointmentB.endDate) {\n return false;\n }\n const startA = appointmentA.startDate.date.getTime();\n const endA = appointmentA.endDate.date.getTime();\n const startB = appointmentB.startDate.date.getTime();\n const endB = appointmentB.endDate.date.getTime();\n // Uses strict overlap check (change < / > to <= / >= if touching boundaries count)\n return startA < endB && endA > startB;\n }\n\n /**\n * Calculates appointment duration in minutes.\n */\n calculateDurationInMinutes(Appointment: AXSchedulerAppointmentType): number {\n if (!Appointment?.startDate || !Appointment.endDate) return 0;\n const durationMillis = Appointment.endDate.date.getTime() - Appointment.startDate.date.getTime();\n return Math.max(0, durationMillis / this.MILLISECONDS_PER_MINUTE);\n }\n\n /**\n * Calculates appointment duration in blocks (default 30 min).\n */\n calculateDurationInBlocks(appointment: AXSchedulerAppointmentType): number {\n const durationMinutes = this.calculateDurationInMinutes(appointment);\n return Math.ceil(durationMinutes / this.BLOCK_DURATION_MINUTES);\n }\n\n /**\n * Gets the day index (relative to view start) and block index (relative to start hour)\n * for a given date time within the view context. Returns null if outside view.\n */\n getBlockIdentifier(\n dateTime: AXDateTime,\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number, // Exclusive end hour\n viewTotalDays = 1, // Default to 1 for day view\n ): AXSchedulerBlockIdentifier | null {\n if (!viewStartDate || !dateTime || typeof startHour !== 'number' || typeof endHour !== 'number') {\n return null;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Calculate exclusive end date\n\n // Check if dateTime is within the view's date and time range\n if (\n dateTime.compare(viewStartDate, 'day') < 0 ||\n dateTime.compare(viewEndDate, 'day') >= 0 || // Check against exclusive end date\n dateTime.hour < startHour ||\n dateTime.hour >= endHour // Check against exclusive end hour\n ) {\n return null;\n }\n\n // Calculate day index relative to view start\n const dayIndex = Math.floor((dateTime.date.getTime() - viewStartDate.date.getTime()) / this.MILLISECONDS_PER_DAY);\n\n // Ensure dayIndex is valid for the view duration\n if (dayIndex < 0 || dayIndex >= viewTotalDays) {\n return null;\n }\n\n const minutesIntoDay = dateTime.hour * this.MINUTES_PER_HOUR + dateTime.minute;\n const minutesIntoViewHours = minutesIntoDay - startHour * this.MINUTES_PER_HOUR;\n\n // This check should be redundant due to initial hour check, but safe to keep\n if (minutesIntoViewHours < 0) return null;\n\n const blockIndex = Math.floor(minutesIntoViewHours / this.BLOCK_DURATION_MINUTES);\n\n return { dayIndex, blockIndex };\n }\n\n /**\n * Groups appointments by the blocks they are ACTIVE in for a given view.\n * @param viewTotalDays - Number of days in the current view (1 for Day, 7 for Week, etc.)\n */\n calculateActiveAppointmentsInBlock(\n singleDayAppointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n viewTotalDays: number, // Now required\n ): AXSchedulerActiveAppointmentsInBlock {\n const blocks: AXSchedulerActiveAppointmentsInBlock = {};\n if (!viewStartDate || typeof startHour !== 'number' || typeof endHour !== 'number' || viewTotalDays <= 0) {\n return blocks;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Exclusive end date\n // Calculate total blocks based on consistent block duration\n const totalBlocksPerDay = Math.max(\n 0,\n (endHour - startHour) * (this.MINUTES_PER_HOUR / this.BLOCK_DURATION_MINUTES),\n );\n\n singleDayAppointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.key) return;\n\n // Clamp appointment start/end times to the view boundaries (days and hours)\n let effectiveStart = appointment.startDate.compare(viewStartDate) < 0 ? viewStartDate : appointment.startDate;\n if (effectiveStart.hour < startHour) effectiveStart = effectiveStart.set('hour', startHour).set('minute', 0);\n\n let effectiveEnd = appointment.endDate.compare(viewEndDate) >= 0 ? viewEndDate : appointment.endDate;\n if (effectiveEnd.hour >= endHour) {\n const endDayBase = effectiveEnd.compare(viewEndDate) >= 0 ? viewEndDate.add('day', -1) : effectiveEnd;\n effectiveEnd = endDayBase.set('hour', endHour).set('minute', 0);\n }\n\n // Get start block info using the specified viewTotalDays\n const startInfo = this.getBlockIdentifier(effectiveStart, viewStartDate, startHour, endHour, viewTotalDays);\n if (!startInfo) return; // Appointment starts completely outside view\n\n // Get end block info (last block occupied) using the specified viewTotalDays\n const timeBeforeEnd = effectiveEnd.add('minute', -1);\n const endInfo = this.getBlockIdentifier(timeBeforeEnd, viewStartDate, startHour, endHour, viewTotalDays);\n // If endInfo is null, it means the appointment ends before the viewable part starts,\n // or exactly at the start, so it occupies no blocks. Handle this case.\n if (\n !endInfo ||\n endInfo.dayIndex < startInfo.dayIndex ||\n (endInfo.dayIndex === startInfo.dayIndex && endInfo.blockIndex < startInfo.blockIndex)\n ) {\n return; // Appointment effectively has no duration within the viewable blocks\n }\n\n // Iterate through the days and blocks the appointment spans within the view\n for (let dIdx = startInfo.dayIndex; dIdx <= endInfo.dayIndex; dIdx++) {\n // Clamp day index just in case (should be handled by getBlockIdentifier checks)\n if (dIdx < 0 || dIdx >= viewTotalDays) continue;\n\n const startBlock = dIdx === startInfo.dayIndex ? startInfo.blockIndex : 0;\n // Make sure endBlock doesn't exceed the calculated totalBlocksPerDay\n const endBlock = dIdx === endInfo.dayIndex ? endInfo.blockIndex : totalBlocksPerDay - 1;\n\n if (!blocks[dIdx]) blocks[dIdx] = {};\n\n for (let bIdx = startBlock; bIdx <= endBlock; bIdx++) {\n // Final check for block index validity\n if (bIdx >= 0 && bIdx < totalBlocksPerDay) {\n if (!blocks[dIdx][bIdx]) blocks[dIdx][bIdx] = [];\n // Avoid duplicates if the same appointment is processed multiple times (shouldn't happen with outer loop)\n if (!blocks[dIdx][bIdx].some((e) => e.key === appointment.key)) {\n blocks[dIdx][bIdx].push(appointment);\n }\n }\n }\n }\n });\n return blocks;\n }\n\n /**\n * Calculates max concurrency and effective total columns for Day View appointments.\n */\n calculateDayViewConcurrencyInfo(\n singleDayAppointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime, // Need start date for context\n startHour: number,\n endHour: number,\n ): Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> {\n const concurrencyInfo = new Map<any, { maxConcurrency: number; effectiveTotalColumns: number }>();\n if (singleDayAppointments.length === 0) return concurrencyInfo;\n\n // Use the consolidated function for day view (viewTotalDays = 1)\n // It returns ActiveAppointmentsInBlock, which has dayIndex 0 for Day view\n const activeAppointmentsMap = this.calculateActiveAppointmentsInBlock(\n singleDayAppointments,\n viewStartDate,\n startHour,\n endHour,\n 1,\n );\n const blocks = activeAppointmentsMap[0] ?? {}; // Extract blocks for the single day (dayIndex 0)\n\n // --- The rest of the logic remains the same, using the 'blocks' derived above ---\n\n // 1. Calculate maxConcurrency for each appointment based on blocks it occupies\n const maxConcurrencyMap: Record<any, number> = {};\n singleDayAppointments.forEach((appointment) => {\n let maxOverlap = 0;\n // Recalculate block range for *this specific appointment* relative to view hours\n const startMinutes = appointment.startDate.hour * this.MINUTES_PER_HOUR + appointment.startDate.minute;\n const endMinutes = appointment.endDate.hour * this.MINUTES_PER_HOUR + appointment.endDate.minute;\n const startBlockOffset = Math.max(0, startMinutes - startHour * this.MINUTES_PER_HOUR);\n const endBlockOffset = Math.min(\n (endHour - startHour) * this.MINUTES_PER_HOUR,\n endMinutes - startHour * this.MINUTES_PER_HOUR,\n );\n const startBlockIndex = Math.floor(startBlockOffset / this.BLOCK_DURATION_MINUTES);\n const endBlockIndex = Math.ceil(endBlockOffset / this.BLOCK_DURATION_MINUTES);\n\n for (let blockIdx = startBlockIndex; blockIdx < endBlockIndex; blockIdx++) {\n const blockData = blocks[blockIdx]; // Access block data using block index\n if (blockData) {\n // blockData now contains appointment objects, use length directly\n maxOverlap = Math.max(maxOverlap, blockData.length);\n }\n }\n // Edge case handling (use blockData.length)\n const startBlockData = blocks[startBlockIndex];\n if (startBlockData) {\n if (startBlockIndex === endBlockIndex - 1 || startBlockIndex >= endBlockIndex) {\n maxOverlap = Math.max(maxOverlap, startBlockData.length);\n }\n }\n\n maxConcurrencyMap[appointment.key] = maxOverlap || 1;\n });\n\n // 2. Calculate effectiveTotalColumns by checking overlaps\n singleDayAppointments.forEach((appointment) => {\n const appointmentKey = appointment.key;\n let effectiveTotalColumns = maxConcurrencyMap[appointmentKey] || 1;\n\n for (const otherAppointment of singleDayAppointments) {\n if (appointmentKey === otherAppointment.key) continue;\n if (this.doAppointmentsOverlap(appointment, otherAppointment)) {\n const otherMaxConcurrency = maxConcurrencyMap[otherAppointment.key] || 1;\n effectiveTotalColumns = Math.max(effectiveTotalColumns, otherMaxConcurrency);\n }\n }\n concurrencyInfo.set(appointmentKey, {\n maxConcurrency: maxConcurrencyMap[appointmentKey] || 1, // Keep original max concurrency\n effectiveTotalColumns: effectiveTotalColumns,\n });\n });\n\n return concurrencyInfo;\n }\n\n /**\n * Groups appointments by the block they START in for Week View.\n */\n calculateWeekViewAppointmentsByStartBlock(\n singleDayAppointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n ): AXSchedulerAppointmentsByStartBlock {\n const blocks: AXSchedulerAppointmentsByStartBlock = {};\n singleDayAppointments.forEach((appointment) => {\n if (!appointment.startDate) return;\n const startInfo = this.getBlockIdentifier(appointment.startDate, viewStartDate, startHour, endHour, 7);\n if (startInfo) {\n const { dayIndex, blockIndex } = startInfo;\n if (!blocks[dayIndex]) blocks[dayIndex] = {};\n if (!blocks[dayIndex][blockIndex]) blocks[dayIndex][blockIndex] = [];\n blocks[dayIndex][blockIndex].push(appointment);\n }\n });\n return blocks;\n }\n\n /**\n * Groups appointments by the day(s) they occur on within a given date range.\n * Returns a Map where the key is the date string ('YYYY-MM-DD') and the value is an array of appointments.\n */\n groupAppointmentsByDay(\n appointments: AXSchedulerAppointmentType[],\n viewStartDate: AXDateTime, // First day visible in the grid\n viewEndDate: AXDateTime, // Last day visible in the grid\n ): Map<string, AXSchedulerAppointmentType[]> {\n const groupedAppointments = new Map<string, AXSchedulerAppointmentType[]>();\n if (!appointments || appointments.length === 0 || !viewStartDate || !viewEndDate) {\n return groupedAppointments;\n }\n\n // Pre-calculate the end date for comparison (exclusive)\n const exclusiveViewEndDate = viewEndDate.add('day', 1);\n\n appointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.key) return;\n\n // Determine the effective start and end dates of the appointment clamped by the view range\n const appointmentStart = appointment.startDate;\n const appointmentEnd = appointment.endDate;\n\n // Skip if appointment ends before the view starts or starts after the view ends\n if (\n appointmentEnd.compare(viewStartDate, 'day') < 0 ||\n appointmentStart.compare(exclusiveViewEndDate, 'day') >= 0\n ) {\n return;\n }\n\n // Clamp start date to the view start date\n let currentDay =\n appointmentStart.compare(viewStartDate, 'day') < 0 ? viewStartDate : appointmentStart.startOf('day');\n\n // Loop through each day the appointment spans within the view range\n let safeCount = 0; // Prevent infinite loops\n while (\n currentDay.compare(appointmentEnd, 'day') <= 0 &&\n currentDay.compare(exclusiveViewEndDate, 'day') < 0 &&\n safeCount < 100\n ) {\n const dateString = this.formatService.format(currentDay, 'datetime', { format: 'YYYY-MM-DD' }); // Use a consistent key format\n\n if (!groupedAppointments.has(dateString)) {\n groupedAppointments.set(dateString, []);\n }\n // Add the appointment if it's not already in the list for that day\n if (!groupedAppointments.get(dateString).some((e) => e.key === appointment.key)) {\n groupedAppointments.get(dateString).push(appointment);\n }\n\n currentDay = currentDay.add('day', 1);\n safeCount++;\n }\n if (safeCount >= 100) {\n console.warn('Safety break hit in groupAppointmentsByDay loop for appointment:', appointment.key);\n }\n });\n\n return groupedAppointments;\n }\n\n getDayOfWeekNumber(dayName: AXDayOfWeekName): number {\n switch (dayName) {\n case 'Sunday':\n return 1;\n case 'Monday':\n return 2;\n case 'Tuesday':\n return 3;\n case 'Wednesday':\n return 4;\n case 'Thursday':\n return 5;\n case 'Friday':\n return 6;\n case 'Saturday':\n return 7;\n default:\n console.warn(`Invalid day name: ${dayName}. Defaulting to Sunday (1).`);\n return 1;\n }\n }\n\n getSlotData(\n startDate: AXDateTime,\n view: AXSchedulerView,\n ): { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } {\n let endDate: AXDateTime;\n switch (view) {\n case 'day':\n case 'week':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES);\n break;\n case 'timelineDay':\n case 'timelineMultiDay':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES * 2);\n break;\n case 'month':\n case 'agenda':\n case 'timelineMonth':\n startDate = startDate.startOf('day');\n endDate = startDate.endOf('day');\n break;\n }\n return { startDate, endDate, view };\n }\n\n handleEvent(\n event: AXSchedulerSlotEvent | AXSchedulerAppointmentEvent,\n eventOutputMap,\n eventType: 'appointment' | 'slot',\n ) {\n const mouseEvent = event.event;\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n if (eventType === 'appointment') {\n const appointmentOutputMap = eventOutputMap[eventType];\n const emitter = appointmentOutputMap[mouseEvent.type as keyof typeof appointmentOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerAppointmentEvent);\n }\n if (eventType === 'slot') {\n const slotOutputMap = eventOutputMap[eventType];\n const emitter = slotOutputMap[mouseEvent.type as keyof typeof slotOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerSlotEvent);\n }\n }\n\n // --- Timeline Specific Helpers ---\n\n calculateTimelineLayout(\n appt: AXSchedulerAppointmentType,\n startHour: number,\n endHour: number,\n ): { left: string; width: string } | null {\n if (\n !appt?.startDate ||\n !appt.endDate ||\n typeof startHour !== 'number' ||\n typeof endHour !== 'number' ||\n startHour >= endHour\n ) {\n console.warn('calculateTimelinePixelLayout: Invalid input', { appt, startHour, endHour });\n return null;\n }\n\n const startMinutes = appt.startDate.hour * 60 + appt.startDate.minute;\n const startBlockOffset = startMinutes - startHour * 60;\n const xBlock = startBlockOffset / 60;\n const left = `calc(var(--ax-comp-scheduler-timeline-view-blocks-width) * ${xBlock} + 1px)`;\n\n const durationMillis = appt.endDate.date.getTime() - appt.startDate.date.getTime();\n const durationMinutes = Math.max(0, durationMillis / (1000 * 60));\n const widthBlock = durationMinutes / 60;\n const blockWidthExpr = `var(--ax-comp-scheduler-timeline-view-blocks-width)`;\n const width = `calc(${blockWidthExpr} * ${widthBlock})`;\n\n return { left, width };\n }\n}\n","import { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerMultiDayViewAppointmentType,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-agenda-view',\n templateUrl: './scheduler-agenda-view.component.html',\n styleUrl: './scheduler-agenda-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, AXFormatPipe, AXDecoratorGenericComponent, AXDragDirective, AXDropZoneDirective],\n})\nexport class AXSchedulerAgendaViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n multiDayAppointments = computed<AXSchedulerMultiDayViewAppointmentType[]>(() => {\n const current = this.date();\n const mapped = this.appointments();\n const daysCount = this.daysCount();\n\n return Array.from({ length: daysCount }, (_, i): AXSchedulerMultiDayViewAppointmentType => {\n const dayStart = current.add('day', i).add('hour', this.startHour());\n const dayEnd = dayStart.add('day', 1).add('hour', this.endHour() - this.startHour());\n const appointmentsForDay = mapped.filter(\n (appt) =>\n (appt.endDate.compare(dayStart, 'day') >= 0 &&\n appt.startDate.compare(dayEnd, 'day') < 0 &&\n appt.endDate.compare(dayStart, 'hour') >= 0 &&\n appt.startDate.compare(dayEnd, 'hour') < 0) ||\n (appt.endDate.compare(dayStart, 'day') >= 0 && appt.startDate.compare(dayEnd, 'day') < 0 && appt.allDay),\n );\n return {\n appointments: appointmentsForDay,\n date: dayStart,\n };\n });\n\n return [];\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'agenda');\n if (slotData) {\n this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n }\n handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'agenda');\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-agenda-container\">\n @for (appt of multiDayAppointments(); track appt.appointments) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, appt.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n [class.ax-today]=\"isToday(appt.date)\"\n class=\"ax-scheduler-agenda-view-container\"\n (click)=\"handleSlotEvent($event, appt.date)\"\n (dblclick)=\"handleSlotEvent($event, appt.date)\"\n (contextmenu)=\"handleSlotEvent($event, appt.date)\"\n >\n <div class=\"ax-scheduler-agenda-header-date-day\">\n <span class=\"ax-scheduler-agenda-header-date-day-char\">\n {{ appt.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-agenda-header-date-day-num\">\n {{ appt.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <div class=\"ax-scheduler-agenda-appointment-container\">\n @for (appointment of appt.appointments; track appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-agenda-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerDayAppointmentLayout,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-day-view',\n templateUrl: './scheduler-day-view.component.html',\n styleUrl: './scheduler-day-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXDecoratorGenericComponent,\n AsyncPipe,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXFormatPipe,\n AXDragDirective,\n AXDropZoneDirective,\n ],\n})\nexport class AXSchedulerDayViewComponent extends MXBaseComponent {\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n allDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.allDay) ?? []);\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSingleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'day');\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n handleAllDaySlotEvent(mouseEvent: MouseEvent) {\n const endDate = this.date().endOf('day');\n const startDate = this.date().startOf('day');\n const slotData = { startDate, endDate, view: 'day' as const };\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n handleAllDayDrop(e: AXDropZoneDropEvent) {\n const endDate = this.date().endOf('day');\n const startDate = this.date().startOf('day');\n const slotData = { startDate, endDate, view: 'day' as const };\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n handleSingleDayDrop(e: AXDropZoneDropEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'day');\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n\n hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startHour()).set('minute', 0).set('second', 0);\n const hours = [time];\n while (time.hour < this.endHour()) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n appointmentLayouts = computed(() => {\n const layouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n const sAppointments = this.singleDayAppointments();\n const viewDate = this.date(); // Get the start date for the view\n const startH = this.startHour();\n const endH = this.endHour();\n\n // Add check for viewDate\n if (sAppointments.length === 0 || !viewDate || typeof startH !== 'number' || typeof endH !== 'number') {\n return layouts;\n }\n\n // Pass viewDate to the service method\n const concurrencyInfo = this.schedulerService.calculateDayViewConcurrencyInfo(\n sAppointments,\n viewDate,\n startH,\n endH,\n );\n\n // Sort for greedy placement\n const sortedAppointments = orderBy(\n sAppointments,\n [(e) => e.startDate.date.getTime(), (e) => e.endDate.date.getTime()],\n ['asc', 'desc'],\n );\n\n // --- First Pass: Assign Columns Greedily (remains in component) ---\n const columnEndTimes = new Map<number, AXDateTime>();\n const assignedColumns = new Map<any, number>(); // Store assigned col index per appointment key\n\n for (const appointment of sortedAppointments) {\n let assignedColumn = -1;\n let colIdx = 0;\n while (assignedColumn < 0) {\n const lastAppointmentEndTimeInColumn = columnEndTimes.get(colIdx);\n // Use service overlap check? (Optional, simple comparison is fine here)\n if (\n !lastAppointmentEndTimeInColumn ||\n lastAppointmentEndTimeInColumn.compare(appointment.startDate, 'minute') <= 0\n ) {\n assignedColumn = colIdx;\n } else {\n colIdx++;\n }\n // Safety break\n if (colIdx > sAppointments.length * 2 && assignedColumn < 0) {\n console.warn(`DayView: Safety break assigning column 0 for appointment ${appointment.key}`);\n assignedColumn = 0;\n break;\n }\n }\n assignedColumns.set(appointment.key, assignedColumn); // Store assignment\n\n // Update end time for the assigned column\n const currentEndTimeInColumn = columnEndTimes.get(assignedColumn);\n if (!currentEndTimeInColumn || appointment.endDate.compare(currentEndTimeInColumn, 'minute') > 0) {\n columnEndTimes.set(assignedColumn, appointment.endDate);\n }\n }\n\n // --- Combine results ---\n sAppointments.forEach((appointment) => {\n const appointmentKey = appointment.key;\n const assignedCol = assignedColumns.get(appointmentKey);\n const effectiveCols = concurrencyInfo.get(appointmentKey)?.effectiveTotalColumns;\n\n // Ensure we have both pieces of info\n if (typeof assignedCol === 'number' && typeof effectiveCols === 'number') {\n layouts.set(appointmentKey, {\n columnIndex: assignedCol,\n effectiveTotalColumns: effectiveCols,\n });\n } else {\n console.warn(`DayView: Missing layout info for appointment ${appointmentKey}. Assigning default.`);\n // Provide a fallback default layout?\n layouts.set(appointmentKey, { columnIndex: 0, effectiveTotalColumns: 1 });\n }\n });\n\n return layouts;\n });\n\n // --- Style Calculation Functions (depend on appointmentLayouts - no change needed) ---\n getAppointmentLayout(key: any): AXSchedulerDayAppointmentLayout | undefined {\n return this.appointmentLayouts().get(key);\n }\n\n getAppointmentLeft(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n const C = layout.columnIndex;\n if (C === 0 || N <= 1) return '0px';\n const leftPercent = C * (100 / N);\n const gapOffsetPx = C * this.GAP_PX;\n return `calc(${leftPercent}% + ${gapOffsetPx}px)`;\n }\n return '0px';\n }\n\n getAppointmentWidth(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n const C = layout.columnIndex;\n if (N <= 0) return '0%';\n if (N === 1) return '100%';\n const widthPercent = (1 / N) * 100;\n const isLastColumn = C + 1 === N;\n if (!isLastColumn) {\n return `calc(${widthPercent}% - ${this.GAP_PX}px)`;\n } else {\n const cumulativeGapPx = (N - 1) * this.GAP_PX;\n return `calc(${widthPercent}% - ${cumulativeGapPx}px)`;\n }\n }\n return '0%';\n }\n\n getAppointmentTop(key: any): string {\n const appointment = this.appointments().find((e) => e.key === key);\n const layout = this.getAppointmentLayout(key);\n if (appointment?.singleDay && layout) {\n const startMinutes = appointment.startDate.hour * 60 + appointment.startDate.minute;\n const startBlockOffset = startMinutes - this.startHour() * 60;\n const yBlock = startBlockOffset / 30;\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${yBlock} + 1px)`;\n }\n return '';\n }\n\n getAppointmentHeight(key: any): string {\n const appointment = this.appointments().find((e) => e.key === key);\n if (appointment?.singleDay) {\n const durationMillis = appointment.endDate.date.getTime() - appointment.startDate.date.getTime();\n const durationMinutes = Math.max(0, durationMillis / (1000 * 60));\n const heightBlock = durationMinutes / 30;\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height)`;\n return `calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_PX}px)`;\n }\n return '0px';\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-day-header\">\n <div class=\"ax-scheduler-day-header-table\" aria-hidden=\"true\">\n <div>\n {{ 'dateTime.duration.all-day' | translate | async }}\n </div>\n </div>\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleAllDayDrop($event)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleAllDaySlotEvent($event)\"\n (dblclick)=\"handleAllDaySlotEvent($event)\"\n (contextmenu)=\"handleAllDaySlotEvent($event)\"\n class=\"ax-scheduler-day-header-table-container\"\n >\n <div class=\"ax-scheduler-day-header-appointment-container\">\n @if (allDayAppointments().length) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n [dragData]=\"allDayAppointments()[0]\"\n (click)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (dblclick)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n [title]=\"allDayAppointments()[0].title\"\n class=\"ax-scheduler-header-day-appointment\"\n [style.color]=\"allDayAppointments()[0].textColor\"\n [style.background-color]=\"allDayAppointments()[0].backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ allDayAppointments()[0].title }}</ax-title>\n </div>\n }\n @if (allDayAppointments().length > 1) {\n <div\n #moreAppointments\n class=\"ax-scheduler-day-header-more-tag\"\n [style.color]=\"allDayAppointments()[1].textColor\"\n [style.background-color]=\"allDayAppointments()[1].backgroundColor\"\n >\n {{ 'more-items' | translate: { params: { number: allDayAppointments().length - 1 } } | async }}\n </div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\">\n @for (appointment of allDayAppointments(); track appointment.key; let first = $first) {\n @if (!first) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-day-time-container\">\n <table class=\"ax-scheduler-day-time\" aria-hidden=\"true\" [border]=\"1\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </table>\n <div class=\"ax-scheduler-day-table-container\">\n <div class=\"ax-scheduler-day-appointment-container\">\n @for (appointment of singleDayAppointments(); track appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n class=\"ax-scheduler-day-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.width]=\"getAppointmentWidth(appointment.key)\"\n [style.height]=\"getAppointmentHeight(appointment.key)\"\n [style.background-color]=\"appointment.backgroundColor\"\n [style.inset-block-start]=\"getAppointmentTop(appointment.key)\"\n [style.inset-inline-start]=\"getAppointmentLeft(appointment.key)\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-day-slot\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleSingleDayDrop($event, time)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleSingleSlotEvent($event, time)\"\n (dblclick)=\"handleSingleSlotEvent($event, time)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time)\"\n ></div>\n <div\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time.add('minute', 30))\"\n (click)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n (dblclick)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n (contextmenu)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n ></div>\n }\n </div>\n </div>\n</div>\n","import { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { MXBaseComponent } from '@acorex/components/common';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe, AXFormatService } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXDayOfWeekName,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class'; // Adjust path\nimport { AXSchedulerService } from '../../scheduler.service'; // Adjust path\n\n// --- Types specific to Month View Layout ---\n// Represents a single day cell in the month grid\nexport type AXSchedulerMonthDayCell = {\n date: AXDateTime;\n isCurrentMonth: boolean;\n isToday: boolean;\n appointments: AXSchedulerAppointmentType[]; // All appointments for this day\n visibleAppointments: AXSchedulerAppointmentType[]; // Appointments to display as chips\n hiddenAppointments: AXSchedulerAppointmentType[]; // Appointments hidden behind the badge\n overflowCount: number; // Count of hidden appointments (length of hiddenAppointments)\n};\n\n@Component({\n selector: 'ax-scheduler-month-view',\n templateUrl: './scheduler-month-view.component.html',\n styleUrl: './scheduler-month-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AsyncPipe,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXFormatPipe,\n AsyncPipe,\n AXDragDirective,\n AXDropZoneDirective,\n ],\n})\nexport class AXSchedulerMonthViewComponent extends MXBaseComponent {\n private formatService = inject(AXFormatService);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n // --- Inputs ---\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n date = input.required<AXDateTime>(); // A date within the target month\n appointments = input<AXSchedulerAppointmentType[]>([]);\n firstDayOfWeek = input<AXDayOfWeekName>('Saturday'); // Match scheduler component default\n\n // --- Constants ---\n readonly DAYS_IN_WEEK = 7;\n readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 2;\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'month');\n if (slotData) {\n this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n }\n handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'month');\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n\n // --- Base Computeds ---\n // Calculate the start of the month based on the input date\n monthStartDate = computed(() => {\n const d = this.date();\n return d ? d.startOf('month') : null;\n });\n\n // Generate the list of weekday names based on the firstDayOfWeek\n daysArray = computed(() => {\n const firstDayNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const dayNames: AXDateTime[] = [];\n\n const currentDate = this.date();\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n let date = currentDate.add('day', -daysToSubtract);\n date = date.add('day', firstDayNum - 1);\n for (let i = 0; i < 7; i++) {\n dayNames.push(date);\n date = date.add('day', 1);\n }\n return dayNames;\n });\n\n // --- Calendar Grid Calculation ---\n calendarDaysInfo = computed(() => {\n const monthStart = this.monthStartDate();\n if (!monthStart) return { days: [], weeksNeeded: 0 }; // Return object\n\n const firstDayOfMonth = monthStart;\n const lastDayOfMonth = monthStart.endOf('month');\n const daysInMonth = lastDayOfMonth.dayOfMonth; // Get number of days in the month\n\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n\n const leadingDays = (firstDisplayedDayOfWeek - firstDayGridNum + this.DAYS_IN_WEEK) % this.DAYS_IN_WEEK;\n const firstDayOfGrid = firstDayOfMonth.add('day', -leadingDays);\n\n // Calculate total cells needed (leading days + days in month)\n const totalCells = leadingDays + daysInMonth;\n // Calculate weeks needed (round up)\n const weeksNeeded = Math.ceil(totalCells / this.DAYS_IN_WEEK);\n // Ensure a minimum of 4 and maximum of 6 weeks for reasonable display, adjust if needed\n const actualWeeksToShow = Math.max(4, Math.min(weeksNeeded, 6));\n const totalDaysToGenerate = actualWeeksToShow * this.DAYS_IN_WEEK;\n\n const days: AXSchedulerMonthDayCell[] = [];\n const today = this.calendarService.create(new Date());\n let currentDay = firstDayOfGrid;\n\n for (let i = 0; i < totalDaysToGenerate; i++) {\n days.push({\n date: currentDay,\n isCurrentMonth: currentDay.monthOfYear === monthStart.monthOfYear,\n isToday: currentDay.equal(today, 'day'),\n appointments: [],\n visibleAppointments: [],\n hiddenAppointments: [],\n overflowCount: 0,\n });\n currentDay = currentDay.add('day', 1);\n }\n // Return both days array and weeks needed\n return { days: days, weeksNeeded: actualWeeksToShow };\n });\n\n // --- Appointment Grouping ---\n appointmentsGroupedByDay = computed(() => {\n const { days } = this.calendarDaysInfo(); // Destructure to get days array\n if (days.length === 0) return new Map<string, AXSchedulerAppointmentType[]>();\n\n const viewStartDate = days[0].date;\n const viewEndDate = days[days.length - 1].date;\n const relevantAppointments = this.appointments();\n\n return this.schedulerService.groupAppointmentsByDay(relevantAppointments, viewStartDate, viewEndDate);\n });\n\n // --- Day Cell Layout Calculation ---\n dayCellLayouts = computed((): AXSchedulerMonthDayCell[] => {\n // Get initial day info (date, isCurrentMonth, isToday)\n const { days: initialDaysInfo } = this.calendarDaysInfo();\n // Get appointments grouped by YYYY-MM-DD string\n const groupedAppointments = this.appointmentsGroupedByDay();\n\n return initialDaysInfo.map((dayInfo) => {\n const dateString = this.formatService.format(dayInfo.date, 'datetime', {\n format: 'YYYY-MM-DD',\n calendar: this.calendar(),\n });\n const appointmentsForDay = groupedAppointments.get(dateString) ?? [];\n\n // Sort appointments (all-day first, then by time)\n const sortedAppointments = orderBy(\n appointmentsForDay,\n [(e) => (e.allDay ? 0 : 1), (e) => e.startDate.date.getTime()],\n ['asc', 'asc'],\n );\n\n // Determine visible and hidden appointments\n const visibleAppointments = sortedAppointments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedAppointments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY); // Get the actual hidden ones\n const overflowCount = hiddenAppointments.length; // Count is simply the length\n\n return {\n ...dayInfo, // Keep date, isCurrentMonth, isToday\n appointments: sortedAppointments, // Store all sorted appointments\n visibleAppointments: visibleAppointments,\n hiddenAppointments: hiddenAppointments, // **** STORE HIDDEN APPOINTMENTS ****\n overflowCount: overflowCount,\n };\n });\n });\n\n // --- Dynamic Grid Rows ---\n gridTemplateRowsStyle = computed(() => {\n const { weeksNeeded } = this.calendarDaysInfo();\n if (!weeksNeeded || weeksNeeded <= 0) {\n return `repeat(6, minmax(5rem, 1fr))`; // Default fallback\n }\n // Use the calculated number of weeks\n return `repeat(${weeksNeeded}, minmax(5rem, 1fr))`;\n });\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-month-container\">\n <!-- Weekday Header -->\n <div class=\"ax-scheduler-month-weekdays\">\n <!-- Use daysArray for header, assuming it provides correct names/order -->\n @for (day of daysArray(); track day.date.getTime()) {\n <div class=\"ax-scheduler-month-weekday\">\n {{ day | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <!-- Calendar Grid - Add dynamic style -->\n <div class=\"ax-scheduler-month-grid\" [style.gridTemplateRows]=\"gridTemplateRowsStyle()\">\n <!-- Iterate over the final layout data -->\n @for (dayCell of dayCellLayouts(); track dayCell.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayCell.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleSlotEvent($event, dayCell.date)\"\n (dblclick)=\"handleSlotEvent($event, dayCell.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayCell.date)\"\n [class.ax-today]=\"dayCell.isToday\"\n class=\"ax-scheduler-month-day-cell\"\n [class.ax-other-month]=\"!dayCell.isCurrentMonth\"\n >\n <div class=\"ax-scheduler-month-day-header\">\n <span class=\"ax-scheduler-month-day-number\">{{ dayCell.date.dayOfMonth }}</span>\n </div>\n <div class=\"ax-scheduler-month-day-appointments\">\n <!-- Visible Appointment Chips -->\n @for (appointment of dayCell.visibleAppointments; track appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-month-appointment-chip\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <!-- Optionally show time for non-all-day appointments -->\n <!-- @if (!appointment.allDay) {\n <span class=\"ax-appointment-chip-time\">\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </span>\n } -->\n <span class=\"ax-appointment-chip-title ax-scheduler-truncate\">{{ appointment.title }}</span>\n </div>\n }\n @if (dayCell.overflowCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\">\n +{{ 'more-items' | translate: { params: { number: dayCell.overflowCount } } | async }}\n </div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (appointment of dayCell.hiddenAppointments; track appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <span class=\"ax-appointment-chip-title ax-scheduler-truncate\">{{ appointment.title }}</span>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentType,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-timeline-day-view',\n templateUrl: './scheduler-timeline-day-view.component.html',\n styleUrl: './scheduler-timeline-day-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXDecoratorGenericComponent, AXFormatPipe, AsyncPipe, AXDragDirective, AXDropZoneDirective],\n})\nexport class AXSchedulerTimelineDayViewComponent extends MXBaseComponent {\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'timelineDay');\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n handleDrop(e: AXDropZoneDropEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'timelineDay');\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n\n hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startHour()).set('minute', 0).set('second', 0);\n const hours = [time];\n while (time.hour < this.endHour()) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n // --- Appointment Layout Calculation ---\n appointmentLayouts = computed((): AXSchedulerAppointmentLayout[] => {\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const startH = this.startHour();\n const endH = this.endHour();\n const appointmentsToLayout = this.singleDayAppointments(); // Use filtered appointments\n\n if (typeof startH !== 'number' || typeof endH !== 'number' || appointmentsToLayout.length === 0) {\n return finalLayouts;\n }\n\n // Sort by start time first for processing order\n const sortedAppointments = orderBy(\n appointmentsToLayout,\n [(a) => a.startDate.date.getTime(), (a) => a.endDate.date.getTime()],\n ['asc', 'desc'], // Process earlier events first\n );\n\n const rowEndTimes: number[] = []; // Stores end minute (relative to view start) of last appt in each row\n\n for (const appointment of sortedAppointments) {\n // Calculate horizontal percentage position and width using the service\n const horiz = this.schedulerService.calculateTimelineLayout(appointment, startH, endH);\n // Skip if appointment is outside the viewable hour range horizontally\n if (!horiz) continue;\n\n // Calculate start/end minutes relative to the start of the view hours for overlap check\n const apptStartMinutes = Math.max(\n 0,\n appointment.startDate.hour * 60 + appointment.startDate.minute - startH * 60,\n );\n // Ensure duration is calculated correctly based on potentially clamped start/end within view hours\n const effectiveStartMinutes = Math.max(\n startH * 60,\n appointment.startDate.hour * 60 + appointment.startDate.minute,\n );\n const effectiveEndMinutes = Math.min(endH * 60, appointment.endDate.hour * 60 + appointment.endDate.minute);\n const durationMinutes = Math.max(0, effectiveEndMinutes - effectiveStartMinutes);\n const apptEndMinutes = apptStartMinutes + durationMinutes; // End minute relative to startHour\n\n // Find the first available vertical row (rowIndex) for stacking\n let assignedRowIndex = -1;\n for (let i = 0; i < rowEndTimes.length; i++) {\n // If this appointment starts AFTER OR AT the time the row becomes free\n // Using >= allows appointments starting exactly when another ends to potentially share a row if desired.\n // Using > would force a new row if they touch exactly. Let's use >= for packing.\n if (apptStartMinutes >= rowEndTimes[i]) {\n assignedRowIndex = i;\n break;\n }\n }\n\n // If no available row found, add a new row\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(apptEndMinutes); // Add end time for the new row\n } else {\n // Update the end time for the assigned row ONLY if this one ends later\n rowEndTimes[assignedRowIndex] = Math.max(rowEndTimes[assignedRowIndex], apptEndMinutes);\n }\n\n // Height is directly the CSS variable\n const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)';\n // Calculate layout styles\n const layoutLeft = horiz.left;\n // Apply the 1px gap by subtracting it from the width\n const layoutWidth = `calc(${horiz.width} - ${this.GAP_PX}px)`;\n // Calculate top using calc() with the CSS variable and the VERTICAL gap\n const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`;\n\n finalLayouts.push({\n appointment: appointment, // Store original appointment data\n layoutLeft,\n layoutWidth,\n layoutTop,\n layoutHeight,\n });\n }\n\n // No second pass implemented here for simplicity, greedy approach used.\n // If vertical packing needs further optimization, a second pass could be added.\n return finalLayouts;\n });\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-timeline-header\">\n @for (hour of hoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-header-hours\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n</div>\n\n<div class=\"ax-scheduler-timeline-content\">\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (layout of appointmentLayouts(); track layout.appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n [dragData]=\"layout.appointment\"\n (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n [title]=\"layout.appointment.title\"\n [style.width]=\"layout.layoutWidth\"\n [style.height]=\"layout.layoutHeight\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.insetBlockStart]=\"layout.layoutTop\"\n [style.color]=\"layout.appointment.textColor\"\n [style.insetInlineStart]=\"layout.layoutLeft\"\n [style.background-color]=\"layout.appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</ax-title>\n <ax-subtitle>\n {{ layout.appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ layout.appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, time)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-slot-cell\"\n (click)=\"handleSlotEvent($event, time)\"\n (dblclick)=\"handleSlotEvent($event, time)\"\n (contextmenu)=\"handleSlotEvent($event, time)\"\n ></div>\n }\n </div>\n</div>\n","import { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface MultiDayViewDayData {\n date: AXDateTime;\n visibleAppointments: AXSchedulerAppointmentType[];\n hiddenAppointments: AXSchedulerAppointmentType[];\n moreCount: number;\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-month-view',\n templateUrl: './scheduler-timeline-month-view.component.html',\n styleUrl: './scheduler-timeline-month-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXDecoratorGenericComponent,\n AXFormatPipe,\n AsyncPipe,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXDragDirective,\n AXDropZoneDirective,\n ],\n})\nexport class AXSchedulerTimelineMonthViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n monthAppointments = computed<MultiDayViewDayData[]>(() => {\n const mapped = this.appointments();\n const current = this.date().startOf('month');\n const daysCount = current.endOf('month').dayOfMonth;\n\n return Array.from({ length: daysCount }, (_, i): MultiDayViewDayData => {\n const dayStart = current.add('day', i).add('hour', this.startHour());\n const dayEnd = dayStart.add('day', 1).add('hour', this.endHour() - this.startHour());\n const appointmentsForDay = mapped.filter(\n (appt) =>\n !appt.allDay &&\n appt.singleDay &&\n appt.endDate.compare(dayStart, 'day') >= 0 &&\n appt.startDate.compare(dayEnd, 'day') < 0 &&\n appt.endDate.compare(dayStart, 'hour') >= 0 &&\n appt.startDate.compare(dayEnd, 'hour') < 0,\n );\n\n const visibleAppointments = appointmentsForDay.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = appointmentsForDay.slice(\n this.MAX_VISIBLE_APPOINTMENTS_PER_DAY,\n appointmentsForDay.length,\n );\n\n return {\n date: dayStart,\n visibleAppointments,\n hiddenAppointments,\n moreCount: hiddenAppointments.length,\n };\n });\n\n return [];\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'timelineMonth');\n if (slotData) {\n this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n }\n handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date, 'timelineMonth');\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-timeline-month-container\">\n @for (appt of monthAppointments(); track appt.visibleAppointments) {\n <div>\n <div class=\"ax-scheduler-timeline-header\">\n <div class=\"ax-scheduler-month-header-date-day\" [class.ax-today]=\"isToday(appt.date)\">\n <span class=\"ax-scheduler-month-header-date-day-char\">\n {{ appt.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-month-header-date-day-num\">\n {{ appt.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, appt.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, appt.date)\"\n (dblclick)=\"handleSlotEvent($event, appt.date)\"\n (contextmenu)=\"handleSlotEvent($event, appt.date)\"\n >\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (appointment of appt.visibleAppointments; track appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n @if (appt.moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\">\n +{{ 'more-items' | translate: { params: { number: appt.moreCount } } | async }}\n </div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (appointment of appt.hiddenAppointments; track appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-popover-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <span class=\"ax-appointment-chip-title ax-scheduler-truncate\">{{ appointment.title }}</span>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n </div>\n }\n</div>\n","import { MXBaseComponent } from '@acorex/components/common';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, output } from '@angular/core';\nimport {\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerMultiDayViewAppointmentType,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerTimelineDayViewComponent } from '../timeline-day/scheduler-timeline-day-view.component';\n\n@Component({\n selector: 'ax-scheduler-timeline-multi-day-view',\n templateUrl: './scheduler-timeline-multi-day-view.component.html',\n styleUrl: './scheduler-timeline-multi-day-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXSchedulerTimelineDayViewComponent, AsyncPipe, AXFormatPipe],\n})\nexport class AXSchedulerTimelineMultiDayViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n multiDayAppointments = computed<AXSchedulerMultiDayViewAppointmentType[]>(() => {\n const mapped = this.appointments();\n const current = this.date();\n const daysCount = this.daysCount();\n\n return Array.from({ length: daysCount }, (_, i): AXSchedulerMultiDayViewAppointmentType => {\n const dayStart = current.add('day', i).add('hour', this.startHour());\n const dayEnd = dayStart.add('day', 1).add('hour', this.endHour() - this.startHour());\n const appointmentsForDay = mapped.filter(\n (appt) =>\n !appt.allDay &&\n appt.singleDay &&\n appt.endDate.compare(dayStart, 'day') >= 0 &&\n appt.startDate.compare(dayEnd, 'day') < 0 &&\n appt.endDate.compare(dayStart, 'hour') >= 0 &&\n appt.startDate.compare(dayEnd, 'hour') < 0,\n );\n return {\n appointments: appointmentsForDay,\n date: dayStart,\n };\n });\n\n return [];\n });\n\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n}\n","<div class=\"ax-scheduler-timeline-day-view-container\">\n @for (appt of multiDayAppointments(); track appt.appointments) {\n <div>\n <div class=\"ax-scheduler-week-header-date-day\" [class.ax-today]=\"isToday(appt.date)\">\n <span class=\"ax-scheduler-week-header-date-day-char\">\n {{ appt.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ appt.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <ax-scheduler-timeline-day-view\n [date]=\"appt.date\"\n [endHour]=\"endHour()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [appointments]=\"appt.appointments\"\n (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n (onAppointmentDropInternal)=\"onAppointmentDropInternal.emit($event)\"\n (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n >\n </ax-scheduler-timeline-day-view>\n </div>\n }\n</div>\n","import { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { MXBaseComponent } from '@acorex/components/common';\nimport { AXDecoratorGenericComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n HostBinding,\n inject,\n input,\n output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerActiveAppointmentsInBlock,\n AXSchedulerAllDaySlotData,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentsByStartBlock,\n AXSchedulerAppointmentType,\n AXSchedulerOverflowBadge,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n} from '../../scheduler.class';\nimport { AXSchedulerService } from '../../scheduler.service';\n\ntype AXSchedulerGridBadgeInfo = AXSchedulerOverflowBadge & {\n hiddenAppointments: AXSchedulerAppointmentType[];\n};\n\n@Component({\n selector: 'ax-scheduler-week-view',\n templateUrl: './scheduler-week-view.component.html',\n styleUrl: './scheduler-week-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXDecoratorGenericComponent,\n AsyncPipe,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXFormatPipe,\n AXDragDirective,\n AXDropZoneDirective,\n ],\n})\nexport class AXSchedulerWeekViewComponent extends MXBaseComponent {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n calendar = input<string>();\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\n\n allDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.allDay) ?? []);\n singleDayAppointments = computed(() => this.appointments()?.filter((e) => e && e.singleDay && !e.allDay) ?? []);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointmentType) {\n this.schedulerService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSingleSlotEvent(mouseEvent: MouseEvent, hour: AXDateTime, day: AXDateTime, minuteIndex: number) {\n const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'week');\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n handleAllDaySlotEvent(mouseEvent: MouseEvent, day: AXDateTime) {\n const endDate = day.endOf('day');\n const startDate = day.startOf('day');\n const slotData = { startDate, endDate, view: 'week' as const };\n if (slotData) this.schedulerService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\n handleAllDayDrop(e: AXDropZoneDropEvent, day: AXDateTime) {\n const endDate = day.endOf('day');\n const startDate = day.startOf('day');\n const slotData = { startDate, endDate, view: 'week' as const };\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n handleSingleDayDrop(e: AXDropZoneDropEvent, hour: AXDateTime, day: AXDateTime, minuteIndex: number) {\n const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'week');\n this.onAppointmentDropInternal.emit({\n event: e,\n slot: slotData,\n appointment: e.dropped.dragData() as AXSchedulerAppointmentType,\n });\n }\n\n hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startHour()).set('minute', 0).set('second', 0);\n const hours = [time];\n while (time.hour < this.endHour()) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n daysArray = computed(() => {\n const time = this.date();\n if (!time) return [];\n const days = [time];\n for (let index = 1; index <= 6; index++) {\n days.push(time.add('day', index));\n }\n return days;\n });\n\n totalBlocksPerViewDay = computed(() => {\n const startH = this.startHour();\n const endH = this.endHour();\n if (typeof startH !== 'number' || typeof endH !== 'number') return 0;\n return Math.max(0, (endH - startH) * (60 / 30));\n });\n\n appointmentsByStartBlock = computed((): AXSchedulerAppointmentsByStartBlock => {\n const viewDate = this.date();\n const startH = this.startHour();\n const endH = this.endHour();\n if (!viewDate || typeof startH !== 'number' || typeof endH !== 'number') return {};\n return this.schedulerService.calculateWeekViewAppointmentsByStartBlock(\n this.singleDayAppointments(),\n viewDate,\n startH,\n endH,\n );\n });\n\n activeAppointmentsInBlock = computed((): AXSchedulerActiveAppointmentsInBlock => {\n const viewDate = this.date();\n const startH = this.startHour();\n const endH = this.endHour();\n if (!viewDate || typeof startH !== 'number' || typeof endH !== 'number') return {};\n return this.schedulerService.calculateActiveAppointmentsInBlock(\n this.singleDayAppointments(),\n viewDate,\n startH,\n endH,\n 7, // Specify 7 days for week view\n );\n });\n\n visibleAppointmentsLayout = computed((): AXSchedulerAppointmentLayout[] => {\n const layouts: AXSchedulerAppointmentLayout[] = [];\n const startingBlocks = this.appointmentsByStartBlock();\n const daysCount = 7;\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N: number = daysCount;\n const occupiedBlocks: Record<number, Record<number, any>> = {};\n\n for (let dayIndex = 0; dayIndex < daysCount; dayIndex++) {\n const dayBlocks = startingBlocks[dayIndex] ?? {};\n for (let blockIndex = 0; blockIndex < totalBlocksPerDay; blockIndex++) {\n if (occupiedBlocks[dayIndex]?.[blockIndex]) continue;\n\n const startingAppointments = dayBlocks[blockIndex] ?? [];\n if (startingAppointments.length > 0) {\n const appointmentToShow = orderBy(startingAppointments, [(e) => e.endDate.date.getTime()], ['desc'])[0];\n\n const C = dayIndex;\n let layoutLeft = '0px';\n if (C > 0 && N > 1) layoutLeft = `calc(${C * (100 / N)}%)`;\n const layoutTop = `calc(${blockHeightExpr} * ${blockIndex})`;\n let layoutHeight = '0px';\n let appointmentDurationMinutes = 0;\n if (appointmentToShow.endDate && appointmentToShow.startDate) {\n appointmentDurationMinutes = this.schedulerService.calculateDurationInMinutes(appointmentToShow);\n if (appointmentDurationMinutes > 0) {\n const heightBlock = appointmentDurationMinutes / 30;\n layoutHeight = `max(0px, calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_PX}px))`;\n }\n }\n\n layouts.push({\n layoutTop,\n layoutLeft,\n layoutHeight,\n appointment: appointmentToShow,\n layoutWidth: 'calc(100% / 7 - 2rem)',\n });\n\n const blocksToOccupy = Math.ceil(appointmentDurationMinutes / 30);\n for (let i = 0; i < blocksToOccupy; i++) {\n const occupiedBlockIndex = blockIndex + i;\n if (occupiedBlockIndex < totalBlocksPerDay) {\n if (!occupiedBlocks[dayIndex]) occupiedBlocks[dayIndex] = {};\n if (!occupiedBlocks[dayIndex][occupiedBlockIndex]) {\n occupiedBlocks[dayIndex][occupiedBlockIndex] = appointmentToShow.key;\n }\n } else {\n break;\n }\n }\n }\n }\n }\n return layouts;\n });\n\n visualOccupancyMap = computed(() => {\n const map = new Map<string, any>();\n const visibleLayouts = this.visibleAppointmentsLayout();\n const viewStartDate = this.date();\n const startH = this.startHour();\n const endH = this.endHour();\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n\n if (!viewStartDate || typeof startH !== 'number' || typeof endH !== 'number') return map;\n\n for (const appointmentLayout of visibleLayouts) {\n const startInfo = this.schedulerService.getBlockIdentifier(\n appointmentLayout.appointment.startDate,\n viewStartDate,\n startH,\n endH,\n 7,\n );\n if (!startInfo) continue;\n\n const durationMinutes = this.schedulerService.calculateDurationInMinutes(appointmentLayout.appointment);\n const blocksToOccupy = Math.ceil(durationMinutes / 30);\n\n for (let i = 0; i < blocksToOccupy; i++) {\n const occupiedBlockIndex = startInfo.blockIndex + i;\n if (occupiedBlockIndex >= 0 && occupiedBlockIndex < totalBlocksPerDay) {\n const mapKey = `${startInfo.dayIndex}-${occupiedBlockIndex}`;\n if (!map.has(mapKey)) {\n map.set(mapKey, appointmentLayout.appointment.key);\n }\n } else {\n break;\n }\n }\n }\n return map;\n });\n\n overflowBadges = computed((): AXSchedulerOverflowBadge[] => {\n const badges: AXSchedulerOverflowBadge[] = [];\n const activeBlocks = this.activeAppointmentsInBlock();\n const occupancyMap = this.visualOccupancyMap();\n const daysCount = 7;\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N: number = daysCount;\n\n if (!activeBlocks || !occupancyMap || totalBlocksPerDay === 0) return badges;\n\n const countedHiddenAppointmentKeysToday = new Map<number, Set<any>>();\n\n for (let dayIndex = 0; dayIndex < daysCount; dayIndex++) {\n countedHiddenAppointmentKeysToday.set(dayIndex, new Set());\n for (let blockIndex = 0; blockIndex < totalBlocksPerDay; blockIndex++) {\n const blockMapKey = `${dayIndex}-${blockIndex}`;\n const activeAppointments = activeBlocks[dayIndex]?.[blockIndex] ?? [];\n if (activeAppointments.length === 0) continue;\n\n const visibleAppointmentKey = occupancyMap.get(blockMapKey);\n const hiddenAppointments = activeAppointments.filter(\n (appointment) => appointment.key !== visibleAppointmentKey,\n );\n const newlyHidden = hiddenAppointments.filter(\n (e) => !countedHiddenAppointmentKeysToday.get(dayIndex).has(e.key),\n );\n\n if (newlyHidden.length > 0) {\n const C = dayIndex;\n let baseColLeft = '0px';\n if (C > 0 && N > 1) baseColLeft = `calc(${C * (100 / N)}%)`;\n const baseTop = `calc(${blockHeightExpr} * ${blockIndex})`;\n const badgeLeft = `calc(${baseColLeft} + calc(100% / ${N} - 1.75rem))`;\n const badgeTop = `calc(${baseTop} + 0.75rem)`;\n\n badges.push({ key: blockMapKey, count: newlyHidden.length, badgeTop, badgeLeft });\n newlyHidden.forEach((e) => countedHiddenAppointmentKeysToday.get(dayIndex).add(e.key));\n }\n }\n }\n return badges;\n });\n\n allDayAppointmentsPerDay = computed((): AXSchedulerAllDaySlotData[] => {\n const days = this.daysArray();\n const allDayAppointments = this.allDayAppointments(); // Use renamed type if needed\n const result: AXSchedulerAllDaySlotData[] = [];\n\n if (days.length !== 7) return result; // Should always be 7 for week view\n\n days.forEach((day) => {\n const dayStart = day.startOf('day');\n const dayEnd = day.endOf('day');\n const appointmentsForThisDay: AXSchedulerAppointmentType[] = []; // Use renamed type\n\n allDayAppointments.forEach((appointment) => {\n // Check if the appointment overlaps with the current day\n if (appointment.startDate.compare(dayEnd) <= 0 && appointment.endDate.compare(dayStart) >= 0) {\n appointmentsForThisDay.push(appointment);\n }\n });\n\n // Sort appointments for this day\n appointmentsForThisDay.sort((a, b) => a.startDate.date.getTime() - b.startDate.date.getTime());\n\n result.push({\n day: day, // Include the AXDateTime object for the day\n appointments: appointmentsForThisDay,\n });\n });\n\n return result;\n });\n\n overflowBadgesWithData = computed((): AXSchedulerGridBadgeInfo[] => {\n const badgesInfo: AXSchedulerGridBadgeInfo[] = [];\n const activeBlocks = this.activeAppointmentsInBlock();\n const occupancyMap = this.visualOccupancyMap();\n const daysCount = 7;\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N: number = daysCount;\n\n if (!activeBlocks || !occupancyMap || totalBlocksPerDay === 0) return badgesInfo;\n\n const countedHiddenAppointmentKeysToday = new Map<number, Set<any>>();\n\n for (let dayIndex = 0; dayIndex < daysCount; dayIndex++) {\n countedHiddenAppointmentKeysToday.set(dayIndex, new Set());\n for (let blockIndex = 0; blockIndex < totalBlocksPerDay; blockIndex++) {\n const blockMapKey = `${dayIndex}-${blockIndex}`;\n const activeAppointments = activeBlocks[dayIndex]?.[blockIndex] ?? [];\n if (activeAppointments.length === 0) continue;\n\n const visibleAppointmentKey = occupancyMap.get(blockMapKey);\n // Find all hidden appointments for this specific block\n const hiddenAppointments = activeAppointments.filter(\n (appointment) => appointment.key !== visibleAppointmentKey,\n );\n // Find which of those hidden ones haven't been counted today yet\n const newlyHidden = hiddenAppointments.filter(\n (e) => !countedHiddenAppointmentKeysToday.get(dayIndex).has(e.key),\n );\n\n if (newlyHidden.length > 0) {\n const C = dayIndex;\n let baseColLeft = '0px';\n if (C > 0 && N > 1) baseColLeft = `calc(${C * (100 / N)}%)`;\n const baseTop = `calc(${blockHeightExpr} * ${blockIndex})`;\n // Keep your positioning logic for the badge itself\n const badgeLeft = `calc(${baseColLeft} + calc(100% / ${N} - 1.75rem))`;\n const badgeTop = `calc(${baseTop} + 0.75rem)`;\n\n // Store the badge info *and* the list of appointments it represents\n badgesInfo.push({\n key: blockMapKey,\n count: newlyHidden.length,\n badgeTop,\n badgeLeft,\n hiddenAppointments: newlyHidden, // Store the actual hidden appointments\n });\n\n // Mark these as counted for today\n newlyHidden.forEach((e) => countedHiddenAppointmentKeysToday.get(dayIndex).add(e.key));\n }\n }\n }\n // Sort the badges by top then left for consistent rendering order? (Optional)\n // badgesInfo.sort((a, b) => {\n // const topCompare = a.badgeTop.localeCompare(b.badgeTop);\n // if (topCompare !== 0) return topCompare;\n // return a.badgeLeft.localeCompare(b.badgeLeft);\n // });\n return badgesInfo;\n });\n\n protected isToday(date: AXDateTime) {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n @HostBinding('class.ax-state-readonly') get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-week-header\">\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\"></div>\n <div class=\"ax-scheduler-week-header-date\" aria-hidden=\"true\">\n @for (day of daysArray(); track day.date.getTime()) {\n <div class=\"ax-scheduler-week-header-date-day\" [class.ax-today]=\"isToday(day)\">\n <span class=\"ax-scheduler-week-header-date-day-char\">\n {{ day | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ day | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\">{{ 'dateTime.duration.all-day' | translate | async }}</div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-week-header-date\">\n @for (slotData of allDayAppointmentsPerDay(); track slotData.day.date.getTime()) {\n <div\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleAllDayDrop($event, slotData.day)\"\n class=\"ax-scheduler-all-day-slot\"\n (click)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (dblclick)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (contextmenu)=\"handleAllDaySlotEvent($event, slotData.day)\"\n >\n @if (slotData.appointments.length > 0) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n [dragData]=\"slotData.appointments[0]\"\n (click)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (dblclick)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n [title]=\"slotData.appointments[0].title\"\n class=\"ax-scheduler-header-week-appointment\"\n [style.color]=\"slotData.appointments[0].textColor\"\n [style.background-color]=\"slotData.appointments[0].backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ slotData.appointments[0].title }}</ax-title>\n </div>\n }\n @if (slotData.appointments.length > 1) {\n <div #moreAppointments class=\"ax-scheduler-appointment-badge\">+{{ slotData.appointments.length - 1 }}</div>\n <ax-popover [target]=\"moreAppointments\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\">\n @for (appointment of slotData.appointments; track appointment.key; let first = $first) {\n @if (!first) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [style.color]=\"appointment.textColor\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-week-time-container\">\n <div class=\"ax-scheduler-week-time\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-week-table-container\">\n <div class=\"ax-scheduler-week-appointment-container\">\n @for (appt of visibleAppointmentsLayout(); track appt.appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n [dragData]=\"appt.appointment\"\n (click)=\"handleAppointmentEvent($event, appt.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appt.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appt.appointment)\"\n [title]=\"appt.appointment.title\"\n [style.height]=\"appt.layoutHeight\"\n class=\"ax-scheduler-week-appointment\"\n [style.color]=\"appt.appointment.textColor\"\n [style.inset-block-start]=\"appt.layoutTop\"\n [style.inset-inline-start]=\"appt.layoutLeft\"\n [style.background-color]=\"appt.appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appt.appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appt.appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appt.appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n\n <!-- Overflow Badges with Popovers -->\n @for (badge of overflowBadgesWithData(); track badge.key) {\n <!-- Wrap badge and popover for targeting -->\n <div\n style=\"position: absolute\"\n class=\"ax-scheduler-badge-wrapper\"\n [style.inset-block-start]=\"badge.badgeTop\"\n [style.inset-inline-start]=\"badge.badgeLeft\"\n >\n <!-- The Badge itself -->\n <div #actionButton class=\"ax-scheduler-appointment-badge\">+{{ badge.count }}</div>\n <!-- The Popover -->\n <ax-popover [target]=\"actionButton\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\">\n @for (appointment of badge.hiddenAppointments; track appointment.key) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragElementClone]=\"true\"\n [dragDisabled]=\"!draggable()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"appointment.title\"\n [style.color]=\"appointment.textColor\"\n class=\"ax-scheduler-popover-appointment\"\n [style.background-color]=\"appointment.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointment.title }}</ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }} -\n {{ appointment.endDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n </div>\n }\n </div>\n\n <table aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr>\n @for (day of daysArray(); track day.date.getTime()) {\n <td\n axDropZone\n #zone=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time, day, 0)\"\n (click)=\"handleSingleSlotEvent($event, time, day, 0)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day, 0)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day, 0)\"\n ></td>\n }\n </tr>\n <tr>\n @for (day of daysArray(); track day.date.getTime()) {\n <td\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time, day, 1)\"\n (click)=\"handleSingleSlotEvent($event, time, day, 1)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day, 1)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day, 1)\"\n ></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n","import { AXButtonComponent } from '@acorex/components/button';\nimport { AXCalendarComponent } from '@acorex/components/calendar';\nimport {\n AXDataSource,\n AXValueChangedEvent,\n convertArrayToDataSource,\n MXBaseComponent,\n} from '@acorex/components/common';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXSelectBoxComponent } from '@acorex/components/select-box';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXHtmlUtil, AXUnsubscriber } from '@acorex/core/utils';\nimport { isPlatformBrowser, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n model,\n OnInit,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { distinctUntilChanged, map, Observable, of, startWith, switchMap } from 'rxjs';\nimport {\n AXDayOfWeekName,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentType,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotEvent,\n AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerService } from './scheduler.service';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineMultiDayViewComponent } from './views/timeline-multi-day/scheduler-timeline-multi-day-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\n@Component({\n selector: 'ax-scheduler',\n templateUrl: './scheduler.component.html',\n styleUrls: ['./scheduler.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n FormsModule,\n AXSelectBoxComponent,\n AXDecoratorIconComponent,\n AXButtonComponent,\n NgClass,\n AXPopoverComponent,\n AXCalendarComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerTimelineDayViewComponent,\n AXSchedulerTimelineMultiDayViewComponent,\n AXSchedulerTimelineMonthViewComponent,\n AXSchedulerAgendaViewComponent,\n ],\n providers: [AXUnsubscriber],\n})\nexport class AXSchedulerComponent extends MXBaseComponent implements OnInit {\n private platformId = inject(PLATFORM_ID);\n private unsubscriber = inject(AXUnsubscriber);\n private formatService = inject(AXFormatService);\n private localeService = inject(AXLocaleService);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n private translationService = inject(AXTranslationService);\n\n private viewModeSelectbox = viewChild(AXSelectBoxComponent);\n\n displayViews: Record<AXSchedulerView, string> = {\n day: 'daily',\n week: 'weekly',\n month: 'monthly',\n timelineDay: 'daily-timeline',\n timelineMultiDay: 'multi-day-timeline',\n timelineMonth: 'monthly-timeline',\n agenda: 'agenda',\n };\n\n calendar = input<'gregorian' | 'solar-hijri' | string>();\n calendarType = linkedSignal<'gregorian' | 'solar-hijri' | string>(\n () => this.calendar() ?? this.localeService.activeProfile().calendar.system,\n );\n\n startingDate = input<Date>(new Date());\n currentDate = linkedSignal<AXDateTime>(() =>\n this.calendarService\n .create(this.startingDate(), this.calendarType())\n .set('hour', 0)\n .set('minute', 0)\n .set('second', 0),\n );\n\n rtl = signal(false);\n isLoading = signal(false);\n isFullScreen = signal(false);\n viewsDataSource = signal<{ id: string; text: string }[]>([]);\n oldDate = signal<AXDateTime>(this.calendarService.create(new Date(), this.calendarType()));\n\n endHour = input(23);\n startHour = input(8);\n keyField = input('id');\n readonly = input(false);\n draggable = input(true);\n titleField = input('title');\n allDayField = input('allDay');\n allowFullScreen = input(true);\n endDateField = input('endDate');\n multiDayViewDaysCount = input(7);\n readonlyField = input('readonly');\n startDateField = input('startDate');\n textColorField = input('textColor');\n descriptionField = input('description');\n backgroundColorField = input('backgroundColor');\n dataSource = input<AXDataSource<any> | any[]>([]);\n firstDayOfWeek = input<AXDayOfWeekName>('Sunday');\n views = input<AXSchedulerView[]>([\n 'day',\n 'week',\n 'month',\n 'timelineDay',\n 'timelineMultiDay',\n 'timelineMonth',\n 'agenda',\n ]);\n\n selectedView = model<AXSchedulerView>(this.views()[0]);\n\n // --- Public Outputs ---\n onSlotClicked = output<AXSchedulerSlotEvent>();\n onSlotDblClicked = output<AXSchedulerSlotEvent>();\n onSlotRightClick = output<AXSchedulerSlotEvent>();\n onAppointmentDrop = output<AXSchedulerSlotDropEvent>();\n onAppointmentClicked = output<AXSchedulerAppointmentEvent>();\n onAppointmentDblClicked = output<AXSchedulerAppointmentEvent>();\n onAppointmentRightClick = output<AXSchedulerAppointmentEvent>();\n\n // --- Internal Handlers for View Outputs ---\n protected handleSlotClickInternal(eventData: AXSchedulerSlotEvent) {\n this.onSlotClicked.emit(eventData);\n }\n protected handleSlotDblClickInternal(eventData: AXSchedulerSlotEvent) {\n this.onSlotDblClicked.emit(eventData);\n }\n protected handleSlotRightClickInternal(eventData: AXSchedulerSlotEvent) {\n this.onSlotRightClick.emit(eventData);\n }\n protected handleAppointmentClickInternal(eventData: AXSchedulerAppointmentEvent) {\n this.onAppointmentClicked.emit(eventData);\n }\n protected handleAppointmentDblClickInternal(eventData: AXSchedulerAppointmentEvent) {\n this.onAppointmentDblClicked.emit(eventData);\n }\n protected handleAppointmentRightClickInternal(eventData: AXSchedulerAppointmentEvent) {\n this.onAppointmentRightClick.emit(eventData);\n }\n protected handleAppointmentDropInternal(eventData: AXSchedulerSlotDropEvent) {\n this.onAppointmentDrop.emit(eventData);\n }\n\n override ngOnInit() {\n super.ngOnInit();\n\n this.calendarService.calendarChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n this.currentDate.set(this.calendarService.create(this.currentDate().date, this.calendarType()));\n this.appointmentsList().refresh();\n });\n\n this.translationService.langChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(async () => {\n await this.fillDataSource();\n this.viewModeSelectbox().selectItems(this.viewsDataSource().find((c) => c.id == this.selectedView()));\n this.currentDate.set(this.calendarService.create(this.currentDate().date, this.calendarType()));\n });\n\n if (isPlatformBrowser(this.platformId)) this.rtl.set(AXHtmlUtil.isRtl(this.getHostElement()));\n this.fillDataSource();\n }\n\n async fillDataSource() {\n const result = [];\n for await (const c of this.views()) {\n const text = await this.translationService.translateAsync(`dateTime.duration.${this.displayViews[c]}`);\n result.push({ text, id: c });\n }\n this.viewsDataSource.set(result);\n }\n\n private getGridDateRange(dateInMonth: AXDateTime): { gridStartDate: AXDateTime; gridEndDate: AXDateTime } {\n const firstDayOfMonth = dateInMonth.startOf('month');\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n const daysFromPrevMonth = (firstDisplayedDayOfWeek - firstDayGridNum + 7) % 7;\n const gridStartDate = firstDayOfMonth.add('day', -daysFromPrevMonth);\n // Calculate end date based on standard 6 weeks for safety, or calculate dynamically if preferred\n const gridEndDate = gridStartDate.add('day', 6 * 7 - 1);\n return { gridStartDate, gridEndDate };\n }\n\n appointmentsList = computed(() => {\n const v = this.dataSource();\n let ds: AXDataSource<any>;\n if (Array.isArray(v)) {\n ds = convertArrayToDataSource(v, { key: this.keyField(), pageSize: 9999 });\n } else {\n ds = v as AXDataSource<any>;\n }\n // ds.refresh();\n return ds;\n });\n\n private dataSourceItemsSignal = toSignal(\n new Observable<AXDataSource<any> | null>((subscriber) => {\n const watcher = effect(() => {\n const dsInstance = this.appointmentsList();\n subscriber.next(dsInstance);\n });\n return () => {\n watcher.destroy();\n };\n }).pipe(\n distinctUntilChanged(),\n switchMap((dsInstance) => {\n if (!dsInstance) return of([]);\n return dsInstance.onChanged.pipe(\n map((event) => event.items ?? []),\n startWith(dsInstance.items ?? []),\n );\n }),\n ),\n { initialValue: [] },\n );\n\n #updatedDataSource = effect(() => {\n const ds = this.appointmentsList();\n untracked(() => {\n if (ds) ds.refresh();\n });\n });\n\n currentDateText = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'timelineDay':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n case 'week': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(this.currentDate().add('week', 1).add('day', -1), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'agenda':\n case 'timelineMultiDay': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(\n this.currentDate().add('day', this.multiDayViewDaysCount() - 1),\n 'datetime',\n {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n },\n );\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'month':\n case 'timelineMonth':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'MMMM yyyy',\n calendar: this.calendarType(),\n });\n }\n });\n\n calendarDepth = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'week':\n case 'agenda':\n case 'timelineMultiDay':\n return 'day';\n case 'month':\n case 'timelineMonth':\n return 'month';\n case 'timelineDay':\n return 'day';\n }\n });\n\n mappedAppointments = computed(() => {\n const items = this.dataSourceItemsSignal();\n const keyField = this.keyField();\n const titleField = this.titleField();\n const allDayField = this.allDayField();\n const readonlyField = this.readonlyField();\n const textColorField = this.textColorField();\n const descriptionField = this.descriptionField();\n const backgroundColorField = this.backgroundColorField();\n const startDateField = this.startDateField();\n const endDateField = this.endDateField();\n\n return items\n .map((item) => {\n const startDate = this.calendarService.create(item[startDateField], this.calendarType());\n const endDate = this.calendarService.create(item[endDateField], this.calendarType());\n // Basic validation\n if (!startDate?.date || !endDate?.date) {\n console.warn('Scheduler: Skipping item due to invalid date fields:', item);\n return null;\n }\n // Check if dates are valid after creation\n if (isNaN(startDate.date.getTime()) || isNaN(endDate.date.getTime())) {\n console.warn('Scheduler: Skipping item due to invalid parsed date (NaN):', item);\n return null;\n }\n\n // Calculate singleDay based on *calendar day*, not just time\n const isSingleDay = startDate.equal(endDate, 'day');\n\n const appointment: AXSchedulerAppointmentType = {\n key: item[keyField],\n title: item[titleField],\n startDate,\n endDate,\n allDay: !!item[allDayField], // Ensure boolean\n singleDay: isSingleDay, // Use calculated singleDay\n readonly: !!item[readonlyField],\n textColor: item[textColorField],\n description: item[descriptionField],\n backgroundColor: item[backgroundColorField],\n };\n return appointment;\n })\n .filter((appt): appt is AXSchedulerAppointmentType => appt !== null); // Filter out nulls from invalid dates\n });\n\n viewAppointments = computed<AXSchedulerAppointmentType[]>(() => {\n const mapped = this.mappedAppointments();\n const view = this.selectedView();\n const current = this.currentDate();\n\n if (!current || mapped.length === 0) return [];\n\n switch (view) {\n case 'day':\n case 'timelineDay': {\n const dayStart = current.startOf('day');\n const dayEnd = current.endOf('day');\n return mapped.filter(\n (appt) => appt.endDate.compare(dayStart, 'day') >= 0 && appt.startDate.compare(dayEnd, 'day') <= 0,\n );\n }\n case 'week': {\n const weekStart = current;\n const weekEnd = weekStart.add('day', 7);\n return mapped.filter(\n (appt) => appt.startDate.compare(weekEnd, 'day') < 0 && appt.endDate.compare(weekStart, 'day') >= 0,\n );\n }\n case 'month': {\n const { gridStartDate, gridEndDate } = this.getGridDateRange(current);\n const exclusiveGridEndDate = gridEndDate.add('day', 1);\n return mapped.filter(\n (appt) =>\n appt.startDate.compare(exclusiveGridEndDate, 'day') < 0 && appt.endDate.compare(gridStartDate, 'day') >= 0,\n );\n }\n case 'timelineMonth': {\n const dayStart = current.startOf('month');\n const dayEnd = dayStart.endOf('month');\n return mapped.filter(\n (appt) => appt.startDate.compare(dayEnd, 'day') < 0 && appt.endDate.compare(dayStart, 'day') >= 0,\n );\n }\n case 'agenda':\n case 'timelineMultiDay': {\n const dayStart = current;\n const dayEnd = dayStart.add('day', this.multiDayViewDaysCount());\n return mapped.filter(\n (appt) => appt.startDate.compare(dayEnd, 'day') < 0 && appt.endDate.compare(dayStart, 'day') >= 0,\n );\n }\n }\n });\n\n viewChanged(e: AXValueChangedEvent<AXSchedulerView>) {\n const newView = e.value;\n const oldView = e.oldValue;\n this.selectedView.set(newView);\n\n if (oldView === 'week') {\n const oldDayOfWeek = this.oldDate().dayOfWeek % 7;\n const date = this.currentDate().add('day', oldDayOfWeek - 1);\n this.currentDate.set(date);\n }\n\n this.oldDate.set(this.currentDate());\n\n if (newView === 'week') {\n const currentDate = this.currentDate();\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n const startOfWeekDate = currentDate.add('day', -daysToSubtract);\n this.currentDate.set(startOfWeekDate);\n }\n }\n\n nextClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timelineDay':\n this.currentDate.set(this.currentDate().add('day', 1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', 1));\n break;\n\n case 'agenda':\n case 'timelineMultiDay':\n this.currentDate.set(this.currentDate().add('day', this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timelineMonth':\n this.currentDate.set(this.currentDate().add('month', 1));\n break;\n }\n }\n\n prevClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timelineDay':\n this.currentDate.set(this.currentDate().add('day', -1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', -1));\n break;\n\n case 'agenda':\n case 'timelineMultiDay':\n this.currentDate.set(this.currentDate().add('day', -this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timelineMonth':\n this.currentDate.set(this.currentDate().add('month', -1));\n break;\n }\n }\n\n calendarDateChanged(e: any) {\n let currentDate = this.calendarService.create(e, this.calendarType());\n if (this.selectedView() === 'week') {\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n currentDate = currentDate.add('day', -daysToSubtract);\n }\n this.currentDate.set(currentDate);\n }\n\n handleFullScreen() {\n if (!this.isFullScreen()) this.getHostElement().classList.add('ax-full-screen-container');\n if (this.isFullScreen()) this.getHostElement().classList.remove('ax-full-screen-container');\n this.isFullScreen.set(!this.isFullScreen());\n }\n}\n","<div class=\"ax-scheduler-container\">\n <div class=\"ax-scheduler-header\">\n <div class=\"ax-scheduler-date\">\n <ax-button look=\"blank\" (onClick)=\"prevClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-left': !rtl(),\n 'ax-icon-chevron-right': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"currentDateText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"nextClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-right': !rtl(),\n 'ax-icon-chevron-left': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-popover [target]=\"date\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [ngModel]=\"currentDate()\"\n (ngModelChange)=\"calendarDateChanged($event)\"\n ></ax-calendar>\n </div>\n </ax-popover>\n </div>\n <div class=\"ax-scheduler-actions\">\n <ax-select-box\n [dropdownWidth]=\"200\"\n [ngModel]=\"selectedView()\"\n [dataSource]=\"viewsDataSource()\"\n (onValueChanged)=\"viewChanged($event)\"\n ></ax-select-box>\n\n @if (allowFullScreen()) {\n <ax-button look=\"blank\" (onClick)=\"handleFullScreen()\">\n <ax-icon>\n <i\n class=\"fa-solid fa-expand\"\n [ngClass]=\"{ 'fa-compress': isFullScreen(), 'fa-expand': !isFullScreen() }\"\n ></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n </div>\n <div class=\"ax-scheduler-views-container\">\n @switch (selectedView()) {\n @case ('day') {\n <ax-scheduler-day-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-day-view>\n }\n @case ('week') {\n <ax-scheduler-week-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-week-view>\n }\n @case ('month') {\n <ax-scheduler-month-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-month-view>\n }\n @case ('timelineDay') {\n <ax-scheduler-timeline-day-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-day-view>\n }\n @case ('timelineMultiDay') {\n <ax-scheduler-timeline-multi-day-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n [daysCount]=\"multiDayViewDaysCount()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-multi-day-view>\n }\n @case ('timelineMonth') {\n <ax-scheduler-timeline-month-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-month-view>\n }\n @case ('agenda') {\n <ax-scheduler-agenda-view\n [endHour]=\"endHour()\"\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [appointments]=\"viewAppointments()\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-agenda-view>\n }\n }\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { AXSchedulerComponent } from './scheduler.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nconst COMPONENT = [\n AXSchedulerComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerTimelineDayViewComponent,\n];\n\n@NgModule({\n imports: [...COMPONENT],\n exports: [...COMPONENT],\n providers: [],\n})\nexport class AXSchedulerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|