@syncfusion/ej2-schedule 30.2.4 → 31.1.17

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 (308) 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 +132 -43
  5. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  6. package/dist/es6/ej2-schedule.es5.js +132 -43
  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/dist/ts/common/calendar-util.d.ts +92 -0
  12. package/dist/ts/common/calendar-util.ts +261 -0
  13. package/dist/ts/common/index.d.ts +4 -0
  14. package/dist/ts/common/index.ts +4 -0
  15. package/dist/ts/components.d.ts +5 -0
  16. package/dist/ts/components.ts +5 -0
  17. package/dist/ts/index.d.ts +6 -0
  18. package/dist/ts/index.ts +7 -0
  19. package/dist/ts/recurrence-editor/date-generator.d.ts +76 -0
  20. package/dist/ts/recurrence-editor/date-generator.ts +1699 -0
  21. package/dist/ts/recurrence-editor/index.d.ts +6 -0
  22. package/dist/ts/recurrence-editor/index.ts +6 -0
  23. package/dist/ts/recurrence-editor/recurrence-editor-model.d.ts +112 -0
  24. package/dist/ts/recurrence-editor/recurrence-editor.d.ts +245 -0
  25. package/dist/ts/recurrence-editor/recurrence-editor.ts +1257 -0
  26. package/dist/ts/schedule/actions/action-base.d.ts +44 -0
  27. package/dist/ts/schedule/actions/action-base.ts +493 -0
  28. package/dist/ts/schedule/actions/crud.d.ts +41 -0
  29. package/dist/ts/schedule/actions/crud.ts +784 -0
  30. package/dist/ts/schedule/actions/data.d.ts +63 -0
  31. package/dist/ts/schedule/actions/data.ts +128 -0
  32. package/dist/ts/schedule/actions/drag.d.ts +75 -0
  33. package/dist/ts/schedule/actions/drag.ts +1401 -0
  34. package/dist/ts/schedule/actions/keyboard.d.ts +100 -0
  35. package/dist/ts/schedule/actions/keyboard.ts +1435 -0
  36. package/dist/ts/schedule/actions/resize.d.ts +27 -0
  37. package/dist/ts/schedule/actions/resize.ts +602 -0
  38. package/dist/ts/schedule/actions/scroll.d.ts +69 -0
  39. package/dist/ts/schedule/actions/scroll.ts +105 -0
  40. package/dist/ts/schedule/actions/touch.d.ts +32 -0
  41. package/dist/ts/schedule/actions/touch.ts +314 -0
  42. package/dist/ts/schedule/actions/virtual-scroll.d.ts +55 -0
  43. package/dist/ts/schedule/actions/virtual-scroll.ts +596 -0
  44. package/dist/ts/schedule/actions/work-cells.d.ts +14 -0
  45. package/dist/ts/schedule/actions/work-cells.ts +151 -0
  46. package/dist/ts/schedule/base/constant.d.ts +102 -0
  47. package/dist/ts/schedule/base/constant.ts +103 -0
  48. package/dist/ts/schedule/base/css-constant.d.ts +475 -0
  49. package/dist/ts/schedule/base/css-constant.ts +475 -0
  50. package/dist/ts/schedule/base/interface.d.ts +673 -0
  51. package/dist/ts/schedule/base/interface.ts +738 -0
  52. package/dist/ts/schedule/base/resource.d.ts +59 -0
  53. package/dist/ts/schedule/base/resource.ts +1091 -0
  54. package/dist/ts/schedule/base/schedule-model.d.ts +930 -0
  55. package/dist/ts/schedule/base/schedule.d.ts +1967 -0
  56. package/dist/ts/schedule/base/schedule.ts +4221 -0
  57. package/dist/ts/schedule/base/type.d.ts +134 -0
  58. package/dist/ts/schedule/base/type.ts +142 -0
  59. package/dist/ts/schedule/base/util.d.ts +266 -0
  60. package/dist/ts/schedule/base/util.ts +492 -0
  61. package/dist/ts/schedule/event-renderer/agenda-base.d.ts +15 -0
  62. package/dist/ts/schedule/event-renderer/agenda-base.ts +423 -0
  63. package/dist/ts/schedule/event-renderer/event-base.d.ts +101 -0
  64. package/dist/ts/schedule/event-renderer/event-base.ts +1501 -0
  65. package/dist/ts/schedule/event-renderer/inline-edit.d.ts +23 -0
  66. package/dist/ts/schedule/event-renderer/inline-edit.ts +287 -0
  67. package/dist/ts/schedule/event-renderer/month.d.ts +60 -0
  68. package/dist/ts/schedule/event-renderer/month.ts +760 -0
  69. package/dist/ts/schedule/event-renderer/timeline-view.d.ts +51 -0
  70. package/dist/ts/schedule/event-renderer/timeline-view.ts +606 -0
  71. package/dist/ts/schedule/event-renderer/vertical-view.d.ts +57 -0
  72. package/dist/ts/schedule/event-renderer/vertical-view.ts +898 -0
  73. package/dist/ts/schedule/event-renderer/year.d.ts +27 -0
  74. package/dist/ts/schedule/event-renderer/year.ts +623 -0
  75. package/dist/ts/schedule/exports/calendar-export.d.ts +16 -0
  76. package/dist/ts/schedule/exports/calendar-export.ts +160 -0
  77. package/dist/ts/schedule/exports/calendar-import.d.ts +18 -0
  78. package/dist/ts/schedule/exports/calendar-import.ts +277 -0
  79. package/dist/ts/schedule/exports/excel-export.d.ts +14 -0
  80. package/dist/ts/schedule/exports/excel-export.ts +89 -0
  81. package/dist/ts/schedule/exports/index.d.ts +7 -0
  82. package/dist/ts/schedule/exports/index.ts +7 -0
  83. package/dist/ts/schedule/exports/print.d.ts +20 -0
  84. package/dist/ts/schedule/exports/print.ts +233 -0
  85. package/dist/ts/schedule/index.d.ts +26 -0
  86. package/dist/ts/schedule/index.ts +26 -0
  87. package/dist/ts/schedule/models/event-settings-model.d.ts +165 -0
  88. package/dist/ts/schedule/models/event-settings.d.ts +149 -0
  89. package/dist/ts/schedule/models/event-settings.ts +187 -0
  90. package/dist/ts/schedule/models/field-options-model.d.ts +37 -0
  91. package/dist/ts/schedule/models/field-options.d.ts +31 -0
  92. package/dist/ts/schedule/models/field-options.ts +41 -0
  93. package/dist/ts/schedule/models/fields-model.d.ts +129 -0
  94. package/dist/ts/schedule/models/fields.d.ts +117 -0
  95. package/dist/ts/schedule/models/fields.ts +149 -0
  96. package/dist/ts/schedule/models/group-model.d.ts +69 -0
  97. package/dist/ts/schedule/models/group.d.ts +60 -0
  98. package/dist/ts/schedule/models/group.ts +75 -0
  99. package/dist/ts/schedule/models/header-rows-model.d.ts +33 -0
  100. package/dist/ts/schedule/models/header-rows.d.ts +30 -0
  101. package/dist/ts/schedule/models/header-rows.ts +35 -0
  102. package/dist/ts/schedule/models/models.d.ts +14 -0
  103. package/dist/ts/schedule/models/models.ts +15 -0
  104. package/dist/ts/schedule/models/quick-info-templates-model.d.ts +52 -0
  105. package/dist/ts/schedule/models/quick-info-templates.d.ts +47 -0
  106. package/dist/ts/schedule/models/quick-info-templates.ts +56 -0
  107. package/dist/ts/schedule/models/resources-model.d.ts +122 -0
  108. package/dist/ts/schedule/models/resources.d.ts +106 -0
  109. package/dist/ts/schedule/models/resources.ts +138 -0
  110. package/dist/ts/schedule/models/time-scale-model.d.ts +57 -0
  111. package/dist/ts/schedule/models/time-scale.d.ts +50 -0
  112. package/dist/ts/schedule/models/time-scale.ts +61 -0
  113. package/dist/ts/schedule/models/toolbar-model.d.ts +196 -0
  114. package/dist/ts/schedule/models/toolbar.d.ts +176 -0
  115. package/dist/ts/schedule/models/toolbar.ts +196 -0
  116. package/dist/ts/schedule/models/views-model.d.ts +370 -0
  117. package/dist/ts/schedule/models/views.d.ts +335 -0
  118. package/dist/ts/schedule/models/views.ts +408 -0
  119. package/dist/ts/schedule/models/work-hours-model.d.ts +29 -0
  120. package/dist/ts/schedule/models/work-hours.d.ts +24 -0
  121. package/dist/ts/schedule/models/work-hours.ts +31 -0
  122. package/dist/ts/schedule/popups/event-tooltip.d.ts +16 -0
  123. package/dist/ts/schedule/popups/event-tooltip.ts +203 -0
  124. package/dist/ts/schedule/popups/event-window.d.ts +118 -0
  125. package/dist/ts/schedule/popups/event-window.ts +2055 -0
  126. package/dist/ts/schedule/popups/form-validator.d.ts +16 -0
  127. package/dist/ts/schedule/popups/form-validator.ts +110 -0
  128. package/dist/ts/schedule/popups/quick-popups.d.ts +78 -0
  129. package/dist/ts/schedule/popups/quick-popups.ts +1470 -0
  130. package/dist/ts/schedule/renderer/agenda.d.ts +45 -0
  131. package/dist/ts/schedule/renderer/agenda.ts +497 -0
  132. package/dist/ts/schedule/renderer/day.d.ts +20 -0
  133. package/dist/ts/schedule/renderer/day.ts +28 -0
  134. package/dist/ts/schedule/renderer/header-renderer.d.ts +48 -0
  135. package/dist/ts/schedule/renderer/header-renderer.ts +736 -0
  136. package/dist/ts/schedule/renderer/month-agenda.d.ts +29 -0
  137. package/dist/ts/schedule/renderer/month-agenda.ts +184 -0
  138. package/dist/ts/schedule/renderer/month.d.ts +61 -0
  139. package/dist/ts/schedule/renderer/month.ts +766 -0
  140. package/dist/ts/schedule/renderer/renderer.d.ts +13 -0
  141. package/dist/ts/schedule/renderer/renderer.ts +165 -0
  142. package/dist/ts/schedule/renderer/timeline-header-row.d.ts +15 -0
  143. package/dist/ts/schedule/renderer/timeline-header-row.ts +132 -0
  144. package/dist/ts/schedule/renderer/timeline-month.d.ts +29 -0
  145. package/dist/ts/schedule/renderer/timeline-month.ts +184 -0
  146. package/dist/ts/schedule/renderer/timeline-view.d.ts +31 -0
  147. package/dist/ts/schedule/renderer/timeline-view.ts +308 -0
  148. package/dist/ts/schedule/renderer/timeline-year.d.ts +22 -0
  149. package/dist/ts/schedule/renderer/timeline-year.ts +450 -0
  150. package/dist/ts/schedule/renderer/vertical-view.d.ts +63 -0
  151. package/dist/ts/schedule/renderer/vertical-view.ts +911 -0
  152. package/dist/ts/schedule/renderer/view-base.d.ts +83 -0
  153. package/dist/ts/schedule/renderer/view-base.ts +709 -0
  154. package/dist/ts/schedule/renderer/week.d.ts +22 -0
  155. package/dist/ts/schedule/renderer/week.ts +35 -0
  156. package/dist/ts/schedule/renderer/work-week.d.ts +22 -0
  157. package/dist/ts/schedule/renderer/work-week.ts +36 -0
  158. package/dist/ts/schedule/renderer/year.d.ts +46 -0
  159. package/dist/ts/schedule/renderer/year.ts +470 -0
  160. package/dist/ts/schedule/timezone/timezone.d.ts +16 -0
  161. package/dist/ts/schedule/timezone/timezone.ts +313 -0
  162. package/package.json +56 -21
  163. package/src/schedule/actions/action-base.js +3 -0
  164. package/src/schedule/actions/drag.js +11 -4
  165. package/src/schedule/actions/keyboard.js +1 -1
  166. package/src/schedule/actions/resize.js +9 -5
  167. package/src/schedule/actions/virtual-scroll.js +3 -0
  168. package/src/schedule/base/css-constant.d.ts +2 -0
  169. package/src/schedule/base/css-constant.js +2 -0
  170. package/src/schedule/base/schedule.js +15 -1
  171. package/src/schedule/event-renderer/agenda-base.d.ts +1 -1
  172. package/src/schedule/event-renderer/agenda-base.js +5 -4
  173. package/src/schedule/event-renderer/inline-edit.js +11 -6
  174. package/src/schedule/event-renderer/month.js +5 -3
  175. package/src/schedule/event-renderer/vertical-view.js +3 -0
  176. package/src/schedule/event-renderer/year.d.ts +2 -0
  177. package/src/schedule/event-renderer/year.js +28 -4
  178. package/src/schedule/popups/event-tooltip.js +4 -0
  179. package/src/schedule/popups/event-window.js +2 -2
  180. package/src/schedule/popups/quick-popups.js +5 -1
  181. package/src/schedule/renderer/agenda.js +3 -2
  182. package/src/schedule/renderer/month.js +9 -7
  183. package/src/schedule/renderer/vertical-view.js +1 -1
  184. package/src/schedule/renderer/view-base.d.ts +2 -0
  185. package/src/schedule/renderer/view-base.js +9 -0
  186. package/src/schedule/renderer/year.js +3 -2
  187. package/styles/bds-lite.css +11 -8
  188. package/styles/bds.css +11 -8
  189. package/styles/bootstrap-dark-lite.css +12 -9
  190. package/styles/bootstrap-dark.css +12 -9
  191. package/styles/bootstrap-lite.css +12 -9
  192. package/styles/bootstrap.css +12 -9
  193. package/styles/bootstrap4-lite.css +11 -8
  194. package/styles/bootstrap4.css +11 -8
  195. package/styles/bootstrap5-dark-lite.css +11 -8
  196. package/styles/bootstrap5-dark.css +11 -8
  197. package/styles/bootstrap5-lite.css +11 -8
  198. package/styles/bootstrap5.3-lite.css +11 -8
  199. package/styles/bootstrap5.3.css +11 -8
  200. package/styles/bootstrap5.css +11 -8
  201. package/styles/fabric-dark-lite.css +12 -9
  202. package/styles/fabric-dark.css +12 -9
  203. package/styles/fabric-lite.css +12 -9
  204. package/styles/fabric.css +12 -9
  205. package/styles/fluent-dark-lite.css +13 -10
  206. package/styles/fluent-dark.css +13 -10
  207. package/styles/fluent-lite.css +13 -10
  208. package/styles/fluent.css +13 -10
  209. package/styles/fluent2-lite.css +11 -8
  210. package/styles/fluent2.css +11 -8
  211. package/styles/highcontrast-light-lite.css +12 -9
  212. package/styles/highcontrast-light.css +12 -9
  213. package/styles/highcontrast-lite.css +12 -9
  214. package/styles/highcontrast.css +12 -9
  215. package/styles/material-dark-lite.css +12 -9
  216. package/styles/material-dark.css +12 -9
  217. package/styles/material-lite.css +12 -9
  218. package/styles/material.css +12 -9
  219. package/styles/material3-dark-lite.css +11 -8
  220. package/styles/material3-dark.css +11 -8
  221. package/styles/material3-lite.css +11 -8
  222. package/styles/material3.css +11 -8
  223. package/styles/recurrence-editor/_bds-definition.scss +1 -0
  224. package/styles/recurrence-editor/_bootstrap-dark-definition.scss +1 -0
  225. package/styles/recurrence-editor/_bootstrap-definition.scss +1 -0
  226. package/styles/recurrence-editor/_bootstrap4-definition.scss +1 -0
  227. package/styles/recurrence-editor/_bootstrap5-definition.scss +1 -0
  228. package/styles/recurrence-editor/_bootstrap5.3-definition.scss +1 -0
  229. package/styles/recurrence-editor/_fabric-dark-definition.scss +1 -0
  230. package/styles/recurrence-editor/_fabric-definition.scss +1 -0
  231. package/styles/recurrence-editor/_fluent-definition.scss +1 -0
  232. package/styles/recurrence-editor/_fluent2-definition.scss +1 -0
  233. package/styles/recurrence-editor/_fusionnew-definition.scss +1 -0
  234. package/styles/recurrence-editor/_highcontrast-definition.scss +1 -0
  235. package/styles/recurrence-editor/_highcontrast-light-definition.scss +1 -0
  236. package/styles/recurrence-editor/_layout.scss +5 -1
  237. package/styles/recurrence-editor/_material-dark-definition.scss +1 -0
  238. package/styles/recurrence-editor/_material-definition.scss +1 -0
  239. package/styles/recurrence-editor/_material3-definition.scss +1 -0
  240. package/styles/recurrence-editor/_tailwind-definition.scss +1 -0
  241. package/styles/recurrence-editor/_tailwind3-definition.scss +1 -0
  242. package/styles/recurrence-editor/bds.css +3 -0
  243. package/styles/recurrence-editor/bootstrap-dark.css +4 -1
  244. package/styles/recurrence-editor/bootstrap.css +4 -1
  245. package/styles/recurrence-editor/bootstrap4.css +3 -0
  246. package/styles/recurrence-editor/bootstrap5-dark.css +3 -0
  247. package/styles/recurrence-editor/bootstrap5.3.css +3 -0
  248. package/styles/recurrence-editor/bootstrap5.css +3 -0
  249. package/styles/recurrence-editor/fabric-dark.css +4 -1
  250. package/styles/recurrence-editor/fabric.css +4 -1
  251. package/styles/recurrence-editor/fluent-dark.css +4 -1
  252. package/styles/recurrence-editor/fluent.css +4 -1
  253. package/styles/recurrence-editor/fluent2.css +3 -0
  254. package/styles/recurrence-editor/highcontrast-light.css +4 -1
  255. package/styles/recurrence-editor/highcontrast.css +4 -1
  256. package/styles/recurrence-editor/material-dark.css +4 -1
  257. package/styles/recurrence-editor/material.css +4 -1
  258. package/styles/recurrence-editor/material3-dark.css +3 -0
  259. package/styles/recurrence-editor/material3.css +3 -0
  260. package/styles/recurrence-editor/tailwind-dark.css +3 -0
  261. package/styles/recurrence-editor/tailwind.css +3 -0
  262. package/styles/recurrence-editor/tailwind3.css +3 -0
  263. package/styles/schedule/_bds-definition.scss +2 -0
  264. package/styles/schedule/_bootstrap-dark-definition.scss +2 -0
  265. package/styles/schedule/_bootstrap-definition.scss +2 -0
  266. package/styles/schedule/_bootstrap4-definition.scss +2 -0
  267. package/styles/schedule/_bootstrap5-definition.scss +2 -0
  268. package/styles/schedule/_bootstrap5.3-definition.scss +2 -0
  269. package/styles/schedule/_fabric-dark-definition.scss +2 -0
  270. package/styles/schedule/_fabric-definition.scss +2 -0
  271. package/styles/schedule/_fluent-definition.scss +3 -1
  272. package/styles/schedule/_fluent2-definition.scss +2 -0
  273. package/styles/schedule/_fusionnew-definition.scss +2 -0
  274. package/styles/schedule/_highcontrast-definition.scss +2 -0
  275. package/styles/schedule/_highcontrast-light-definition.scss +2 -0
  276. package/styles/schedule/_layout.scss +12 -11
  277. package/styles/schedule/_material-dark-definition.scss +2 -0
  278. package/styles/schedule/_material-definition.scss +2 -0
  279. package/styles/schedule/_material3-definition.scss +2 -0
  280. package/styles/schedule/_tailwind-definition.scss +2 -0
  281. package/styles/schedule/_tailwind3-definition.scss +2 -0
  282. package/styles/schedule/bds.css +8 -8
  283. package/styles/schedule/bootstrap-dark.css +8 -8
  284. package/styles/schedule/bootstrap.css +8 -8
  285. package/styles/schedule/bootstrap4.css +8 -8
  286. package/styles/schedule/bootstrap5-dark.css +8 -8
  287. package/styles/schedule/bootstrap5.3.css +8 -8
  288. package/styles/schedule/bootstrap5.css +8 -8
  289. package/styles/schedule/fabric-dark.css +8 -8
  290. package/styles/schedule/fabric.css +8 -8
  291. package/styles/schedule/fluent-dark.css +9 -9
  292. package/styles/schedule/fluent.css +9 -9
  293. package/styles/schedule/fluent2.css +8 -8
  294. package/styles/schedule/highcontrast-light.css +8 -8
  295. package/styles/schedule/highcontrast.css +8 -8
  296. package/styles/schedule/material-dark.css +8 -8
  297. package/styles/schedule/material.css +8 -8
  298. package/styles/schedule/material3-dark.css +8 -8
  299. package/styles/schedule/material3.css +8 -8
  300. package/styles/schedule/tailwind-dark.css +8 -8
  301. package/styles/schedule/tailwind.css +8 -8
  302. package/styles/schedule/tailwind3.css +8 -8
  303. package/styles/tailwind-dark-lite.css +11 -8
  304. package/styles/tailwind-dark.css +11 -8
  305. package/styles/tailwind-lite.css +11 -8
  306. package/styles/tailwind.css +11 -8
  307. package/styles/tailwind3-lite.css +11 -8
  308. package/styles/tailwind3.css +11 -8
@@ -0,0 +1,27 @@
1
+ import { Schedule } from '../base/schedule';
2
+ import { TimelineEvent } from './timeline-view';
3
+ /**
4
+ * Year view events render
5
+ */
6
+ export declare class YearEvent extends TimelineEvent {
7
+ cellHeader: number;
8
+ private isResource;
9
+ constructor(parent: Schedule);
10
+ renderAppointments(): void;
11
+ private yearViewEvents;
12
+ private timelineYearViewEvents;
13
+ private updateSpannedEvents;
14
+ private timelineResourceEvents;
15
+ private shouldRenderAppointment;
16
+ private renderResourceEvent;
17
+ setMaxEventHeight(event: HTMLElement, cell: HTMLElement): void;
18
+ private renderEvent;
19
+ private renderMoreIndicator;
20
+ private createEventElement;
21
+ isSpannedEvent(eventObj: Record<string, any>, monthDate: Date): Record<string, any>;
22
+ private updateSpannedEventDetails;
23
+ getOverlapEvents(date: Date, appointments: Record<string, any>[]): Record<string, any>[];
24
+ private getMonths;
25
+ private removeCellHeight;
26
+ destroy(): void;
27
+ }
@@ -0,0 +1,623 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { addClass, append, createElement, extend, remove, isNullOrUndefined } from '@syncfusion/ej2-base';
3
+ import { setStyleAttribute, EventHandler } from '@syncfusion/ej2-base';
4
+ import { Schedule } from '../base/schedule';
5
+ import { EventRenderedArgs, TdData } from '../base/interface';
6
+ import { TimelineEvent } from './timeline-view';
7
+ import * as util from '../base/util';
8
+ import * as events from '../base/constant';
9
+ import * as cls from '../base/css-constant';
10
+
11
+ const EVENT_GAP: number = 2;
12
+
13
+ /**
14
+ * Year view events render
15
+ */
16
+
17
+ export class YearEvent extends TimelineEvent {
18
+ public cellHeader: number;
19
+ private isResource: boolean = false;
20
+
21
+ constructor(parent: Schedule) {
22
+ super(parent, 'day');
23
+ }
24
+
25
+ public renderAppointments(): void {
26
+ if (this.parent.dragAndDropModule) {
27
+ this.parent.dragAndDropModule.setDragArea();
28
+ }
29
+ this.fields = this.parent.eventFields;
30
+ const elementSelector: string = (this.parent.currentView === 'Year') ? '.' + cls.WORK_CELLS_CLASS + ' ' + '.' + cls.APPOINTMENT_CLASS :
31
+ '.' + cls.APPOINTMENT_WRAPPER_CLASS + ',.' + cls.MORE_INDICATOR_CLASS;
32
+ const eventWrappers: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll(elementSelector));
33
+ for (const wrapper of eventWrappers) {
34
+ remove(wrapper);
35
+ }
36
+ this.renderedEvents = [];
37
+ if (this.parent.currentView === 'Year') {
38
+ this.yearViewEvents();
39
+ } else {
40
+ this.removeCellHeight();
41
+ if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
42
+ this.isResource = true;
43
+ this.timelineResourceEvents();
44
+ } else {
45
+ this.timelineYearViewEvents();
46
+ }
47
+ }
48
+ this.parent.renderTemplates();
49
+ this.parent.notify(events.contentReady, {});
50
+ }
51
+
52
+ private yearViewEvents(): void {
53
+ const months: number[] = this.getMonths();
54
+ for (const month of months) {
55
+ const queryString: string = `.e-month-calendar:nth-child(${months.indexOf(month) + 1}) td.e-work-cells`;
56
+ const workCells: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll(queryString));
57
+ const monthDate: Date = new Date(this.parent.selectedDate.getFullYear(), month, 1);
58
+ const monthStart: Date = this.parent.calendarUtil.getMonthStartDate(new Date(monthDate.getTime()));
59
+ const monthEnd: Date = this.parent.calendarUtil.getMonthEndDate(new Date(monthDate.getTime()));
60
+ let startDate: Date = util.getWeekFirstDate(monthStart, this.parent.activeViewOptions.firstDayOfWeek);
61
+ const endDate: Date = util.addDays(util.getWeekLastDate(monthEnd, this.parent.activeViewOptions.firstDayOfWeek), 1);
62
+ for (let index: number = 0; startDate.getTime() < endDate.getTime(); index++) {
63
+ const start: Date = util.resetTime(new Date(startDate.getTime()));
64
+ const end: Date = util.addDays(new Date(start.getTime()), 1);
65
+ startDate = util.addDays(new Date(startDate.getTime()), 1);
66
+ if (!this.parent.isMinMaxDate(start as Date)) {
67
+ continue;
68
+ }
69
+ const filterEvents: Record<string, any>[] = this.parent.eventBase.filterEvents(start, end);
70
+ if (filterEvents.length > 0) {
71
+ const workCell: HTMLElement = workCells[parseInt(index.toString(), 10)];
72
+ if (workCell) {
73
+ workCell.appendChild(createElement('div', { className: cls.APPOINTMENT_CLASS }));
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }
79
+
80
+ private timelineYearViewEvents(): void {
81
+ const workCell: HTMLElement = this.parent.element.querySelector('.' + cls.WORK_CELLS_CLASS + ':not(.' + cls.OTHERMONTH_CLASS + ')');
82
+ this.cellWidth = this.parent.getElementWidth(workCell);
83
+ this.cellHeader = util.getOuterHeight(workCell.querySelector('.' + cls.DATE_HEADER_CLASS));
84
+ const eventTable: Element = this.parent.element.querySelector('.' + cls.EVENT_TABLE_CLASS);
85
+ this.eventHeight = this.parent.getElementHeightFromClass(eventTable, cls.APPOINTMENT_CLASS);
86
+ const selector: string =
87
+ `.${cls.MONTH_HEADER_WRAPPER} tbody tr,.${cls.RESOURCE_COLUMN_TABLE_CLASS} tbody tr,.${cls.CONTENT_TABLE_CLASS} tbody tr`;
88
+ this.addCellHeight(selector, this.eventHeight, EVENT_GAP, this.cellHeader, this.moreIndicatorHeight);
89
+ const wrapperCollection: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.APPOINTMENT_CONTAINER_CLASS));
90
+ const months: number[] = this.getMonths();
91
+ const groupIndex: number = (this.parent.activeViewOptions.group.resources.length > 0 && this.parent.uiStateValues.isGroupAdaptive) ?
92
+ this.parent.uiStateValues.groupIndex : undefined;
93
+ for (let row: number = 0; row < months.length; row++) {
94
+ const wrapper: Element = wrapperCollection[parseInt(row.toString(), 10)];
95
+ let td: number = row + 1;
96
+ let eventWrapper: HTMLElement = createElement('div', { className: cls.APPOINTMENT_WRAPPER_CLASS });
97
+ wrapper.appendChild(eventWrapper);
98
+ let monthStart: Date = new Date(this.parent.selectedDate.getFullYear(), months[parseInt(row.toString(), 10)], 1);
99
+ const monthEnd: Date = new Date(monthStart.getFullYear(), monthStart.getMonth() + 1, 0);
100
+ let dayIndex: number = monthStart.getDay();
101
+ const isSpannedCollection: Record<string, any>[] = [];
102
+ if (this.parent.activeViewOptions.orientation === 'Horizontal') {
103
+ this.renderedEvents = [];
104
+ }
105
+ while (monthStart.getTime() <= monthEnd.getTime()) {
106
+ let leftValue: number;
107
+ let rightValue: number;
108
+ if (this.parent.activeViewOptions.orientation === 'Vertical') {
109
+ const wrapper: Element = wrapperCollection[parseInt(dayIndex.toString(), 10)];
110
+ td = dayIndex + 1;
111
+ eventWrapper = wrapper.querySelector('.' + cls.APPOINTMENT_WRAPPER_CLASS) as HTMLElement;
112
+ if (!eventWrapper) {
113
+ eventWrapper = createElement('div', { className: cls.APPOINTMENT_WRAPPER_CLASS });
114
+ wrapper.appendChild(eventWrapper);
115
+ }
116
+ if (this.parent.enableRtl) {
117
+ rightValue = row * this.cellWidth;
118
+ } else {
119
+ leftValue = row * this.cellWidth;
120
+ }
121
+ } else {
122
+ if (this.parent.enableRtl) {
123
+ rightValue = ((dayIndex + monthStart.getDate()) - 1) * this.cellWidth;
124
+ } else {
125
+ leftValue = ((dayIndex + monthStart.getDate()) - 1) * this.cellWidth;
126
+ }
127
+ }
128
+ const rowTd: HTMLElement = this.parent.element.querySelector(`.e-content-wrap tr:nth-child(${td}) td`) as HTMLElement;
129
+ this.cellHeight = rowTd.offsetHeight;
130
+ const dayStart: Date = util.resetTime(new Date(monthStart.getTime()));
131
+ const dayEnd: Date = util.addDays(new Date(dayStart.getTime()), 1);
132
+ let resource: TdData;
133
+ if (this.parent.uiStateValues.isGroupAdaptive) {
134
+ resource = this.parent.resourceBase.lastResourceLevel[this.parent.uiStateValues.groupIndex];
135
+ }
136
+ let dayEvents: Record<string, any>[] = this.parent.eventBase.filterEvents(dayStart, dayEnd, undefined, resource);
137
+ dayEvents = this.parent.eventBase.sortByDateTime(dayEvents);
138
+ for (let index: number = 0, count: number = dayEvents.length; index < count; index++) {
139
+ const eventData: Record<string, any> =
140
+ extend({}, dayEvents[parseInt(index.toString(), 10)], null, true) as Record<string, any>;
141
+ this.updateSpannedEvents(eventData, dayStart, dayEnd);
142
+ const overlapIndex: number = this.getIndex(dayStart as Date);
143
+ eventData.Index = overlapIndex;
144
+ const availedHeight: number = this.cellHeader + (this.eventHeight * (overlapIndex + 1)) + EVENT_GAP +
145
+ this.moreIndicatorHeight;
146
+ const appArea: number = this.cellHeight - this.cellHeader - this.moreIndicatorHeight;
147
+ const renderedAppCount: number = Math.floor(appArea / (this.eventHeight + EVENT_GAP));
148
+ const eventsPerRow: number = this.parent.rowAutoHeight ? 1 : this.parent.activeViewOptions.maxEventsPerRow;
149
+ const moreIndicatorCount: number = this.parent.activeViewOptions.maxEventsPerRow ? count - eventsPerRow
150
+ : (count - renderedAppCount) <= 0 ? 1 : count - renderedAppCount;
151
+ if (this.parent.activeViewOptions.orientation === 'Horizontal') {
152
+ const isRendered: Record<string, any>[] = this.renderedEvents.filter((eventObj: Record<string, any>) =>
153
+ eventObj.Guid === eventData.Guid);
154
+ const isSpanned: Record<string, any>[] = isSpannedCollection.filter((eventObj: Record<string, any>) =>
155
+ eventObj.Guid === eventData.Guid);
156
+ if (isRendered.length > 0 && isRendered[0].MoreIndicator || isSpanned.length > 0 && isSpanned[0].MoreIndicator) {
157
+ const moreIndex: number = this.parent.activeViewOptions.orientation === 'Horizontal' ? row : dayIndex;
158
+ this.renderMoreIndicator(eventWrapper, moreIndicatorCount,
159
+ dayStart, moreIndex, leftValue, rightValue, groupIndex);
160
+ continue;
161
+ } else if (isRendered.length > 0 || isSpanned.length > 0) {
162
+ continue;
163
+ }
164
+ }
165
+ if (this.maxHeight && this.parent.currentView.indexOf('Timeline') !== -1 && overlapIndex > 0) {
166
+ continue;
167
+ }
168
+ if (this.parent.rowAutoHeight || this.shouldRenderAppointment(overlapIndex, availedHeight)) {
169
+ this.renderEvent(eventWrapper, eventData, row, leftValue, rightValue, monthStart, dayIndex);
170
+ if (this.parent.rowAutoHeight || this.cellHeight > availedHeight) {
171
+ this.updateCellHeight(rowTd, availedHeight);
172
+ }
173
+ isSpannedCollection.push(eventData);
174
+ } else {
175
+ const moreIndex: number = this.parent.activeViewOptions.orientation === 'Horizontal' ? row : dayIndex;
176
+ this.renderMoreIndicator(eventWrapper, moreIndicatorCount, dayStart, moreIndex, leftValue, rightValue, groupIndex);
177
+ if (this.parent.activeViewOptions.orientation === 'Horizontal') {
178
+ eventData.MoreIndicator = true;
179
+ this.renderedEvents.push(eventData);
180
+ isSpannedCollection.push(eventData);
181
+ }
182
+ }
183
+ }
184
+ monthStart = util.addDays(new Date(monthStart.getTime()), 1);
185
+ if (this.parent.activeViewOptions.orientation === 'Vertical') {
186
+ dayIndex++;
187
+ this.renderedEvents = [];
188
+ }
189
+ }
190
+ }
191
+ if (this.parent.rowAutoHeight && this.parent.activeViewOptions.orientation === 'Vertical') {
192
+ const appContainer: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.APPOINTMENT_CONTAINER_CLASS));
193
+ const tr: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.CONTENT_TABLE_CLASS + ' tbody tr'));
194
+ appContainer.forEach((ele: HTMLElement, index: number) => {
195
+ const app: HTMLElement[] = [].slice.call(ele.querySelectorAll('.' + cls.APPOINTMENT_CLASS));
196
+ const appTop: number = tr[parseInt(index.toString(), 10)].offsetTop + this.cellHeader + EVENT_GAP;
197
+ app.forEach((app: HTMLElement) => {
198
+ const overlap: number = parseInt(app.getAttribute('data-index'), 10);
199
+ app.style.top = appTop + (overlap * this.eventHeight) + 'px';
200
+ app.removeAttribute('data-index');
201
+ });
202
+ });
203
+ }
204
+ }
205
+
206
+ private updateSpannedEvents(eventObj: Record<string, any>, dayStart: Date, dayEnd: Date): void {
207
+ const isLeftRightResize: boolean = (this.isResource && this.parent.activeViewOptions.orientation === 'Vertical') ||
208
+ (!this.isResource && this.parent.activeViewOptions.orientation === 'Horizontal');
209
+ const data: Record<string, any> = { isLeft: true, isRight: true, isBottom: true, isTop: true };
210
+ if (dayStart.getTime() <= (eventObj[this.fields.startTime] as Date).getTime()) {
211
+ if (isLeftRightResize) {
212
+ data.isLeft = false;
213
+ } else {
214
+ data.isTop = false;
215
+ }
216
+ }
217
+ if ((dayEnd.getTime() >= (eventObj[this.fields.endTime] as Date).getTime()) || (isLeftRightResize && !this.isResource &&
218
+ util.addDays(dayEnd, -1).getMonth() === (eventObj[this.fields.endTime] as Date).getMonth()) ||
219
+ (isLeftRightResize && this.isResource && (dayEnd.getTime() <= eventObj[this.fields.endTime].getTime()))) {
220
+ if (isLeftRightResize) {
221
+ data.isRight = false;
222
+ } else {
223
+ data.isBottom = false;
224
+ }
225
+ }
226
+ eventObj.data = data;
227
+ }
228
+
229
+ private timelineResourceEvents(): void {
230
+ const contentTable: HTMLElement = this.parent.element.querySelector('.' + cls.CONTENT_WRAP_CLASS);
231
+ const isVerticalScrollbarAvail: boolean = contentTable.offsetWidth > contentTable.clientWidth;
232
+ const workCell: HTMLElement = this.parent.element.querySelector('.' + cls.WORK_CELLS_CLASS);
233
+ this.cellWidth = this.parent.getElementWidth(workCell);
234
+ this.cellHeader = 0;
235
+ const eventTable: Element = this.parent.element.querySelector('.' + cls.EVENT_TABLE_CLASS);
236
+ this.eventHeight = this.parent.getElementHeightFromClass(eventTable, cls.APPOINTMENT_CLASS);
237
+ const selector: string =
238
+ `.${cls.MONTH_HEADER_WRAPPER} tbody tr,.${cls.RESOURCE_COLUMN_TABLE_CLASS} tbody tr,.${cls.CONTENT_TABLE_CLASS} tbody tr`;
239
+ this.addCellHeight(selector, this.eventHeight, EVENT_GAP, this.cellHeader, this.moreIndicatorHeight);
240
+ const wrapperCollection: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.APPOINTMENT_CONTAINER_CLASS));
241
+ const resources: TdData[] = this.parent.uiStateValues.isGroupAdaptive ?
242
+ [this.parent.resourceBase.lastResourceLevel[this.parent.uiStateValues.groupIndex]] :
243
+ this.parent.activeViewOptions.allowVirtualScrolling ? this.parent.resourceBase.renderedResources :
244
+ this.parent.resourceBase.lastResourceLevel;
245
+ const months: number[] = this.getMonths();
246
+ if (this.parent.activeViewOptions.orientation === 'Horizontal') {
247
+ for (let month: number = 0; month < months.length; month++) {
248
+ const monthStart: Date = new Date(this.parent.selectedDate.getFullYear(), months[parseInt(month.toString(), 10)], 1);
249
+ for (let i: number = 0, len: number = resources.length; i < len; i++) {
250
+ this.renderedEvents = [];
251
+ this.renderResourceEvent(wrapperCollection[parseInt(month.toString(), 10)], resources[parseInt(i.toString(), 10)],
252
+ month, i, monthStart);
253
+ }
254
+ }
255
+ } else {
256
+ for (let i: number = 0, len: number = resources.length; i < len; i++) {
257
+ this.renderedEvents = [];
258
+ for (let month: number = 0; month < months.length; month++) {
259
+ const monthStart: Date = new Date(this.parent.selectedDate.getFullYear(), months[parseInt(month.toString(), 10)], 1);
260
+ this.renderResourceEvent(wrapperCollection[parseInt(i.toString(), 10)], resources[parseInt(i.toString(), 10)], month,
261
+ i, monthStart);
262
+ }
263
+ }
264
+ }
265
+ if (this.parent.rowAutoHeight && !isVerticalScrollbarAvail && contentTable.offsetWidth > contentTable.clientWidth) {
266
+ const appointments: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.APPOINTMENT_CLASS));
267
+ appointments.forEach((ele: HTMLElement) => {
268
+ ele.style.removeProperty('left');
269
+ ele.style.removeProperty('right');
270
+ });
271
+ const appContainer: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.APPOINTMENT_CONTAINER_CLASS));
272
+ const conTable: HTMLElement = this.parent.element.querySelector('.' + cls.CONTENT_TABLE_CLASS);
273
+ const tr: HTMLElement[] = [].slice.call(conTable.querySelectorAll('tbody tr'));
274
+ appContainer.forEach((ele: HTMLElement, index: number) => {
275
+ const appWrapper: HTMLElement[] = [].slice.call(ele.children);
276
+ const row: HTMLElement = tr[parseInt(index.toString(), 10)];
277
+ appWrapper.forEach((appWrap: HTMLElement, cellIndex: number) => {
278
+ const td: HTMLElement = row.querySelector(`td:nth-child(${cellIndex + 1})`);
279
+ const app: HTMLElement[] = [].slice.call(appWrap.children);
280
+ const width: number = this.parent.getElementWidth(td);
281
+ const left: number = td.offsetLeft;
282
+ if (this.parent.enableRtl) {
283
+ const right: number = conTable.offsetWidth - left - td.offsetWidth;
284
+ app.forEach((app: HTMLElement) => {
285
+ app.style.width = Math.floor(parseInt(app.style.width, 10) / width) * width + 'px';
286
+ app.style.right = right + 'px';
287
+ });
288
+ } else {
289
+ app.forEach((app: HTMLElement) => {
290
+ app.style.width = Math.floor(parseInt(app.style.width, 10) / width) * width + 'px';
291
+ app.style.left = left + 'px';
292
+ });
293
+ }
294
+ });
295
+ });
296
+ }
297
+ }
298
+
299
+ private shouldRenderAppointment(overlapIndex: number, availedHeight: number): boolean {
300
+ const eventsPerRow: number = this.parent.rowAutoHeight ? 1 : this.parent.activeViewOptions.maxEventsPerRow;
301
+ if (this.parent.activeViewOptions.maxEventsPerRow && !this.parent.rowAutoHeight &&
302
+ !this.parent.eventSettings.enableIndicator) {
303
+ return overlapIndex < eventsPerRow;
304
+ } else if (this.maxOrIndicator) {
305
+ return overlapIndex < 1;
306
+ } else {
307
+ return this.cellHeight > availedHeight;
308
+ }
309
+ }
310
+
311
+ private renderResourceEvent(wrapper: Element, resource: TdData, month: number, index: number, monthStart: Date): void {
312
+ const eventWrapper: HTMLElement = createElement('div', { className: cls.APPOINTMENT_WRAPPER_CLASS });
313
+ wrapper.appendChild(eventWrapper);
314
+ const monthEnd: Date = util.addDays(util.lastDateOfMonth(new Date(monthStart.getTime())), 1);
315
+ const eventDatas: Record<string, any>[] = this.parent.eventBase.filterEvents(monthStart, monthEnd, undefined, resource);
316
+ const rowIndex: number = this.parent.activeViewOptions.orientation === 'Vertical' ? index : month;
317
+ const td: HTMLElement = this.parent.element.querySelector(`.e-content-wrap tr:nth-child(${rowIndex + 1}) td`) as HTMLElement;
318
+ this.cellHeight = td.offsetHeight;
319
+ this.groupOrder = resource.groupOrder;
320
+ const isSpannedCollection: Record<string, any>[] = [];
321
+ for (let a: number = 0; a < eventDatas.length; a++) {
322
+ const data: Record<string, any> = eventDatas[parseInt(a.toString(), 10)];
323
+ let overlapIndex: number;
324
+ const eventData: Record<string, any> = extend({}, data, null, true) as Record<string, any>;
325
+ if (this.parent.activeViewOptions.group.resources.length > 0) {
326
+ const eventObj: Record<string, any> = this.isSpannedEvent(eventData, monthStart);
327
+ overlapIndex = this.getIndex(eventObj[this.fields.startTime] as Date);
328
+ eventData.Index = overlapIndex;
329
+ } else {
330
+ overlapIndex = this.getIndex(eventData[this.fields.startTime] as Date);
331
+ eventData.Index = overlapIndex;
332
+ }
333
+ const availedHeight: number = this.cellHeader + (this.eventHeight * (a + 1)) + EVENT_GAP + this.moreIndicatorHeight;
334
+ const leftValue: number = (this.parent.activeViewOptions.orientation === 'Vertical') ?
335
+ month * this.cellWidth : index * this.cellWidth;
336
+ if (!this.parent.isMinMaxDate(eventData[this.fields.startTime] as Date)) {
337
+ return;
338
+ }
339
+ if (this.parent.activeViewOptions.orientation === 'Vertical' && this.parent.activeViewOptions.group.resources.length > 0) {
340
+ const isRendered: Record<string, any>[] = this.renderedEvents.filter((eventObj: Record<string, any>) =>
341
+ eventObj.Guid === eventData.Guid);
342
+ const isSpanned: Record<string, any>[] = isSpannedCollection.filter((eventObj: Record<string, any>) =>
343
+ eventObj.Guid === eventData.Guid);
344
+ if (isRendered.length > 0 || isSpanned.length > 0) {
345
+ continue;
346
+ }
347
+ }
348
+ if (this.maxHeight && this.parent.currentView.indexOf('Timeline') !== -1 && overlapIndex > 0) {
349
+ continue;
350
+ }
351
+ if (this.parent.rowAutoHeight || this.shouldRenderAppointment(overlapIndex, availedHeight)) {
352
+ this.renderEvent(eventWrapper, eventData, month, leftValue, leftValue, monthStart, index);
353
+ this.updateCellHeight(td, availedHeight);
354
+ isSpannedCollection.push(eventData);
355
+ } else {
356
+ const moreIndex: number = this.parent.activeViewOptions.orientation === 'Horizontal' ? month : index;
357
+ this.renderMoreIndicator(eventWrapper, eventDatas.length - a, monthStart, moreIndex, leftValue, leftValue, index);
358
+ if (this.parent.activeViewOptions.orientation === 'Horizontal') {
359
+ for (let i: number = index; i < eventDatas.length; i++) {
360
+ this.renderedEvents.push(extend({}, eventDatas[parseInt(i.toString(), 10)],
361
+ { Index: overlapIndex + i }, true) as Record<string, any>);
362
+ }
363
+ }
364
+ break;
365
+ }
366
+ }
367
+ }
368
+
369
+ public setMaxEventHeight(event: HTMLElement, cell: HTMLElement): void {
370
+ const height: number = (cell.offsetHeight - this.cellHeader) - (this.maxHeight ? 0 : this.moreIndicatorHeight);
371
+ setStyleAttribute(event, { 'height': height + 'px', 'align-items': 'center' });
372
+ }
373
+
374
+ // eslint-disable-next-line max-len
375
+ private renderEvent(wrapper: HTMLElement, eventData: Record<string, any>, row: number, left: number, right: number, monthDate: Date, rowIndex?: number): void {
376
+ const eventObj: Record<string, any> = this.isSpannedEvent(eventData, monthDate);
377
+ const wrap: HTMLElement = this.createEventElement(eventObj);
378
+ let width: number;
379
+ let index: number;
380
+ if (eventObj.isSpanned.count === 1) {
381
+ const endTime: Date = util.addDays(eventObj[this.fields.endTime] as Date, -1);
382
+ eventObj[this.fields.endTime] = (endTime > eventObj[this.fields.startTime]) ? endTime : eventObj[this.fields.endTime];
383
+ }
384
+ if (eventObj[this.fields.startTime] > eventObj[this.fields.endTime]) {
385
+ return;
386
+ }
387
+ if (this.parent.activeViewOptions.orientation === 'Horizontal') {
388
+ index = row + 1;
389
+ if ((eventObj[this.fields.startTime] as Date).getTime() === (eventObj[this.fields.endTime] as Date).getTime()) {
390
+ eventObj.isSpanned.count = 1;
391
+ }
392
+ width = eventObj.isSpanned.count * this.cellWidth;
393
+ } else {
394
+ index = rowIndex + 1;
395
+ width = this.isResource ? eventObj.isSpanned.count * this.cellWidth : this.cellWidth;
396
+ }
397
+ const rowTd: HTMLElement = this.parent.element.querySelector(`.e-content-wrap tr:nth-child(${index}) td`) as HTMLElement;
398
+ const top: number = rowTd.offsetTop + this.cellHeader + (this.eventHeight * <number>eventObj.Index) + EVENT_GAP;
399
+ setStyleAttribute(wrap, {
400
+ 'width': width + 'px', 'height': this.eventHeight + 'px', 'left': left + 'px', 'right': right + 'px', 'top': top + 'px'
401
+ });
402
+ if (this.maxOrIndicator && this.parent.currentView.indexOf('Timeline') !== -1) {
403
+ this.setMaxEventHeight(wrap, rowTd);
404
+ }
405
+ if (!this.isResource && this.parent.rowAutoHeight && this.parent.activeViewOptions.orientation === 'Vertical') {
406
+ wrap.setAttribute('data-index', eventObj.Index.toString());
407
+ }
408
+ const args: EventRenderedArgs = { data: eventObj, element: wrap, cancel: false, type: 'event' };
409
+ this.parent.trigger(events.eventRendered, args, (eventArgs: EventRenderedArgs) => {
410
+ if (!eventArgs.cancel) {
411
+ wrapper.appendChild(wrap);
412
+ this.wireAppointmentEvents(wrap, eventObj);
413
+ if (this.parent.activeViewOptions.group.resources.length > 0) {
414
+ this.renderedEvents.push(extend({}, eventObj, null, true) as Record<string, any>);
415
+ } else if (this.parent.activeViewOptions.orientation === 'Vertical') {
416
+ this.renderedEvents.push(extend({}, eventObj, null, true) as Record<string, any>);
417
+ } else if ((eventObj.isSpanned.isRight || eventObj.isSpanned.isLeft) && this.parent.activeViewOptions.orientation === 'Horizontal'
418
+ || !eventObj.isSpanned.isRight) {
419
+ this.renderedEvents.push(extend({}, eventObj, null, true) as Record<string, any>);
420
+ }
421
+ }
422
+ });
423
+ }
424
+
425
+ // eslint-disable-next-line max-len
426
+ private renderMoreIndicator(wrapper: HTMLElement, count: number, startDate: Date, row: number, left: number, right: number, index?: number): void {
427
+ if (this.parent.activeViewOptions.group.resources.length === 0 && wrapper.querySelector('[data-start-date="' + startDate.getTime() + '"]')) {
428
+ return;
429
+ }
430
+ let endDate: Date;
431
+ if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
432
+ endDate = util.addDays(util.lastDateOfMonth(new Date(startDate.getTime())), 1);
433
+ } else {
434
+ endDate = util.addDays(new Date(startDate.getTime()), 1);
435
+ }
436
+ const moreIndicator: HTMLElement = this.getMoreIndicatorElement(count, startDate, endDate);
437
+ const rowTr: HTMLElement = this.parent.element.querySelector(`.e-content-wrap tr:nth-child(${row + 1})`) as HTMLElement;
438
+ const top: number = rowTr.offsetTop + (this.cellHeight - this.moreIndicatorHeight);
439
+ left = (Math.floor(left / this.cellWidth) * this.cellWidth);
440
+ right = (Math.floor(right / this.cellWidth) * this.cellWidth);
441
+ setStyleAttribute(moreIndicator, { 'width': this.cellWidth + 'px', 'left': left + 'px', 'right': right + 'px', 'top': top + 'px' });
442
+ if (!isNullOrUndefined(index)) {
443
+ moreIndicator.setAttribute('data-group-index', index.toString());
444
+ }
445
+ wrapper.appendChild(moreIndicator);
446
+ EventHandler.add(moreIndicator, 'click', this.moreIndicatorClick, this);
447
+ }
448
+
449
+ private createEventElement(record: Record<string, any>): HTMLElement {
450
+ const eventSubject: string = (record[this.fields.subject] || this.parent.eventSettings.fields.subject.default
451
+ || this.parent.localeObj.getConstant('addTitle')) as string;
452
+ const eventWrapper: HTMLElement = createElement('div', {
453
+ className: cls.APPOINTMENT_CLASS,
454
+ attrs: {
455
+ 'data-id': 'Appointment_' + record[this.fields.id],
456
+ 'data-guid': record.Guid as string,
457
+ 'role': 'button', 'tabindex': '0',
458
+ 'aria-disabled': this.parent.eventBase.getReadonlyAttribute(record),
459
+ 'aria-label': this.parent.getAnnouncementString(record)
460
+ }
461
+ });
462
+ if (this.cssClass) {
463
+ addClass([eventWrapper], this.cssClass);
464
+ }
465
+ if (record[this.fields.isReadonly]) {
466
+ addClass([eventWrapper], cls.READ_ONLY);
467
+ }
468
+ if (this.parent.activeViewOptions.group.resources.length > 0) {
469
+ const resIndex: number = this.getGroupIndexFromEvent(record);
470
+ eventWrapper.setAttribute('data-group-index', resIndex.toString());
471
+ }
472
+ let templateElement: HTMLElement[] = [];
473
+ const eventObj: Record<string, any> = extend({}, record, null, true) as Record<string, any>;
474
+ if (this.parent.activeViewOptions.eventTemplate) {
475
+ const templateId: string = this.parent.element.id + '_' + this.parent.activeViewOptions.eventTemplateName + 'eventTemplate';
476
+ templateElement = this.parent.getAppointmentTemplate()(eventObj, this.parent, 'eventTemplate', templateId, false,
477
+ undefined, undefined, this.parent.root);
478
+ } else {
479
+ const locationEle: string = (record[this.fields.location] || this.parent.eventSettings.fields.location.default || '') as string;
480
+ const subjectEle: HTMLElement = createElement('div', {
481
+ className: cls.SUBJECT_CLASS,
482
+ innerHTML: (eventSubject + (locationEle ? ';&nbsp' + locationEle : ''))
483
+ });
484
+ const startTimeEle: HTMLElement = createElement('div', {
485
+ className: cls.APPOINTMENT_TIME + (this.parent.isAdaptive ? ' ' + cls.DISABLE_CLASS : ''),
486
+ innerHTML: this.parent.getTimeString(eventObj[this.fields.startTime] as Date)
487
+ });
488
+ const endTimeEle: HTMLElement = createElement('div', {
489
+ className: cls.APPOINTMENT_TIME + (this.parent.isAdaptive ? ' ' + cls.DISABLE_CLASS : ''),
490
+ innerHTML: this.parent.getTimeString(eventObj[this.fields.endTime] as Date)
491
+ });
492
+ addClass([subjectEle], 'e-text-center');
493
+ if (record[this.fields.isAllDay]) {
494
+ templateElement = [subjectEle];
495
+ } else if (!eventObj.isLeft && !eventObj.isRight) {
496
+ templateElement = [startTimeEle, subjectEle, endTimeEle];
497
+ } else {
498
+ if (!eventObj.isLeft) {
499
+ templateElement.push(startTimeEle);
500
+ }
501
+ templateElement.push(subjectEle);
502
+ if (!eventObj.isRight) {
503
+ templateElement.push(endTimeEle);
504
+ }
505
+ }
506
+ }
507
+ const appointmentDetails: HTMLElement = createElement('div', { className: cls.APPOINTMENT_DETAILS });
508
+ append(templateElement, appointmentDetails);
509
+ eventWrapper.appendChild(appointmentDetails);
510
+ this.parent.eventBase.renderSpannedIcon(eventWrapper, record.isSpanned);
511
+ this.renderResizeHandler(eventWrapper, record.data as Record<string, any>, record[this.fields.isReadonly] as boolean);
512
+ this.applyResourceColor(eventWrapper, eventObj, 'backgroundColor', this.groupOrder);
513
+ return eventWrapper;
514
+ }
515
+
516
+ public isSpannedEvent(eventObj: Record<string, any>, monthDate: Date): Record<string, any> {
517
+ const monthStart: Date = new Date(monthDate.getFullYear(), monthDate.getMonth(), 1);
518
+ const monthEnd: Date = util.addDays(new Date(monthDate.getFullYear(), monthDate.getMonth() + 1, 0), 1);
519
+ const eventData: Record<string, any> = extend({}, eventObj, null, true) as Record<string, any>;
520
+ const eventStart: Date = eventData[this.fields.startTime] as Date;
521
+ const eventEnd: Date = eventData[this.fields.endTime] as Date;
522
+ const isSpanned: Record<string, any> = { isLeft: false, isRight: false, count: 1 };
523
+ const yearStart: Date = new Date(this.parent.selectedDate.getFullYear(), this.parent.firstMonthOfYear, 1);
524
+ const yearEnd: Date = util.addMonths(yearStart, this.parent.monthsCount);
525
+ if (this.isResource) {
526
+ this.updateSpannedEvents(eventObj, monthStart, monthEnd);
527
+ }
528
+ if (this.parent.activeViewOptions.orientation === 'Vertical' && this.parent.activeViewOptions.group.resources.length > 0) {
529
+ this.updateSpannedEventDetails(eventStart, eventEnd, yearStart, yearEnd, eventData, isSpanned);
530
+ const originalStartTime: Date = eventData[this.fields.startTime];
531
+ const originalEndTime: Date = new Date(eventData[this.fields.endTime] - 1);
532
+ isSpanned.count = (originalEndTime.getMonth() - originalStartTime.getMonth()) +
533
+ (this.parent.monthsCount * (originalEndTime.getFullYear() - originalStartTime.getFullYear())) + 1;
534
+ }
535
+ else {
536
+ this.updateSpannedEventDetails(eventStart, eventEnd, monthStart, monthEnd, eventData, isSpanned);
537
+ if (this.parent.activeViewOptions.group.resources.length === 0 || this.parent.uiStateValues.isGroupAdaptive) {
538
+ let end: number = util.resetTime(eventData[this.fields.endTime]).getTime();
539
+ const start: number = util.resetTime(eventData[this.fields.startTime]).getTime();
540
+ if (eventObj[this.fields.isAllDay] && end === eventObj[this.fields.endTime].getTime() || isSpanned.isRight) {
541
+ end = util.addDays(new Date(end), -1).getTime();
542
+ }
543
+ isSpanned.count = Math.round((end - start) / util.MS_PER_DAY) + 1;
544
+ }
545
+ }
546
+ eventData.isSpanned = isSpanned;
547
+ if (util.resetTime(eventStart).getTime() < util.resetTime(this.parent.minDate).getTime()) {
548
+ eventData[this.fields.startTime] = this.parent.minDate;
549
+ }
550
+ if (util.resetTime(eventEnd).getTime() > util.resetTime(this.parent.maxDate).getTime()) {
551
+ eventData[this.fields.endTime] = this.parent.maxDate;
552
+ }
553
+ return eventData;
554
+ }
555
+
556
+ private updateSpannedEventDetails(eventStart: Date, eventEnd: Date, viewStart: Date, viewEnd: Date,
557
+ eventObj: Record<string, any>, isSpanned: Record<string, any>): void {
558
+ if (eventStart.getTime() < viewStart.getTime()) {
559
+ eventObj[this.fields.startTime] = viewStart;
560
+ isSpanned.isLeft = true;
561
+ }
562
+ if (eventEnd.getTime() > viewEnd.getTime()) {
563
+ eventObj[this.fields.endTime] = viewEnd;
564
+ isSpanned.isRight = true;
565
+ }
566
+ }
567
+
568
+ public getOverlapEvents(date: Date, appointments: Record<string, any>[]): Record<string, any>[] {
569
+ const appointmentsList: Record<string, any>[] = [];
570
+ let dateStart: number;
571
+ let dateEnd: number;
572
+ if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
573
+ const monthStart: Date = this.parent.calendarUtil.getMonthStartDate(new Date(date.getTime()));
574
+ const monthEnd: Date = util.addDays(this.parent.calendarUtil.getMonthEndDate(new Date(date.getTime())), -1);
575
+ dateStart = util.resetTime(new Date(monthStart.getTime())).getTime();
576
+ dateEnd = util.resetTime(new Date(monthEnd.getTime())).getTime();
577
+ } else {
578
+ if (this.parent.rowAutoHeight) {
579
+ dateStart = util.resetTime(new Date(date.getTime())).getTime();
580
+ dateEnd = util.addDays(util.resetTime(new Date(date.getTime())), 1).getTime();
581
+ } else {
582
+ dateStart = dateEnd = util.resetTime(new Date(date.getTime())).getTime();
583
+ }
584
+ }
585
+ for (const app of appointments) {
586
+ const appStart: Date = new Date(app[this.fields.startTime].getTime());
587
+ const appEnd: Date = new Date(app[this.fields.endTime].getTime());
588
+ const timeCondition: boolean = app[this.fields.isAllDay] ? util.resetTime(appEnd).getTime() > dateStart :
589
+ util.resetTime(appEnd).getTime() >= dateStart;
590
+ if (((util.resetTime(appStart).getTime() <= dateStart) && (timeCondition)) ||
591
+ (util.resetTime(appStart).getTime() >= dateStart) && (util.resetTime(appEnd).getTime() <= dateEnd)) {
592
+ appointmentsList.push(app);
593
+ }
594
+ else if (this.parent.activeViewOptions.orientation === 'Vertical') {
595
+ if (util.resetTime(appStart).getTime() >= dateStart && util.resetTime(appEnd).getTime() >= dateEnd) {
596
+ appointmentsList.push(app);
597
+ }
598
+ }
599
+ }
600
+ return appointmentsList;
601
+ }
602
+
603
+ private getMonths(): number[] {
604
+ // eslint-disable-next-line prefer-spread
605
+ return Array.apply(null, { length: this.parent.monthsCount }).map((value: number, index: number) =>
606
+ this.parent.firstMonthOfYear + index);
607
+ }
608
+
609
+ private removeCellHeight(): void {
610
+ const elementSelector: string =
611
+ `.${cls.MONTH_HEADER_WRAPPER} tbody tr,.${cls.RESOURCE_COLUMN_TABLE_CLASS} tbody tr,.${cls.CONTENT_TABLE_CLASS} tbody tr`;
612
+ const rows: HTMLElement[] = [].slice.call(this.element.querySelectorAll(elementSelector));
613
+ for (const row of rows) {
614
+ (row.firstElementChild as HTMLElement).style.height = '';
615
+ }
616
+ }
617
+
618
+ public destroy(): void {
619
+ super.destroy();
620
+ this.parent = null;
621
+ }
622
+
623
+ }