@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.
Files changed (168) 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 +7 -3
  5. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  6. package/dist/es6/ej2-schedule.es5.js +6 -2
  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 +18 -53
  12. package/src/schedule/actions/virtual-scroll.js +5 -1
  13. package/src/schedule/event-renderer/event-base.js +1 -1
  14. package/styles/bootstrap4-lite.css +8 -0
  15. package/styles/bootstrap4.css +8 -0
  16. package/styles/recurrence-editor/bootstrap4.css +8 -0
  17. package/styles/schedule/bootstrap4.css +8 -0
  18. package/dist/ts/common/calendar-util.d.ts +0 -92
  19. package/dist/ts/common/calendar-util.ts +0 -261
  20. package/dist/ts/common/index.d.ts +0 -4
  21. package/dist/ts/common/index.ts +0 -4
  22. package/dist/ts/components.d.ts +0 -5
  23. package/dist/ts/components.ts +0 -5
  24. package/dist/ts/index.d.ts +0 -6
  25. package/dist/ts/index.ts +0 -7
  26. package/dist/ts/recurrence-editor/date-generator.d.ts +0 -76
  27. package/dist/ts/recurrence-editor/date-generator.ts +0 -1699
  28. package/dist/ts/recurrence-editor/index.d.ts +0 -6
  29. package/dist/ts/recurrence-editor/index.ts +0 -6
  30. package/dist/ts/recurrence-editor/recurrence-editor-model.d.ts +0 -112
  31. package/dist/ts/recurrence-editor/recurrence-editor.d.ts +0 -245
  32. package/dist/ts/recurrence-editor/recurrence-editor.ts +0 -1257
  33. package/dist/ts/schedule/actions/action-base.d.ts +0 -44
  34. package/dist/ts/schedule/actions/action-base.ts +0 -493
  35. package/dist/ts/schedule/actions/crud.d.ts +0 -41
  36. package/dist/ts/schedule/actions/crud.ts +0 -784
  37. package/dist/ts/schedule/actions/data.d.ts +0 -63
  38. package/dist/ts/schedule/actions/data.ts +0 -128
  39. package/dist/ts/schedule/actions/drag.d.ts +0 -75
  40. package/dist/ts/schedule/actions/drag.ts +0 -1401
  41. package/dist/ts/schedule/actions/keyboard.d.ts +0 -100
  42. package/dist/ts/schedule/actions/keyboard.ts +0 -1435
  43. package/dist/ts/schedule/actions/resize.d.ts +0 -27
  44. package/dist/ts/schedule/actions/resize.ts +0 -602
  45. package/dist/ts/schedule/actions/scroll.d.ts +0 -69
  46. package/dist/ts/schedule/actions/scroll.ts +0 -105
  47. package/dist/ts/schedule/actions/touch.d.ts +0 -32
  48. package/dist/ts/schedule/actions/touch.ts +0 -314
  49. package/dist/ts/schedule/actions/virtual-scroll.d.ts +0 -55
  50. package/dist/ts/schedule/actions/virtual-scroll.ts +0 -596
  51. package/dist/ts/schedule/actions/work-cells.d.ts +0 -14
  52. package/dist/ts/schedule/actions/work-cells.ts +0 -151
  53. package/dist/ts/schedule/base/constant.d.ts +0 -102
  54. package/dist/ts/schedule/base/constant.ts +0 -103
  55. package/dist/ts/schedule/base/css-constant.d.ts +0 -475
  56. package/dist/ts/schedule/base/css-constant.ts +0 -475
  57. package/dist/ts/schedule/base/interface.d.ts +0 -673
  58. package/dist/ts/schedule/base/interface.ts +0 -738
  59. package/dist/ts/schedule/base/resource.d.ts +0 -59
  60. package/dist/ts/schedule/base/resource.ts +0 -1091
  61. package/dist/ts/schedule/base/schedule-model.d.ts +0 -930
  62. package/dist/ts/schedule/base/schedule.d.ts +0 -1967
  63. package/dist/ts/schedule/base/schedule.ts +0 -4221
  64. package/dist/ts/schedule/base/type.d.ts +0 -134
  65. package/dist/ts/schedule/base/type.ts +0 -142
  66. package/dist/ts/schedule/base/util.d.ts +0 -266
  67. package/dist/ts/schedule/base/util.ts +0 -492
  68. package/dist/ts/schedule/event-renderer/agenda-base.d.ts +0 -15
  69. package/dist/ts/schedule/event-renderer/agenda-base.ts +0 -423
  70. package/dist/ts/schedule/event-renderer/event-base.d.ts +0 -101
  71. package/dist/ts/schedule/event-renderer/event-base.ts +0 -1501
  72. package/dist/ts/schedule/event-renderer/inline-edit.d.ts +0 -23
  73. package/dist/ts/schedule/event-renderer/inline-edit.ts +0 -287
  74. package/dist/ts/schedule/event-renderer/month.d.ts +0 -60
  75. package/dist/ts/schedule/event-renderer/month.ts +0 -760
  76. package/dist/ts/schedule/event-renderer/timeline-view.d.ts +0 -51
  77. package/dist/ts/schedule/event-renderer/timeline-view.ts +0 -606
  78. package/dist/ts/schedule/event-renderer/vertical-view.d.ts +0 -57
  79. package/dist/ts/schedule/event-renderer/vertical-view.ts +0 -898
  80. package/dist/ts/schedule/event-renderer/year.d.ts +0 -27
  81. package/dist/ts/schedule/event-renderer/year.ts +0 -623
  82. package/dist/ts/schedule/exports/calendar-export.d.ts +0 -16
  83. package/dist/ts/schedule/exports/calendar-export.ts +0 -160
  84. package/dist/ts/schedule/exports/calendar-import.d.ts +0 -18
  85. package/dist/ts/schedule/exports/calendar-import.ts +0 -277
  86. package/dist/ts/schedule/exports/excel-export.d.ts +0 -14
  87. package/dist/ts/schedule/exports/excel-export.ts +0 -89
  88. package/dist/ts/schedule/exports/index.d.ts +0 -7
  89. package/dist/ts/schedule/exports/index.ts +0 -7
  90. package/dist/ts/schedule/exports/print.d.ts +0 -20
  91. package/dist/ts/schedule/exports/print.ts +0 -233
  92. package/dist/ts/schedule/index.d.ts +0 -26
  93. package/dist/ts/schedule/index.ts +0 -26
  94. package/dist/ts/schedule/models/event-settings-model.d.ts +0 -165
  95. package/dist/ts/schedule/models/event-settings.d.ts +0 -149
  96. package/dist/ts/schedule/models/event-settings.ts +0 -187
  97. package/dist/ts/schedule/models/field-options-model.d.ts +0 -37
  98. package/dist/ts/schedule/models/field-options.d.ts +0 -31
  99. package/dist/ts/schedule/models/field-options.ts +0 -41
  100. package/dist/ts/schedule/models/fields-model.d.ts +0 -129
  101. package/dist/ts/schedule/models/fields.d.ts +0 -117
  102. package/dist/ts/schedule/models/fields.ts +0 -149
  103. package/dist/ts/schedule/models/group-model.d.ts +0 -69
  104. package/dist/ts/schedule/models/group.d.ts +0 -60
  105. package/dist/ts/schedule/models/group.ts +0 -75
  106. package/dist/ts/schedule/models/header-rows-model.d.ts +0 -33
  107. package/dist/ts/schedule/models/header-rows.d.ts +0 -30
  108. package/dist/ts/schedule/models/header-rows.ts +0 -35
  109. package/dist/ts/schedule/models/models.d.ts +0 -14
  110. package/dist/ts/schedule/models/models.ts +0 -15
  111. package/dist/ts/schedule/models/quick-info-templates-model.d.ts +0 -52
  112. package/dist/ts/schedule/models/quick-info-templates.d.ts +0 -47
  113. package/dist/ts/schedule/models/quick-info-templates.ts +0 -56
  114. package/dist/ts/schedule/models/resources-model.d.ts +0 -122
  115. package/dist/ts/schedule/models/resources.d.ts +0 -106
  116. package/dist/ts/schedule/models/resources.ts +0 -138
  117. package/dist/ts/schedule/models/time-scale-model.d.ts +0 -57
  118. package/dist/ts/schedule/models/time-scale.d.ts +0 -50
  119. package/dist/ts/schedule/models/time-scale.ts +0 -61
  120. package/dist/ts/schedule/models/toolbar-model.d.ts +0 -196
  121. package/dist/ts/schedule/models/toolbar.d.ts +0 -176
  122. package/dist/ts/schedule/models/toolbar.ts +0 -196
  123. package/dist/ts/schedule/models/views-model.d.ts +0 -370
  124. package/dist/ts/schedule/models/views.d.ts +0 -335
  125. package/dist/ts/schedule/models/views.ts +0 -408
  126. package/dist/ts/schedule/models/work-hours-model.d.ts +0 -29
  127. package/dist/ts/schedule/models/work-hours.d.ts +0 -24
  128. package/dist/ts/schedule/models/work-hours.ts +0 -31
  129. package/dist/ts/schedule/popups/event-tooltip.d.ts +0 -16
  130. package/dist/ts/schedule/popups/event-tooltip.ts +0 -203
  131. package/dist/ts/schedule/popups/event-window.d.ts +0 -118
  132. package/dist/ts/schedule/popups/event-window.ts +0 -2055
  133. package/dist/ts/schedule/popups/form-validator.d.ts +0 -16
  134. package/dist/ts/schedule/popups/form-validator.ts +0 -110
  135. package/dist/ts/schedule/popups/quick-popups.d.ts +0 -78
  136. package/dist/ts/schedule/popups/quick-popups.ts +0 -1470
  137. package/dist/ts/schedule/renderer/agenda.d.ts +0 -45
  138. package/dist/ts/schedule/renderer/agenda.ts +0 -497
  139. package/dist/ts/schedule/renderer/day.d.ts +0 -20
  140. package/dist/ts/schedule/renderer/day.ts +0 -28
  141. package/dist/ts/schedule/renderer/header-renderer.d.ts +0 -48
  142. package/dist/ts/schedule/renderer/header-renderer.ts +0 -736
  143. package/dist/ts/schedule/renderer/month-agenda.d.ts +0 -29
  144. package/dist/ts/schedule/renderer/month-agenda.ts +0 -184
  145. package/dist/ts/schedule/renderer/month.d.ts +0 -61
  146. package/dist/ts/schedule/renderer/month.ts +0 -766
  147. package/dist/ts/schedule/renderer/renderer.d.ts +0 -13
  148. package/dist/ts/schedule/renderer/renderer.ts +0 -165
  149. package/dist/ts/schedule/renderer/timeline-header-row.d.ts +0 -15
  150. package/dist/ts/schedule/renderer/timeline-header-row.ts +0 -132
  151. package/dist/ts/schedule/renderer/timeline-month.d.ts +0 -29
  152. package/dist/ts/schedule/renderer/timeline-month.ts +0 -184
  153. package/dist/ts/schedule/renderer/timeline-view.d.ts +0 -31
  154. package/dist/ts/schedule/renderer/timeline-view.ts +0 -308
  155. package/dist/ts/schedule/renderer/timeline-year.d.ts +0 -22
  156. package/dist/ts/schedule/renderer/timeline-year.ts +0 -450
  157. package/dist/ts/schedule/renderer/vertical-view.d.ts +0 -63
  158. package/dist/ts/schedule/renderer/vertical-view.ts +0 -911
  159. package/dist/ts/schedule/renderer/view-base.d.ts +0 -83
  160. package/dist/ts/schedule/renderer/view-base.ts +0 -709
  161. package/dist/ts/schedule/renderer/week.d.ts +0 -22
  162. package/dist/ts/schedule/renderer/week.ts +0 -35
  163. package/dist/ts/schedule/renderer/work-week.d.ts +0 -22
  164. package/dist/ts/schedule/renderer/work-week.ts +0 -36
  165. package/dist/ts/schedule/renderer/year.d.ts +0 -46
  166. package/dist/ts/schedule/renderer/year.ts +0 -470
  167. package/dist/ts/schedule/timezone/timezone.d.ts +0 -16
  168. 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
- }