@syncfusion/ej2-schedule 31.1.17 → 31.1.20

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.
Files changed (167) hide show
  1. package/dist/ej2-schedule.min.js +2 -2
  2. package/dist/ej2-schedule.umd.min.js +2 -2
  3. package/dist/ej2-schedule.umd.min.js.map +1 -1
  4. package/dist/es6/ej2-schedule.es2015.js +1 -1
  5. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  6. package/dist/es6/ej2-schedule.es5.js +1 -1
  7. package/dist/es6/ej2-schedule.es5.js.map +1 -1
  8. package/dist/global/ej2-schedule.min.js +2 -2
  9. package/dist/global/ej2-schedule.min.js.map +1 -1
  10. package/dist/global/index.d.ts +1 -1
  11. package/package.json +17 -52
  12. package/src/schedule/event-renderer/event-base.js +1 -1
  13. package/styles/bootstrap4-lite.css +8 -0
  14. package/styles/bootstrap4.css +8 -0
  15. package/styles/recurrence-editor/bootstrap4.css +8 -0
  16. package/styles/schedule/bootstrap4.css +8 -0
  17. package/dist/ts/common/calendar-util.d.ts +0 -92
  18. package/dist/ts/common/calendar-util.ts +0 -261
  19. package/dist/ts/common/index.d.ts +0 -4
  20. package/dist/ts/common/index.ts +0 -4
  21. package/dist/ts/components.d.ts +0 -5
  22. package/dist/ts/components.ts +0 -5
  23. package/dist/ts/index.d.ts +0 -6
  24. package/dist/ts/index.ts +0 -7
  25. package/dist/ts/recurrence-editor/date-generator.d.ts +0 -76
  26. package/dist/ts/recurrence-editor/date-generator.ts +0 -1699
  27. package/dist/ts/recurrence-editor/index.d.ts +0 -6
  28. package/dist/ts/recurrence-editor/index.ts +0 -6
  29. package/dist/ts/recurrence-editor/recurrence-editor-model.d.ts +0 -112
  30. package/dist/ts/recurrence-editor/recurrence-editor.d.ts +0 -245
  31. package/dist/ts/recurrence-editor/recurrence-editor.ts +0 -1257
  32. package/dist/ts/schedule/actions/action-base.d.ts +0 -44
  33. package/dist/ts/schedule/actions/action-base.ts +0 -493
  34. package/dist/ts/schedule/actions/crud.d.ts +0 -41
  35. package/dist/ts/schedule/actions/crud.ts +0 -784
  36. package/dist/ts/schedule/actions/data.d.ts +0 -63
  37. package/dist/ts/schedule/actions/data.ts +0 -128
  38. package/dist/ts/schedule/actions/drag.d.ts +0 -75
  39. package/dist/ts/schedule/actions/drag.ts +0 -1401
  40. package/dist/ts/schedule/actions/keyboard.d.ts +0 -100
  41. package/dist/ts/schedule/actions/keyboard.ts +0 -1435
  42. package/dist/ts/schedule/actions/resize.d.ts +0 -27
  43. package/dist/ts/schedule/actions/resize.ts +0 -602
  44. package/dist/ts/schedule/actions/scroll.d.ts +0 -69
  45. package/dist/ts/schedule/actions/scroll.ts +0 -105
  46. package/dist/ts/schedule/actions/touch.d.ts +0 -32
  47. package/dist/ts/schedule/actions/touch.ts +0 -314
  48. package/dist/ts/schedule/actions/virtual-scroll.d.ts +0 -55
  49. package/dist/ts/schedule/actions/virtual-scroll.ts +0 -596
  50. package/dist/ts/schedule/actions/work-cells.d.ts +0 -14
  51. package/dist/ts/schedule/actions/work-cells.ts +0 -151
  52. package/dist/ts/schedule/base/constant.d.ts +0 -102
  53. package/dist/ts/schedule/base/constant.ts +0 -103
  54. package/dist/ts/schedule/base/css-constant.d.ts +0 -475
  55. package/dist/ts/schedule/base/css-constant.ts +0 -475
  56. package/dist/ts/schedule/base/interface.d.ts +0 -673
  57. package/dist/ts/schedule/base/interface.ts +0 -738
  58. package/dist/ts/schedule/base/resource.d.ts +0 -59
  59. package/dist/ts/schedule/base/resource.ts +0 -1091
  60. package/dist/ts/schedule/base/schedule-model.d.ts +0 -930
  61. package/dist/ts/schedule/base/schedule.d.ts +0 -1967
  62. package/dist/ts/schedule/base/schedule.ts +0 -4221
  63. package/dist/ts/schedule/base/type.d.ts +0 -134
  64. package/dist/ts/schedule/base/type.ts +0 -142
  65. package/dist/ts/schedule/base/util.d.ts +0 -266
  66. package/dist/ts/schedule/base/util.ts +0 -492
  67. package/dist/ts/schedule/event-renderer/agenda-base.d.ts +0 -15
  68. package/dist/ts/schedule/event-renderer/agenda-base.ts +0 -423
  69. package/dist/ts/schedule/event-renderer/event-base.d.ts +0 -101
  70. package/dist/ts/schedule/event-renderer/event-base.ts +0 -1501
  71. package/dist/ts/schedule/event-renderer/inline-edit.d.ts +0 -23
  72. package/dist/ts/schedule/event-renderer/inline-edit.ts +0 -287
  73. package/dist/ts/schedule/event-renderer/month.d.ts +0 -60
  74. package/dist/ts/schedule/event-renderer/month.ts +0 -760
  75. package/dist/ts/schedule/event-renderer/timeline-view.d.ts +0 -51
  76. package/dist/ts/schedule/event-renderer/timeline-view.ts +0 -606
  77. package/dist/ts/schedule/event-renderer/vertical-view.d.ts +0 -57
  78. package/dist/ts/schedule/event-renderer/vertical-view.ts +0 -898
  79. package/dist/ts/schedule/event-renderer/year.d.ts +0 -27
  80. package/dist/ts/schedule/event-renderer/year.ts +0 -623
  81. package/dist/ts/schedule/exports/calendar-export.d.ts +0 -16
  82. package/dist/ts/schedule/exports/calendar-export.ts +0 -160
  83. package/dist/ts/schedule/exports/calendar-import.d.ts +0 -18
  84. package/dist/ts/schedule/exports/calendar-import.ts +0 -277
  85. package/dist/ts/schedule/exports/excel-export.d.ts +0 -14
  86. package/dist/ts/schedule/exports/excel-export.ts +0 -89
  87. package/dist/ts/schedule/exports/index.d.ts +0 -7
  88. package/dist/ts/schedule/exports/index.ts +0 -7
  89. package/dist/ts/schedule/exports/print.d.ts +0 -20
  90. package/dist/ts/schedule/exports/print.ts +0 -233
  91. package/dist/ts/schedule/index.d.ts +0 -26
  92. package/dist/ts/schedule/index.ts +0 -26
  93. package/dist/ts/schedule/models/event-settings-model.d.ts +0 -165
  94. package/dist/ts/schedule/models/event-settings.d.ts +0 -149
  95. package/dist/ts/schedule/models/event-settings.ts +0 -187
  96. package/dist/ts/schedule/models/field-options-model.d.ts +0 -37
  97. package/dist/ts/schedule/models/field-options.d.ts +0 -31
  98. package/dist/ts/schedule/models/field-options.ts +0 -41
  99. package/dist/ts/schedule/models/fields-model.d.ts +0 -129
  100. package/dist/ts/schedule/models/fields.d.ts +0 -117
  101. package/dist/ts/schedule/models/fields.ts +0 -149
  102. package/dist/ts/schedule/models/group-model.d.ts +0 -69
  103. package/dist/ts/schedule/models/group.d.ts +0 -60
  104. package/dist/ts/schedule/models/group.ts +0 -75
  105. package/dist/ts/schedule/models/header-rows-model.d.ts +0 -33
  106. package/dist/ts/schedule/models/header-rows.d.ts +0 -30
  107. package/dist/ts/schedule/models/header-rows.ts +0 -35
  108. package/dist/ts/schedule/models/models.d.ts +0 -14
  109. package/dist/ts/schedule/models/models.ts +0 -15
  110. package/dist/ts/schedule/models/quick-info-templates-model.d.ts +0 -52
  111. package/dist/ts/schedule/models/quick-info-templates.d.ts +0 -47
  112. package/dist/ts/schedule/models/quick-info-templates.ts +0 -56
  113. package/dist/ts/schedule/models/resources-model.d.ts +0 -122
  114. package/dist/ts/schedule/models/resources.d.ts +0 -106
  115. package/dist/ts/schedule/models/resources.ts +0 -138
  116. package/dist/ts/schedule/models/time-scale-model.d.ts +0 -57
  117. package/dist/ts/schedule/models/time-scale.d.ts +0 -50
  118. package/dist/ts/schedule/models/time-scale.ts +0 -61
  119. package/dist/ts/schedule/models/toolbar-model.d.ts +0 -196
  120. package/dist/ts/schedule/models/toolbar.d.ts +0 -176
  121. package/dist/ts/schedule/models/toolbar.ts +0 -196
  122. package/dist/ts/schedule/models/views-model.d.ts +0 -370
  123. package/dist/ts/schedule/models/views.d.ts +0 -335
  124. package/dist/ts/schedule/models/views.ts +0 -408
  125. package/dist/ts/schedule/models/work-hours-model.d.ts +0 -29
  126. package/dist/ts/schedule/models/work-hours.d.ts +0 -24
  127. package/dist/ts/schedule/models/work-hours.ts +0 -31
  128. package/dist/ts/schedule/popups/event-tooltip.d.ts +0 -16
  129. package/dist/ts/schedule/popups/event-tooltip.ts +0 -203
  130. package/dist/ts/schedule/popups/event-window.d.ts +0 -118
  131. package/dist/ts/schedule/popups/event-window.ts +0 -2055
  132. package/dist/ts/schedule/popups/form-validator.d.ts +0 -16
  133. package/dist/ts/schedule/popups/form-validator.ts +0 -110
  134. package/dist/ts/schedule/popups/quick-popups.d.ts +0 -78
  135. package/dist/ts/schedule/popups/quick-popups.ts +0 -1470
  136. package/dist/ts/schedule/renderer/agenda.d.ts +0 -45
  137. package/dist/ts/schedule/renderer/agenda.ts +0 -497
  138. package/dist/ts/schedule/renderer/day.d.ts +0 -20
  139. package/dist/ts/schedule/renderer/day.ts +0 -28
  140. package/dist/ts/schedule/renderer/header-renderer.d.ts +0 -48
  141. package/dist/ts/schedule/renderer/header-renderer.ts +0 -736
  142. package/dist/ts/schedule/renderer/month-agenda.d.ts +0 -29
  143. package/dist/ts/schedule/renderer/month-agenda.ts +0 -184
  144. package/dist/ts/schedule/renderer/month.d.ts +0 -61
  145. package/dist/ts/schedule/renderer/month.ts +0 -766
  146. package/dist/ts/schedule/renderer/renderer.d.ts +0 -13
  147. package/dist/ts/schedule/renderer/renderer.ts +0 -165
  148. package/dist/ts/schedule/renderer/timeline-header-row.d.ts +0 -15
  149. package/dist/ts/schedule/renderer/timeline-header-row.ts +0 -132
  150. package/dist/ts/schedule/renderer/timeline-month.d.ts +0 -29
  151. package/dist/ts/schedule/renderer/timeline-month.ts +0 -184
  152. package/dist/ts/schedule/renderer/timeline-view.d.ts +0 -31
  153. package/dist/ts/schedule/renderer/timeline-view.ts +0 -308
  154. package/dist/ts/schedule/renderer/timeline-year.d.ts +0 -22
  155. package/dist/ts/schedule/renderer/timeline-year.ts +0 -450
  156. package/dist/ts/schedule/renderer/vertical-view.d.ts +0 -63
  157. package/dist/ts/schedule/renderer/vertical-view.ts +0 -911
  158. package/dist/ts/schedule/renderer/view-base.d.ts +0 -83
  159. package/dist/ts/schedule/renderer/view-base.ts +0 -709
  160. package/dist/ts/schedule/renderer/week.d.ts +0 -22
  161. package/dist/ts/schedule/renderer/week.ts +0 -35
  162. package/dist/ts/schedule/renderer/work-week.d.ts +0 -22
  163. package/dist/ts/schedule/renderer/work-week.ts +0 -36
  164. package/dist/ts/schedule/renderer/year.d.ts +0 -46
  165. package/dist/ts/schedule/renderer/year.ts +0 -470
  166. package/dist/ts/schedule/timezone/timezone.d.ts +0 -16
  167. package/dist/ts/schedule/timezone/timezone.ts +0 -313
@@ -1,709 +0,0 @@
1
- import {
2
- createElement, append, prepend, isNullOrUndefined, getValue, getDefaultDateObject,
3
- cldrData, Internationalization, addClass, setStyleAttribute, formatUnit, EventHandler, remove
4
- } from '@syncfusion/ej2-base';
5
- import { Schedule } from '../base/schedule';
6
- import { TdData, ResourceDetails, CallbackFunction, RenderCellEventArgs } from '../base/interface';
7
- import * as cls from '../base/css-constant';
8
- import * as event from '../base/constant';
9
- import * as util from '../base/util';
10
- import { NavigationDirection } from '../base/type';
11
-
12
- /**
13
- * view base
14
- */
15
- export class ViewBase {
16
- public previousNextAction: NavigationDirection = 'Next';
17
- public element: HTMLElement;
18
- public parent: Schedule;
19
- public renderDates: Date[];
20
- public colLevels: TdData[][];
21
- public viewIndex: number;
22
- public skipPersistenceSave: boolean = false;
23
- public isScrolledBottom: boolean = false;
24
-
25
- /**
26
- * Constructor
27
- *
28
- * @param {Schedule} parent Accepts the schedule instance
29
- */
30
- constructor(parent: Schedule) {
31
- this.parent = parent;
32
- }
33
-
34
- public isTimelineView(): boolean {
35
- return this.parent.currentView.indexOf('Timeline') !== -1;
36
- }
37
-
38
- public getContentRows(): Element[] {
39
- return [];
40
- }
41
-
42
- public refreshHeader(): void {
43
- // Method to refresh the date header
44
- }
45
-
46
- public refreshResourceHeader(): void {
47
- const resTbl: HTMLElement = this.element.querySelector('.' + cls.RESOURCE_COLUMN_TABLE_CLASS) as HTMLElement;
48
- const resourceTd: HTMLElement[] = Array.from(resTbl.querySelectorAll('.' + cls.RESOURCE_CELLS_CLASS)) as HTMLElement[];
49
- resourceTd.forEach((currentElement: HTMLElement) => {
50
- const children: HTMLElement[] = Array.from(currentElement.children) as HTMLElement[];
51
- children.forEach((child: HTMLElement) => {
52
- if (!child.classList.contains(cls.RESOURCE_EXPAND_CLASS) && !child.classList.contains(cls.RESOURCE_COLLAPSE_CLASS)) {
53
- remove(child);
54
- }
55
- });
56
- });
57
- const rendereData: TdData[] = this.parent.resourceBase.renderedResources;
58
- if (!isNullOrUndefined(rendereData) && rendereData.length > 0) {
59
- for (let i: number = 0; i < resourceTd.length; i++) {
60
- const element: HTMLElement = resourceTd[parseInt(i.toString(), 10)];
61
- const data: TdData = rendereData[parseInt(i.toString(), 10)];
62
- if (this.parent.activeView && !isNullOrUndefined(element) && !isNullOrUndefined(data)
63
- && parseInt(element.getAttribute('data-group-index'), 10) === data.groupIndex) {
64
- this.parent.activeView.setResourceHeaderContent(element, data, cls.RESOURCE_TEXT_CLASS);
65
- const eventArgs: RenderCellEventArgs = { element: element, elementType: 'resourceHeader', groupIndex: data.groupIndex };
66
- this.parent.trigger(event.renderCell, eventArgs);
67
- }
68
- }
69
- }
70
- this.parent.renderTemplates();
71
- this.parent.notify(event.contentReady, {});
72
- }
73
-
74
- public getDayName(date: Date): string {
75
- return this.parent.getDayNames('abbreviated')[date.getDay()];
76
- }
77
-
78
- public getDate(date: Date): string {
79
- return this.parent.globalize.formatDate(date, { format: 'd', calendar: this.parent.getCalendarMode() });
80
- }
81
-
82
- public getTime(date: Date): string {
83
- if (this.parent.isAdaptive) {
84
- if (this.parent.activeViewOptions.timeFormat === 'HH:mm' || this.parent.activeViewOptions.timeFormat === 'HH.mm') {
85
- return this.parent.globalize.formatDate(date, { format: 'H', calendar: this.parent.getCalendarMode() });
86
- }
87
- return this.parent.globalize.formatDate(date, { skeleton: 'h', calendar: this.parent.getCalendarMode() });
88
- }
89
- return this.parent.getTimeString(date);
90
- }
91
-
92
- public getTimelineDate(date: Date): string {
93
- const text: string = this.parent.globalize.formatDate(date, { skeleton: 'MMMd', calendar: this.parent.getCalendarMode() }) + ', ' +
94
- this.parent.getDayNames('wide')[date.getDay()];
95
- return util.capitalizeFirstWord(text, 'multiple');
96
- }
97
-
98
- public createEventTable(trCount: number): Element {
99
- const eventTable: Element = createElement('div', { className: cls.EVENT_TABLE_CLASS });
100
- append(this.getEventRows(trCount), eventTable);
101
- return eventTable;
102
- }
103
-
104
- public getEventRows(trCount: number): Element[] {
105
- const eventRows: Element[] = [];
106
- let eventContainer: Element;
107
- for (let row: number = 0; row < trCount; row++) {
108
- eventContainer = createElement('div', { className: cls.APPOINTMENT_CONTAINER_CLASS });
109
- if (this.parent.resourceBase && !this.parent.uiStateValues.isGroupAdaptive && this.parent.resourceBase.renderedResources) {
110
- eventContainer.setAttribute('data-group-index', this.parent.resourceBase.renderedResources[parseInt(row.toString(), 10)].groupIndex.toString());
111
- }
112
- eventRows.push(eventContainer);
113
- }
114
- return eventRows;
115
- }
116
-
117
- public collapseRows(wrap: Element): void {
118
- if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
119
- this.parent.resourceBase.hideResourceRows(wrap.querySelector('tbody'));
120
- this.parent.resourceBase.hideResourceRows(wrap.querySelector('.' + cls.EVENT_TABLE_CLASS));
121
- }
122
- }
123
-
124
- public createTableLayout(className?: string): Element {
125
- const clsName: string = className || '';
126
- const table: Element = createElement('table', { className: cls.SCHEDULE_TABLE_CLASS + ' ' + clsName });
127
- const tbody: Element = createElement('tbody');
128
- table.appendChild(tbody);
129
- return table;
130
- }
131
-
132
- public setAriaAttributes(table: Element): void {
133
- table.setAttribute('role', 'grid');
134
- if (this.parent.currentView !== 'Year') {
135
- table.setAttribute('id', this.parent.element.id + '_table');
136
- }
137
- table.setAttribute('aria-label', this.getLabelText(this.parent.currentView));
138
- }
139
-
140
- public createColGroup(table: Element, lastRow: TdData[]): void {
141
- if (isNullOrUndefined(lastRow)) {
142
- return;
143
- }
144
- let length: number = lastRow.length;
145
- if (lastRow[0] && lastRow[0].colSpan) {
146
- length = lastRow.map((value: TdData) => value.colSpan).reduce((prev: number, next: number) => prev + next);
147
- }
148
- const colGroupEle: Element = createElement('colgroup');
149
- for (let i: number = 0; i < length; i++) {
150
- colGroupEle.appendChild(createElement('col'));
151
- }
152
- prepend([colGroupEle], table);
153
- }
154
-
155
- public getScrollXIndent(content: HTMLElement): number {
156
- return content.offsetHeight - content.clientHeight > 0 ? util.getScrollBarWidth() : 0;
157
- }
158
-
159
- public scrollTopPanel(target: HTMLElement): void {
160
- (this.getDatesHeaderElement().firstElementChild as Element).scrollLeft = target.scrollLeft;
161
- }
162
-
163
- public scrollHeaderLabels(target: HTMLElement): void {
164
- const headerTable: HTMLElement = this.element.querySelector('.e-date-header-wrap table') as HTMLElement;
165
- const colWidth: number = headerTable.offsetWidth / headerTable.querySelectorAll('colgroup col').length;
166
- const applyLeft: CallbackFunction = (headerCells: HTMLElement[], isRtl: boolean) => {
167
- let currentCell: HTMLElement;
168
- let tdLeft: number = 0;
169
- let colSpan: number = 0;
170
- const hiddenLeft: number = isRtl ? -(target.scrollLeft) : target.scrollLeft;
171
- for (const cell of headerCells) {
172
- colSpan += parseInt(cell.getAttribute('colSpan'), 10);
173
- if (colSpan > Math.floor(hiddenLeft / colWidth)) {
174
- currentCell = cell;
175
- break;
176
- }
177
- tdLeft += cell.offsetWidth;
178
- }
179
- if (!isNullOrUndefined(currentCell)) {
180
- (currentCell.children[0] as HTMLElement).style[isRtl ? 'right' : 'left'] = (hiddenLeft - tdLeft) + 'px';
181
- }
182
- };
183
- const classNames: string[] = ['.e-header-year-cell', '.e-header-month-cell', '.e-header-week-cell', '.e-header-cells'];
184
- for (const className of classNames) {
185
- const headerCells: HTMLElement[] = [].slice.call(this.element.querySelectorAll(className));
186
- if (headerCells.length > 0) {
187
- for (const element of headerCells) {
188
- (element.children[0] as HTMLElement).style[this.parent.enableRtl ? 'right' : 'left'] = '';
189
- }
190
- applyLeft(headerCells, this.parent.enableRtl);
191
- }
192
- }
193
- }
194
-
195
- public addAttributes(td: TdData, element: Element): void {
196
- if (td.template) { append(td.template, element); }
197
- if (td.colSpan) { element.setAttribute('colspan', td.colSpan.toString()); }
198
- if (td.className) { addClass([element], td.className); }
199
- }
200
-
201
- public getHeaderBarHeight(): number {
202
- let headerBarHeight: number = 2;
203
- if (this.parent.headerModule) {
204
- headerBarHeight += util.getOuterHeight(this.parent.headerModule.getHeaderElement());
205
- }
206
- if (this.parent.uiStateValues.isGroupAdaptive) {
207
- const resHeader: HTMLElement = (<HTMLElement>this.parent.element.querySelector('.' + cls.RESOURCE_HEADER_TOOLBAR));
208
- if (resHeader) {
209
- headerBarHeight += resHeader.offsetHeight;
210
- }
211
- }
212
- return headerBarHeight;
213
- }
214
-
215
- public renderPanel(type: string): void {
216
- if (type === cls.PREVIOUS_PANEL_CLASS) {
217
- prepend([this.element], this.parent.element.querySelector('.' + cls.TABLE_CONTAINER_CLASS));
218
- } else {
219
- this.parent.element.querySelector('.' + cls.TABLE_CONTAINER_CLASS).appendChild(this.element);
220
- }
221
- }
222
-
223
- public setPanel(panel: HTMLElement): void {
224
- this.element = panel;
225
- }
226
-
227
- public getPanel(): HTMLElement {
228
- return this.element;
229
- }
230
-
231
- public getDatesHeaderElement(): HTMLElement {
232
- return this.element.querySelector('.' + cls.DATE_HEADER_CONTAINER_CLASS) as HTMLElement;
233
- }
234
-
235
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
236
- public getDateSlots(renderDates: Date[], workDays: number[]): TdData[] {
237
- return []; // Here getDateSlots only need in vertical and month views
238
- }
239
-
240
- public generateColumnLevels(): TdData[][] {
241
- return []; // Here generateColumnLevels only need in vertical and month views
242
- }
243
-
244
- public getColumnLevels(): TdData[][] {
245
- return this.colLevels;
246
- }
247
-
248
- public highlightCurrentTime(): void {
249
- // Here showTimeIndicator functionalities
250
- }
251
-
252
- public getStartDate(): Date {
253
- return this.renderDates[0];
254
- }
255
-
256
- public getEndDate(): Date {
257
- return this.renderDates[this.renderDates.length - 1];
258
- }
259
-
260
- public startDate(): Date {
261
- return this.renderDates[0];
262
- }
263
-
264
- public endDate(): Date {
265
- return util.addDays(this.renderDates[this.renderDates.length - 1], 1);
266
- }
267
-
268
- public getStartHour(): Date {
269
- let startHour: Date = this.parent.getStartEndTime(this.parent.activeViewOptions.startHour);
270
- if (isNullOrUndefined(startHour)) {
271
- startHour = new Date(2000, 0, 0, 0);
272
- }
273
- return startHour;
274
- }
275
-
276
- public getEndHour(): Date {
277
- let endHour: Date = this.parent.getStartEndTime(this.parent.activeViewOptions.endHour);
278
- if (isNullOrUndefined(endHour)) {
279
- endHour = new Date(2000, 0, 0, 0);
280
- }
281
- return endHour;
282
- }
283
-
284
- public isCurrentDate(date: Date): boolean {
285
- return date.setHours(0, 0, 0, 0) === new Date(this.parent.currentTimezoneDate).setHours(0, 0, 0, 0);
286
- }
287
-
288
- public isCurrentMonth(date: Date): boolean {
289
- if (this.parent.activeViewOptions.displayDate || this.parent.activeViewOptions.numberOfWeeks > 0) {
290
- return this.parent.activeView.getStartDate().getTime() <= this.parent.getCurrentTime().getTime() &&
291
- this.parent.activeView.getEndDate().getTime() >= this.parent.getCurrentTime().getTime();
292
- }
293
- return date.getFullYear() ===
294
- this.parent.getCurrentTime().getFullYear() && date.getMonth() === this.parent.getCurrentTime().getMonth();
295
- }
296
-
297
- public isWorkDay(date: Date, workDays: number[] = this.parent.activeViewOptions.workDays): boolean {
298
- if (!isNullOrUndefined(workDays) && workDays.indexOf(date.getDay()) >= 0) {
299
- return true;
300
- }
301
- return false;
302
- }
303
-
304
- public isWorkHour(date: Date, startHour: Date, endHour: Date, workDays: number[]): boolean {
305
- if (isNullOrUndefined(startHour) || isNullOrUndefined(endHour)) {
306
- return false;
307
- }
308
- startHour.setMilliseconds(0);
309
- endHour.setMilliseconds(0);
310
- if (util.resetTime(date).getTime() !== util.resetTime(startHour).getTime()) {
311
- startHour = new Date(2000, 0, 0, startHour.getHours(), startHour.getMinutes(), startHour.getMilliseconds());
312
- endHour = new Date(2000, 0, 0, endHour.getHours(), endHour.getMinutes(), endHour.getMilliseconds());
313
- }
314
- return !(util.getDateInMs(date) < util.getDateInMs(startHour) || util.getDateInMs(date) >= util.getDateInMs(endHour) ||
315
- !this.isWorkDay(date, workDays));
316
- }
317
-
318
- public getRenderDates(workDays?: number[], date: Date = this.parent.selectedDate): Date[] {
319
- const renderDates: Date[] = [];
320
- // Due to same code for vertical and time line, week & work week views, if condition has used
321
- if (this.parent.currentView === 'Week' || this.parent.currentView === 'TimelineWeek') {
322
- const selectedDate: Date = util.resetTime(date);
323
- let start: Date = util.getWeekFirstDate(selectedDate, this.parent.activeViewOptions.firstDayOfWeek);
324
- for (let i: number = 0, length: number = util.WEEK_LENGTH * this.parent.activeViewOptions.interval; i < length; i++) {
325
- if (this.parent.activeViewOptions.showWeekend) {
326
- renderDates.push(start);
327
- } else {
328
- if (this.isWorkDay(start, workDays)) {
329
- renderDates.push(start);
330
- }
331
- }
332
- start = util.addDays(start, 1);
333
- }
334
- } else if (this.parent.currentView === 'WorkWeek' || this.parent.currentView === 'TimelineWorkWeek') {
335
- let start: Date = util.getWeekFirstDate(util.resetTime(date), this.parent.activeViewOptions.firstDayOfWeek);
336
- for (let i: number = 0, length: number = util.WEEK_LENGTH * this.parent.activeViewOptions.interval; i < length; i++) {
337
- if (this.isWorkDay(start, workDays)) {
338
- renderDates.push(start);
339
- }
340
- start = util.addDays(start, 1);
341
- }
342
- } else {
343
- const dayCount: number = this.parent.currentView === 'Agenda' ? this.parent.agendaDaysCount :
344
- this.parent.activeViewOptions.interval;
345
- let start: Date = util.resetTime(date);
346
- do {
347
- if (this.parent.activeViewOptions.showWeekend) {
348
- renderDates.push(start);
349
- } else {
350
- if (this.isWorkDay(start, workDays)) {
351
- renderDates.push(start);
352
- }
353
- }
354
- start = util.addDays(start, 1);
355
- } while (dayCount !== renderDates.length);
356
- }
357
- if (!workDays) {
358
- this.renderDates = renderDates;
359
- }
360
- if (this.parent.headerModule) {
361
- this.parent.headerModule.previousNextIconHandler();
362
- }
363
- return renderDates;
364
- }
365
-
366
- public getNextPreviousDate(type: NavigationDirection): Date {
367
- this.previousNextAction = type;
368
- if (this.parent.currentView === 'Day' || this.parent.currentView === 'TimelineDay') {
369
- if (this.parent.activeViewOptions.showWeekend) {
370
- const daysCount: number = this.parent.activeViewOptions.interval;
371
- return util.addDays(this.parent.selectedDate, type === 'Next' ? daysCount : -daysCount);
372
- } else {
373
- let date: Date;
374
- if (type === 'Next') {
375
- date = util.addDays(this.renderDates.slice(-1)[0], 1);
376
- while (!this.isWorkDay(date)) {
377
- date = util.addDays(date, 1);
378
- }
379
- } else {
380
- date = util.addDays(this.renderDates[0], -1);
381
- let count: number = 0;
382
- do {
383
- if (this.isWorkDay(date)) {
384
- count += 1;
385
- }
386
- if (this.parent.activeViewOptions.interval !== count) {
387
- date = util.addDays(date, -1);
388
- }
389
- } while (this.parent.activeViewOptions.interval !== count);
390
- }
391
- return date;
392
- }
393
- }
394
- const weekLength: number = type === 'Next' ? util.WEEK_LENGTH : -util.WEEK_LENGTH;
395
- return util.addDays(this.parent.selectedDate, weekLength * this.parent.activeViewOptions.interval);
396
- }
397
-
398
- public formatViewLabel(view: string, startDate: Date, endDate: Date): string {
399
- const formatOptions: { type: string; skeleton: string; calendar: string } = { type: 'date', skeleton: 'full', calendar: this.parent.getCalendarMode() };
400
- return this.parent.localeObj.getConstant(view) + ' ' + this.parent.localeObj.getConstant('start') + ' ' + this.parent.globalize.formatDate(startDate, formatOptions) + ' '
401
- + this.parent.localeObj.getConstant('endAt') + ' ' + this.parent.globalize.formatDate(endDate, formatOptions);
402
- }
403
-
404
- public getLabelText(view: string): string {
405
- const viewStr: string = view.charAt(0).toLowerCase() + view.substring(1);
406
- if (view === 'Year' || view === 'TimelineYear') {
407
- return this.formatViewLabel(viewStr, this.parent.activeView.getStartDate(), this.parent.activeView.getEndDate());
408
- } else {
409
- if (this.renderDates.length > 0) {
410
- if (this.parent.currentView === 'Day' || this.parent.currentView === 'TimelineDay') {
411
- return this.parent.localeObj.getConstant(viewStr) + ' of ' + util.capitalizeFirstWord(
412
- this.parent.globalize.formatDate(this.parent.selectedDate, { type: 'date', skeleton: 'full', calendar: this.parent.getCalendarMode() }),
413
- 'single');
414
- } else {
415
- return this.formatViewLabel(viewStr, this.renderDates[0], this.renderDates[this.renderDates.length - 1]);
416
- }
417
- } else {
418
- return '';
419
- }
420
- }
421
- }
422
-
423
- public getDateRangeText(date: Date = this.renderDates[0], dateCollection: Date[] = this.renderDates): string {
424
- if (this.parent.isAdaptive) {
425
- const formatDate: string = (this.parent.activeViewOptions.dateFormat) ? this.parent.activeViewOptions.dateFormat : 'MMMM y';
426
- return util.capitalizeFirstWord(
427
- this.parent.globalize.formatDate(this.parent.selectedDate, { format: formatDate, calendar: this.parent.getCalendarMode() }),
428
- 'single');
429
- }
430
- return this.formatDateRange(date, dateCollection[dateCollection.length - 1]);
431
- }
432
-
433
- public formatDateRange(startDate: Date, endDate?: Date): string {
434
- const globalize: Internationalization = this.parent.globalize;
435
- const mode: string = this.parent.getCalendarMode();
436
- if (startDate === endDate) {
437
- endDate = null;
438
- }
439
- if (!isNullOrUndefined(this.parent.activeViewOptions.dateFormat)) {
440
- let text: string = '';
441
- if (!endDate) {
442
- text = globalize.formatDate(startDate, { format: this.parent.activeViewOptions.dateFormat, calendar: mode });
443
- return util.capitalizeFirstWord(text, 'multiple');
444
- }
445
- text = (globalize.formatDate(startDate, { format: this.parent.activeViewOptions.dateFormat, calendar: mode }) +
446
- ' - ' + globalize.formatDate(endDate, { format: this.parent.activeViewOptions.dateFormat, calendar: mode }));
447
- return util.capitalizeFirstWord(text, 'multiple');
448
- }
449
- let formattedStr: string;
450
- let longDateFormat: string;
451
- if (isNullOrUndefined(this.parent.locale) || this.parent.locale === 'en' || this.parent.locale === 'en-US') {
452
- longDateFormat = getValue('dateFormats.long', getDefaultDateObject(mode));
453
- } else {
454
- longDateFormat = getValue('main.' + '' + this.parent.locale + '.dates.calendars.' + mode + '.dateFormats.long', cldrData);
455
- }
456
- if (!endDate) {
457
- return util.capitalizeFirstWord(globalize.formatDate(startDate, { format: longDateFormat, calendar: mode }), 'single');
458
- }
459
- const dateFormat: string = longDateFormat.trim().toLocaleLowerCase();
460
- if (dateFormat.substr(0, 1) === 'd') {
461
- if (startDate.getFullYear() === endDate.getFullYear()) {
462
- if (startDate.getMonth() === endDate.getMonth()) {
463
- formattedStr = globalize.formatDate(startDate, { format: 'dd', calendar: mode }) + ' - ' +
464
- globalize.formatDate(endDate, { format: 'dd MMMM yyyy', calendar: mode });
465
- } else {
466
- formattedStr = globalize.formatDate(startDate, { format: 'dd MMM', calendar: mode }) + ' - ' +
467
- globalize.formatDate(endDate, { format: 'dd MMM yyyy', calendar: mode });
468
- }
469
- } else {
470
- formattedStr = globalize.formatDate(startDate, { format: 'dd MMM yyyy', calendar: mode }) + ' - ' +
471
- globalize.formatDate(endDate, { format: 'dd MMM yyyy', calendar: mode });
472
- }
473
- } else if (dateFormat.substr(0, 1) === 'm') {
474
- if (startDate.getFullYear() === endDate.getFullYear()) {
475
- if (startDate.getMonth() === endDate.getMonth()) {
476
- formattedStr = globalize.formatDate(startDate, { format: 'MMMM dd', calendar: mode }) + ' - ' +
477
- globalize.formatDate(endDate, { format: 'dd, yyyy', calendar: mode });
478
- } else {
479
- formattedStr = globalize.formatDate(startDate, { format: 'MMM dd', calendar: mode }) + ' - ' +
480
- globalize.formatDate(endDate, { format: 'MMM dd, yyyy', calendar: mode });
481
- }
482
- } else {
483
- formattedStr = globalize.
484
- formatDate(startDate, { format: 'MMM dd, yyyy', calendar: mode }) + ' - ' +
485
- globalize.formatDate(endDate, { format: 'MMM dd, yyyy', calendar: mode });
486
- }
487
- } else {
488
- formattedStr = globalize.formatDate(startDate, { format: longDateFormat, calendar: mode }) + ' - ' +
489
- globalize.formatDate(endDate, { format: longDateFormat, calendar: mode });
490
- }
491
- return util.capitalizeFirstWord(formattedStr, 'multiple');
492
- }
493
-
494
- public getMobileDateElement(date: Date, className?: string): Element {
495
- const wrap: Element = createElement('div', {
496
- className: className,
497
- innerHTML: '<div class="e-m-date">' + this.parent.globalize.formatDate(
498
- date, { format: 'd', calendar: this.parent.getCalendarMode() }) + '</div>' + '<div class="e-m-day">' +
499
- util.capitalizeFirstWord(
500
- this.parent.globalize.formatDate(date, { format: 'E', calendar: this.parent.getCalendarMode() }), 'single') + '</div>'
501
- });
502
- return wrap;
503
- }
504
-
505
- public setResourceHeaderContent(tdElement: Element, tdData: TdData, className: string = cls.TEXT_ELLIPSIS): void {
506
- if (this.parent.activeViewOptions.resourceHeaderTemplate) {
507
- const data: ResourceDetails = { resource: tdData.resource, resourceData: tdData.resourceData };
508
- const scheduleId: string = this.parent.element.id + '_';
509
- const viewName: string = this.parent.activeViewOptions.resourceHeaderTemplateName;
510
- const templateId: string = scheduleId + viewName + 'resourceHeaderTemplate';
511
- const quickTemplate: HTMLElement[] = [].slice.call(this.parent.getResourceHeaderTemplate()(data, this.parent, 'resourceHeaderTemplate',
512
- templateId, false, undefined,
513
- undefined, this.parent.root));
514
- append(quickTemplate, tdElement);
515
- } else {
516
- const resourceText: HTMLElement = createElement('div', { className: className });
517
- this.parent.sanitize(tdData.resourceData[tdData.resource.textField] as string, resourceText);
518
- tdElement.appendChild(resourceText);
519
- }
520
- }
521
-
522
- public renderResourceMobileLayout(): void {
523
- if (this.parent.resourceBase.lastResourceLevel && this.parent.resourceBase.lastResourceLevel.length <= 0) {
524
- return;
525
- }
526
- this.parent.resourceBase.renderResourceHeader();
527
- this.parent.resourceBase.renderResourceTree();
528
- }
529
-
530
- public addAutoHeightClass(element: Element): void {
531
- if (!this.parent.uiStateValues.isGroupAdaptive && this.parent.rowAutoHeight && this.isTimelineView()
532
- && this.parent.activeViewOptions.group.resources.length > 0) {
533
- addClass([element], cls.AUTO_HEIGHT);
534
- }
535
- }
536
-
537
- private getColElements(): HTMLElement[] {
538
- return [].slice.call(this.element.querySelectorAll('.' + cls.CONTENT_WRAP_CLASS + ' col, .' + cls.DATE_HEADER_WRAP_CLASS + ' col'));
539
- }
540
-
541
- public setColWidth(content: HTMLElement): void {
542
- if (this.isTimelineView()) {
543
- const colElements: HTMLElement[] = this.getColElements();
544
- const contentBody: HTMLElement = this.element.querySelector('.' + cls.CONTENT_TABLE_CLASS + ' tbody') as HTMLElement;
545
- const colWidth: number = (this.parent.getElementWidth(contentBody) / (colElements.length / 2));
546
- if (content.offsetHeight !== content.clientHeight) {
547
- const resourceColumn: HTMLElement = this.parent.element.querySelector('.' + cls.RESOURCE_COLUMN_WRAP_CLASS);
548
- if (!isNullOrUndefined(resourceColumn) && resourceColumn.offsetHeight !== content.clientHeight) {
549
- setStyleAttribute(resourceColumn, { 'height': formatUnit(content.clientHeight) });
550
- }
551
- }
552
- const cssClass: string = `.${cls.HEADER_CELLS_CLASS},.${cls.TIME_SLOT_CLASS},.${cls.HEADER_WEEK_CELLS_CLASS},.${cls.HEADER_MONTH_CELLS_CLASS},.${cls.HEADER_YEAR_CELLS_CLASS}`;
553
- const headerCellElements: HTMLElement[] = [].slice.call(this.element.querySelectorAll(cssClass));
554
- headerCellElements.forEach((ele: HTMLElement) => {
555
- const colSpan: string = isNullOrUndefined(ele.getAttribute('colspan')) ? '1' : ele.getAttribute('colspan');
556
- const headerCellColSpan: number = parseInt(colSpan, 10);
557
- setStyleAttribute(ele, { 'width': formatUnit(colWidth * headerCellColSpan) });
558
- });
559
- }
560
- }
561
-
562
- public resetColWidth(): void {
563
- const colElements: HTMLElement[] = this.getColElements();
564
- for (const col of colElements) {
565
- col.style.width = '';
566
- }
567
- }
568
-
569
- public getContentAreaElement(): HTMLElement {
570
- return this.element.querySelector('.' + cls.CONTENT_WRAP_CLASS) as HTMLElement;
571
- }
572
-
573
- public wireExpandCollapseIconEvents(): void {
574
- if (this.parent.resourceBase && this.parent.resourceBase.resourceCollection.length > 1) {
575
- const treeIcons: HTMLElement[] = [].slice.call(this.element.querySelectorAll('.' + cls.RESOURCE_TREE_ICON_CLASS));
576
- for (const icon of treeIcons) {
577
- EventHandler.clearEvents(icon);
578
- EventHandler.add(icon, 'click', this.parent.resourceBase.onTreeIconClick, this.parent.resourceBase);
579
- }
580
- }
581
- }
582
-
583
- public scrollToDate(scrollDate: Date): void {
584
- if (['Month', 'TimelineMonth'].indexOf(this.parent.currentView) === -1 || isNullOrUndefined(scrollDate)) {
585
- return;
586
- }
587
- const scrollWrap: HTMLElement = this.getContentAreaElement();
588
- const tdDate: number = new Date(util.resetTime(new Date(+scrollDate)).getTime()).getTime();
589
- const dateElement: HTMLElement = scrollWrap.querySelector(`.${cls.WORK_CELLS_CLASS}[data-date="${tdDate}"]`) as HTMLElement;
590
- if (this.parent.currentView === 'Month' && dateElement) {
591
- if (scrollWrap.scrollWidth > scrollWrap.clientWidth) {
592
- if (!this.parent.enableRtl) {
593
- scrollWrap.scrollLeft = dateElement.offsetLeft;
594
- } else {
595
- scrollWrap.scrollLeft = -(this.parent.getContentTable().offsetWidth - dateElement.offsetLeft - dateElement.offsetWidth);
596
- }
597
- }
598
- scrollWrap.scrollTop = dateElement.offsetTop;
599
- }
600
- if (this.parent.currentView === 'TimelineMonth' && dateElement) {
601
- if (!this.parent.enableRtl) {
602
- scrollWrap.scrollLeft = dateElement.offsetLeft;
603
- } else {
604
- scrollWrap.scrollLeft = -(this.parent.getContentTable().offsetWidth - dateElement.offsetLeft - dateElement.offsetWidth);
605
- }
606
- }
607
- }
608
-
609
- public setPersistence(): void {
610
- if (this.parent.enablePersistence) {
611
- const contentWrap: HTMLElement = this.element.querySelector('.e-content-wrap') as HTMLElement;
612
- if (this.parent.virtualScrollModule && this.isScrolledBottom) {
613
- this.isScrolledBottom = false;
614
- this.skipPersistenceSave = true;
615
- contentWrap.scrollTop = this.parent.scrollTop;
616
- this.skipPersistenceSave = false;
617
- }
618
- if (!isNullOrUndefined(contentWrap)) {
619
- this.parent.scrollLeft = contentWrap.scrollLeft;
620
- this.parent.scrollTop = contentWrap.scrollTop;
621
- }
622
- }
623
- }
624
-
625
- public retainScrollPosition(): void {
626
- if (this.parent.enablePersistence) {
627
- const conWrap: HTMLElement = this.parent.element.querySelector('.e-content-wrap') as HTMLElement;
628
- if (!isNullOrUndefined(conWrap) && !isNullOrUndefined(this.parent.scrollLeft) && !isNullOrUndefined(this.parent.scrollTop)) {
629
- this.isScrolledBottom = conWrap.scrollHeight - conWrap.clientHeight < this.parent.scrollTop;
630
- conWrap.scrollTop = this.parent.scrollTop;
631
- conWrap.scrollLeft = this.parent.scrollLeft;
632
- }
633
- }
634
- }
635
-
636
- public getViewStartDate(): Date {
637
- let startDate: Date = this.renderDates[0];
638
- if (this.parent.activeViewOptions.group.resources.length > 0 && this.parent.resourceBase.lastResourceLevel.length > 0) {
639
- startDate = this.parent.resourceBase.getResourceRenderDates()[0];
640
- }
641
- return startDate;
642
- }
643
-
644
- public getViewEndDate(): Date {
645
- let endDate: Date = util.addDays(this.renderDates[this.renderDates.length - 1], 1);
646
- if (this.parent.activeViewOptions.group.resources.length > 0 && this.parent.resourceBase.lastResourceLevel.length > 0) {
647
- endDate = util.addDays(this.parent.resourceBase.getResourceRenderDates().slice(-1)[0], 1);
648
- }
649
- return endDate;
650
- }
651
-
652
- public getAdjustedDate(startTime: Date): Date {
653
- if (!this.parent.activeViewOptions.timeScale.enable || this.parent.currentView === 'Month' ||
654
- (this.parent.currentView === 'TimelineYear' && this.parent.activeViewOptions.group.resources.length === 0)) {
655
- return new Date(startTime.setHours(0, 0, 0, 0));
656
- }
657
- else if (this.parent.currentView === 'TimelineYear' && this.parent.activeViewOptions.group.resources.length > 0) {
658
- startTime.setHours(0, 0, 0, 0);
659
- return new Date(startTime.setDate(1));
660
- }
661
- return null;
662
- }
663
-
664
- public resetColLevels(): void {
665
- this.parent.resourceBase.expandedResources = [];
666
- const renderedCount: number = this.parent.virtualScrollModule.getRenderedCount();
667
- const lastLevel: TdData[] = this.parent.activeViewOptions.group.byDate ? this.colLevels[0] :
668
- this.parent.resourceBase.renderedResources;
669
- let index: number = 0;
670
- for (let i: number = 0; i < lastLevel.length; i++) {
671
- if (index >= renderedCount) {
672
- break;
673
- }
674
- index += lastLevel[parseInt(i.toString(), 10)].colSpan;
675
- this.parent.resourceBase.expandedResources.push(lastLevel[parseInt(i.toString(), 10)]);
676
- }
677
- if (this.parent.activeViewOptions.group.byDate) {
678
- this.colLevels[0] = this.parent.resourceBase.expandedResources;
679
- this.parent.virtualScrollModule.setRenderedDates(this.parent.resourceBase.expandedResources);
680
- } else {
681
- this.colLevels[this.colLevels.length - 2] = this.parent.resourceBase.expandedResources;
682
- this.parent.resourceBase.renderedResources = this.parent.resourceBase.expandedResources;
683
- }
684
- if (this.parent.currentView !== 'Month') {
685
- this.colLevels[this.colLevels.length - 1] = this.colLevels[this.colLevels.length - 1].slice(0, index);
686
- this.parent.resourceBase.expandedResources = this.colLevels[this.colLevels.length - 1];
687
- }
688
- }
689
-
690
- public getGroupIndices(dataCollection?: TdData[]): number[] {
691
- let groupIndices: number[] = [];
692
- if (this.parent.virtualScrollModule && this.parent.activeViewOptions.group.resources.length > 0 && (dataCollection ||
693
- this.parent.virtualScrollModule.existingDataCollection.length > 0) && !this.parent.uiStateValues.isGroupAdaptive) {
694
- dataCollection = isNullOrUndefined(dataCollection) ? this.parent.virtualScrollModule.existingDataCollection : dataCollection;
695
- groupIndices = dataCollection.map((data: TdData) => data.groupIndex);
696
- }
697
- return groupIndices;
698
- }
699
-
700
- public destroy(): void {
701
- if (this.element && this.element.parentNode) {
702
- remove(this.element);
703
- }
704
- this.element = null;
705
- this.renderDates = null;
706
- this.colLevels = null;
707
- }
708
-
709
- }