@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,709 @@
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
+ }