@syncfusion/ej2-schedule 31.1.17 → 31.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ej2-schedule.min.js +2 -2
- package/dist/ej2-schedule.umd.min.js +2 -2
- package/dist/ej2-schedule.umd.min.js.map +1 -1
- package/dist/es6/ej2-schedule.es2015.js +7 -3
- package/dist/es6/ej2-schedule.es2015.js.map +1 -1
- package/dist/es6/ej2-schedule.es5.js +6 -2
- package/dist/es6/ej2-schedule.es5.js.map +1 -1
- package/dist/global/ej2-schedule.min.js +2 -2
- package/dist/global/ej2-schedule.min.js.map +1 -1
- package/dist/global/index.d.ts +1 -1
- package/package.json +18 -53
- package/src/schedule/actions/virtual-scroll.js +5 -1
- package/src/schedule/event-renderer/event-base.js +1 -1
- package/styles/bootstrap4-lite.css +8 -0
- package/styles/bootstrap4.css +8 -0
- package/styles/recurrence-editor/bootstrap4.css +8 -0
- package/styles/schedule/bootstrap4.css +8 -0
- package/dist/ts/common/calendar-util.d.ts +0 -92
- package/dist/ts/common/calendar-util.ts +0 -261
- package/dist/ts/common/index.d.ts +0 -4
- package/dist/ts/common/index.ts +0 -4
- package/dist/ts/components.d.ts +0 -5
- package/dist/ts/components.ts +0 -5
- package/dist/ts/index.d.ts +0 -6
- package/dist/ts/index.ts +0 -7
- package/dist/ts/recurrence-editor/date-generator.d.ts +0 -76
- package/dist/ts/recurrence-editor/date-generator.ts +0 -1699
- package/dist/ts/recurrence-editor/index.d.ts +0 -6
- package/dist/ts/recurrence-editor/index.ts +0 -6
- package/dist/ts/recurrence-editor/recurrence-editor-model.d.ts +0 -112
- package/dist/ts/recurrence-editor/recurrence-editor.d.ts +0 -245
- package/dist/ts/recurrence-editor/recurrence-editor.ts +0 -1257
- package/dist/ts/schedule/actions/action-base.d.ts +0 -44
- package/dist/ts/schedule/actions/action-base.ts +0 -493
- package/dist/ts/schedule/actions/crud.d.ts +0 -41
- package/dist/ts/schedule/actions/crud.ts +0 -784
- package/dist/ts/schedule/actions/data.d.ts +0 -63
- package/dist/ts/schedule/actions/data.ts +0 -128
- package/dist/ts/schedule/actions/drag.d.ts +0 -75
- package/dist/ts/schedule/actions/drag.ts +0 -1401
- package/dist/ts/schedule/actions/keyboard.d.ts +0 -100
- package/dist/ts/schedule/actions/keyboard.ts +0 -1435
- package/dist/ts/schedule/actions/resize.d.ts +0 -27
- package/dist/ts/schedule/actions/resize.ts +0 -602
- package/dist/ts/schedule/actions/scroll.d.ts +0 -69
- package/dist/ts/schedule/actions/scroll.ts +0 -105
- package/dist/ts/schedule/actions/touch.d.ts +0 -32
- package/dist/ts/schedule/actions/touch.ts +0 -314
- package/dist/ts/schedule/actions/virtual-scroll.d.ts +0 -55
- package/dist/ts/schedule/actions/virtual-scroll.ts +0 -596
- package/dist/ts/schedule/actions/work-cells.d.ts +0 -14
- package/dist/ts/schedule/actions/work-cells.ts +0 -151
- package/dist/ts/schedule/base/constant.d.ts +0 -102
- package/dist/ts/schedule/base/constant.ts +0 -103
- package/dist/ts/schedule/base/css-constant.d.ts +0 -475
- package/dist/ts/schedule/base/css-constant.ts +0 -475
- package/dist/ts/schedule/base/interface.d.ts +0 -673
- package/dist/ts/schedule/base/interface.ts +0 -738
- package/dist/ts/schedule/base/resource.d.ts +0 -59
- package/dist/ts/schedule/base/resource.ts +0 -1091
- package/dist/ts/schedule/base/schedule-model.d.ts +0 -930
- package/dist/ts/schedule/base/schedule.d.ts +0 -1967
- package/dist/ts/schedule/base/schedule.ts +0 -4221
- package/dist/ts/schedule/base/type.d.ts +0 -134
- package/dist/ts/schedule/base/type.ts +0 -142
- package/dist/ts/schedule/base/util.d.ts +0 -266
- package/dist/ts/schedule/base/util.ts +0 -492
- package/dist/ts/schedule/event-renderer/agenda-base.d.ts +0 -15
- package/dist/ts/schedule/event-renderer/agenda-base.ts +0 -423
- package/dist/ts/schedule/event-renderer/event-base.d.ts +0 -101
- package/dist/ts/schedule/event-renderer/event-base.ts +0 -1501
- package/dist/ts/schedule/event-renderer/inline-edit.d.ts +0 -23
- package/dist/ts/schedule/event-renderer/inline-edit.ts +0 -287
- package/dist/ts/schedule/event-renderer/month.d.ts +0 -60
- package/dist/ts/schedule/event-renderer/month.ts +0 -760
- package/dist/ts/schedule/event-renderer/timeline-view.d.ts +0 -51
- package/dist/ts/schedule/event-renderer/timeline-view.ts +0 -606
- package/dist/ts/schedule/event-renderer/vertical-view.d.ts +0 -57
- package/dist/ts/schedule/event-renderer/vertical-view.ts +0 -898
- package/dist/ts/schedule/event-renderer/year.d.ts +0 -27
- package/dist/ts/schedule/event-renderer/year.ts +0 -623
- package/dist/ts/schedule/exports/calendar-export.d.ts +0 -16
- package/dist/ts/schedule/exports/calendar-export.ts +0 -160
- package/dist/ts/schedule/exports/calendar-import.d.ts +0 -18
- package/dist/ts/schedule/exports/calendar-import.ts +0 -277
- package/dist/ts/schedule/exports/excel-export.d.ts +0 -14
- package/dist/ts/schedule/exports/excel-export.ts +0 -89
- package/dist/ts/schedule/exports/index.d.ts +0 -7
- package/dist/ts/schedule/exports/index.ts +0 -7
- package/dist/ts/schedule/exports/print.d.ts +0 -20
- package/dist/ts/schedule/exports/print.ts +0 -233
- package/dist/ts/schedule/index.d.ts +0 -26
- package/dist/ts/schedule/index.ts +0 -26
- package/dist/ts/schedule/models/event-settings-model.d.ts +0 -165
- package/dist/ts/schedule/models/event-settings.d.ts +0 -149
- package/dist/ts/schedule/models/event-settings.ts +0 -187
- package/dist/ts/schedule/models/field-options-model.d.ts +0 -37
- package/dist/ts/schedule/models/field-options.d.ts +0 -31
- package/dist/ts/schedule/models/field-options.ts +0 -41
- package/dist/ts/schedule/models/fields-model.d.ts +0 -129
- package/dist/ts/schedule/models/fields.d.ts +0 -117
- package/dist/ts/schedule/models/fields.ts +0 -149
- package/dist/ts/schedule/models/group-model.d.ts +0 -69
- package/dist/ts/schedule/models/group.d.ts +0 -60
- package/dist/ts/schedule/models/group.ts +0 -75
- package/dist/ts/schedule/models/header-rows-model.d.ts +0 -33
- package/dist/ts/schedule/models/header-rows.d.ts +0 -30
- package/dist/ts/schedule/models/header-rows.ts +0 -35
- package/dist/ts/schedule/models/models.d.ts +0 -14
- package/dist/ts/schedule/models/models.ts +0 -15
- package/dist/ts/schedule/models/quick-info-templates-model.d.ts +0 -52
- package/dist/ts/schedule/models/quick-info-templates.d.ts +0 -47
- package/dist/ts/schedule/models/quick-info-templates.ts +0 -56
- package/dist/ts/schedule/models/resources-model.d.ts +0 -122
- package/dist/ts/schedule/models/resources.d.ts +0 -106
- package/dist/ts/schedule/models/resources.ts +0 -138
- package/dist/ts/schedule/models/time-scale-model.d.ts +0 -57
- package/dist/ts/schedule/models/time-scale.d.ts +0 -50
- package/dist/ts/schedule/models/time-scale.ts +0 -61
- package/dist/ts/schedule/models/toolbar-model.d.ts +0 -196
- package/dist/ts/schedule/models/toolbar.d.ts +0 -176
- package/dist/ts/schedule/models/toolbar.ts +0 -196
- package/dist/ts/schedule/models/views-model.d.ts +0 -370
- package/dist/ts/schedule/models/views.d.ts +0 -335
- package/dist/ts/schedule/models/views.ts +0 -408
- package/dist/ts/schedule/models/work-hours-model.d.ts +0 -29
- package/dist/ts/schedule/models/work-hours.d.ts +0 -24
- package/dist/ts/schedule/models/work-hours.ts +0 -31
- package/dist/ts/schedule/popups/event-tooltip.d.ts +0 -16
- package/dist/ts/schedule/popups/event-tooltip.ts +0 -203
- package/dist/ts/schedule/popups/event-window.d.ts +0 -118
- package/dist/ts/schedule/popups/event-window.ts +0 -2055
- package/dist/ts/schedule/popups/form-validator.d.ts +0 -16
- package/dist/ts/schedule/popups/form-validator.ts +0 -110
- package/dist/ts/schedule/popups/quick-popups.d.ts +0 -78
- package/dist/ts/schedule/popups/quick-popups.ts +0 -1470
- package/dist/ts/schedule/renderer/agenda.d.ts +0 -45
- package/dist/ts/schedule/renderer/agenda.ts +0 -497
- package/dist/ts/schedule/renderer/day.d.ts +0 -20
- package/dist/ts/schedule/renderer/day.ts +0 -28
- package/dist/ts/schedule/renderer/header-renderer.d.ts +0 -48
- package/dist/ts/schedule/renderer/header-renderer.ts +0 -736
- package/dist/ts/schedule/renderer/month-agenda.d.ts +0 -29
- package/dist/ts/schedule/renderer/month-agenda.ts +0 -184
- package/dist/ts/schedule/renderer/month.d.ts +0 -61
- package/dist/ts/schedule/renderer/month.ts +0 -766
- package/dist/ts/schedule/renderer/renderer.d.ts +0 -13
- package/dist/ts/schedule/renderer/renderer.ts +0 -165
- package/dist/ts/schedule/renderer/timeline-header-row.d.ts +0 -15
- package/dist/ts/schedule/renderer/timeline-header-row.ts +0 -132
- package/dist/ts/schedule/renderer/timeline-month.d.ts +0 -29
- package/dist/ts/schedule/renderer/timeline-month.ts +0 -184
- package/dist/ts/schedule/renderer/timeline-view.d.ts +0 -31
- package/dist/ts/schedule/renderer/timeline-view.ts +0 -308
- package/dist/ts/schedule/renderer/timeline-year.d.ts +0 -22
- package/dist/ts/schedule/renderer/timeline-year.ts +0 -450
- package/dist/ts/schedule/renderer/vertical-view.d.ts +0 -63
- package/dist/ts/schedule/renderer/vertical-view.ts +0 -911
- package/dist/ts/schedule/renderer/view-base.d.ts +0 -83
- package/dist/ts/schedule/renderer/view-base.ts +0 -709
- package/dist/ts/schedule/renderer/week.d.ts +0 -22
- package/dist/ts/schedule/renderer/week.ts +0 -35
- package/dist/ts/schedule/renderer/work-week.d.ts +0 -22
- package/dist/ts/schedule/renderer/work-week.ts +0 -36
- package/dist/ts/schedule/renderer/year.d.ts +0 -46
- package/dist/ts/schedule/renderer/year.ts +0 -470
- package/dist/ts/schedule/timezone/timezone.d.ts +0 -16
- package/dist/ts/schedule/timezone/timezone.ts +0 -313
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Schedule } from '../base/schedule';
|
|
2
|
-
import { MonthEvent } from './month';
|
|
3
|
-
/**
|
|
4
|
-
* Timeline view events render
|
|
5
|
-
*/
|
|
6
|
-
export declare class TimelineEvent extends MonthEvent {
|
|
7
|
-
private startHour;
|
|
8
|
-
private endHour;
|
|
9
|
-
slotCount: number;
|
|
10
|
-
private interval;
|
|
11
|
-
private day;
|
|
12
|
-
eventContainers: HTMLElement[];
|
|
13
|
-
private dayLength;
|
|
14
|
-
slotsPerDay: number;
|
|
15
|
-
private content;
|
|
16
|
-
private rowIndex;
|
|
17
|
-
inlineValue: boolean;
|
|
18
|
-
private cellTops;
|
|
19
|
-
constructor(parent: Schedule, type: string);
|
|
20
|
-
getSlotDates(): void;
|
|
21
|
-
getOverlapEvents(date: Date, appointments: Record<string, any>[]): Record<string, any>[];
|
|
22
|
-
getSortComparerIndex(startDate: Date, endDate: Date): number;
|
|
23
|
-
getOverlapSortComparerEvents(startDate: Date, endDate: Date, appointmentsCollection: Record<string, any>[]): Record<string, any>[];
|
|
24
|
-
renderResourceEvents(): void;
|
|
25
|
-
renderEvents(event: Record<string, any>, resIndex: number, appointmentsList?: Record<string, any>[]): void;
|
|
26
|
-
private adjustToNearestTimeSlot;
|
|
27
|
-
private renderTimelineMoreIndicator;
|
|
28
|
-
updateCellHeight(cell: HTMLElement, height: number): void;
|
|
29
|
-
private getFirstChild;
|
|
30
|
-
updateBlockElements(): void;
|
|
31
|
-
getStartTime(event: Record<string, any>, eventData: Record<string, any>): Date;
|
|
32
|
-
private getNextDay;
|
|
33
|
-
getEndTime(event: Record<string, any>, eventData: Record<string, any>): Date;
|
|
34
|
-
private getPreviousDay;
|
|
35
|
-
getEventWidth(startDate: Date, endDate: Date, isAllDay: boolean, count: number): number;
|
|
36
|
-
private getSameDayEventsWidth;
|
|
37
|
-
private getSpannedEventsWidth;
|
|
38
|
-
private getEndTimeOfLastSlot;
|
|
39
|
-
private isSameDay;
|
|
40
|
-
private getAppointmentLeft;
|
|
41
|
-
getPosition(startTime: Date, endTime: Date, isAllDay: boolean, day: number): number;
|
|
42
|
-
private getFilterEvents;
|
|
43
|
-
private getIntervalInMinutes;
|
|
44
|
-
private isAlreadyAvail;
|
|
45
|
-
getRowTop(resIndex: number): number;
|
|
46
|
-
getCellTd(): HTMLElement;
|
|
47
|
-
renderBlockIndicator(cellTd: HTMLElement, position: number, resIndex: number): void;
|
|
48
|
-
setMaxEventHeight(event: HTMLElement, cell: HTMLElement): void;
|
|
49
|
-
private isDayProcess;
|
|
50
|
-
destroy(): void;
|
|
51
|
-
}
|
|
@@ -1,606 +0,0 @@
|
|
|
1
|
-
/* eslint-disable max-len */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
import { isNullOrUndefined, setStyleAttribute, extend, EventHandler, createElement } from '@syncfusion/ej2-base';
|
|
4
|
-
import { Schedule } from '../base/schedule';
|
|
5
|
-
import * as cls from '../base/css-constant';
|
|
6
|
-
import * as util from '../base/util';
|
|
7
|
-
import { MonthEvent } from './month';
|
|
8
|
-
import { TdData } from '../base/interface';
|
|
9
|
-
|
|
10
|
-
const EVENT_GAP: number = 2;
|
|
11
|
-
const BLOCK_INDICATOR_WIDTH: number = 22;
|
|
12
|
-
const BLOCK_INDICATOR_HEIGHT: number = 18;
|
|
13
|
-
/**
|
|
14
|
-
* Timeline view events render
|
|
15
|
-
*/
|
|
16
|
-
export class TimelineEvent extends MonthEvent {
|
|
17
|
-
private startHour: Date = this.parent.activeView.getStartHour();
|
|
18
|
-
private endHour: Date = this.parent.activeView.getEndHour();
|
|
19
|
-
public slotCount: number = this.parent.activeViewOptions.timeScale.slotCount;
|
|
20
|
-
private interval: number = this.parent.activeViewOptions.timeScale.interval;
|
|
21
|
-
private day: number = 0;
|
|
22
|
-
public eventContainers: HTMLElement[];
|
|
23
|
-
private dayLength: number;
|
|
24
|
-
public slotsPerDay: number;
|
|
25
|
-
private content: HTMLElement;
|
|
26
|
-
private rowIndex: number = 0;
|
|
27
|
-
public inlineValue: boolean;
|
|
28
|
-
private cellTops: number[] = [];
|
|
29
|
-
|
|
30
|
-
constructor(parent: Schedule, type: string) {
|
|
31
|
-
super(parent);
|
|
32
|
-
this.renderType = type;
|
|
33
|
-
this.eventContainers = [].slice.call(this.element.querySelectorAll('.' + cls.APPOINTMENT_CONTAINER_CLASS));
|
|
34
|
-
const tr: HTMLElement[] = [].slice.call(this.element.querySelectorAll('.' + cls.CONTENT_TABLE_CLASS + ' tbody tr'));
|
|
35
|
-
this.dayLength = tr.length === 0 ? 0 : tr[0].children.length;
|
|
36
|
-
this.content = this.parent.element.querySelector('.' + cls.SCHEDULE_TABLE_CLASS + '.' + cls.CONTENT_TABLE_CLASS);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
public getSlotDates(): void {
|
|
40
|
-
this.slots = [];
|
|
41
|
-
this.slots.push(this.parent.activeView.renderDates.map((date: Date) => { return +date; }) as any);
|
|
42
|
-
if (this.parent.activeViewOptions.headerRows.length > 0 &&
|
|
43
|
-
this.parent.activeViewOptions.headerRows.slice(-1)[0].option !== 'Hour') {
|
|
44
|
-
this.renderType = 'day';
|
|
45
|
-
const workCell: HTMLTableCellElement = this.content.querySelector('.' + cls.WORK_CELLS_CLASS) as HTMLTableCellElement;
|
|
46
|
-
this.cellWidth = this.parent.getElementWidth(workCell) / +(workCell.getAttribute('colspan') || 1);
|
|
47
|
-
this.slotsPerDay = 1;
|
|
48
|
-
} else {
|
|
49
|
-
this.slotsPerDay = (this.dayLength / this.dateRender.length);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public getOverlapEvents(date: Date, appointments: Record<string, any>[]): Record<string, any>[] {
|
|
54
|
-
const appointmentsList: Record<string, any>[] = [];
|
|
55
|
-
if (this.renderType === 'day') {
|
|
56
|
-
for (const app of appointments) {
|
|
57
|
-
if ((util.resetTime(<Date>app[this.fields.startTime]).getTime() <= util.resetTime(new Date(date.getTime())).getTime()) &&
|
|
58
|
-
(util.resetTime(<Date>app[this.fields.endTime]).getTime() >= util.resetTime(new Date(date.getTime())).getTime())) {
|
|
59
|
-
appointmentsList.push(app);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
} else {
|
|
63
|
-
for (const app of appointments) {
|
|
64
|
-
const eventData: Record<string, any> = app.data as Record<string, any>;
|
|
65
|
-
if (((<Date>eventData.trimStartTime).getTime() <= date.getTime() &&
|
|
66
|
-
(<Date>eventData.trimEndTime).getTime() > date.getTime()) ||
|
|
67
|
-
((<Date>eventData.trimStartTime).getTime() === date.getTime() &&
|
|
68
|
-
(<Date>eventData.trimEndTime).getTime() === date.getTime())) {
|
|
69
|
-
appointmentsList.push(app);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return appointmentsList;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
public getSortComparerIndex(startDate: Date, endDate: Date): number {
|
|
77
|
-
let appIndex: number = -1;
|
|
78
|
-
const appointments: Record<string, any>[] = <Record<string, any>[]>this.renderedEvents;
|
|
79
|
-
if (appointments.length > 0) {
|
|
80
|
-
const appointmentsList: Record<string, any>[] = this.getOverlapSortComparerEvents(startDate, endDate, appointments);
|
|
81
|
-
const appLevel: number[] = appointmentsList.map((obj: Record<string, any>) => obj.Index) as number[];
|
|
82
|
-
appIndex = (appLevel.length > 0) ? this.getSmallestMissingNumber(appLevel) : 0;
|
|
83
|
-
}
|
|
84
|
-
return (appIndex === -1) ? 0 : appIndex;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
public getOverlapSortComparerEvents(startDate: Date, endDate: Date, appointmentsCollection: Record<string, any>[]): Record<string, any>[] {
|
|
88
|
-
const appointments: Record<string, any>[] = [];
|
|
89
|
-
for (const app of appointmentsCollection) {
|
|
90
|
-
if (this.renderType === 'day') {
|
|
91
|
-
const start: number = util.resetTime(startDate).getTime();
|
|
92
|
-
const end: number = util.resetTime(endDate).getTime();
|
|
93
|
-
const appStart: number = util.resetTime(<Date>app[this.fields.startTime]).getTime();
|
|
94
|
-
const appEnd: number = util.resetTime(<Date>app[this.fields.endTime]).getTime();
|
|
95
|
-
const isEndOverlap : () => boolean = () => {
|
|
96
|
-
let endTime: number = (end - (util.getDateInMs(endDate) <= 0 ? util.MS_PER_DAY : 0));
|
|
97
|
-
endTime = start > endTime ? start : endTime;
|
|
98
|
-
return appEnd >= endTime && appStart <= endTime;
|
|
99
|
-
};
|
|
100
|
-
if (appStart <= start && appEnd >= start || isEndOverlap() || appStart > start && appEnd < end) {
|
|
101
|
-
appointments.push(app);
|
|
102
|
-
}
|
|
103
|
-
} else {
|
|
104
|
-
const eventData: Record<string, any> = app.data as Record<string, any>;
|
|
105
|
-
if (((eventData.trimStartTime.getTime() <= startDate.getTime()) && (startDate.getTime() < eventData.trimEndTime.getTime())) ||
|
|
106
|
-
((startDate.getTime() <= eventData.trimStartTime.getTime()) && (eventData.trimStartTime.getTime() < endDate.getTime()))) {
|
|
107
|
-
appointments.push(app);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return appointments;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
public renderResourceEvents(): void {
|
|
115
|
-
this.removeHeightProperty(cls.RESOURCE_COLUMN_TABLE_CLASS);
|
|
116
|
-
const selector: string = '.' + cls.RESOURCE_COLUMN_TABLE_CLASS + ' tbody tr';
|
|
117
|
-
this.addCellHeight(selector, this.eventHeight, EVENT_GAP, this.moreIndicatorHeight, 0, false);
|
|
118
|
-
const resources: TdData[] = this.parent.uiStateValues.isGroupAdaptive ?
|
|
119
|
-
[this.parent.resourceBase.lastResourceLevel[this.parent.uiStateValues.groupIndex]] :
|
|
120
|
-
this.parent.resourceBase.renderedResources;
|
|
121
|
-
if (this.parent.crudModule && this.parent.crudModule.crudObj.isCrudAction) {
|
|
122
|
-
for (let i: number = 0, len: number = this.parent.crudModule.crudObj.sourceEvent.length; i < len; i++) {
|
|
123
|
-
const source: TdData = this.parent.crudModule.crudObj.sourceEvent[parseInt(i.toString(), 10)];
|
|
124
|
-
this.rowIndex = source.groupIndex;
|
|
125
|
-
if (!this.parent.uiStateValues.isGroupAdaptive ||
|
|
126
|
-
(this.parent.uiStateValues.groupIndex === source.groupIndex && this.parent.uiStateValues.isGroupAdaptive)) {
|
|
127
|
-
this.renderEventsHandler(this.parent.activeView.renderDates, this.parent.activeViewOptions.workDays, source);
|
|
128
|
-
}
|
|
129
|
-
if (this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)] && this.parent.crudModule.crudObj.sourceEvent[parseInt(i.toString(), 10)].groupIndex !==
|
|
130
|
-
this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)].groupIndex) {
|
|
131
|
-
const target: TdData = this.parent.crudModule.crudObj.targetEvent[parseInt(i.toString(), 10)];
|
|
132
|
-
this.rowIndex = target.groupIndex;
|
|
133
|
-
this.renderEventsHandler(this.parent.activeView.renderDates, this.parent.activeViewOptions.workDays, target);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
this.parent.crudModule.crudObj.isCrudAction = false;
|
|
137
|
-
} else {
|
|
138
|
-
for (let i: number = 0; i < resources.length; i++) {
|
|
139
|
-
this.rowIndex = i;
|
|
140
|
-
this.renderEventsHandler(this.parent.activeView.renderDates, this.parent.activeViewOptions.workDays, resources[parseInt(i.toString(), 10)]);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
public renderEvents(event: Record<string, any>, resIndex: number, appointmentsList?: Record<string, any>[]): void {
|
|
146
|
-
let startTime: Date = event[this.fields.startTime] as Date;
|
|
147
|
-
let endTime: Date = event[this.fields.endTime] as Date;
|
|
148
|
-
if ((startTime.getTime() < this.parent.minDate.getTime()) || (endTime.getTime() > this.parent.maxDate.getTime())) {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
const eventData: Record<string, any> = event.data as Record<string, any>;
|
|
152
|
-
startTime = this.getStartTime(event, eventData);
|
|
153
|
-
endTime = this.getEndTime(event, eventData);
|
|
154
|
-
const startEndHours: Record<string, Date> = util.getStartEndHours(event[this.fields.startTime], this.startHour, this.endHour);
|
|
155
|
-
const eventDates: Record<string, Date> = this.updateEventMinimumDuration(startEndHours, startTime, endTime);
|
|
156
|
-
startTime = eventDates.startDate;
|
|
157
|
-
endTime = eventDates.endDate;
|
|
158
|
-
this.day = this.parent.getIndexOfDate(this.dateRender, util.resetTime(new Date(startTime.getTime())));
|
|
159
|
-
if (this.day < 0) {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
const cellTd: HTMLElement = this.getCellTd();
|
|
163
|
-
const eventsPerRow: number = this.parent.rowAutoHeight ? 1 : this.parent.activeViewOptions.maxEventsPerRow;
|
|
164
|
-
const overlapCount: number = (isNullOrUndefined(this.parent.eventSettings.sortComparer)) ? this.getIndex(startTime) : this.getSortComparerIndex(startTime, endTime);
|
|
165
|
-
event.Index = overlapCount;
|
|
166
|
-
const appHeight: number = this.eventHeight;
|
|
167
|
-
const diffInDays: number = eventData.count as number;
|
|
168
|
-
const eventObj: Record<string, any> = extend({}, event, null, true) as Record<string, any>;
|
|
169
|
-
eventObj[this.fields.startTime] = eventData[this.fields.startTime];
|
|
170
|
-
eventObj[this.fields.endTime] = eventData[this.fields.endTime];
|
|
171
|
-
const currentDate: Date = util.resetTime(new Date(this.dateRender[this.day].getTime()));
|
|
172
|
-
const schedule: { [key: string]: Date } = util.getStartEndHours(currentDate, this.startHour, this.endHour);
|
|
173
|
-
let isValidEvent: boolean = true;
|
|
174
|
-
if (this.isDayProcess() || eventObj[this.fields.isAllDay]) {
|
|
175
|
-
isValidEvent = true;
|
|
176
|
-
} else {
|
|
177
|
-
isValidEvent = this.isValidEvent(eventObj, startTime, endTime, schedule);
|
|
178
|
-
}
|
|
179
|
-
if (startTime <= endTime && isValidEvent) {
|
|
180
|
-
let appWidth: number = this.getEventWidth(startTime, endTime, event[this.fields.isAllDay] as boolean, diffInDays);
|
|
181
|
-
appWidth = this.renderType === 'day' ? appWidth - 2 : appWidth;
|
|
182
|
-
let appLeft: number = 0;
|
|
183
|
-
let appRight: number = 0;
|
|
184
|
-
const position: number = this.getPosition(startTime, endTime, event[this.fields.isAllDay] as boolean, this.day);
|
|
185
|
-
appWidth = (appWidth <= 0) ? this.cellWidth : appWidth; // appWidth 0 when start and end time as same
|
|
186
|
-
this.renderedEvents.push(extend({}, event, null, true) as Record<string, any>);
|
|
187
|
-
if (isNullOrUndefined(this.cellTops[parseInt(resIndex.toString(), 10)])) {
|
|
188
|
-
this.cellTops[parseInt(resIndex.toString(), 10)] = this.getRowTop(resIndex);
|
|
189
|
-
}
|
|
190
|
-
const top: number = this.cellTops[parseInt(resIndex.toString(), 10)];
|
|
191
|
-
const appTop: number = (top + (this.maxHeight ? 0 : EVENT_GAP)) + (overlapCount * (appHeight + EVENT_GAP));
|
|
192
|
-
appLeft = (this.parent.enableRtl) ? 0 : position;
|
|
193
|
-
appRight = (this.parent.enableRtl) ? position : 0;
|
|
194
|
-
const height: number = ((overlapCount + 1) * (appHeight + EVENT_GAP)) + this.moreIndicatorHeight;
|
|
195
|
-
const renderApp: boolean = this.parent.activeViewOptions.maxEventsPerRow && !this.parent.rowAutoHeight && !this.parent.eventSettings.enableIndicator
|
|
196
|
-
? overlapCount < eventsPerRow : this.maxOrIndicator ? overlapCount < 1 ? true : false : this.cellHeight > height;
|
|
197
|
-
if (this.parent.rowAutoHeight || renderApp) {
|
|
198
|
-
let appointmentElement: HTMLElement;
|
|
199
|
-
if (isNullOrUndefined(this.inlineValue)) {
|
|
200
|
-
appointmentElement = this.createAppointmentElement(event, resIndex);
|
|
201
|
-
} else {
|
|
202
|
-
appointmentElement = this.parent.inlineModule.createInlineAppointmentElement();
|
|
203
|
-
}
|
|
204
|
-
this.applyResourceColor(appointmentElement, event, 'backgroundColor', this.groupOrder);
|
|
205
|
-
setStyleAttribute(appointmentElement, {
|
|
206
|
-
'width': appWidth + 'px', 'left': appLeft + 'px', 'right': appRight + 'px', 'top': appTop + 'px'
|
|
207
|
-
});
|
|
208
|
-
this.wireAppointmentEvents(appointmentElement, event);
|
|
209
|
-
if (this.parent.rowAutoHeight) {
|
|
210
|
-
const conWrap: HTMLElement = this.parent.element.querySelector('.' + cls.CONTENT_WRAP_CLASS) as HTMLElement;
|
|
211
|
-
const conWidth: number = this.parent.getElementWidth(conWrap);
|
|
212
|
-
const isWithoutScroll: boolean = conWrap.offsetHeight === conWrap.clientHeight &&
|
|
213
|
-
conWrap.offsetWidth === conWrap.clientWidth;
|
|
214
|
-
this.renderEventElement(event, appointmentElement, cellTd);
|
|
215
|
-
const firstChild: HTMLElement = this.getFirstChild(resIndex);
|
|
216
|
-
this.updateCellHeight(firstChild, height);
|
|
217
|
-
if (isWithoutScroll &&
|
|
218
|
-
(conWrap.offsetWidth > conWrap.clientWidth || conWidth !== this.parent.getElementWidth(conWrap))) {
|
|
219
|
-
this.adjustAppointments(conWidth);
|
|
220
|
-
}
|
|
221
|
-
} else {
|
|
222
|
-
this.renderEventElement(event, appointmentElement, cellTd);
|
|
223
|
-
}
|
|
224
|
-
} else {
|
|
225
|
-
for (let i: number = 0; i < diffInDays; i++) {
|
|
226
|
-
const moreIndicator: HTMLElement = cellTd.querySelector('.' + cls.MORE_INDICATOR_CLASS) as HTMLElement;
|
|
227
|
-
let appPos: number = (this.parent.enableRtl) ? appRight : appLeft;
|
|
228
|
-
appPos = (Math.floor(appPos / this.cellWidth) * this.cellWidth);
|
|
229
|
-
const interval: number = this.interval / this.slotCount;
|
|
230
|
-
let startDate: Date = (this.parent.activeViewOptions.option === 'TimelineMonth' || this.renderType === 'day' || i !== 0) ?
|
|
231
|
-
new Date(this.dateRender[this.day + i].getTime()) : new Date(startTime);
|
|
232
|
-
let endDate: Date = util.addDays(this.dateRender[this.day + i], 1);
|
|
233
|
-
if (this.parent.activeViewOptions.option === 'TimelineMonth' || this.renderType === 'day') {
|
|
234
|
-
const position: number = this.getPosition(startDate, endDate, event[this.fields.isAllDay], (this.day + i));
|
|
235
|
-
this.renderTimelineMoreIndicator(startTime, startDate, endDate, appHeight, interval, resIndex, appointmentsList, top, appLeft, appRight, cellTd, moreIndicator, appPos, position);
|
|
236
|
-
} else {
|
|
237
|
-
const slotCount: number = (util.getUniversalTime(endTime) - util.getUniversalTime(startTime)) / util.MS_PER_MINUTE *
|
|
238
|
-
this.slotCount / this.interval;
|
|
239
|
-
for (let k: number = 0; k < slotCount; k++) {
|
|
240
|
-
startDate = (k === 0) ? new Date(startDate.getTime()) : new Date(startDate.getTime() + (60000 * interval));
|
|
241
|
-
if (slotCount < 1) {
|
|
242
|
-
startDate = this.adjustToNearestTimeSlot(startDate, interval);
|
|
243
|
-
}
|
|
244
|
-
endDate = new Date(startDate.getTime() + (60000 * interval));
|
|
245
|
-
if (slotCount >= 1 && endDate.getTime() > endTime.getTime()) {
|
|
246
|
-
break;
|
|
247
|
-
}
|
|
248
|
-
const position: number = this.getPosition(startDate, endDate, false, (this.day + i));
|
|
249
|
-
if (appPos > position) {
|
|
250
|
-
break;
|
|
251
|
-
}
|
|
252
|
-
appPos = position;
|
|
253
|
-
this.renderTimelineMoreIndicator(startTime, startDate, endDate, appHeight, interval, resIndex, appointmentsList, top, appLeft, appRight, cellTd, moreIndicator, appPos, position);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
this.parent.renderTemplates();
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
private adjustToNearestTimeSlot(inputTime: Date, interval: number): Date {
|
|
263
|
-
// Parse the input time
|
|
264
|
-
const parsedTime: Date = new Date(inputTime);
|
|
265
|
-
|
|
266
|
-
// Get the minutes of the input time in milliseconds
|
|
267
|
-
const minutesInMilliseconds: number = parsedTime.getHours() * 60 * 60 * 1000 + parsedTime.getMinutes() * 60 * 1000;
|
|
268
|
-
|
|
269
|
-
// Calculate the adjusted time in milliseconds (nearest time slot)
|
|
270
|
-
const adjustedMinutesInMilliseconds: number = Math.floor(minutesInMilliseconds / (interval * 60 * 1000)) * (interval * 60 * 1000);
|
|
271
|
-
|
|
272
|
-
// Create a new Date object with the adjusted time
|
|
273
|
-
const adjustedTime: Date = new Date(parsedTime.getTime());
|
|
274
|
-
adjustedTime.setHours(adjustedMinutesInMilliseconds / (60 * 60 * 1000) % 24);
|
|
275
|
-
adjustedTime.setMinutes((adjustedMinutesInMilliseconds % (60 * 60 * 1000)) / (60 * 1000));
|
|
276
|
-
|
|
277
|
-
// Return the adjusted time in string format
|
|
278
|
-
return adjustedTime;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
private renderTimelineMoreIndicator(startTime: Date, startDate: Date, endDate: Date, appHeight: number, interval: number, resIndex: number, appointmentsList: Record<string, any>[], top: number, appLeft: number, appRight: number, cellTd: HTMLElement, moreIndicator: HTMLElement, appPos: number, position: number): void {
|
|
282
|
-
appLeft = (this.parent.enableRtl) ? appRight = position : position;
|
|
283
|
-
appPos = (this.parent.enableRtl) ? appRight : appLeft;
|
|
284
|
-
appPos = (Math.floor(appPos / this.cellWidth) * this.cellWidth);
|
|
285
|
-
if ((cellTd && isNullOrUndefined(moreIndicator)) ||
|
|
286
|
-
(!this.isAlreadyAvail(appPos, cellTd))) {
|
|
287
|
-
const startDateTime: Date = (this.parent.activeViewOptions.option === 'TimelineMonth' || this.renderType === 'day') ? new Date(+startTime) : startDate;
|
|
288
|
-
const slotStartTime: Date =
|
|
289
|
-
(new Date(startDateTime.setMinutes(Math.floor(startDateTime.getMinutes() / interval) * interval)));
|
|
290
|
-
const slotEndTime: Date = new Date(slotStartTime.getTime() + (60000 * interval));
|
|
291
|
-
let groupIndex: string;
|
|
292
|
-
if (this.parent.activeViewOptions.group.resources.length > 0 && !isNullOrUndefined(resIndex)) {
|
|
293
|
-
groupIndex = resIndex.toString();
|
|
294
|
-
}
|
|
295
|
-
const filterEvents: Record<string, any>[] =
|
|
296
|
-
this.getFilterEvents(startDate, endDate, slotStartTime, slotEndTime, groupIndex, appointmentsList);
|
|
297
|
-
const appArea: number = this.cellHeight - this.moreIndicatorHeight;
|
|
298
|
-
appHeight = this.withIndicator ? appArea - EVENT_GAP : appHeight;
|
|
299
|
-
const renderedAppCount: number = Math.floor(appArea / (appHeight + EVENT_GAP));
|
|
300
|
-
const count: number = this.parent.activeViewOptions.maxEventsPerRow && !this.parent.eventSettings.enableIndicator
|
|
301
|
-
? filterEvents.length - this.parent.activeViewOptions.maxEventsPerRow : (filterEvents.length - renderedAppCount) <= 0 ? 1
|
|
302
|
-
: filterEvents.length - renderedAppCount;
|
|
303
|
-
let moreIndicatorElement: HTMLElement;
|
|
304
|
-
if (this.renderType === 'day') {
|
|
305
|
-
moreIndicatorElement = this.getMoreIndicatorElement(count, startDate, endDate);
|
|
306
|
-
} else {
|
|
307
|
-
moreIndicatorElement = this.getMoreIndicatorElement(count, slotStartTime, slotEndTime);
|
|
308
|
-
}
|
|
309
|
-
if (!isNullOrUndefined(groupIndex)) {
|
|
310
|
-
moreIndicatorElement.setAttribute('data-group-index', groupIndex);
|
|
311
|
-
}
|
|
312
|
-
moreIndicatorElement.style.top = top + appArea + 'px';
|
|
313
|
-
moreIndicatorElement.style.width = this.cellWidth + 'px';
|
|
314
|
-
moreIndicatorElement.style.left = (Math.floor(appLeft / this.cellWidth) * this.cellWidth) + 'px';
|
|
315
|
-
moreIndicatorElement.style.right = (Math.floor(appRight / this.cellWidth) * this.cellWidth) + 'px';
|
|
316
|
-
this.renderElement(cellTd, moreIndicatorElement);
|
|
317
|
-
EventHandler.add(moreIndicatorElement, 'click', this.moreIndicatorClick, this);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
public updateCellHeight(cell: HTMLElement, height: number): void {
|
|
321
|
-
const cellHeight: number = cell.style.height === '' ? this.cellHeight : parseInt(cell.style.height, 10);
|
|
322
|
-
if (height > cellHeight) {
|
|
323
|
-
setStyleAttribute(cell, { 'height': height + 'px' });
|
|
324
|
-
if (this.parent.activeViewOptions.group.resources.length > 0) {
|
|
325
|
-
const resourceCell: HTMLElement = this.parent.element.querySelector('.' + cls.RESOURCE_COLUMN_TABLE_CLASS + ' ' + 'tbody td[data-group-index="' +
|
|
326
|
-
cell.getAttribute('data-group-index') + '"]') as HTMLElement;
|
|
327
|
-
if (resourceCell) {
|
|
328
|
-
setStyleAttribute(resourceCell, { 'height': height + 'px' });
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
const monthHeader: HTMLElement = this.parent.element.querySelector('.e-month-header-wrapper table tr:nth-child(' +
|
|
332
|
-
((cell.parentElement as HTMLTableRowElement).rowIndex + 1) + ') td') as HTMLElement;
|
|
333
|
-
if (monthHeader) {
|
|
334
|
-
setStyleAttribute(monthHeader, { 'height': height + 'px' });
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
private getFirstChild(index: number): HTMLElement {
|
|
340
|
-
const query: string = '.' + cls.CONTENT_TABLE_CLASS + ' tbody td';
|
|
341
|
-
let groupIndex: string = '';
|
|
342
|
-
if (this.parent.activeViewOptions.group.resources.length > 0) {
|
|
343
|
-
groupIndex = '[data-group-index="' + index.toString() + '"]';
|
|
344
|
-
}
|
|
345
|
-
const td: HTMLElement = this.parent.element.querySelector(query + groupIndex) as HTMLElement;
|
|
346
|
-
return td;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
public updateBlockElements(): void {
|
|
350
|
-
const blockElement: HTMLElement[] = [].slice.call(this.element.querySelectorAll('.' + cls.BLOCK_APPOINTMENT_CLASS));
|
|
351
|
-
for (const element of blockElement) {
|
|
352
|
-
const resIndex: number = parseInt(element.getAttribute('data-group-index'), 10);
|
|
353
|
-
const firstChild: HTMLElement = this.getFirstChild(resIndex);
|
|
354
|
-
element.style.height = (firstChild.offsetHeight - 1) + 'px';
|
|
355
|
-
const width: number = element.offsetWidth / firstChild.offsetWidth;
|
|
356
|
-
element.style.width = (firstChild.offsetWidth * width) + 'px';
|
|
357
|
-
}
|
|
358
|
-
const blockIndicator: HTMLElement[] = [].slice.call(this.element.querySelectorAll('.' + cls.BLOCK_INDICATOR_CLASS));
|
|
359
|
-
for (const element of blockIndicator) {
|
|
360
|
-
const resIndex: number = parseInt(element.getAttribute('data-group-index'), 10);
|
|
361
|
-
element.style.top = this.getRowTop(resIndex) +
|
|
362
|
-
this.getFirstChild(resIndex).offsetHeight - BLOCK_INDICATOR_HEIGHT + 'px';
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
public getStartTime(event: Record<string, any>, eventData: Record<string, any>): Date {
|
|
367
|
-
let startTime: Date = event[this.fields.startTime] as Date;
|
|
368
|
-
const schedule: { [key: string]: Date } = util.getStartEndHours(startTime, this.startHour, this.endHour);
|
|
369
|
-
if (this.isDayProcess()) {
|
|
370
|
-
startTime = event[this.fields.startTime] as Date;
|
|
371
|
-
} else {
|
|
372
|
-
if (schedule.startHour.getTime() >= eventData[this.fields.startTime]) {
|
|
373
|
-
startTime = schedule.startHour;
|
|
374
|
-
} else if (schedule.endHour.getTime() <= eventData[this.fields.startTime]) {
|
|
375
|
-
startTime = this.getNextDay(schedule.startHour, eventData);
|
|
376
|
-
} else {
|
|
377
|
-
startTime = eventData[this.fields.startTime] as Date;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
// To overcome the overflow
|
|
381
|
-
eventData.trimStartTime = (event[this.fields.isAllDay]) ? schedule.startHour : eventData[this.fields.startTime];
|
|
382
|
-
return startTime;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
private getNextDay(startTime: Date, eventData: Record<string, any>): Date {
|
|
386
|
-
let startDate: Date;
|
|
387
|
-
for (let i: number = 1; i <= this.dateRender.length; i++) {
|
|
388
|
-
startDate = util.addDays(startTime, i);
|
|
389
|
-
if (this.parent.getIndexOfDate(this.dateRender, util.resetTime(new Date(startTime.getTime()))) !== -1) {
|
|
390
|
-
eventData.count = eventData.count as number - 1;
|
|
391
|
-
return startDate;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
return startDate;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
public getEndTime(event: Record<string, any>, eventData: Record<string, any>): Date {
|
|
398
|
-
let endTime: Date = event[this.fields.endTime] as Date;
|
|
399
|
-
const schedule: { [key: string]: Date } = util.getStartEndHours(endTime, this.startHour, this.endHour);
|
|
400
|
-
if (this.isDayProcess()) {
|
|
401
|
-
endTime = eventData[this.fields.endTime] as Date;
|
|
402
|
-
} else {
|
|
403
|
-
endTime = eventData[this.fields.endTime] as Date;
|
|
404
|
-
if (schedule.endHour.getTime() <= eventData[this.fields.endTime] || event[this.fields.isAllDay]) {
|
|
405
|
-
endTime = schedule.endHour;
|
|
406
|
-
}
|
|
407
|
-
if (schedule.startHour.getTime() >= eventData[this.fields.endTime].getTime() && !event[this.fields.isAllDay]) {
|
|
408
|
-
endTime = this.getPreviousDay(schedule.startHour, schedule.endHour, eventData);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
// To overcome the overflow
|
|
412
|
-
eventData.trimEndTime = (event[this.fields.isAllDay]) ? schedule.endHour : eventData[this.fields.endTime];
|
|
413
|
-
return endTime;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
private getPreviousDay(startTime: Date, endTime: Date, eventData: Record<string, any>): Date {
|
|
417
|
-
for (let i: number = 1; i <= this.dateRender.length; i++) {
|
|
418
|
-
let endDate: Date = util.addDays(endTime, -i);
|
|
419
|
-
if (this.parent.getIndexOfDate(this.dateRender, util.resetTime(new Date(startTime.getTime()))) !== -1) {
|
|
420
|
-
endDate = util.resetTime(new Date(endDate.getTime()));
|
|
421
|
-
endDate.setHours(endTime.getHours(), endTime.getMinutes(), endTime.getSeconds());
|
|
422
|
-
const count: number = eventData.count as number;
|
|
423
|
-
const actualEndTime: Date = eventData[this.fields.endTime] as Date;
|
|
424
|
-
eventData.count = actualEndTime.getHours() !== 0 || actualEndTime.getMinutes() !== 0 ? count - 1 : count;
|
|
425
|
-
return endDate;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
return eventData[this.fields.endTime];
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
public getEventWidth(startDate: Date, endDate: Date, isAllDay: boolean, count: number): number {
|
|
432
|
-
if (this.renderType === 'day' || isAllDay) {
|
|
433
|
-
return (count * this.slotsPerDay) * this.cellWidth;
|
|
434
|
-
}
|
|
435
|
-
if (this.isSameDay(startDate, endDate)) {
|
|
436
|
-
return this.getSameDayEventsWidth(startDate, endDate);
|
|
437
|
-
} else {
|
|
438
|
-
return this.getSpannedEventsWidth(startDate, endDate, count);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
private getSameDayEventsWidth(startDate: Date, endDate: Date): number {
|
|
443
|
-
return ((util.getUniversalTime(endDate) - util.getUniversalTime(startDate)) /
|
|
444
|
-
util.MS_PER_MINUTE * (this.cellWidth * this.slotCount) / this.getIntervalInMinutes(startDate));
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
private getSpannedEventsWidth(startDate: Date, endDate: Date, diffInDays: number): number {
|
|
448
|
-
const width: number = (diffInDays * this.slotsPerDay) * this.cellWidth;
|
|
449
|
-
let endWidth: number;
|
|
450
|
-
const start: { [key: string]: Date } =
|
|
451
|
-
util.getStartEndHours(util.resetTime(new Date(startDate.getTime())), this.startHour, this.endHour);
|
|
452
|
-
const startWidth: number = this.getSameDayEventsWidth(start.startHour, startDate);
|
|
453
|
-
if (this.parent.getIndexOfDate(this.dateRender, util.resetTime(new Date(endDate.getTime()))) === -1) {
|
|
454
|
-
endWidth = 0;
|
|
455
|
-
} else {
|
|
456
|
-
const { startHour, endHour }: { [key: string]: Date } =
|
|
457
|
-
util.getStartEndHours(util.resetTime(new Date(endDate.getTime())), this.startHour, this.endHour);
|
|
458
|
-
const interval: number = this.interval / this.slotCount;
|
|
459
|
-
const lastSlotEndTime: Date = this.getEndTimeOfLastSlot(startHour, endHour, interval);
|
|
460
|
-
const adjustedEndDate: Date = endHour < lastSlotEndTime ? endHour : lastSlotEndTime;
|
|
461
|
-
endWidth = this.getSameDayEventsWidth(endDate, adjustedEndDate);
|
|
462
|
-
endWidth = ((this.slotsPerDay * this.cellWidth) === endWidth) ? 0 : endWidth;
|
|
463
|
-
}
|
|
464
|
-
const spannedWidth: number = startWidth + endWidth;
|
|
465
|
-
return (width > spannedWidth) ? width - spannedWidth : width - startWidth;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
private getEndTimeOfLastSlot(startHour: Date, endHour: Date, interval: number): Date {
|
|
469
|
-
const minutesInDay: number = (endHour.getTime() - startHour.getTime()) / (1000 * 60);
|
|
470
|
-
const lastSlotEndMinutes: number = Math.floor(minutesInDay / interval) * interval;
|
|
471
|
-
const lastSlotEndTime: Date = new Date(startHour);
|
|
472
|
-
lastSlotEndTime.setMinutes(lastSlotEndMinutes);
|
|
473
|
-
return lastSlotEndTime;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
private isSameDay(startTime: Date, endTime: Date): boolean {
|
|
477
|
-
const startDay: number = this.parent.getIndexOfDate(this.dateRender, util.resetTime(new Date(startTime.getTime()) as Date));
|
|
478
|
-
const endDay: number = this.parent.getIndexOfDate(this.dateRender, util.resetTime(new Date(endTime.getTime()) as Date));
|
|
479
|
-
return (startDay === endDay);
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
private getAppointmentLeft(schedule: { [key: string]: Date }, startTime: Date, day: number): number {
|
|
483
|
-
const slotTd: number = (this.isSameDay(startTime, schedule.startHour as Date)) ?
|
|
484
|
-
((util.getUniversalTime(startTime) - util.getUniversalTime(schedule.startHour)) /
|
|
485
|
-
(util.MS_PER_MINUTE * this.getIntervalInMinutes(startTime))) * this.slotCount : 0;
|
|
486
|
-
if (day === 0) {
|
|
487
|
-
return slotTd;
|
|
488
|
-
} else {
|
|
489
|
-
const daySlot: number = Math.round(((util.getUniversalTime(schedule.endHour) - util.getUniversalTime(schedule.startHour)) /
|
|
490
|
-
this.interval / util.MS_PER_MINUTE) * this.slotCount);
|
|
491
|
-
return (daySlot * day) + slotTd;
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
public getPosition(startTime: Date, endTime: Date, isAllDay: boolean, day: number): number {
|
|
496
|
-
if (this.renderType === 'day' || isAllDay) {
|
|
497
|
-
return (day * this.slotsPerDay) * this.cellWidth;
|
|
498
|
-
}
|
|
499
|
-
const currentDate: Date = util.resetTime(new Date(this.dateRender[parseInt(day.toString(), 10)].getTime()));
|
|
500
|
-
const schedule: { [key: string]: Date } = util.getStartEndHours(currentDate, this.startHour, this.endHour);
|
|
501
|
-
let cellIndex: number;
|
|
502
|
-
if (schedule.endHour.getTime() <= endTime.getTime() && schedule.startHour.getTime() >= startTime.getTime()) {
|
|
503
|
-
cellIndex = this.getAppointmentLeft(schedule, schedule.startHour, day);
|
|
504
|
-
} else if (schedule.endHour.getTime() <= endTime.getTime()) {
|
|
505
|
-
cellIndex = this.getAppointmentLeft(schedule, startTime, day);
|
|
506
|
-
} else if (schedule.startHour.getTime() >= startTime.getTime()) {
|
|
507
|
-
cellIndex = this.getAppointmentLeft(schedule, schedule.startHour, day);
|
|
508
|
-
} else {
|
|
509
|
-
cellIndex = this.getAppointmentLeft(schedule, startTime, day);
|
|
510
|
-
}
|
|
511
|
-
return cellIndex * this.cellWidth;
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
private getFilterEvents(startDate: Date, endDate: Date, startTime: Date, endTime: Date, gIndex: string, eventsList?: Record<string, any>[]): Record<string, any>[] {
|
|
515
|
-
if (this.renderType === 'day') {
|
|
516
|
-
return this.getFilteredEvents(startDate, endDate, gIndex, eventsList);
|
|
517
|
-
} else {
|
|
518
|
-
return this.getFilteredEvents(startTime, endTime, gIndex, eventsList);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
private getIntervalInMinutes(startDate: Date): number {
|
|
523
|
-
if (this.slotsPerDay !== 1) {
|
|
524
|
-
return this.interval;
|
|
525
|
-
}
|
|
526
|
-
const hoursRange: { [key: string]: Date } =
|
|
527
|
-
util.getStartEndHours(util.resetTime(new Date(startDate.getTime())), this.startHour, this.endHour);
|
|
528
|
-
return (hoursRange.endHour.getTime() - hoursRange.startHour.getTime()) / util.MS_PER_MINUTE;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
private isAlreadyAvail(appPos: number, cellTd: HTMLElement): boolean {
|
|
532
|
-
const moreIndicator: HTMLElement[] = [].slice.call(cellTd.querySelectorAll('.' + cls.MORE_INDICATOR_CLASS));
|
|
533
|
-
for (let i: number = 0; i < moreIndicator.length; i++) {
|
|
534
|
-
let indicatorPos: string;
|
|
535
|
-
if (moreIndicator) {
|
|
536
|
-
indicatorPos = (this.parent.enableRtl) ? moreIndicator[parseInt(i.toString(), 10)].style.right : moreIndicator[parseInt(i.toString(), 10)].style.left;
|
|
537
|
-
}
|
|
538
|
-
if (parseInt(indicatorPos, 10) === Math.floor(appPos)) {
|
|
539
|
-
return true;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
return false;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
public getRowTop(resIndex: number): number {
|
|
546
|
-
if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
|
|
547
|
-
return (<HTMLElement>this.parent.element.querySelector('.' + cls.CONTENT_WRAP_CLASS +
|
|
548
|
-
' ' + 'tbody td[data-group-index="' + resIndex.toString() + '"]')).offsetTop;
|
|
549
|
-
}
|
|
550
|
-
return 0;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
public getCellTd(): HTMLElement {
|
|
554
|
-
const wrapIndex: number = this.parent.uiStateValues.isGroupAdaptive ? 0 : this.rowIndex;
|
|
555
|
-
return this.eventContainers[parseInt(wrapIndex.toString(), 10)] as HTMLElement;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
public renderBlockIndicator(cellTd: HTMLElement, position: number, resIndex: number): void {
|
|
559
|
-
// No need to render block icon for Year, Month and Week header rows
|
|
560
|
-
if (this.parent.headerRows.length > 0 &&
|
|
561
|
-
(this.parent.headerRows[this.parent.headerRows.length - 1].option !== 'Hour' ||
|
|
562
|
-
this.parent.headerRows[this.parent.headerRows.length - 1].option !== 'Date')) {
|
|
563
|
-
return;
|
|
564
|
-
}
|
|
565
|
-
position = (Math.floor(position / this.cellWidth) * this.cellWidth) + this.cellWidth - BLOCK_INDICATOR_WIDTH;
|
|
566
|
-
if (!this.isAlreadyAvail(position, cellTd)) {
|
|
567
|
-
const blockIndicator: HTMLElement = createElement('div', { className: 'e-icons ' + cls.BLOCK_INDICATOR_CLASS });
|
|
568
|
-
if (this.parent.activeViewOptions.group.resources.length > 0) {
|
|
569
|
-
blockIndicator.setAttribute('data-group-index', resIndex.toString());
|
|
570
|
-
}
|
|
571
|
-
if (this.parent.enableRtl) {
|
|
572
|
-
blockIndicator.style.right = position + 'px';
|
|
573
|
-
} else {
|
|
574
|
-
blockIndicator.style.left = position + 'px';
|
|
575
|
-
}
|
|
576
|
-
blockIndicator.style.top = this.getRowTop(resIndex) + this.cellHeight - BLOCK_INDICATOR_HEIGHT + 'px';
|
|
577
|
-
this.renderElement(cellTd, blockIndicator);
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
582
|
-
public setMaxEventHeight(event: HTMLElement, cell: HTMLElement): void {
|
|
583
|
-
setStyleAttribute(event, {
|
|
584
|
-
'height': (this.cellHeight - (this.maxHeight ? 0 : EVENT_GAP) - (this.maxHeight ? 0 : this.moreIndicatorHeight)) + 'px'
|
|
585
|
-
});
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
private isDayProcess(): boolean {
|
|
589
|
-
if (this.parent.currentView === 'TimelineMonth' || !this.parent.activeViewOptions.timeScale.enable ||
|
|
590
|
-
(this.parent.activeViewOptions.headerRows.length > 0 &&
|
|
591
|
-
this.parent.activeViewOptions.headerRows.slice(-1)[0].option !== 'Hour')) {
|
|
592
|
-
return true;
|
|
593
|
-
}
|
|
594
|
-
return false;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
public destroy(): void {
|
|
598
|
-
this.renderType = null;
|
|
599
|
-
this.eventContainers = null;
|
|
600
|
-
this.dayLength = null;
|
|
601
|
-
this.content = null;
|
|
602
|
-
super.destroy();
|
|
603
|
-
this.parent = null;
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
}
|