@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.
235 lines (232 loc) • 13.3 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, HostBinding, Input, TemplateRef } from '@angular/core';
import { IntlService } from '@progress/kendo-angular-intl';
import { LocalizationService } from '@progress/kendo-angular-l10n';
import { toLocalDate } from '@progress/kendo-date-math';
import { caretAltLeftIcon, caretAltRightIcon } from '@progress/kendo-svg-icons';
import { convertNgClassBindings } from '../utils';
import { AgendaTaskItemComponent } from './agenda-task-item.component';
import { FocusableDirective } from '../../navigation/focusable.directive';
import { IconWrapperComponent } from '@progress/kendo-angular-icons';
import { AgendaHeaderItemComponent } from './agenda-header-item.component';
import { NgFor, NgIf, NgTemplateOutlet, NgClass, NgStyle } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@progress/kendo-angular-intl";
import * as i2 from "@progress/kendo-angular-l10n";
/**
* @hidden
*/
export class AgendaListComponent {
intlService;
localization;
classes = true;
tasks;
eventTemplate;
slotClass;
eventClass;
eventStyles;
agendaTimeTemplate;
agendaDateTemplate;
editable;
caretAltLeftIcon = caretAltLeftIcon;
caretAltRightIcon = caretAltRightIcon;
constructor(intlService, localization) {
this.intlService = intlService;
this.localization = localization;
}
extractDataItem(item) {
return item.type === "group" ? item.dataItem.items[0] : item.dataItem;
}
extractDataItemInLocalTime(item) {
let currentItem;
if (item.type === "group") {
currentItem = { ...item.dataItem.items[0] };
currentItem.start = toLocalDate(item.dataItem.items[0].start);
currentItem.end = toLocalDate(item.dataItem.items[0].end);
}
else {
currentItem = { ...item.dataItem };
currentItem.start = toLocalDate(item.dataItem.start);
currentItem.end = toLocalDate(item.dataItem.end);
}
return currentItem;
}
formatTime(dataItem) {
if (dataItem.isAllDay) {
return this.localization.get('allDay');
}
let format = "{0:t}-{1:t}";
if (dataItem.head) {
format = "{0:t}";
}
else if (dataItem.tail) {
format = "{1:t}";
}
return this.intlService.format(format, toLocalDate(dataItem.start), toLocalDate(dataItem.end));
}
trackByFn(index, _item) {
return index;
}
cellClasses(item) {
const task = this.extractDataItem(item);
let result = [];
if (this.slotClass) {
result = result.concat(convertNgClassBindings(this.slotClass({
start: task.start,
end: task.end,
resources: task.resources,
event: task.event
})));
}
if (this.eventClass) {
result = result.concat(convertNgClassBindings(this.eventClass({
event: task.event,
resources: task.resources
})));
}
return result;
}
getEventStyles(item) {
if (this.eventStyles) {
const task = this.extractDataItem(item);
return this.eventStyles({
event: task.event,
resources: task.resources
});
}
}
get arrowIcons() {
return !this.localization.rtl ? ['caret-alt-left', 'caret-alt-right'] : ['caret-alt-right', 'caret-alt-left'];
}
get arrowSVGIcons() {
return !this.localization.rtl ? [this.caretAltLeftIcon, this.caretAltRightIcon] : [this.caretAltRightIcon, this.caretAltLeftIcon];
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AgendaListComponent, deps: [{ token: i1.IntlService }, { token: i2.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AgendaListComponent, isStandalone: true, selector: "[kendoSchedulerAgendaList]", inputs: { tasks: "tasks", eventTemplate: "eventTemplate", slotClass: "slotClass", eventClass: "eventClass", eventStyles: "eventStyles", agendaTimeTemplate: "agendaTimeTemplate", agendaDateTemplate: "agendaDateTemplate", editable: "editable" }, host: { properties: { "class.k-scheduler-content": "this.classes" } }, ngImport: i0, template: `
<table class="k-scheduler-table" role="none">
<tbody role="rowgroup">
<ng-container *ngFor="let group of tasks; let groupIndex = index;">
<tr *ngFor="let item of group.tasks; let index = index; trackBy: trackByFn" role="row">
<ng-container *ngFor="let resource of group.resources; let resourceIndex = index">
<td *ngIf="group.spans[resourceIndex] && index === 0" class="k-scheduler-groupcolumn k-first" [attr.rowspan]="group.spans[resourceIndex]" role="rowheader">
{{ resource }}
</td>
</ng-container>
<td *ngIf="item.type === 'group'"
[kendoSchedulerAgendaHeaderItem]="item"
[hasFirstClass]="!group.resources || group.resources.length === 0"
[agendaDateTemplate]="agendaDateTemplate">
</td>
<td class="k-scheduler-timecolumn k-scheduler-cell" role="gridcell">
<div *ngIf="!agendaTimeTemplate">
<kendo-icon-wrapper
*ngIf="extractDataItem(item).tail || extractDataItem(item).mid"
[name]="arrowIcons[0]"
[svgIcon]="arrowSVGIcons[0]"
>
</kendo-icon-wrapper>
{{ formatTime(extractDataItem(item)) }}
<kendo-icon-wrapper
*ngIf="extractDataItem(item).head || extractDataItem(item).mid"
[name]="arrowIcons[1]"
[svgIcon]="arrowSVGIcons[1]"
>
</kendo-icon-wrapper>
</div>
<ng-container *ngIf="agendaTimeTemplate" [ngTemplateOutlet]="agendaTimeTemplate"
[ngTemplateOutletContext]="extractDataItemInLocalTime(item)">
</ng-container>
</td>
<td [attr.data-group-index]="groupIndex" [attr.data-task-index]="index" role="gridcell"
[ngClass]="cellClasses(item)" [ngStyle]="getEventStyles(item)"
[kendoSchedulerFocusIndex]="groupIndex"
[id]="item.elementId"
[kendoSchedulerAgendaTaskItem]="extractDataItem(item)"
[editable]="editable"
[eventTemplate]="eventTemplate"
></td>
</tr>
</ng-container>
</tbody>
</table>
`, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: AgendaHeaderItemComponent, selector: "[kendoSchedulerAgendaHeaderItem]", inputs: ["kendoSchedulerAgendaHeaderItem", "agendaDateTemplate", "hasFirstClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: FocusableDirective, selector: "[kendoSchedulerFocusIndex]", inputs: ["kendoSchedulerFocusIndex", "containerType"] }, { kind: "component", type: AgendaTaskItemComponent, selector: "[kendoSchedulerAgendaTaskItem]", inputs: ["kendoSchedulerAgendaTaskItem", "color", "eventTemplate", "editable"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AgendaListComponent, decorators: [{
type: Component,
args: [{
// eslint-disable-next-line @angular-eslint/component-selector
selector: '[kendoSchedulerAgendaList]',
template: `
<table class="k-scheduler-table" role="none">
<tbody role="rowgroup">
<ng-container *ngFor="let group of tasks; let groupIndex = index;">
<tr *ngFor="let item of group.tasks; let index = index; trackBy: trackByFn" role="row">
<ng-container *ngFor="let resource of group.resources; let resourceIndex = index">
<td *ngIf="group.spans[resourceIndex] && index === 0" class="k-scheduler-groupcolumn k-first" [attr.rowspan]="group.spans[resourceIndex]" role="rowheader">
{{ resource }}
</td>
</ng-container>
<td *ngIf="item.type === 'group'"
[kendoSchedulerAgendaHeaderItem]="item"
[hasFirstClass]="!group.resources || group.resources.length === 0"
[agendaDateTemplate]="agendaDateTemplate">
</td>
<td class="k-scheduler-timecolumn k-scheduler-cell" role="gridcell">
<div *ngIf="!agendaTimeTemplate">
<kendo-icon-wrapper
*ngIf="extractDataItem(item).tail || extractDataItem(item).mid"
[name]="arrowIcons[0]"
[svgIcon]="arrowSVGIcons[0]"
>
</kendo-icon-wrapper>
{{ formatTime(extractDataItem(item)) }}
<kendo-icon-wrapper
*ngIf="extractDataItem(item).head || extractDataItem(item).mid"
[name]="arrowIcons[1]"
[svgIcon]="arrowSVGIcons[1]"
>
</kendo-icon-wrapper>
</div>
<ng-container *ngIf="agendaTimeTemplate" [ngTemplateOutlet]="agendaTimeTemplate"
[ngTemplateOutletContext]="extractDataItemInLocalTime(item)">
</ng-container>
</td>
<td [attr.data-group-index]="groupIndex" [attr.data-task-index]="index" role="gridcell"
[ngClass]="cellClasses(item)" [ngStyle]="getEventStyles(item)"
[kendoSchedulerFocusIndex]="groupIndex"
[id]="item.elementId"
[kendoSchedulerAgendaTaskItem]="extractDataItem(item)"
[editable]="editable"
[eventTemplate]="eventTemplate"
></td>
</tr>
</ng-container>
</tbody>
</table>
`,
standalone: true,
imports: [NgFor, NgIf, AgendaHeaderItemComponent, IconWrapperComponent, NgTemplateOutlet, NgClass, NgStyle, FocusableDirective, AgendaTaskItemComponent]
}]
}], ctorParameters: function () { return [{ type: i1.IntlService }, { type: i2.LocalizationService }]; }, propDecorators: { classes: [{
type: HostBinding,
args: ['class.k-scheduler-content']
}], tasks: [{
type: Input
}], eventTemplate: [{
type: Input
}], slotClass: [{
type: Input
}], eventClass: [{
type: Input
}], eventStyles: [{
type: Input
}], agendaTimeTemplate: [{
type: Input
}], agendaDateTemplate: [{
type: Input
}], editable: [{
type: Input
}] } });