@acorex/components 21.0.1-next.2 → 21.0.1-next.4

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.
@@ -1,7 +1,7 @@
1
1
  import { AXRange, NXNativeEvent, NXComponent, NXEvent, AXValueChangedEvent } from '@acorex/cdk/common';
2
2
  import { AXDateTime, AXHolidayDate } from '@acorex/core/date-time';
3
3
  import * as _angular_core from '@angular/core';
4
- import { OnInit, TemplateRef, AfterViewInit, ElementRef } from '@angular/core';
4
+ import { OnInit, AfterViewInit, TemplateRef, OnDestroy, ElementRef } from '@angular/core';
5
5
  import { AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';
6
6
 
7
7
  type AXSchedulerView = 'day' | 'week' | 'month' | 'timeline-day' | 'timeline-multi-day' | 'timeline-month' | 'timeline-year' | 'agenda';
@@ -68,6 +68,21 @@ type AXSchedulerResource = {
68
68
  title: string;
69
69
  description?: string;
70
70
  };
71
+ /**
72
+ * Result of calculating updated appointment data after a drag-and-drop operation.
73
+ */
74
+ type AXSchedulerAppointmentDropResult = {
75
+ /** The new start date for the appointment */
76
+ startDate: Date;
77
+ /** The new end date for the appointment */
78
+ endDate: Date;
79
+ /** Whether the appointment should be marked as all-day */
80
+ allDay: boolean;
81
+ /** The new resource ID (if applicable) */
82
+ resourceId?: unknown;
83
+ /** Whether the drop was on the same slot (no change needed) */
84
+ isSameSlotDrop: boolean;
85
+ };
71
86
 
72
87
  interface AXSchedulerAppointmentMouseEvent extends NXNativeEvent<AXSchedulerComponent, MouseEvent> {
73
88
  appointment: AXSchedulerAppointment;
@@ -90,7 +105,7 @@ interface AXSchedulerSlotDropEvent extends NXEvent<AXSchedulerComponent> {
90
105
  };
91
106
  isSameSlotDrop: boolean;
92
107
  }
93
- declare class AXSchedulerComponent extends NXComponent implements OnInit {
108
+ declare class AXSchedulerComponent extends NXComponent implements OnInit, AfterViewInit {
94
109
  #private;
95
110
  private platformId;
96
111
  private unsubscriber;
@@ -115,6 +130,7 @@ declare class AXSchedulerComponent extends NXComponent implements OnInit {
115
130
  text: string;
116
131
  }[]>;
117
132
  private prevDate;
133
+ protected selectedAppointmentId: _angular_core.WritableSignal<string | number>;
118
134
  endDayHour: _angular_core.InputSignal<number>;
119
135
  startDayHour: _angular_core.InputSignal<number>;
120
136
  hasHeader: _angular_core.InputSignal<boolean>;
@@ -155,6 +171,7 @@ declare class AXSchedulerComponent extends NXComponent implements OnInit {
155
171
  protected handleAppointmentRightClickInternal(eventData: AXSchedulerAppointmentMouseEvent): void;
156
172
  protected handleAppointmentDropInternal(eventData: AXSchedulerSlotDropEvent): void;
157
173
  ngOnInit(): void;
174
+ ngAfterViewInit(): void;
158
175
  private fillDataSource;
159
176
  private getGridDateRange;
160
177
  currentDateText: _angular_core.Signal<string>;
@@ -197,12 +214,15 @@ declare class AXSchedulerComponent extends NXComponent implements OnInit {
197
214
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerComponent, "ax-scheduler", never, { "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "startingDate": { "alias": "startingDate"; "required": false; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": false; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": false; "isSignal": true; }; "hasHeader": { "alias": "hasHeader"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "weekend": { "alias": "weekend"; "required": false; "isSignal": true; }; "allowFullScreen": { "alias": "allowFullScreen"; "required": false; "isSignal": true; }; "multiDayViewDaysCount": { "alias": "multiDayViewDaysCount"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "holidays": { "alias": "holidays"; "required": false; "isSignal": true; }; "views": { "alias": "views"; "required": false; "isSignal": true; }; "selectedView": { "alias": "selectedView"; "required": false; "isSignal": true; }; }, { "selectedView": "selectedViewChange"; "onDataLoaded": "onDataLoaded"; "onRangeChanged": "onRangeChanged"; "onSlotClicked": "onSlotClicked"; "onSlotDblClicked": "onSlotDblClicked"; "onSlotRightClick": "onSlotRightClick"; "onAppointmentDrop": "onAppointmentDrop"; "onActionClick": "onActionClick"; "onAppointmentClicked": "onAppointmentClicked"; "onAppointmentDblClicked": "onAppointmentDblClicked"; "onAppointmentRightClick": "onAppointmentRightClick"; }, never, never, true, never>;
198
215
  }
199
216
 
200
- declare class AXSchedulerDayViewComponent extends NXComponent implements AfterViewInit {
217
+ declare class AXSchedulerDayViewComponent extends NXComponent implements AfterViewInit, OnDestroy {
201
218
  private document;
219
+ private destroyRef;
202
220
  private scheduler;
203
221
  private calendarService;
204
222
  private schedulerService;
205
223
  readonly GAP_PX = 1;
224
+ private resizeObserverCleanup;
225
+ rtl: _angular_core.InputSignal<boolean>;
206
226
  readonly: _angular_core.InputSignal<boolean>;
207
227
  draggable: _angular_core.InputSignal<boolean>;
208
228
  hasActions: _angular_core.InputSignal<boolean>;
@@ -214,10 +234,12 @@ declare class AXSchedulerDayViewComponent extends NXComponent implements AfterVi
214
234
  showCurrentTimeIndicator: _angular_core.InputSignal<boolean>;
215
235
  appointments: _angular_core.InputSignal<AXSchedulerAppointment[]>;
216
236
  tooltipTemplate: _angular_core.InputSignal<string | TemplateRef<unknown>>;
237
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
238
+ protected isActive(appointmentId: string | number): boolean;
217
239
  currentTimeLineElement: _angular_core.Signal<ElementRef<HTMLElement>>;
218
240
  private dragStartSlotId;
219
241
  private processedAppointmentsForLayout;
220
- protected allDayAppointments: _angular_core.Signal<AXSchedulerAppointment[]>;
242
+ protected allDayAppointments: _angular_core.Signal<AXSchedulerAppointmentSegment[]>;
221
243
  protected singleDayAppointments: _angular_core.Signal<AXSchedulerAppointmentSegment[]>;
222
244
  slotClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
223
245
  slotDblClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
@@ -244,24 +266,34 @@ declare class AXSchedulerDayViewComponent extends NXComponent implements AfterVi
244
266
  protected getCurrentTimePosition(): number | null;
245
267
  protected getCurrentTimePositionWithOffset(): string | null;
246
268
  ngAfterViewInit(): void;
269
+ ngOnDestroy(): void;
247
270
  private setupCurrentTimeScroll;
248
271
  protected getSlotId(e: PointerEvent): void;
249
- protected get isReadonly(): boolean;
250
272
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerDayViewComponent, never>;
251
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerDayViewComponent, "ax-scheduler-day-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
273
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerDayViewComponent, "ax-scheduler-day-view", never, { "rtl": { "alias": "rtl"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
252
274
  }
253
275
 
254
276
  type AXSchedulerGridBadgeInfo = AXSchedulerOverflowBadge & {
255
277
  hiddenAppointments: AXSchedulerAppointmentSegment[];
256
278
  };
257
- declare class AXSchedulerWeekViewComponent extends NXComponent implements AfterViewInit {
279
+ type AXSchedulerWeekSpanningAppointment = {
280
+ appointment: AXSchedulerAppointment;
281
+ startDayIndex: number;
282
+ spanCount: number;
283
+ rowIndex: number;
284
+ isStartClipped: boolean;
285
+ isEndClipped: boolean;
286
+ };
287
+ declare class AXSchedulerWeekViewComponent extends NXComponent implements AfterViewInit, OnDestroy {
258
288
  private readonly document;
289
+ private readonly destroyRef;
259
290
  private readonly scheduler;
260
291
  private readonly calendarService;
261
292
  private readonly schedulerService;
262
293
  private readonly dragStartSlotId;
263
294
  private readonly GAP_PX;
264
295
  private readonly BADGE_SPACE_REM;
296
+ private resizeObserverCleanup;
265
297
  readonly: _angular_core.InputSignal<boolean>;
266
298
  draggable: _angular_core.InputSignal<boolean>;
267
299
  hasActions: _angular_core.InputSignal<boolean>;
@@ -273,6 +305,8 @@ declare class AXSchedulerWeekViewComponent extends NXComponent implements AfterV
273
305
  showCurrentTimeIndicator: _angular_core.InputSignal<boolean>;
274
306
  appointments: _angular_core.InputSignal<AXSchedulerAppointment[]>;
275
307
  tooltipTemplate: _angular_core.InputSignal<string | TemplateRef<unknown>>;
308
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
309
+ protected isActive(appointmentId: string | number): boolean;
276
310
  currentTimeLineElement: _angular_core.Signal<ElementRef<HTMLElement>>;
277
311
  protected readonly slotClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
278
312
  protected readonly slotDblClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
@@ -305,9 +339,14 @@ declare class AXSchedulerWeekViewComponent extends NXComponent implements AfterV
305
339
  * Calculates the total number of 30-minute blocks within the visible hours of a single day.
306
340
  */
307
341
  protected totalBlocksPerViewDay: _angular_core.Signal<number>;
342
+ private isMultiDayAppointment;
343
+ protected spanningAppointments: _angular_core.Signal<AXSchedulerWeekSpanningAppointment[]>;
344
+ private multiDayAppointmentIds;
345
+ protected maxSpanningRowIndex: _angular_core.Signal<number>;
308
346
  /**
309
347
  * @protected
310
- * Filters processed segments to get only those for the all-day header.
348
+ * Filters processed segments to get only single-day all-day appointments for the all-day header.
349
+ * Multi-day appointments are rendered separately as spanning bars.
311
350
  */
312
351
  protected allDayAppointmentsPerDay: _angular_core.Signal<AXSchedulerAllDaySlotData[]>;
313
352
  /**
@@ -401,13 +440,13 @@ declare class AXSchedulerWeekViewComponent extends NXComponent implements AfterV
401
440
  protected getCurrentDayColumnPosition(): string | null;
402
441
  protected getCurrentDayColumnWidth(): string;
403
442
  ngAfterViewInit(): void;
443
+ ngOnDestroy(): void;
404
444
  private setupCurrentTimeScroll;
405
445
  protected shouldShowCurrentTimeForToday(): boolean;
406
- protected get isReadonly(): boolean;
407
446
  private processedAppointmentsForLayout;
408
447
  private timedGridSegments;
409
448
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerWeekViewComponent, never>;
410
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerWeekViewComponent, "ax-scheduler-week-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
449
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerWeekViewComponent, "ax-scheduler-week-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
411
450
  }
412
451
 
413
452
  type AXSchedulerMonthDayCell = {
@@ -421,6 +460,15 @@ type AXSchedulerMonthDayCell = {
421
460
  visibleAppointments: AXSchedulerAppointmentSegment[];
422
461
  hiddenAppointments: AXSchedulerAppointmentSegment[];
423
462
  overflowCount: number;
463
+ gridIndex: number;
464
+ };
465
+ type AXSchedulerSpanningAppointment = {
466
+ appointment: AXSchedulerAppointment;
467
+ gridStartIndex: number;
468
+ spanCount: number;
469
+ rowIndex: number;
470
+ isStartClipped: boolean;
471
+ isEndClipped: boolean;
424
472
  };
425
473
  declare class AXSchedulerMonthViewComponent extends NXComponent {
426
474
  private document;
@@ -435,6 +483,8 @@ declare class AXSchedulerMonthViewComponent extends NXComponent {
435
483
  date: _angular_core.InputSignal<AXDateTime>;
436
484
  appointments: _angular_core.InputSignal<AXSchedulerAppointment[]>;
437
485
  firstDayOfWeek: _angular_core.InputSignal<AXDayOfWeekName>;
486
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
487
+ protected isActive(appointmentId: string | number): boolean;
438
488
  tooltipTemplate: _angular_core.InputSignal<string | TemplateRef<unknown>>;
439
489
  readonly DAYS_IN_WEEK = 7;
440
490
  readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 2;
@@ -455,13 +505,20 @@ declare class AXSchedulerMonthViewComponent extends NXComponent {
455
505
  private monthStartDate;
456
506
  protected daysArray: _angular_core.Signal<AXDateTime[]>;
457
507
  private calendarDaysInfo;
458
- private appointmentsGroupedByDay;
508
+ private isMultiDayAppointment;
509
+ protected spanningAppointments: _angular_core.Signal<AXSchedulerSpanningAppointment[]>;
510
+ private multiDayAppointmentIds;
459
511
  protected dayCellLayouts: _angular_core.Signal<AXSchedulerMonthDayCell[]>;
460
512
  protected gridTemplateRowsStyle: _angular_core.Signal<string>;
461
513
  protected getSlotId(e: PointerEvent): void;
462
- protected get isReadonly(): boolean;
514
+ protected getSpanningAppointmentStyle(spanning: AXSchedulerSpanningAppointment): Record<string, string>;
515
+ protected spanningAppointmentsByWeekRow: _angular_core.Signal<Map<number, AXSchedulerSpanningAppointment[]>>;
516
+ protected weekRowsArray: _angular_core.Signal<number[]>;
517
+ protected getSpanningAppointmentsForWeekRow(weekRowIndex: number): AXSchedulerSpanningAppointment[];
518
+ protected maxSpanningRowsPerWeek: _angular_core.Signal<Map<number, number>>;
519
+ protected getSpanningRowsCountForDayCell(gridIndex: number): number;
463
520
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerMonthViewComponent, never>;
464
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerMonthViewComponent, "ax-scheduler-month-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
521
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerMonthViewComponent, "ax-scheduler-month-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
465
522
  }
466
523
 
467
524
  interface AgendaDayData {
@@ -486,6 +543,8 @@ declare class AXSchedulerAgendaViewComponent extends NXComponent {
486
543
  date: _angular_core.InputSignal<AXDateTime>;
487
544
  appointments: _angular_core.InputSignal<AXSchedulerAppointment[]>;
488
545
  tooltipTemplate: _angular_core.InputSignal<string | TemplateRef<unknown>>;
546
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
547
+ protected isActive(appointmentId: string | number): boolean;
489
548
  private dragStartSlotId;
490
549
  protected agendaDaysLayout: _angular_core.Signal<AgendaDayData[]>;
491
550
  slotClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
@@ -507,16 +566,29 @@ declare class AXSchedulerAgendaViewComponent extends NXComponent {
507
566
  holiday?: AXHolidayDate;
508
567
  };
509
568
  protected getSlotId(e: PointerEvent): void;
510
- protected get isReadonly(): boolean;
569
+ /**
570
+ * Checks if an appointment spans multiple days.
571
+ * Returns true if the appointment covers more than one calendar day.
572
+ */
573
+ protected isMultiDayAppointment(segment: AXSchedulerAppointmentSegment): boolean;
574
+ /**
575
+ * Gets the formatted date range for multi-day appointments.
576
+ * Returns the start and end dates formatted for display (e.g., "7 Dec", "21 Dec").
577
+ * Supports Persian calendar through the calendar input.
578
+ */
579
+ protected getMultiDayStartDate(segment: AXSchedulerAppointmentSegment): Date;
580
+ protected getMultiDayEndDate(segment: AXSchedulerAppointmentSegment): Date;
511
581
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerAgendaViewComponent, never>;
512
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerAgendaViewComponent, "ax-scheduler-agenda-view", never, { "daysCount": { "alias": "daysCount"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
582
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerAgendaViewComponent, "ax-scheduler-agenda-view", never, { "daysCount": { "alias": "daysCount"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
513
583
  }
514
584
 
515
- declare class AXSchedulerTimelineDayViewComponent extends NXComponent implements AfterViewInit {
585
+ declare class AXSchedulerTimelineDayViewComponent extends NXComponent implements AfterViewInit, OnDestroy {
516
586
  private document;
587
+ private destroyRef;
517
588
  private scheduler;
518
589
  private calendarService;
519
590
  private schedulerService;
591
+ private resizeObserverCleanup?;
520
592
  readonly GAP_PX = 1;
521
593
  readonly: _angular_core.InputSignal<boolean>;
522
594
  draggable: _angular_core.InputSignal<boolean>;
@@ -526,6 +598,8 @@ declare class AXSchedulerTimelineDayViewComponent extends NXComponent implements
526
598
  showResourceHeaders: _angular_core.InputSignal<boolean>;
527
599
  date: _angular_core.InputSignal<AXDateTime>;
528
600
  endDayHour: _angular_core.InputSignal<number>;
601
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
602
+ protected isActive(appointmentId: string | number): boolean;
529
603
  startDayHour: _angular_core.InputSignal<number>;
530
604
  showUnassignedAppointments: _angular_core.InputSignal<boolean>;
531
605
  resources: _angular_core.InputSignal<AXSchedulerResource[]>;
@@ -576,6 +650,7 @@ declare class AXSchedulerTimelineDayViewComponent extends NXComponent implements
576
650
  protected getCurrentTimePosition(): number | null;
577
651
  protected getCurrentTimePositionWithOffset(): string | null;
578
652
  ngAfterViewInit(): void;
653
+ ngOnDestroy(): void;
579
654
  private setupCurrentTimeScroll;
580
655
  /**
581
656
  * Gets appointment layouts for a specific resource with proper positioning.
@@ -590,13 +665,13 @@ declare class AXSchedulerTimelineDayViewComponent extends NXComponent implements
590
665
  */
591
666
  private calculateMaxOverlappingRows;
592
667
  protected getSlotId(e: PointerEvent): void;
593
- protected get isReadonly(): boolean;
594
668
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerTimelineDayViewComponent, never>;
595
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineDayViewComponent, "ax-scheduler-timeline-day-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
669
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineDayViewComponent, "ax-scheduler-timeline-day-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
596
670
  }
597
671
 
598
672
  interface TimelineMonthViewDayData {
599
673
  date: AXDateTime;
674
+ dayIndex: number;
600
675
  visibleAppointments: AXSchedulerAppointmentSegment[];
601
676
  hiddenAppointments: AXSchedulerAppointmentSegment[];
602
677
  moreCount: number;
@@ -610,12 +685,28 @@ interface TimelineMonthViewDayData {
610
685
  moreCount: number;
611
686
  }>;
612
687
  }
613
- declare class AXSchedulerTimelineMonthViewComponent extends NXComponent implements AfterViewInit {
688
+ type AXSchedulerTimelineSpanningAppointment = {
689
+ appointment: AXSchedulerAppointment;
690
+ startDayIndex: number;
691
+ spanCount: number;
692
+ rowIndex: number;
693
+ isStartClipped: boolean;
694
+ isEndClipped: boolean;
695
+ };
696
+ declare class AXSchedulerTimelineMonthViewComponent extends NXComponent implements AfterViewInit, OnDestroy {
614
697
  private document;
698
+ private destroyRef;
615
699
  private scheduler;
616
700
  private calendarService;
617
701
  private schedulerService;
702
+ private resizeObserverCleanup?;
618
703
  private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY;
704
+ private isMultiDayAppointment;
705
+ protected spanningAppointments: _angular_core.Signal<AXSchedulerTimelineSpanningAppointment[]>;
706
+ private multiDayAppointmentIds;
707
+ protected getSpanningAppointmentsForResource(resourceId: any): AXSchedulerTimelineSpanningAppointment[];
708
+ protected maxSpanningRows: _angular_core.Signal<number>;
709
+ protected getMaxSpanningRowsForResource(resourceId: any): number;
619
710
  readonly: _angular_core.InputSignal<boolean>;
620
711
  draggable: _angular_core.InputSignal<boolean>;
621
712
  hasActions: _angular_core.InputSignal<boolean>;
@@ -624,6 +715,8 @@ declare class AXSchedulerTimelineMonthViewComponent extends NXComponent implemen
624
715
  showResourceHeaders: _angular_core.InputSignal<boolean>;
625
716
  date: _angular_core.InputSignal<AXDateTime>;
626
717
  showUnassignedAppointments: _angular_core.InputSignal<boolean>;
718
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
719
+ protected isActive(appointmentId: string | number): boolean;
627
720
  resources: _angular_core.InputSignal<AXSchedulerResource[]>;
628
721
  showCurrentTimeIndicator: _angular_core.InputSignal<boolean>;
629
722
  resourceTemplate: _angular_core.InputSignal<TemplateRef<unknown>>;
@@ -670,6 +763,7 @@ declare class AXSchedulerTimelineMonthViewComponent extends NXComponent implemen
670
763
  protected getResourceContext(resourceId: any): AXSchedulerResource;
671
764
  protected getCurrentTimePosition(): number | null;
672
765
  ngAfterViewInit(): void;
766
+ ngOnDestroy(): void;
673
767
  private setupCurrentTimeScroll;
674
768
  /**
675
769
  * Gets appointments for a specific resource and day.
@@ -690,11 +784,22 @@ declare class AXSchedulerTimelineMonthViewComponent extends NXComponent implemen
690
784
  */
691
785
  protected calculateMaxOverlappingRows(appointments: AXSchedulerAppointmentSegment[]): number;
692
786
  protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean;
693
- protected get isReadonly(): boolean;
694
787
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerTimelineMonthViewComponent, never>;
695
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineMonthViewComponent, "ax-scheduler-timeline-month-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
788
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineMonthViewComponent, "ax-scheduler-timeline-month-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
696
789
  }
697
790
 
791
+ /**
792
+ * Represents a spanning appointment in the timeline-multi-day view.
793
+ */
794
+ interface AXSchedulerTimelineMultiDaySpanningAppointment {
795
+ appointment: AXSchedulerAppointment;
796
+ startDayIndex: number;
797
+ spanCount: number;
798
+ rowIndex: number;
799
+ isStartClipped: boolean;
800
+ isEndClipped: boolean;
801
+ resourceId?: unknown;
802
+ }
698
803
  interface TimelineMultiDayDaySlot {
699
804
  date: AXDateTime;
700
805
  originalAppointmentsForThisDay: AXSchedulerAppointment[];
@@ -703,9 +808,12 @@ interface TimelineMultiDayDaySlot {
703
808
  holiday?: AXHolidayDate;
704
809
  };
705
810
  }
706
- declare class AXSchedulerTimelineMultiDayViewComponent extends NXComponent implements AfterViewInit {
811
+ declare class AXSchedulerTimelineMultiDayViewComponent extends NXComponent implements AfterViewInit, OnDestroy {
812
+ private destroyRef;
813
+ private scheduler;
707
814
  private calendarService;
708
815
  private schedulerService;
816
+ private resizeObserverCleanup?;
709
817
  daysCount: _angular_core.InputSignal<number>;
710
818
  readonly: _angular_core.InputSignal<boolean>;
711
819
  draggable: _angular_core.InputSignal<boolean>;
@@ -715,6 +823,8 @@ declare class AXSchedulerTimelineMultiDayViewComponent extends NXComponent imple
715
823
  showResourceHeaders: _angular_core.InputSignal<boolean>;
716
824
  date: _angular_core.InputSignal<AXDateTime>;
717
825
  endDayHour: _angular_core.InputSignal<number>;
826
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
827
+ protected isActive(appointmentId: string | number): boolean;
718
828
  showCurrentTimeIndicator: _angular_core.InputSignal<boolean>;
719
829
  startDayHour: _angular_core.InputSignal<number>;
720
830
  showUnassignedAppointments: _angular_core.InputSignal<boolean>;
@@ -724,6 +834,42 @@ declare class AXSchedulerTimelineMultiDayViewComponent extends NXComponent imple
724
834
  tooltipTemplate: _angular_core.InputSignal<string | TemplateRef<unknown>>;
725
835
  currentTimeLineElement: _angular_core.Signal<ElementRef<HTMLElement>>;
726
836
  protected daysDataForTimelineViews: _angular_core.Signal<TimelineMultiDayDaySlot[]>;
837
+ /**
838
+ * Checks if an appointment spans multiple days.
839
+ */
840
+ private isMultiDayAppointment;
841
+ /**
842
+ * Computes spanning appointments for multi-day events across the view.
843
+ */
844
+ protected spanningAppointments: _angular_core.Signal<AXSchedulerTimelineMultiDaySpanningAppointment[]>;
845
+ /**
846
+ * Gets the set of multi-day appointment IDs to exclude from individual day views.
847
+ */
848
+ protected multiDayAppointmentIds: _angular_core.Signal<Set<unknown>>;
849
+ /**
850
+ * Gets spanning appointments filtered for a specific resource.
851
+ */
852
+ protected getSpanningAppointmentsForResource(resourceId: unknown): AXSchedulerTimelineMultiDaySpanningAppointment[];
853
+ /**
854
+ * Gets the maximum number of spanning rows for a resource.
855
+ */
856
+ protected getMaxSpanningRowsForResource(resourceId: unknown): number;
857
+ /**
858
+ * Gets the maximum number of spanning rows across all appointments (for non-resource layouts).
859
+ */
860
+ protected maxSpanningRows: _angular_core.Signal<number>;
861
+ /**
862
+ * Filters appointments for a day, excluding multi-day appointments.
863
+ */
864
+ protected getFilteredAppointmentsForDay(originalAppointments: AXSchedulerAppointment[]): AXSchedulerAppointment[];
865
+ /**
866
+ * Handles clicking on a spanning appointment.
867
+ */
868
+ protected handleSpanningAppointmentEvent(event: MouseEvent, appointment: AXSchedulerAppointment): void;
869
+ /**
870
+ * Handles action click on spanning appointment.
871
+ */
872
+ protected handleSpanningActionClick(event: MouseEvent, appointment: AXSchedulerAppointment): void;
727
873
  slotClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
728
874
  slotDblClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
729
875
  slotRightClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
@@ -754,6 +900,7 @@ declare class AXSchedulerTimelineMultiDayViewComponent extends NXComponent imple
754
900
  protected getCurrentTimePosition(): number | null;
755
901
  protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean;
756
902
  ngAfterViewInit(): void;
903
+ ngOnDestroy(): void;
757
904
  private setupCurrentTimeScroll;
758
905
  /**
759
906
  * Gets appointments for a specific resource and day.
@@ -762,7 +909,7 @@ declare class AXSchedulerTimelineMultiDayViewComponent extends NXComponent imple
762
909
  /**
763
910
  * Gets the height for a specific resource across all days.
764
911
  */
765
- protected getResourceRowHeight(resourceId: any): string;
912
+ protected getResourceRowHeight(resourceId: unknown): string;
766
913
  /**
767
914
  * Calculates the maximum number of overlapping rows for a set of appointments.
768
915
  * Uses the actual segmented times that will be displayed in the timeline view.
@@ -781,11 +928,12 @@ declare class AXSchedulerTimelineMultiDayViewComponent extends NXComponent imple
781
928
  holiday?: AXHolidayDate;
782
929
  };
783
930
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerTimelineMultiDayViewComponent, never>;
784
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineMultiDayViewComponent, "ax-scheduler-timeline-multi-day-view", never, { "daysCount": { "alias": "daysCount"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
931
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineMultiDayViewComponent, "ax-scheduler-timeline-multi-day-view", never, { "daysCount": { "alias": "daysCount"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "endDayHour": { "alias": "endDayHour"; "required": true; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "startDayHour": { "alias": "startDayHour"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
785
932
  }
786
933
 
787
934
  interface TimelineYearViewDayData {
788
935
  date: AXDateTime;
936
+ dayIndex: number;
789
937
  visibleAppointments: AXSchedulerAppointmentSegment[];
790
938
  hiddenAppointments: AXSchedulerAppointmentSegment[];
791
939
  moreCount: number;
@@ -799,12 +947,28 @@ interface TimelineYearViewDayData {
799
947
  moreCount: number;
800
948
  }>;
801
949
  }
802
- declare class AXSchedulerTimelineYearViewComponent extends NXComponent implements AfterViewInit {
950
+ type AXSchedulerTimelineYearSpanningAppointment = {
951
+ appointment: AXSchedulerAppointment;
952
+ startDayIndex: number;
953
+ spanCount: number;
954
+ rowIndex: number;
955
+ isStartClipped: boolean;
956
+ isEndClipped: boolean;
957
+ };
958
+ declare class AXSchedulerTimelineYearViewComponent extends NXComponent implements AfterViewInit, OnDestroy {
803
959
  private document;
960
+ private destroyRef;
804
961
  private scheduler;
805
962
  private calendarService;
806
963
  private schedulerService;
964
+ private resizeObserverCleanup?;
807
965
  private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY;
966
+ private isMultiDayAppointment;
967
+ protected spanningAppointments: _angular_core.Signal<AXSchedulerTimelineYearSpanningAppointment[]>;
968
+ private multiDayAppointmentIds;
969
+ protected getSpanningAppointmentsForResource(resourceId: any): AXSchedulerTimelineYearSpanningAppointment[];
970
+ protected maxSpanningRows: _angular_core.Signal<number>;
971
+ protected getMaxSpanningRowsForResource(resourceId: any): number;
808
972
  readonly: _angular_core.InputSignal<boolean>;
809
973
  draggable: _angular_core.InputSignal<boolean>;
810
974
  hasActions: _angular_core.InputSignal<boolean>;
@@ -813,6 +977,8 @@ declare class AXSchedulerTimelineYearViewComponent extends NXComponent implement
813
977
  showResourceHeaders: _angular_core.InputSignal<boolean>;
814
978
  date: _angular_core.InputSignal<AXDateTime>;
815
979
  showUnassignedAppointments: _angular_core.InputSignal<boolean>;
980
+ selectedAppointmentId: _angular_core.InputSignal<string | number>;
981
+ protected isActive(appointmentId: string | number): boolean;
816
982
  resources: _angular_core.InputSignal<AXSchedulerResource[]>;
817
983
  showCurrentTimeIndicator: _angular_core.InputSignal<boolean>;
818
984
  resourceTemplate: _angular_core.InputSignal<TemplateRef<unknown>>;
@@ -835,6 +1001,7 @@ declare class AXSchedulerTimelineYearViewComponent extends NXComponent implement
835
1001
  protected getResourceContext(resourceId: any): AXSchedulerResource;
836
1002
  protected getCurrentTimePosition(): number | null;
837
1003
  ngAfterViewInit(): void;
1004
+ ngOnDestroy(): void;
838
1005
  private setupCurrentTimeScroll;
839
1006
  slotClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
840
1007
  slotDblClickedInternal: _angular_core.OutputEmitterRef<AXSchedulerSlotMouseEvent>;
@@ -852,7 +1019,7 @@ declare class AXSchedulerTimelineYearViewComponent extends NXComponent implement
852
1019
  protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean;
853
1020
  protected getSlotId(e: PointerEvent): void;
854
1021
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerTimelineYearViewComponent, never>;
855
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineYearViewComponent, "ax-scheduler-timeline-year-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
1022
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXSchedulerTimelineYearViewComponent, "ax-scheduler-timeline-year-view", never, { "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "hasActions": { "alias": "hasActions"; "required": false; "isSignal": true; }; "dragStartDelay": { "alias": "dragStartDelay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": true; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "selectedAppointmentId": { "alias": "selectedAppointmentId"; "required": false; "isSignal": true; }; "resources": { "alias": "resources"; "required": false; "isSignal": true; }; "showCurrentTimeIndicator": { "alias": "showCurrentTimeIndicator"; "required": false; "isSignal": true; }; "resourceTemplate": { "alias": "resourceTemplate"; "required": false; "isSignal": true; }; "appointments": { "alias": "appointments"; "required": false; "isSignal": true; }; "tooltipTemplate": { "alias": "tooltipTemplate"; "required": false; "isSignal": true; }; }, { "slotClickedInternal": "slotClickedInternal"; "slotDblClickedInternal": "slotDblClickedInternal"; "slotRightClickedInternal": "slotRightClickedInternal"; "appointmentClickedInternal": "appointmentClickedInternal"; "appointmentDblClickedInternal": "appointmentDblClickedInternal"; "appointmentRightClickedInternal": "appointmentRightClickedInternal"; "onActionClickInternal": "onActionClickInternal"; "onAppointmentDropInternal": "onAppointmentDropInternal"; }, never, never, true, never>;
856
1023
  }
857
1024
 
858
1025
  declare class AXSchedulerModule {
@@ -1032,9 +1199,96 @@ declare class AXSchedulerService {
1032
1199
  * @returns string[] - Array of resource IDs.
1033
1200
  */
1034
1201
  getAllResourceIds(resources: AXSchedulerResource[], showUnassignedAppointments?: boolean): any[];
1202
+ /**
1203
+ * Calculates the updated appointment data after a drag-and-drop operation.
1204
+ *
1205
+ * This utility method handles the complex logic of preserving appointment duration
1206
+ * when dropping an appointment on a new slot. It correctly handles:
1207
+ * - Single-day timed events (preserves exact duration in milliseconds)
1208
+ * - All-day events (preserves the day span)
1209
+ * - Multi-day events (preserves the number of days spanned)
1210
+ * - Day-based views (agenda, month): preserves original time of day
1211
+ * - Time-slot views (day, week, timeline): uses the slot's time
1212
+ * - Resource ID changes
1213
+ *
1214
+ * @param event - The drop event from the scheduler's onAppointmentDrop output.
1215
+ * @returns AXSchedulerAppointmentDropResult - The calculated new appointment data,
1216
+ * or null if the drop was on the same slot (no change needed).
1217
+ *
1218
+ * @example
1219
+ * ```typescript
1220
+ * // In your component:
1221
+ * handleAppointmentDrop(event: AXSchedulerSlotDropEvent) {
1222
+ * const result = this.schedulerService.calculateAppointmentDropResult(event);
1223
+ *
1224
+ * if (result.isSameSlotDrop) {
1225
+ * return; // No change needed
1226
+ * }
1227
+ *
1228
+ * // Update your data
1229
+ * this.appointments.update(appointments =>
1230
+ * appointments.map(appt =>
1231
+ * appt.id === event.appointment.id
1232
+ * ? { ...appt, ...result }
1233
+ * : appt
1234
+ * )
1235
+ * );
1236
+ * }
1237
+ * ```
1238
+ */
1239
+ calculateAppointmentDropResult(event: {
1240
+ appointment: AXSchedulerAppointment;
1241
+ slot: {
1242
+ startDate: {
1243
+ date: Date;
1244
+ };
1245
+ endDate?: {
1246
+ date: Date;
1247
+ };
1248
+ view?: AXSchedulerView;
1249
+ resourceId?: unknown;
1250
+ };
1251
+ isSameSlotDrop: boolean;
1252
+ }): AXSchedulerAppointmentDropResult;
1253
+ /**
1254
+ * Determines if a slot represents a day-based drop (entire day slot).
1255
+ * Day-based views (agenda, month, timeline-month, timeline-year) have slots
1256
+ * that start at 00:00:00 and span the entire day.
1257
+ *
1258
+ * @param slot - The slot to check.
1259
+ * @returns boolean - True if this is a day-based slot.
1260
+ */
1261
+ private isDayBasedSlotDrop;
1262
+ /**
1263
+ * Applies the drop result to an appointment, returning a new updated appointment object.
1264
+ *
1265
+ * This is a convenience method that combines the drop result with the original appointment.
1266
+ *
1267
+ * @param appointment - The original appointment to update.
1268
+ * @param dropResult - The result from calculateAppointmentDropResult.
1269
+ * @returns AXSchedulerAppointment - A new appointment object with updated fields.
1270
+ *
1271
+ * @example
1272
+ * ```typescript
1273
+ * handleAppointmentDrop(event: AXSchedulerSlotDropEvent) {
1274
+ * const result = this.schedulerService.calculateAppointmentDropResult(event);
1275
+ *
1276
+ * if (result.isSameSlotDrop) return;
1277
+ *
1278
+ * this.appointments.update(appointments =>
1279
+ * appointments.map(appt =>
1280
+ * appt.id === event.appointment.id
1281
+ * ? this.schedulerService.applyDropResult(appt, result)
1282
+ * : appt
1283
+ * )
1284
+ * );
1285
+ * }
1286
+ * ```
1287
+ */
1288
+ applyDropResult(appointment: AXSchedulerAppointment, dropResult: AXSchedulerAppointmentDropResult): AXSchedulerAppointment;
1035
1289
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSchedulerService, never>;
1036
1290
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXSchedulerService>;
1037
1291
  }
1038
1292
 
1039
1293
  export { AXSchedulerAgendaViewComponent, AXSchedulerComponent, AXSchedulerDayViewComponent, AXSchedulerModule, AXSchedulerMonthViewComponent, AXSchedulerService, AXSchedulerTimelineDayViewComponent, AXSchedulerTimelineMonthViewComponent, AXSchedulerTimelineMultiDayViewComponent, AXSchedulerTimelineYearViewComponent, AXSchedulerWeekViewComponent };
1040
- export type { AXDayOfWeekName, AXSchedulerActiveAppointmentsInBlock, AXSchedulerAllDaySlotData, AXSchedulerAppointment, AXSchedulerAppointmentDataSource, AXSchedulerAppointmentDataSourceFilter, AXSchedulerAppointmentLayout, AXSchedulerAppointmentLoader, AXSchedulerAppointmentLoaderAsync, AXSchedulerAppointmentMouseEvent, AXSchedulerAppointmentSegment, AXSchedulerBlockIdentifier, AXSchedulerBlockOccupancyMap, AXSchedulerDateRange, AXSchedulerDayAppointmentLayout, AXSchedulerMonthDayCell, AXSchedulerMultiDayViewAppointment, AXSchedulerOverflowBadge, AXSchedulerResource, AXSchedulerSlotDropEvent, AXSchedulerSlotMouseEvent, AXSchedulerView, AgendaDayData, TimelineMonthViewDayData, TimelineMultiDayDaySlot, TimelineYearViewDayData };
1294
+ export type { AXDayOfWeekName, AXSchedulerActiveAppointmentsInBlock, AXSchedulerAllDaySlotData, AXSchedulerAppointment, AXSchedulerAppointmentDataSource, AXSchedulerAppointmentDataSourceFilter, AXSchedulerAppointmentDropResult, AXSchedulerAppointmentLayout, AXSchedulerAppointmentLoader, AXSchedulerAppointmentLoaderAsync, AXSchedulerAppointmentMouseEvent, AXSchedulerAppointmentSegment, AXSchedulerBlockIdentifier, AXSchedulerBlockOccupancyMap, AXSchedulerDateRange, AXSchedulerDayAppointmentLayout, AXSchedulerMonthDayCell, AXSchedulerMultiDayViewAppointment, AXSchedulerOverflowBadge, AXSchedulerResource, AXSchedulerSlotDropEvent, AXSchedulerSlotMouseEvent, AXSchedulerSpanningAppointment, AXSchedulerTimelineSpanningAppointment, AXSchedulerTimelineYearSpanningAppointment, AXSchedulerView, AgendaDayData, TimelineMonthViewDayData, TimelineMultiDayDaySlot, TimelineYearViewDayData };