UNPKG

@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
/**----------------------------------------------------------------------------------------- * 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 }] } });