@progress/kendo-angular-scheduler
Version:
Kendo UI Scheduler Angular - Outlook or Google-style angular scheduler calendar. Full-featured and customizable embedded scheduling from the creator developers trust for professional UI components.
550 lines (549 loc) • 40.1 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import { Component, Input, NgZone, ViewChildren, ViewChild, QueryList, ElementRef, Renderer2, ChangeDetectorRef } from '@angular/core';
import { IntlService, DatePipe } from '@progress/kendo-angular-intl';
import { LocalizationService } from '@progress/kendo-angular-l10n';
import { ViewContextService } from '../view-context.service';
import { ViewStateService } from '../view-state.service';
import { DayTimeSlotService } from '../day-time/day-time-slot.service';
import { createTasks, SortPipe } from './utils';
import { toPx } from '../utils';
import { DayTimeViewComponent } from '../day-time/day-time-view.component';
import { PDFService } from '../../pdf/pdf.service';
import { ScrollbarWidthService, isDocumentAvailable } from '@progress/kendo-angular-common';
import { ResourceIteratorPipe } from '../common/resource-iterator.pipe';
import { ResizeHintComponent } from '../common/resize-hint.component';
import { HintContainerComponent } from '../common/hint-container.component';
import { FocusableDirective } from '../../navigation/focusable.directive';
import { DayTimeViewItemComponent } from '../day-time/day-time-view-item.component';
import { TimeSlotDirective } from '../day-time/event-slot.directive';
import { NgClass, NgFor, NgIf, NgTemplateOutlet, NgStyle, AsyncPipe } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@progress/kendo-angular-l10n";
import * as i2 from "../view-context.service";
import * as i3 from "../view-state.service";
import * as i4 from "@progress/kendo-angular-intl";
import * as i5 from "../day-time/day-time-slot.service";
import * as i6 from "../../pdf/pdf.service";
import * as i7 from "@progress/kendo-angular-common";
/**
* @hidden
*/
export class TimelineMultiDayViewComponent extends DayTimeViewComponent {
name = 'timeline';
columnWidth = 100;
viewName = 'timeline';
verticalResourceRows;
get classNames() {
return `k-scheduler-${this.viewName}-view`;
}
headerTable;
get contentWidthPercentage() {
const expectedWidth = this.columnWidth * this.slotsCount;
const percentage = (expectedWidth / this.contentWidth) * 100;
return Math.max(percentage, 100);
}
verticalTime = false;
contentWidth;
constructor(localization, changeDetector, viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, scrollBarWidthService) {
super(changeDetector, viewContext, viewState, intl, slotService, zone, renderer, element, pdfService, localization, scrollBarWidthService);
}
ngOnChanges(changes) {
if (changes.columnWidth) {
this.changes.next(null);
}
super.ngOnChanges(changes);
}
reflow() {
if (!isDocumentAvailable()) {
return;
}
const slotService = this.slotService;
this.updateContentHeight();
slotService.containerSize = this.content.nativeElement.scrollWidth;
this.contentWidth = this.content.nativeElement.getBoundingClientRect().width;
this.cdr.detectChanges();
const verticalResourceRows = this.verticalResources.length ? this.verticalResourceRows.toArray() : [];
slotService.layoutTimeline(this.eventHeight, verticalResourceRows);
if (verticalResourceRows.length) {
slotService.forEachGroup((group, index) => {
verticalResourceRows[index].nativeElement.style.height = `${group.timeRanges[0].slots[0].height}px`;
});
}
this.syncTables();
}
get allEventsMessage() {
return this.localization.get('allEvents');
}
get slotsCount() {
const resources = this.horizontalResources;
let result = this.daySlots.length * this.timeSlots.length;
for (let idx = 0; idx < resources.length; idx++) {
result *= (resources[idx].data || []).length || 1;
}
return result;
}
timeColspan(index) {
if (this.minorTimeHeaderTemplateRef) {
return 1;
}
const timeSlots = this.timeSlots.length;
const remainder = timeSlots % this.slotDivisions;
return remainder === 0 || (index < timeSlots - remainder) ? this.slotDivisions : 1;
}
horizontalColspan(resourceIndex) {
const resources = this.horizontalResources;
let result = this.daySlots.length * this.timeSlots.length;
for (let idx = resourceIndex + 1; idx < resources.length; idx++) {
result *= (resources[idx].data || []).length || 1;
}
return result;
}
verticalRowspan(resourceIndex) {
const resources = this.verticalResources;
let result = 1;
for (let idx = resourceIndex + 1; idx < resources.length; idx++) {
result *= (resources[idx].data || []).length || 1;
}
return result;
}
handleScroll() {
this.headerWrap.nativeElement.scrollLeft = this.content.nativeElement.scrollLeft;
}
createTasks(items, dateRange) {
return createTasks(dateRange.start, dateRange.end, items);
}
onTasksChange() {
this.items.next(this.tasks);
}
dragRanges(slot) {
return this.slotService.dragRanges(slot, this.dragging.offset, true);
}
dragHintSize(firstSlot, lastSlot) {
return {
width: toPx(lastSlot.rect.left - firstSlot.rect.left + lastSlot.rect.width),
height: toPx(firstSlot.height)
};
}
updateResizeHints(ranges, start, end) {
const last = ranges[ranges.length - 1];
super.updateResizeHints([[ranges[0][0], last[last.length - 1]]], start, end);
}
pdfWidth() {
const contentWidth = this.content.nativeElement.scrollWidth;
const timesWidth = this.times.nativeElement.offsetWidth;
return contentWidth + timesWidth;
}
currentTimeArrowOffset() {
return this.headerWrap.nativeElement.querySelector('tr:last-child').offsetTop;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimelineMultiDayViewComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i2.ViewContextService }, { token: i3.ViewStateService }, { token: i4.IntlService }, { token: i5.DayTimeSlotService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i6.PDFService }, { token: i7.ScrollbarWidthService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TimelineMultiDayViewComponent, isStandalone: true, selector: "timeline-multi-day-view", inputs: { name: "name", columnWidth: "columnWidth", viewName: "viewName" }, providers: [
DayTimeSlotService
], viewQueries: [{ propertyName: "headerTable", first: true, predicate: ["headerTable"], descendants: true }, { propertyName: "verticalResourceRows", predicate: ["verticalResourceRows"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
<table class="k-scheduler-layout" [ngClass]="classNames">
<tbody>
<tr class="k-scheduler-head">
<td>
<div class="k-scheduler-times" #timesHeader>
<table class="k-scheduler-table" aria-hidden="true">
<tbody>
<tr><th class="k-scheduler-cell k-heading-cell"></th></tr>
<tr><th class="k-slot-cell k-scheduler-cell k-heading-cell"></th></tr>
<tr *ngFor="let resource of horizontalResources; trackBy: itemIndex;">
<th class="k-scheduler-cell k-heading-cell"></th>
</tr>
</tbody>
</table>
</div>
</td>
<td>
<div class="k-scheduler-header" #header >
<div class="k-scheduler-header-wrap" #headerWrap>
<ng-container *ngIf="showCurrentTime">
<div *ngFor="let resource of horizontalResources | resourceIterator; trackBy: itemIndex;"
#currentTimeArrow class="k-current-time k-current-time-arrow-down">
</div>
</ng-container>
<table class="k-scheduler-table" #headerTable aria-hidden="true" [style.width.%]="contentWidthPercentage">
<tbody>
<tr *ngFor="let resource of horizontalResources; let resourceIndex = index; trackBy: itemIndex;">
<th *ngFor="let item of horizontalResources | resourceIterator : resourceIndex; trackBy: itemIndex;"
class="k-slot-cell k-scheduler-cell k-heading-cell" [attr.colspan]="horizontalColspan(resourceIndex)">
<ng-container *ngIf="!groupHeaderTemplateRef">{{ getField(item, resource.textField) }}</ng-container>
<ng-container *ngIf="groupHeaderTemplateRef" [ngTemplateOutlet]="groupHeaderTemplateRef"
[ngTemplateOutletContext]="{ resource: item }"></ng-container>
</th>
</tr>
<tr class="k-scheduler-date-group">
<ng-container *ngFor="let resource of horizontalResources | resourceIterator; trackBy: itemIndex;">
<ng-container *ngFor="let daySlot of daySlots; let index = index; trackBy: itemIndex;">
<th [attr.colspan]="timeSlots.length" class="k-scheduler-cell k-heading-cell k-slot-cell">
<span *ngIf="!dateHeaderTemplateRef" class="k-link k-nav-day" [attr.data-dayslot-index]="index">{{ daySlot.start | kendoDate: 'm'}}</span>
<ng-container *ngIf="dateHeaderTemplateRef" [ngTemplateOutlet]="dateHeaderTemplateRef" [ngTemplateOutletContext]="{ date: daySlot.start }"></ng-container>
</th>
</ng-container>
</ng-container>
</tr>
<tr>
<ng-container *ngFor="let resource of horizontalResources | resourceIterator; let resourceIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let daySlot of daySlots; let rangeIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let timeSlot of timeSlots; let index = index; trackBy: itemIndex;">
<th *ngIf="timeSlot.isMajor" [attr.colspan]="timeColspan(index)" class="k-scheduler-cell k-heading-cell">
<ng-container *ngIf="!majorTimeHeaderTemplateRef">{{ timeSlot.start | kendoDate: 't' }}</ng-container>
<ng-container *ngIf="majorTimeHeaderTemplateRef" [ngTemplateOutlet]="majorTimeHeaderTemplateRef" [ngTemplateOutletContext]="{ date: timeSlot.start }"></ng-container>
</th>
<th
*ngIf="!timeSlot.isMajor && minorTimeHeaderTemplateRef"
[ngStyle]="{'border-left-color': 'transparent', 'border-right-color': 'transparent'}"
class="k-scheduler-cell k-heading-cell"
>
<ng-container [ngTemplateOutlet]="minorTimeHeaderTemplateRef" [ngTemplateOutletContext]="{ date: timeSlot.start }">
</ng-container>
</th>
</ng-container>
</ng-container>
</ng-container>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
<tr class="k-scheduler-body">
<td>
<div class="k-scheduler-times" #times>
<table class="k-scheduler-table" #timesTable aria-hidden="true">
<tbody>
<tr *ngIf="!verticalResources.length">
<th rowspan="1" #titleCell class="k-scheduler-cell k-heading-cell">
{{ allEventsMessage }}
</th>
</tr>
<ng-container *ngIf="verticalResources.length">
<ng-container *ngFor="let resourceItem of verticalResources | resourceIterator; let leafIndex = index; trackBy: itemIndex;">
<tr #verticalResourceRows>
<ng-container *ngFor="let resource of verticalResources; let resourceIndex = index; trackBy: itemIndex;">
<th *ngIf="verticalItem(leafIndex, resourceIndex)" [attr.rowspan]="verticalRowspan(resourceIndex)" class="k-slot-cell k-scheduler-cell k-heading-cell">
<div>
<ng-container *ngIf="!groupHeaderTemplateRef">{{ getField(verticalItem(leafIndex, resourceIndex), resource.textField) }}</ng-container>
<ng-container *ngIf="groupHeaderTemplateRef" [ngTemplateOutlet]="groupHeaderTemplateRef"
[ngTemplateOutletContext]="{ resource: verticalItem(leafIndex, resourceIndex) }"></ng-container>
</div>
</th>
</ng-container>
</tr>
</ng-container>
</ng-container>
</tbody>
</table>
</div>
</td>
<td>
<div
class="k-scheduler-content"
#content
role="group"
tabindex="0"
(scroll)="handleScroll()"
[attr.aria-owns]="matchOwned(items | async | sort)">
<ng-container *ngIf="showCurrentTime">
<div *ngFor="let resource of horizontalResources | resourceIterator; trackBy: itemIndex;"
class="k-current-time" #currentTimeMarker>
</div>
</ng-container>
<table class="k-scheduler-table" #contentTable role="presentation" [style.width.%]="contentWidthPercentage">
<tbody>
<tr *ngFor="let resourceItem of verticalResources | resourceIterator; let verticalIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let resource of horizontalResources | resourceIterator; let horizontalIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let daySlot of daySlots; let rangeIndex = index; trackBy: itemIndex;">
<td *ngFor="let slot of timeSlots; let index = index; trackBy: itemIndex;"
[ngClass]="timeSlotClass(slot, daySlot.start, verticalResources.length ? verticalIndex : horizontalIndex)"
timeSlot #timeSlot="timeSlot"
[date]="daySlot.start"
[invariantStart]="slot.start"
[invariantEnd]="slot.end"
[workDayStart]="workDayStartTime"
[workDayEnd]="workDayEndTime"
[workWeekStart]="workWeekStart"
[workWeekEnd]="workWeekEnd"
selectableSlot
[id]="{ resourceIndex: verticalResources.length ? verticalIndex : horizontalIndex, rangeIndex: rangeIndex, index: index }"
[class.k-selected]="isSlotSelected({
start: toPlainDateTime(daySlot.start, slot.start),
end: toPlainDateTime(daySlot.start, slot.end),
isAllDay: false,
resources: resourcesByIndex(verticalResources.length ? verticalIndex : horizontalIndex)
})"
class="k-scheduler-cell"
>
<ng-container *ngIf="timeSlotTemplateRef" [ngTemplateOutlet]="timeSlotTemplateRef"
[ngTemplateOutletContext]="{ date: timeSlot.startLocalTime, resources: resourcesByIndex(timeSlot.id.resourceIndex ) }">
</ng-container>
</td>
</ng-container>
</ng-container>
</tr>
</tbody>
</table>
<ng-container *ngFor="let item of items | async | sort; trackBy: itemIndex;">
<div *ngFor="let itemResource of item.resources; trackBy: itemIndex;"
[ngClass]="getEventClasses(item, itemResource.resources)"
[ngStyle]="getEventStyles(item, itemResource)"
role="button"
[kendoSchedulerFocusIndex]="itemResource.leafIdx"
[id]="item.elementId + '_' + itemResource.leafIdx"
dayTimeViewItem
[editable]="editable"
[item]="item"
[index]="item.index"
[rangeIndex]="item.rangeIndex"
[eventTemplate]="eventTemplateRef"
[resources]="itemResource.resources"
[resourceIndex]="itemResource.leafIdx">
</div>
</ng-container>
<kendo-hint-container #hintContainer>
<ng-template>
<div *ngFor="let hint of dragHints; trackBy: itemIndex;"
class="k-event-drag-hint"
dayTimeViewItem
[ngStyle]="hint.style"
[ngClass]="hint.class"
[dragHint]="true"
[eventTemplate]="eventTemplateRef"
[item]="hint.item"
[resources]="hint.resources">
</div>
<div *ngIf="resizeHints && resizeHints.length"
kendoResizeHint
[hint]="resizeHints[0]"
[ngClass]="resizeHints[0].class"
[format]="resizeHintFormat">
</div>
</ng-template>
</kendo-hint-container>
</div>
</td>
</tr>
</tbody>
</table>
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: TimeSlotDirective, selector: "[timeSlot]", inputs: ["invariantStart", "invariantEnd", "workDayStart", "workDayEnd", "workWeekStart", "workWeekEnd", "date"], exportAs: ["timeSlot"] }, { kind: "component", type: DayTimeViewItemComponent, selector: "[dayTimeViewItem]", inputs: ["vertical", "isAllDay", "name"] }, { kind: "directive", type: FocusableDirective, selector: "[kendoSchedulerFocusIndex]", inputs: ["kendoSchedulerFocusIndex", "containerType"] }, { kind: "component", type: HintContainerComponent, selector: "kendo-hint-container" }, { kind: "component", type: ResizeHintComponent, selector: "[kendoResizeHint]", inputs: ["hint", "format"] }, { kind: "pipe", type: ResourceIteratorPipe, name: "resourceIterator" }, { kind: "pipe", type: DatePipe, name: "kendoDate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: SortPipe, name: "sort" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TimelineMultiDayViewComponent, decorators: [{
type: Component,
args: [{
// eslint-disable-next-line @angular-eslint/component-selector
selector: 'timeline-multi-day-view',
providers: [
DayTimeSlotService
],
template: `
<table class="k-scheduler-layout" [ngClass]="classNames">
<tbody>
<tr class="k-scheduler-head">
<td>
<div class="k-scheduler-times" #timesHeader>
<table class="k-scheduler-table" aria-hidden="true">
<tbody>
<tr><th class="k-scheduler-cell k-heading-cell"></th></tr>
<tr><th class="k-slot-cell k-scheduler-cell k-heading-cell"></th></tr>
<tr *ngFor="let resource of horizontalResources; trackBy: itemIndex;">
<th class="k-scheduler-cell k-heading-cell"></th>
</tr>
</tbody>
</table>
</div>
</td>
<td>
<div class="k-scheduler-header" #header >
<div class="k-scheduler-header-wrap" #headerWrap>
<ng-container *ngIf="showCurrentTime">
<div *ngFor="let resource of horizontalResources | resourceIterator; trackBy: itemIndex;"
#currentTimeArrow class="k-current-time k-current-time-arrow-down">
</div>
</ng-container>
<table class="k-scheduler-table" #headerTable aria-hidden="true" [style.width.%]="contentWidthPercentage">
<tbody>
<tr *ngFor="let resource of horizontalResources; let resourceIndex = index; trackBy: itemIndex;">
<th *ngFor="let item of horizontalResources | resourceIterator : resourceIndex; trackBy: itemIndex;"
class="k-slot-cell k-scheduler-cell k-heading-cell" [attr.colspan]="horizontalColspan(resourceIndex)">
<ng-container *ngIf="!groupHeaderTemplateRef">{{ getField(item, resource.textField) }}</ng-container>
<ng-container *ngIf="groupHeaderTemplateRef" [ngTemplateOutlet]="groupHeaderTemplateRef"
[ngTemplateOutletContext]="{ resource: item }"></ng-container>
</th>
</tr>
<tr class="k-scheduler-date-group">
<ng-container *ngFor="let resource of horizontalResources | resourceIterator; trackBy: itemIndex;">
<ng-container *ngFor="let daySlot of daySlots; let index = index; trackBy: itemIndex;">
<th [attr.colspan]="timeSlots.length" class="k-scheduler-cell k-heading-cell k-slot-cell">
<span *ngIf="!dateHeaderTemplateRef" class="k-link k-nav-day" [attr.data-dayslot-index]="index">{{ daySlot.start | kendoDate: 'm'}}</span>
<ng-container *ngIf="dateHeaderTemplateRef" [ngTemplateOutlet]="dateHeaderTemplateRef" [ngTemplateOutletContext]="{ date: daySlot.start }"></ng-container>
</th>
</ng-container>
</ng-container>
</tr>
<tr>
<ng-container *ngFor="let resource of horizontalResources | resourceIterator; let resourceIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let daySlot of daySlots; let rangeIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let timeSlot of timeSlots; let index = index; trackBy: itemIndex;">
<th *ngIf="timeSlot.isMajor" [attr.colspan]="timeColspan(index)" class="k-scheduler-cell k-heading-cell">
<ng-container *ngIf="!majorTimeHeaderTemplateRef">{{ timeSlot.start | kendoDate: 't' }}</ng-container>
<ng-container *ngIf="majorTimeHeaderTemplateRef" [ngTemplateOutlet]="majorTimeHeaderTemplateRef" [ngTemplateOutletContext]="{ date: timeSlot.start }"></ng-container>
</th>
<th
*ngIf="!timeSlot.isMajor && minorTimeHeaderTemplateRef"
[ngStyle]="{'border-left-color': 'transparent', 'border-right-color': 'transparent'}"
class="k-scheduler-cell k-heading-cell"
>
<ng-container [ngTemplateOutlet]="minorTimeHeaderTemplateRef" [ngTemplateOutletContext]="{ date: timeSlot.start }">
</ng-container>
</th>
</ng-container>
</ng-container>
</ng-container>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
<tr class="k-scheduler-body">
<td>
<div class="k-scheduler-times" #times>
<table class="k-scheduler-table" #timesTable aria-hidden="true">
<tbody>
<tr *ngIf="!verticalResources.length">
<th rowspan="1" #titleCell class="k-scheduler-cell k-heading-cell">
{{ allEventsMessage }}
</th>
</tr>
<ng-container *ngIf="verticalResources.length">
<ng-container *ngFor="let resourceItem of verticalResources | resourceIterator; let leafIndex = index; trackBy: itemIndex;">
<tr #verticalResourceRows>
<ng-container *ngFor="let resource of verticalResources; let resourceIndex = index; trackBy: itemIndex;">
<th *ngIf="verticalItem(leafIndex, resourceIndex)" [attr.rowspan]="verticalRowspan(resourceIndex)" class="k-slot-cell k-scheduler-cell k-heading-cell">
<div>
<ng-container *ngIf="!groupHeaderTemplateRef">{{ getField(verticalItem(leafIndex, resourceIndex), resource.textField) }}</ng-container>
<ng-container *ngIf="groupHeaderTemplateRef" [ngTemplateOutlet]="groupHeaderTemplateRef"
[ngTemplateOutletContext]="{ resource: verticalItem(leafIndex, resourceIndex) }"></ng-container>
</div>
</th>
</ng-container>
</tr>
</ng-container>
</ng-container>
</tbody>
</table>
</div>
</td>
<td>
<div
class="k-scheduler-content"
#content
role="group"
tabindex="0"
(scroll)="handleScroll()"
[attr.aria-owns]="matchOwned(items | async | sort)">
<ng-container *ngIf="showCurrentTime">
<div *ngFor="let resource of horizontalResources | resourceIterator; trackBy: itemIndex;"
class="k-current-time" #currentTimeMarker>
</div>
</ng-container>
<table class="k-scheduler-table" #contentTable role="presentation" [style.width.%]="contentWidthPercentage">
<tbody>
<tr *ngFor="let resourceItem of verticalResources | resourceIterator; let verticalIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let resource of horizontalResources | resourceIterator; let horizontalIndex = index; trackBy: itemIndex;">
<ng-container *ngFor="let daySlot of daySlots; let rangeIndex = index; trackBy: itemIndex;">
<td *ngFor="let slot of timeSlots; let index = index; trackBy: itemIndex;"
[ngClass]="timeSlotClass(slot, daySlot.start, verticalResources.length ? verticalIndex : horizontalIndex)"
timeSlot #timeSlot="timeSlot"
[date]="daySlot.start"
[invariantStart]="slot.start"
[invariantEnd]="slot.end"
[workDayStart]="workDayStartTime"
[workDayEnd]="workDayEndTime"
[workWeekStart]="workWeekStart"
[workWeekEnd]="workWeekEnd"
selectableSlot
[id]="{ resourceIndex: verticalResources.length ? verticalIndex : horizontalIndex, rangeIndex: rangeIndex, index: index }"
[class.k-selected]="isSlotSelected({
start: toPlainDateTime(daySlot.start, slot.start),
end: toPlainDateTime(daySlot.start, slot.end),
isAllDay: false,
resources: resourcesByIndex(verticalResources.length ? verticalIndex : horizontalIndex)
})"
class="k-scheduler-cell"
>
<ng-container *ngIf="timeSlotTemplateRef" [ngTemplateOutlet]="timeSlotTemplateRef"
[ngTemplateOutletContext]="{ date: timeSlot.startLocalTime, resources: resourcesByIndex(timeSlot.id.resourceIndex ) }">
</ng-container>
</td>
</ng-container>
</ng-container>
</tr>
</tbody>
</table>
<ng-container *ngFor="let item of items | async | sort; trackBy: itemIndex;">
<div *ngFor="let itemResource of item.resources; trackBy: itemIndex;"
[ngClass]="getEventClasses(item, itemResource.resources)"
[ngStyle]="getEventStyles(item, itemResource)"
role="button"
[kendoSchedulerFocusIndex]="itemResource.leafIdx"
[id]="item.elementId + '_' + itemResource.leafIdx"
dayTimeViewItem
[editable]="editable"
[item]="item"
[index]="item.index"
[rangeIndex]="item.rangeIndex"
[eventTemplate]="eventTemplateRef"
[resources]="itemResource.resources"
[resourceIndex]="itemResource.leafIdx">
</div>
</ng-container>
<kendo-hint-container #hintContainer>
<ng-template>
<div *ngFor="let hint of dragHints; trackBy: itemIndex;"
class="k-event-drag-hint"
dayTimeViewItem
[ngStyle]="hint.style"
[ngClass]="hint.class"
[dragHint]="true"
[eventTemplate]="eventTemplateRef"
[item]="hint.item"
[resources]="hint.resources">
</div>
<div *ngIf="resizeHints && resizeHints.length"
kendoResizeHint
[hint]="resizeHints[0]"
[ngClass]="resizeHints[0].class"
[format]="resizeHintFormat">
</div>
</ng-template>
</kendo-hint-container>
</div>
</td>
</tr>
</tbody>
</table>
`,
standalone: true,
imports: [NgClass, NgFor, NgIf, NgTemplateOutlet, NgStyle, TimeSlotDirective, DayTimeViewItemComponent, FocusableDirective, HintContainerComponent, ResizeHintComponent, ResourceIteratorPipe, DatePipe, AsyncPipe, SortPipe]
}]
}], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i2.ViewContextService }, { type: i3.ViewStateService }, { type: i4.IntlService }, { type: i5.DayTimeSlotService }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i6.PDFService }, { type: i7.ScrollbarWidthService }]; }, propDecorators: { name: [{
type: Input
}], columnWidth: [{
type: Input
}], viewName: [{
type: Input
}], verticalResourceRows: [{
type: ViewChildren,
args: ['verticalResourceRows']
}], headerTable: [{
type: ViewChild,
args: ['headerTable']
}] } });