@acorex/components 19.12.0 → 19.13.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/calendar/lib/calendar-range.component.d.ts +4 -1
- package/calendar/lib/calendar.class.d.ts +8 -0
- package/calendar/lib/calendar.component.d.ts +2 -0
- package/data-pager/lib/data-pager-base.component.d.ts +2 -2
- package/data-pager/lib/data-pager-info.component.d.ts +1 -1
- package/data-pager/lib/data-pager-input-selector.component.d.ts +1 -1
- package/data-pager/lib/data-pager-next-buttons.component.d.ts +1 -1
- package/data-pager/lib/data-pager-numeric-selector.component.d.ts +1 -1
- package/data-pager/lib/data-pager-pagesize-dropdown.component.d.ts +1 -1
- package/data-pager/lib/data-pager-prev-buttons.component.d.ts +1 -1
- package/datetime-box/lib/datetime-box.component.d.ts +11 -13
- package/datetime-input/lib/datetime-input.component.d.ts +21 -84
- package/datetime-picker/lib/datetime-picker.component.d.ts +13 -31
- package/fesm2022/acorex-components-action-sheet.mjs +10 -10
- package/fesm2022/acorex-components-alert.mjs +8 -8
- package/fesm2022/acorex-components-alert.mjs.map +1 -1
- package/fesm2022/acorex-components-audio-wave.mjs +7 -7
- package/fesm2022/acorex-components-autocomplete.mjs +7 -7
- package/fesm2022/acorex-components-avatar.mjs +10 -10
- package/fesm2022/acorex-components-badge.mjs +7 -7
- package/fesm2022/acorex-components-bottom-navigation.mjs +10 -10
- package/fesm2022/acorex-components-breadcrumbs.mjs +10 -10
- package/fesm2022/acorex-components-button-group.mjs +10 -10
- package/fesm2022/acorex-components-button.mjs +13 -13
- package/fesm2022/acorex-components-calendar.mjs +76 -48
- package/fesm2022/acorex-components-calendar.mjs.map +1 -1
- package/fesm2022/acorex-components-check-box.mjs +7 -7
- package/fesm2022/acorex-components-chips.mjs +7 -7
- package/fesm2022/acorex-components-circular-progress.mjs +7 -7
- package/fesm2022/acorex-components-collapse.mjs +10 -10
- package/fesm2022/acorex-components-color-box.mjs +7 -7
- package/fesm2022/acorex-components-color-palette.mjs +25 -25
- package/fesm2022/acorex-components-comment.mjs +28 -28
- package/fesm2022/acorex-components-common.mjs +91 -91
- package/fesm2022/acorex-components-conversation.mjs +49 -49
- package/fesm2022/acorex-components-cron-job.mjs +46 -46
- package/fesm2022/acorex-components-data-pager.mjs +45 -45
- package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
- package/fesm2022/acorex-components-data-table.mjs +37 -37
- package/fesm2022/acorex-components-datetime-box.mjs +34 -32
- package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-input.mjs +121 -189
- package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
- package/fesm2022/acorex-components-datetime-picker.mjs +85 -87
- package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-decorators.mjs +25 -25
- package/fesm2022/acorex-components-dialog.mjs +10 -10
- package/fesm2022/acorex-components-drawer.mjs +13 -13
- package/fesm2022/acorex-components-dropdown-button.mjs +7 -7
- package/fesm2022/acorex-components-dropdown.mjs +13 -13
- package/fesm2022/acorex-components-file-explorer.mjs +25 -25
- package/fesm2022/acorex-components-file-explorer.mjs.map +1 -1
- package/fesm2022/acorex-components-form.mjs +23 -21
- package/fesm2022/acorex-components-form.mjs.map +1 -1
- package/fesm2022/acorex-components-grid-layout-builder.mjs +10 -10
- package/fesm2022/acorex-components-image-editor.mjs +34 -34
- package/fesm2022/acorex-components-image.mjs +7 -7
- package/fesm2022/acorex-components-json-viewer.mjs +7 -7
- package/fesm2022/acorex-components-kbd.mjs +10 -10
- package/fesm2022/acorex-components-label.mjs +7 -7
- package/fesm2022/acorex-components-list.mjs +7 -7
- package/fesm2022/acorex-components-loading-dialog.mjs +10 -10
- package/fesm2022/acorex-components-loading.mjs +16 -16
- package/fesm2022/acorex-components-map.mjs +10 -10
- package/fesm2022/acorex-components-media-viewer.mjs +34 -34
- package/fesm2022/acorex-components-menu.mjs +16 -16
- package/fesm2022/{acorex-components-modal-acorex-components-modal-Bs1CnBt8.mjs → acorex-components-modal-acorex-components-modal-DWBUhygA.mjs} +132 -42
- package/fesm2022/acorex-components-modal-acorex-components-modal-DWBUhygA.mjs.map +1 -0
- package/fesm2022/acorex-components-modal-modal-content.component-4ttnaM8r.mjs +187 -0
- package/fesm2022/acorex-components-modal-modal-content.component-4ttnaM8r.mjs.map +1 -0
- package/fesm2022/acorex-components-modal.mjs +1 -1
- package/fesm2022/acorex-components-navbar.mjs +7 -7
- package/fesm2022/acorex-components-notification.mjs +10 -10
- package/fesm2022/acorex-components-number-box.mjs +7 -7
- package/fesm2022/acorex-components-otp.mjs +7 -7
- package/fesm2022/acorex-components-page.mjs +10 -10
- package/fesm2022/acorex-components-paint.mjs +25 -25
- package/fesm2022/acorex-components-password-box.mjs +10 -10
- package/fesm2022/acorex-components-pdf-reader.mjs +7 -7
- package/fesm2022/acorex-components-phone-box.mjs +7 -7
- package/fesm2022/acorex-components-picker.mjs +13 -13
- package/fesm2022/acorex-components-popover.mjs +7 -7
- package/fesm2022/acorex-components-popup.mjs +10 -10
- package/fesm2022/acorex-components-progress-bar.mjs +7 -7
- package/fesm2022/acorex-components-qrcode.mjs +7 -7
- package/fesm2022/acorex-components-query-builder.mjs +7 -7
- package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
- package/fesm2022/acorex-components-radio.mjs +7 -7
- package/fesm2022/acorex-components-rail-navigation.mjs +13 -13
- package/fesm2022/acorex-components-range-slider.mjs +7 -7
- package/fesm2022/acorex-components-rate-picker.mjs +7 -7
- package/fesm2022/acorex-components-rest-api-generator.mjs +22 -22
- package/fesm2022/acorex-components-result.mjs +7 -7
- package/fesm2022/acorex-components-routing-progress.mjs +7 -7
- package/fesm2022/acorex-components-scheduler.mjs +565 -125
- package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
- package/fesm2022/acorex-components-scss.mjs +4 -4
- package/fesm2022/acorex-components-search-box.mjs +7 -7
- package/fesm2022/acorex-components-select-box.mjs +7 -7
- package/fesm2022/acorex-components-selection-list.mjs +7 -7
- package/fesm2022/acorex-components-side-menu.mjs +13 -13
- package/fesm2022/acorex-components-skeleton.mjs +7 -7
- package/fesm2022/acorex-components-slider.mjs +7 -7
- package/fesm2022/acorex-components-sliding-item.mjs +13 -13
- package/fesm2022/acorex-components-step-wizard.mjs +13 -13
- package/fesm2022/acorex-components-switch.mjs +10 -10
- package/fesm2022/acorex-components-tabs.mjs +13 -13
- package/fesm2022/acorex-components-tag-box.mjs +7 -7
- package/fesm2022/acorex-components-tag.mjs +7 -7
- package/fesm2022/acorex-components-text-area.mjs +7 -7
- package/fesm2022/acorex-components-text-box.mjs +10 -10
- package/fesm2022/acorex-components-time-line.mjs +10 -10
- package/fesm2022/acorex-components-toast.mjs +10 -10
- package/fesm2022/acorex-components-toolbar.mjs +7 -7
- package/fesm2022/acorex-components-tooltip.mjs +10 -10
- package/fesm2022/acorex-components-tree-view.mjs +25 -16
- package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
- package/fesm2022/acorex-components-uploader.mjs +29 -29
- package/fesm2022/acorex-components-uploader.mjs.map +1 -1
- package/fesm2022/acorex-components-video-player.mjs +7 -7
- package/fesm2022/acorex-components-wysiwyg.mjs +31 -31
- package/form/lib/validation-summary.component.d.ts +4 -2
- package/modal/lib/modal-content/modal-content.component.d.ts +11 -8
- package/modal/lib/modal-state.service.d.ts +5 -4
- package/modal/lib/modal.component.d.ts +2 -0
- package/modal/lib/modal.service.d.ts +4 -2
- package/modal/lib/modal.types.d.ts +15 -1
- package/package.json +1 -1
- package/scheduler/README.md +2 -2
- package/scheduler/index.d.ts +4 -0
- package/scheduler/lib/scheduler.class.d.ts +12 -6
- package/scheduler/lib/scheduler.component.d.ts +11 -11
- package/scheduler/lib/scheduler.module.d.ts +2 -1
- package/scheduler/lib/scheduler.service.d.ts +7 -2
- package/scheduler/lib/views/agenda/scheduler-agenda-view.component.d.ts +26 -0
- package/scheduler/lib/views/day/scheduler-day-view.component.d.ts +5 -4
- package/scheduler/lib/views/month/scheduler-month-view.component.d.ts +5 -3
- package/scheduler/lib/views/timeline-day/scheduler-timeline-day-view.component.d.ts +28 -0
- package/scheduler/lib/views/timeline-month/scheduler-timeline-month-view.component.d.ts +33 -0
- package/scheduler/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.d.ts +22 -0
- package/scheduler/lib/views/week/scheduler-week-view.component.d.ts +8 -7
- package/tree-view/lib/tree-view.component.d.ts +4 -2
- package/fesm2022/acorex-components-modal-acorex-components-modal-Bs1CnBt8.mjs.map +0 -1
- package/fesm2022/acorex-components-modal-modal-content.component-DhpujG4d.mjs +0 -181
- package/fesm2022/acorex-components-modal-modal-content.component-DhpujG4d.mjs.map +0 -1
@@ -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/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/week/scheduler-week-view.component.ts","../../../../libs/components/scheduler/src/lib/views/week/scheduler-week-view.component.html","../../../../libs/components/scheduler/src/lib/scheduler.module.ts","../../../../libs/components/scheduler/src/lib/scheduler.component.ts","../../../../libs/components/scheduler/src/lib/scheduler.component.html","../../../../libs/components/scheduler/src/acorex-components-scheduler.ts"],"sourcesContent":["import { AXDateTime } from '@acorex/core/date-time';\nimport { 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 readonly BLOCK_DURATION_MINUTES = 30;\n readonly MILLISECONDS_PER_MINUTE = 60 * 1000;\n readonly MINUTES_PER_HOUR = 60;\n readonly HOURS_PER_DAY = 24;\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 = currentDay.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 endDate = startDate.add('minute', 30);\n break;\n case 'week':\n endDate = startDate.add('minute', 30);\n break;\n case 'month':\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","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 { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, ViewEncapsulation } 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 changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXDecoratorGenericComponent, AsyncPipe, AXTranslatorPipe, AXPopoverComponent],\n})\nexport class AXSchedulerDayViewComponent extends MXBaseComponent {\n private schedulerCalcService = inject(AXSchedulerService);\n\n readonly GAP_WIDTH_PX = 1;\n\n draggable = input(true);\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.schedulerCalcService.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.schedulerCalcService.getSlotData(startDate, 'day');\n if (slotData)\n this.schedulerCalcService.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: 'week' as const };\n if (slotData)\n this.schedulerCalcService.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.schedulerCalcService.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_WIDTH_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_WIDTH_PX}px)`;\n } else {\n const cumulativeGapPx = (N - 1) * this.GAP_WIDTH_PX;\n return `calc(${widthPercent}% - ${cumulativeGapPx}px)`;\n }\n }\n return '0%';\n }\n\n getAppointmentTransform(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 const translateY = `calc(var(--ax-comp-scheduler-view-blocks-height) * ${yBlock} + 1px)`;\n return `translateY(${translateY})`;\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-view-blocks-height)`;\n return `calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_WIDTH_PX}px)`;\n }\n return '0px';\n }\n}\n","<div class=\"ax-scheduler-day-header\">\n <table class=\"ax-scheduler-day-header-table\" aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n <tr>\n {{\n 'dateTime.duration.all-day' | translate | async\n }}\n </tr>\n </tbody>\n </table>\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\">\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 <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr>\n {{\n time.format('HH:mm')\n }}\n </tr>\n }\n </tbody>\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.transform]=\"getAppointmentTransform(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('HH:mm') }} - {{ appointment.endDate.format('HH:mm') }}\n </ax-subtitle>\n </div>\n }\n </div>\n <table aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr\n (click)=\"handleSingleSlotEvent($event, time, 0)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, 0)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, 0)\"\n ></tr>\n <tr\n (click)=\"handleSingleSlotEvent($event, time, 1)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, 1)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, 1)\"\n ></tr>\n }\n </tbody>\n </table>\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 { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, ViewEncapsulation } 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 changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, AXTranslatorPipe, AXPopoverComponent],\n})\nexport class AXSchedulerMonthViewComponent extends MXBaseComponent {\n private schedulerCalcService = inject(AXSchedulerService);\n private calendarService = inject(AXCalendarService); // Inject if needed for 'today' comparison\n\n // --- Inputs ---\n draggable = input(true);\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 MAX_VISIBLE_APPOINTMENTS_PER_DAY = 2;\n readonly DAYS_IN_WEEK = 7;\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.schedulerCalcService.handleEvent({ event: mouseEvent, appointment }, this.eventOutputMap, 'appointment');\n }\n handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerCalcService.getSlotData(date, 'month');\n if (slotData) {\n this.schedulerCalcService.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.schedulerCalcService.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.schedulerCalcService.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.schedulerCalcService.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.schedulerCalcService.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 = dayInfo.date.format('YYYY-MM-DD');\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","<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\">{{ day.format('DDDD') }}</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\">{{ appointment.startDate.format('HH:mm') }}</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 class=\"ax-overlay-pane ax-scheduler-month-popover-appointment\">\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 { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXDateTime } from '@acorex/core/date-time';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, ViewEncapsulation } from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerActiveAppointmentsInBlock,\n AXSchedulerAllDaySlotData,\n AXSchedulerAppointmentEvent,\n AXSchedulerAppointmentsByStartBlock,\n AXSchedulerAppointmentType,\n AXSchedulerOverflowBadge,\n AXSchedulerSlotEvent,\n AXSchedulerWeekAppointmentLayout,\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 changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXDecoratorGenericComponent, AsyncPipe, AXTranslatorPipe, AXPopoverComponent],\n})\nexport class AXSchedulerWeekViewComponent extends MXBaseComponent {\n private schedulerCalcService = inject(AXSchedulerService);\n\n readonly GAP_WIDTH_PX = 1;\n\n draggable = input(true);\n endHour = input.required<number>();\n date = input.required<AXDateTime>();\n startHour = input.required<number>();\n appointments = input<AXSchedulerAppointmentType[]>([]);\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.schedulerCalcService.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.schedulerCalcService.getSlotData(startDate, 'week');\n if (slotData)\n this.schedulerCalcService.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)\n this.schedulerCalcService.handleEvent({ event: mouseEvent, slot: slotData }, this.eventOutputMap, 'slot');\n }\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 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.schedulerCalcService.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.schedulerCalcService.calculateActiveAppointmentsInBlock(\n this.singleDayAppointments(),\n viewDate,\n startH,\n endH,\n 7, // Specify 7 days for week view\n );\n });\n\n visibleAppointmentsLayout = computed((): AXSchedulerWeekAppointmentLayout[] => {\n const layouts: AXSchedulerWeekAppointmentLayout[] = [];\n const startingBlocks = this.appointmentsByStartBlock();\n const daysCount = 7;\n const totalBlocksPerDay = this.totalBlocksPerViewDay();\n const blockHeightExpr = `var(--ax-comp-scheduler-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.schedulerCalcService.calculateDurationInMinutes(appointmentToShow);\n if (appointmentDurationMinutes > 0) {\n const heightBlock = appointmentDurationMinutes / 30;\n layoutHeight = `max(0px, calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_WIDTH_PX}px))`;\n }\n }\n\n layouts.push({ ...appointmentToShow, layoutTop, layoutLeft, layoutHeight });\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.schedulerCalcService.getBlockIdentifier(\n appointmentLayout.startDate,\n viewStartDate,\n startH,\n endH,\n 7,\n );\n if (!startInfo) continue;\n\n const durationMinutes = this.schedulerCalcService.calculateDurationInMinutes(appointmentLayout);\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.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-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-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","<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>{{ day.format('DDD dd') }}</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\">\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('HH:mm') }}\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-week-table-container\">\n <div class=\"ax-scheduler-week-appointment-container\">\n @for (appointmentLayout of visibleAppointmentsLayout(); track appointmentLayout.key) {\n <div\n (click)=\"handleAppointmentEvent($event, appointmentLayout)\"\n (dblclick)=\"handleAppointmentEvent($event, appointmentLayout)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointmentLayout)\"\n [title]=\"appointmentLayout.title\"\n [class.ax-draggable]=\"draggable()\"\n class=\"ax-scheduler-week-appointment\"\n [style.top]=\"appointmentLayout.layoutTop\"\n [style.left]=\"appointmentLayout.layoutLeft\"\n [style.color]=\"appointmentLayout.textColor\"\n [style.height]=\"appointmentLayout.layoutHeight\"\n [style.background-color]=\"appointmentLayout.backgroundColor\"\n >\n <ax-title class=\"ax-scheduler-truncate\">{{ appointmentLayout.title }}</ax-title>\n <ax-subtitle>\n {{ appointmentLayout.startDate.format('HH:mm') }} - {{ appointmentLayout.endDate.format('HH:mm') }}\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 class=\"ax-scheduler-badge-wrapper\"\n style=\"position: absolute\"\n [style.top]=\"badge.badgeTop\"\n [style.left]=\"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\">\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 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 <ax-subtitle>\n {{ appointment.startDate.format('HH:mm') }} - {{ appointment.endDate.format('HH:mm') }}\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 { 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 { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nconst COMPONENT = [\n AXSchedulerComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n];\n\n@NgModule({\n imports: [...COMPONENT],\n exports: [...COMPONENT],\n providers: [],\n})\nexport class AXSchedulerModule {}\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 { AXPlatform, AXScreenSizes } from '@acorex/core/platform';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXHtmlUtil, AXUnsubscriber } from '@acorex/core/utils';\nimport { 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 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 { AXSchedulerModule } from './scheduler.module';\nimport { AXSchedulerService } from './scheduler.service';\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 AXSchedulerModule,\n AXSelectBoxComponent,\n AXDecoratorIconComponent,\n AXButtonComponent,\n NgClass,\n AXPopoverComponent,\n AXCalendarComponent,\n ],\n})\nexport class AXSchedulerComponent extends MXBaseComponent implements OnInit {\n protected platform = inject(AXPlatform);\n private unsubscriber = inject(AXUnsubscriber);\n private calendarService = inject(AXCalendarService);\n private translationService = inject(AXTranslationService);\n private schedulerCalcService = inject(AXSchedulerService);\n\n private viewModeSelectbox = viewChild(AXSelectBoxComponent);\n\n displayViews = {\n day: 'daily',\n week: 'weekly',\n month: 'monthly',\n year: 'yearly',\n };\n\n draggable = signal(false); // TODO\n\n rtl = signal(false);\n isLoading = signal(false);\n isFullScreen = signal(false);\n size = signal<AXScreenSizes | null>(null);\n viewsDataSource = signal<{ id: string; text: string }[]>([]);\n oldDate = signal<AXDateTime>(this.calendarService.create(new Date()));\n\n currentDate = linkedSignal<AXDateTime>(() =>\n this.calendarService.create(this.startingDate()).set('hour', 0).set('minute', 0).set('second', 0),\n );\n\n endHour = input(23);\n startHour = input(8);\n keyField = input('id');\n titleField = input('title');\n startingDate = input<Date>();\n allDayField = input('allDay');\n allowFullScreen = input(true);\n endDateField = input('endDate');\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[]>(['day', 'week', 'month']);\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 this.detectSize();\n this.platform.resize.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n this.detectSize();\n super.cdr.markForCheck();\n });\n\n this.calendarService.calendarChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n this.currentDate.set(this.calendarService.create(this.currentDate().date));\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));\n });\n\n 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 detectSize() {\n this.size.set(this.platform.screenSize);\n }\n\n private getGridDateRange(dateInMonth: AXDateTime): { gridStartDate: AXDateTime; gridEndDate: AXDateTime } {\n const firstDayOfMonth = dateInMonth.startOf('month');\n const firstDayGridNum = this.schedulerCalcService.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 return this.currentDate().format('dd MMMM yyyy');\n case 'week':\n return `${this.currentDate().format('dd MMMM yyyy')} - ${this.currentDate().add('week', 1).add('day', -1).format('dd MMMM yyyy')}`;\n case 'month':\n return this.currentDate().format('MMMM yyyy');\n }\n return '';\n });\n\n calendarDepth = computed(() => {\n if (this.selectedView() === 'week') return 'day';\n return this.selectedView();\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]);\n const endDate = this.calendarService.create(item[endDateField]);\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(() => {\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 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 default:\n return [];\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.schedulerCalcService.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 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 'month':\n this.currentDate.set(this.currentDate().add('month', 1));\n break;\n }\n }\n\n prevClick() {\n switch (this.selectedView()) {\n case 'day':\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 'month':\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);\n if (this.selectedView() === 'week') {\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerCalcService.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=\"link\" (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=\"link\" (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\n <ax-popover [target]=\"date\" [placement]=\"'bottom'\">\n <div class=\"ax-overlay-pane ax-scheduler-calendar-container\">\n <ax-calendar\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]=\"100\"\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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\n [startHour]=\"startHour()\"\n [draggable]=\"draggable()\"\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 [draggable]=\"draggable()\"\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 }\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2.AXSchedulerDayViewComponent","i3.AXSchedulerWeekViewComponent","i4.AXSchedulerMonthViewComponent"],"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 { 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 { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, output } 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 schedulerService = inject(AXSchedulerService);\n\n daysCount = input(7);\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 // 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","<div class=\"ax-scheduler-agenda-container\">\n @for (appt of multiDayAppointments(); track appt.appointments) {\n <div\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 { ChangeDetectionStrategy, Component, computed, inject, input, output, ViewEncapsulation } 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 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","<div class=\"ax-scheduler-day-header\">\n <table class=\"ax-scheduler-day-header-table\" aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n <tr>\n {{\n 'dateTime.duration.all-day' | translate | async\n }}\n </tr>\n </tbody>\n </table>\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\">\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 <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr>\n {{\n time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n </tr>\n }\n </tbody>\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 <table aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr\n (click)=\"handleSingleSlotEvent($event, time, 0)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, 0)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, 0)\"\n ></tr>\n <tr\n (click)=\"handleSingleSlotEvent($event, time, 1)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, 1)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, 1)\"\n ></tr>\n }\n </tbody>\n </table>\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 { ChangeDetectionStrategy, Component, computed, inject, input, output, ViewEncapsulation } 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 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","<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 class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\">\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 { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, output } 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 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","<div class=\"ax-scheduler-timeline-header\">\n @for (hour of hoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-header-hours\">\n {{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\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 { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, output } 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 schedulerService = inject(AXSchedulerService);\n\n private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3;\n\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, 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","<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\">\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 class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\">\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 { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, 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 daysCount = input(7);\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","<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\">\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 [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 { AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, ViewEncapsulation } 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 schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\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","<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\">\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\">\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 { AXPlatform, AXScreenSizes } from '@acorex/core/platform';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXHtmlUtil, AXUnsubscriber } from '@acorex/core/utils';\nimport { 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 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 protected platform = inject(AXPlatform);\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>();\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 size = signal<AXScreenSizes | null>(null);\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 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 this.detectSize();\n this.platform.resize.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n this.detectSize();\n super.cdr.markForCheck();\n });\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 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 detectSize() {\n this.size.set(this.platform.screenSize);\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=\"link\" (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=\"link\" (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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\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 [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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\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 [date]=\"currentDate()\"\n [endHour]=\"endHour()\"\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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"}
|