@syncfusion/ej2-schedule 30.2.7 → 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 (304) 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 +110 -36
  5. package/dist/es6/ej2-schedule.es2015.js.map +1 -1
  6. package/dist/es6/ej2-schedule.es5.js +110 -36
  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 +8 -5
  167. package/src/schedule/base/css-constant.d.ts +2 -0
  168. package/src/schedule/base/css-constant.js +2 -0
  169. package/src/schedule/base/schedule.js +15 -1
  170. package/src/schedule/event-renderer/agenda-base.d.ts +1 -1
  171. package/src/schedule/event-renderer/agenda-base.js +5 -4
  172. package/src/schedule/event-renderer/inline-edit.js +11 -6
  173. package/src/schedule/event-renderer/month.js +5 -3
  174. package/src/schedule/event-renderer/vertical-view.js +3 -0
  175. package/src/schedule/event-renderer/year.d.ts +2 -0
  176. package/src/schedule/event-renderer/year.js +28 -4
  177. package/src/schedule/popups/event-tooltip.js +4 -0
  178. package/src/schedule/popups/event-window.js +2 -2
  179. package/src/schedule/popups/quick-popups.js +5 -1
  180. package/src/schedule/renderer/agenda.js +3 -2
  181. package/src/schedule/renderer/vertical-view.js +1 -1
  182. package/src/schedule/renderer/year.js +3 -2
  183. package/styles/bds-lite.css +11 -8
  184. package/styles/bds.css +11 -8
  185. package/styles/bootstrap-dark-lite.css +12 -9
  186. package/styles/bootstrap-dark.css +12 -9
  187. package/styles/bootstrap-lite.css +12 -9
  188. package/styles/bootstrap.css +12 -9
  189. package/styles/bootstrap4-lite.css +11 -8
  190. package/styles/bootstrap4.css +11 -8
  191. package/styles/bootstrap5-dark-lite.css +11 -8
  192. package/styles/bootstrap5-dark.css +11 -8
  193. package/styles/bootstrap5-lite.css +11 -8
  194. package/styles/bootstrap5.3-lite.css +11 -8
  195. package/styles/bootstrap5.3.css +11 -8
  196. package/styles/bootstrap5.css +11 -8
  197. package/styles/fabric-dark-lite.css +12 -9
  198. package/styles/fabric-dark.css +12 -9
  199. package/styles/fabric-lite.css +12 -9
  200. package/styles/fabric.css +12 -9
  201. package/styles/fluent-dark-lite.css +13 -10
  202. package/styles/fluent-dark.css +13 -10
  203. package/styles/fluent-lite.css +13 -10
  204. package/styles/fluent.css +13 -10
  205. package/styles/fluent2-lite.css +11 -8
  206. package/styles/fluent2.css +11 -8
  207. package/styles/highcontrast-light-lite.css +12 -9
  208. package/styles/highcontrast-light.css +12 -9
  209. package/styles/highcontrast-lite.css +12 -9
  210. package/styles/highcontrast.css +12 -9
  211. package/styles/material-dark-lite.css +12 -9
  212. package/styles/material-dark.css +12 -9
  213. package/styles/material-lite.css +12 -9
  214. package/styles/material.css +12 -9
  215. package/styles/material3-dark-lite.css +11 -8
  216. package/styles/material3-dark.css +11 -8
  217. package/styles/material3-lite.css +11 -8
  218. package/styles/material3.css +11 -8
  219. package/styles/recurrence-editor/_bds-definition.scss +1 -0
  220. package/styles/recurrence-editor/_bootstrap-dark-definition.scss +1 -0
  221. package/styles/recurrence-editor/_bootstrap-definition.scss +1 -0
  222. package/styles/recurrence-editor/_bootstrap4-definition.scss +1 -0
  223. package/styles/recurrence-editor/_bootstrap5-definition.scss +1 -0
  224. package/styles/recurrence-editor/_bootstrap5.3-definition.scss +1 -0
  225. package/styles/recurrence-editor/_fabric-dark-definition.scss +1 -0
  226. package/styles/recurrence-editor/_fabric-definition.scss +1 -0
  227. package/styles/recurrence-editor/_fluent-definition.scss +1 -0
  228. package/styles/recurrence-editor/_fluent2-definition.scss +1 -0
  229. package/styles/recurrence-editor/_fusionnew-definition.scss +1 -0
  230. package/styles/recurrence-editor/_highcontrast-definition.scss +1 -0
  231. package/styles/recurrence-editor/_highcontrast-light-definition.scss +1 -0
  232. package/styles/recurrence-editor/_layout.scss +5 -1
  233. package/styles/recurrence-editor/_material-dark-definition.scss +1 -0
  234. package/styles/recurrence-editor/_material-definition.scss +1 -0
  235. package/styles/recurrence-editor/_material3-definition.scss +1 -0
  236. package/styles/recurrence-editor/_tailwind-definition.scss +1 -0
  237. package/styles/recurrence-editor/_tailwind3-definition.scss +1 -0
  238. package/styles/recurrence-editor/bds.css +3 -0
  239. package/styles/recurrence-editor/bootstrap-dark.css +4 -1
  240. package/styles/recurrence-editor/bootstrap.css +4 -1
  241. package/styles/recurrence-editor/bootstrap4.css +3 -0
  242. package/styles/recurrence-editor/bootstrap5-dark.css +3 -0
  243. package/styles/recurrence-editor/bootstrap5.3.css +3 -0
  244. package/styles/recurrence-editor/bootstrap5.css +3 -0
  245. package/styles/recurrence-editor/fabric-dark.css +4 -1
  246. package/styles/recurrence-editor/fabric.css +4 -1
  247. package/styles/recurrence-editor/fluent-dark.css +4 -1
  248. package/styles/recurrence-editor/fluent.css +4 -1
  249. package/styles/recurrence-editor/fluent2.css +3 -0
  250. package/styles/recurrence-editor/highcontrast-light.css +4 -1
  251. package/styles/recurrence-editor/highcontrast.css +4 -1
  252. package/styles/recurrence-editor/material-dark.css +4 -1
  253. package/styles/recurrence-editor/material.css +4 -1
  254. package/styles/recurrence-editor/material3-dark.css +3 -0
  255. package/styles/recurrence-editor/material3.css +3 -0
  256. package/styles/recurrence-editor/tailwind-dark.css +3 -0
  257. package/styles/recurrence-editor/tailwind.css +3 -0
  258. package/styles/recurrence-editor/tailwind3.css +3 -0
  259. package/styles/schedule/_bds-definition.scss +2 -0
  260. package/styles/schedule/_bootstrap-dark-definition.scss +2 -0
  261. package/styles/schedule/_bootstrap-definition.scss +2 -0
  262. package/styles/schedule/_bootstrap4-definition.scss +2 -0
  263. package/styles/schedule/_bootstrap5-definition.scss +2 -0
  264. package/styles/schedule/_bootstrap5.3-definition.scss +2 -0
  265. package/styles/schedule/_fabric-dark-definition.scss +2 -0
  266. package/styles/schedule/_fabric-definition.scss +2 -0
  267. package/styles/schedule/_fluent-definition.scss +3 -1
  268. package/styles/schedule/_fluent2-definition.scss +2 -0
  269. package/styles/schedule/_fusionnew-definition.scss +2 -0
  270. package/styles/schedule/_highcontrast-definition.scss +2 -0
  271. package/styles/schedule/_highcontrast-light-definition.scss +2 -0
  272. package/styles/schedule/_layout.scss +12 -11
  273. package/styles/schedule/_material-dark-definition.scss +2 -0
  274. package/styles/schedule/_material-definition.scss +2 -0
  275. package/styles/schedule/_material3-definition.scss +2 -0
  276. package/styles/schedule/_tailwind-definition.scss +2 -0
  277. package/styles/schedule/_tailwind3-definition.scss +2 -0
  278. package/styles/schedule/bds.css +8 -8
  279. package/styles/schedule/bootstrap-dark.css +8 -8
  280. package/styles/schedule/bootstrap.css +8 -8
  281. package/styles/schedule/bootstrap4.css +8 -8
  282. package/styles/schedule/bootstrap5-dark.css +8 -8
  283. package/styles/schedule/bootstrap5.3.css +8 -8
  284. package/styles/schedule/bootstrap5.css +8 -8
  285. package/styles/schedule/fabric-dark.css +8 -8
  286. package/styles/schedule/fabric.css +8 -8
  287. package/styles/schedule/fluent-dark.css +9 -9
  288. package/styles/schedule/fluent.css +9 -9
  289. package/styles/schedule/fluent2.css +8 -8
  290. package/styles/schedule/highcontrast-light.css +8 -8
  291. package/styles/schedule/highcontrast.css +8 -8
  292. package/styles/schedule/material-dark.css +8 -8
  293. package/styles/schedule/material.css +8 -8
  294. package/styles/schedule/material3-dark.css +8 -8
  295. package/styles/schedule/material3.css +8 -8
  296. package/styles/schedule/tailwind-dark.css +8 -8
  297. package/styles/schedule/tailwind.css +8 -8
  298. package/styles/schedule/tailwind3.css +8 -8
  299. package/styles/tailwind-dark-lite.css +11 -8
  300. package/styles/tailwind-dark.css +11 -8
  301. package/styles/tailwind-lite.css +11 -8
  302. package/styles/tailwind.css +11 -8
  303. package/styles/tailwind3-lite.css +11 -8
  304. package/styles/tailwind3.css +11 -8
@@ -0,0 +1,44 @@
1
+ import { ActionBaseArgs, ResizeEdges, DragEventArgs, ResizeEventArgs } from '../base/interface';
2
+ import { Schedule } from '../base/schedule';
3
+ import { MonthEvent } from '../event-renderer/month';
4
+ import { VerticalEvent } from '../event-renderer/vertical-view';
5
+ import { YearEvent } from '../event-renderer/year';
6
+ /**
7
+ * Base class for the common drag and resize related actions
8
+ */
9
+ export declare class ActionBase {
10
+ parent: Schedule;
11
+ actionObj: ActionBaseArgs;
12
+ resizeEdges: ResizeEdges;
13
+ scrollArgs: ActionBaseArgs;
14
+ scrollEdges: ResizeEdges;
15
+ monthEvent: MonthEvent;
16
+ verticalEvent: VerticalEvent;
17
+ yearEvent: YearEvent;
18
+ daysVariation: number;
19
+ private scrollEventArgs;
20
+ constructor(parent: Schedule);
21
+ getChangedData(multiData?: Record<string, any>[]): Record<string, any>;
22
+ saveChangedData(eventArgs: DragEventArgs | ResizeEventArgs, isMultiSelect?: boolean): void;
23
+ calculateIntervalTime(date: Date): Date;
24
+ getContentAreaDimension(): Record<string, any>;
25
+ getIndex(index: number): number;
26
+ updateTimePosition(date: Date, multiData?: Record<string, any>[]): void;
27
+ getResourceElements(table: HTMLTableCellElement[]): HTMLTableCellElement[];
28
+ getOriginalElement(element: HTMLElement): HTMLElement[];
29
+ createCloneElement(element: HTMLElement): HTMLElement;
30
+ removeCloneElementClasses(): void;
31
+ removeCloneElement(): void;
32
+ getCursorElement(e: MouseEvent & TouchEvent): HTMLElement;
33
+ autoScroll(): void;
34
+ autoScrollValidation(): boolean;
35
+ actionClass(type: string): void;
36
+ updateScrollPosition(e: MouseEvent & TouchEvent): void;
37
+ updateOriginalElement(cloneElement: HTMLElement): void;
38
+ getUpdatedEvent(startTime: Date, endTime: Date, eventObj: Record<string, any>): Record<string, any>;
39
+ dynamicYearlyEventsRendering(event: Record<string, any>, isResize?: boolean): void;
40
+ renderDynamicElement(cellTd: HTMLElement | Element, element: HTMLElement, isAppointment?: boolean): void;
41
+ createAppointmentElement(resIndex: number, innerText: string): HTMLElement;
42
+ dynamicEventsRendering(event: Record<string, any>): void;
43
+ destroy(): void;
44
+ }
@@ -0,0 +1,493 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { addClass, createElement, extend, isNullOrUndefined, closest, setStyleAttribute } from '@syncfusion/ej2-base';
3
+ import { formatUnit, remove, removeClass } from '@syncfusion/ej2-base';
4
+ import { ActionBaseArgs, ResizeEdges, DragEventArgs, ResizeEventArgs, TdData } from '../base/interface';
5
+ import { Schedule } from '../base/schedule';
6
+ import { CurrentAction } from '../base/type';
7
+ import { MonthEvent } from '../event-renderer/month';
8
+ import { VerticalEvent } from '../event-renderer/vertical-view';
9
+ import { YearEvent } from '../event-renderer/year';
10
+ import * as cls from '../base/css-constant';
11
+ import * as util from '../base/util';
12
+
13
+ /**
14
+ * Base class for the common drag and resize related actions
15
+ */
16
+
17
+ export class ActionBase {
18
+ public parent: Schedule;
19
+ public actionObj: ActionBaseArgs;
20
+ public resizeEdges: ResizeEdges;
21
+ public scrollArgs: ActionBaseArgs;
22
+ public scrollEdges: ResizeEdges;
23
+ public monthEvent: MonthEvent;
24
+ public verticalEvent: VerticalEvent;
25
+ public yearEvent: YearEvent;
26
+ public daysVariation: number = 0;
27
+ private scrollEventArgs: MouseEvent & TouchEvent;
28
+
29
+ constructor(parent: Schedule) {
30
+ this.parent = parent;
31
+ this.actionObj = {
32
+ X: 0, Y: 0, groupIndex: 0, cellWidth: 0, cellHeight: 0, slotInterval: 0, interval: 0, actionIndex: 0,
33
+ cloneElement: [], originalElement: [], action: null, isAllDay: null, excludeSelectors: null,
34
+ index: 0, navigationInterval: null, scrollInterval: null
35
+ };
36
+ this.scrollArgs = { element: null, width: 0, height: 0 };
37
+ this.resizeEdges = { left: false, right: false, top: false, bottom: false };
38
+ this.scrollEdges = { left: false, right: false, top: false, bottom: false };
39
+ }
40
+
41
+ public getChangedData(multiData?: Record<string, any>[]): Record<string, any> {
42
+ const eventObj: Record<string, any> = extend({}, this.actionObj.event, null, true) as Record<string, any>;
43
+ eventObj[this.parent.eventFields.startTime] = this.actionObj.start;
44
+ eventObj[this.parent.eventFields.endTime] = this.actionObj.end;
45
+ if (!isNullOrUndefined(this.actionObj.isAllDay)) {
46
+ eventObj[this.parent.eventFields.isAllDay] = this.actionObj.isAllDay;
47
+ }
48
+ if (this.parent.activeViewOptions.group.resources.length > 0) {
49
+ const originalElement: HTMLElement[] = this.getOriginalElement(this.actionObj.element);
50
+ if (originalElement) {
51
+ let indexCol: number[] = originalElement.map((element: HTMLElement) => parseInt(element.getAttribute('data-group-index'), 10));
52
+ if (indexCol.indexOf(this.actionObj.groupIndex) === -1 || (!isNullOrUndefined(multiData) && multiData.length > 0)) {
53
+ const cloneIndex: number = parseInt(this.actionObj.clone.getAttribute('data-group-index'), 10);
54
+ indexCol = indexCol.filter((index: number) => index !== cloneIndex);
55
+ indexCol.push(this.actionObj.groupIndex);
56
+ if (multiData && multiData.length > 0) {
57
+ multiData.forEach((data: Record<string, any>) => {
58
+ this.parent.resourceBase.getResourceData(data, this.actionObj.groupIndex, indexCol);
59
+ });
60
+ } else {
61
+ this.parent.resourceBase.getResourceData(eventObj, this.actionObj.groupIndex, indexCol);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return eventObj;
67
+ }
68
+
69
+ public saveChangedData(eventArgs: DragEventArgs | ResizeEventArgs, isMultiSelect: boolean = false): void {
70
+ this.parent.activeEventData.event = this.actionObj.event;
71
+ this.parent.currentAction = 'Save';
72
+ let currentAction: CurrentAction;
73
+ let eventsCollection: Record<string, any>[] = [eventArgs.data];
74
+ if (isMultiSelect) {
75
+ eventsCollection = (eventArgs as DragEventArgs).selectedData;
76
+ }
77
+ for (const eventObj of eventsCollection) {
78
+ const isSameResource: boolean = (this.parent.activeViewOptions.group.resources.length > 0) ?
79
+ parseInt(this.actionObj.element.getAttribute('data-group-index'), 10) === this.actionObj.groupIndex : true;
80
+ if (+eventObj[this.parent.eventFields.startTime] === +this.actionObj.event[this.parent.eventFields.startTime] &&
81
+ +eventObj[this.parent.eventFields.endTime] === +this.actionObj.event[this.parent.eventFields.endTime] && isSameResource) {
82
+ this.parent.crudModule.crudObj.isCrudAction = false;
83
+ return;
84
+ }
85
+
86
+ if (eventObj[this.parent.eventFields.recurrenceRule]) {
87
+ const eveId: number = (eventObj[this.parent.eventFields.recurrenceID] || eventObj[this.parent.eventFields.id]) as number;
88
+ if (eventObj[this.parent.eventFields.id] === eventObj[this.parent.eventFields.recurrenceID]) {
89
+ eventObj[this.parent.eventFields.id] = this.parent.eventBase.getEventMaxID();
90
+ currentAction = 'EditOccurrence';
91
+ }
92
+ if (this.parent.enableRecurrenceValidation
93
+ && this.parent.eventWindow.editOccurrenceValidation(eveId, eventObj, this.actionObj.event)) {
94
+ return;
95
+ }
96
+ } else {
97
+ currentAction = null;
98
+ }
99
+ if (eventObj[this.parent.eventFields.startTimezone] || eventObj[this.parent.eventFields.endTimezone]) {
100
+ this.parent.eventBase.timezoneConvert(eventObj);
101
+ }
102
+ this.parent.crudModule.saveEvent(eventObj, currentAction);
103
+ }
104
+ }
105
+
106
+ public calculateIntervalTime(date: Date): Date {
107
+ let dateInMS: number = util.resetTime(date).getTime();
108
+ const startHour: Date = this.parent.activeView.getStartHour();
109
+ const intervalInMS: number = util.MS_PER_MINUTE * this.actionObj.interval;
110
+ dateInMS += (startHour.getHours() * 60 + startHour.getMinutes()) * util.MS_PER_MINUTE + startHour.getSeconds() * 1000;
111
+ dateInMS = dateInMS + Math.floor((date.getTime() - dateInMS) / intervalInMS) * intervalInMS;
112
+ return new Date(dateInMS);
113
+ }
114
+
115
+ public getContentAreaDimension(): Record<string, any> {
116
+ const viewElement: HTMLElement = this.parent.element.querySelector('.' + cls.CONTENT_WRAP_CLASS) as HTMLElement;
117
+ let trElement: HTMLElement[] = [].slice.call(viewElement.querySelector('tr').children);
118
+ if (!this.parent.activeView.isTimelineView() && this.parent.activeViewOptions.group.resources.length > 0 &&
119
+ !this.parent.isAdaptive && !this.parent.enableAdaptiveUI && !this.parent.virtualScrollModule) {
120
+ trElement = this.getResourceElements(trElement as HTMLTableCellElement[]);
121
+ }
122
+ const leftOffset: ClientRect = trElement[0].getBoundingClientRect();
123
+ const rightOffset: ClientRect = trElement.slice(-1)[0].getBoundingClientRect();
124
+ const viewDimension: Record<string, any> = {
125
+ bottom: viewElement.scrollHeight - 5,
126
+ left: this.parent.enableRtl ? rightOffset.left : leftOffset.left,
127
+ right: this.parent.enableRtl ? leftOffset.right : rightOffset.right,
128
+ top: 0,
129
+ leftOffset: this.parent.enableRtl ? rightOffset.right : leftOffset.right,
130
+ rightOffset: this.parent.enableRtl ? leftOffset.left : rightOffset.left
131
+ };
132
+ return viewDimension;
133
+ }
134
+
135
+ public getIndex(index: number): number {
136
+ const contentElements: HTMLTableCellElement[] = [].slice.call(this.parent.getContentTable().querySelector('tr').children);
137
+ const indexes: { [key: string]: number } = { minIndex: 0, maxIndex: contentElements.length - 1 };
138
+ if (this.actionObj.action === 'resize' && this.parent.activeViewOptions.group.resources.length > 0 &&
139
+ !this.parent.uiStateValues.isGroupAdaptive && !this.parent.activeView.isTimelineView()) {
140
+ const groupElements: HTMLTableCellElement[] = this.getResourceElements(contentElements);
141
+ indexes.minIndex = groupElements[0].cellIndex;
142
+ indexes.maxIndex = groupElements.slice(-1)[0].cellIndex;
143
+ }
144
+ if (index < indexes.minIndex) {
145
+ index = indexes.minIndex;
146
+ }
147
+ if (index > indexes.maxIndex) {
148
+ index = indexes.maxIndex;
149
+ }
150
+ return index;
151
+ }
152
+
153
+ public updateTimePosition(date: Date, multiData?: Record<string, any>[]): void {
154
+ let index: number = 0;
155
+ for (const cloneElement of this.actionObj.cloneElement) {
156
+ const timeElement: Element = cloneElement.querySelector('.' + cls.APPOINTMENT_TIME);
157
+ if (timeElement) {
158
+ let startTime: Date = this.actionObj.start;
159
+ let endTime: Date = this.actionObj.end;
160
+ if (multiData && multiData.length > 0) {
161
+ startTime = multiData[parseInt(index.toString(), 10)][this.parent.eventFields.startTime] as Date;
162
+ endTime = multiData[parseInt(index.toString(), 10)][this.parent.eventFields.endTime] as Date;
163
+ }
164
+ timeElement.innerHTML = this.parent.getTimeString(startTime) + ' - ' +
165
+ this.parent.getTimeString(endTime);
166
+ }
167
+ index++;
168
+ }
169
+ if (!this.parent.activeViewOptions.timeScale.enable || !this.parent.isAdaptive || this.parent.currentView === 'Month' ||
170
+ this.parent.currentView === 'TimelineMonth') {
171
+ return;
172
+ }
173
+ let timeIndicator: HTMLElement = this.parent.element.querySelector('.' + cls.CLONE_TIME_INDICATOR_CLASS) as HTMLElement;
174
+ if (!timeIndicator) {
175
+ timeIndicator = createElement('div', { className: cls.CLONE_TIME_INDICATOR_CLASS });
176
+ const wrapperClass: string = this.parent.activeView.isTimelineView() ? cls.DATE_HEADER_WRAP_CLASS : cls.TIME_CELLS_WRAP_CLASS;
177
+ this.parent.element.querySelector('.' + wrapperClass).appendChild(timeIndicator);
178
+ }
179
+ timeIndicator.innerHTML = this.parent.getTimeString(date);
180
+ let offsetValue: number = 0;
181
+ if (this.parent.activeView.isTimelineView()) {
182
+ if (this.parent.enableRtl) {
183
+ const rightValue: number = parseInt(this.actionObj.clone.style.right, 10);
184
+ offsetValue = this.actionObj.action === 'drag' || this.resizeEdges.left ?
185
+ rightValue + this.actionObj.clone.offsetWidth : rightValue;
186
+ timeIndicator.style.right = formatUnit(offsetValue);
187
+ } else {
188
+ const leftValue: number = parseInt(this.actionObj.clone.style.left, 10);
189
+ offsetValue = this.actionObj.action === 'drag' || this.resizeEdges.left ?
190
+ leftValue : leftValue + this.actionObj.clone.offsetWidth;
191
+ timeIndicator.style.left = formatUnit(offsetValue);
192
+ }
193
+ } else {
194
+ offsetValue = this.actionObj.action === 'drag' || this.resizeEdges.top ? this.actionObj.clone.offsetTop :
195
+ this.actionObj.clone.offsetTop + this.actionObj.clone.offsetHeight;
196
+ timeIndicator.style.top = formatUnit(offsetValue);
197
+ }
198
+ }
199
+
200
+ public getResourceElements(table: HTMLTableCellElement[]): HTMLTableCellElement[] {
201
+ return table.filter((element: HTMLTableCellElement) =>
202
+ parseInt(element.getAttribute('data-group-index'), 10) === this.actionObj.groupIndex);
203
+ }
204
+
205
+ public getOriginalElement(element: HTMLElement): HTMLElement[] {
206
+ let originalElement: HTMLElement[];
207
+ const guid: string = element.getAttribute('data-guid');
208
+ const isMorePopup: boolean = element.offsetParent && element.offsetParent.classList.contains(cls.MORE_EVENT_POPUP_CLASS);
209
+ if (isMorePopup || this.parent.activeView.isTimelineView() || (this.actionObj.action !== 'resize' && this.parent.virtualScrollModule)) {
210
+ originalElement = [].slice.call(this.parent.element.querySelectorAll('[data-guid="' + guid + '"]'));
211
+ } else {
212
+ const tr: HTMLElement = closest(element, 'tr') as HTMLElement;
213
+ if (tr) {
214
+ originalElement = [].slice.call(tr.querySelectorAll('[data-guid="' + guid + '"]'));
215
+ }
216
+ }
217
+ return originalElement;
218
+ }
219
+
220
+ public createCloneElement(element: HTMLElement): HTMLElement {
221
+ const cloneWrapper: HTMLElement = document.createElement('div');
222
+ cloneWrapper.appendChild(element.cloneNode(true));
223
+ const cloneElement: HTMLElement = cloneWrapper.children[0] as HTMLElement;
224
+ const cloneClassLists: string[] = [cls.CLONE_ELEMENT_CLASS];
225
+ cloneClassLists.push((this.actionObj.action === 'drag') ? cls.DRAG_CLONE_CLASS : cls.RESIZE_CLONE_CLASS);
226
+ if (this.parent.currentView === 'Month' || this.parent.currentView === 'TimelineMonth') {
227
+ cloneClassLists.push(cls.MONTH_CLONE_ELEMENT_CLASS);
228
+ }
229
+ addClass([cloneElement], cloneClassLists);
230
+ addClass([element], cls.EVENT_ACTION_CLASS);
231
+ if (!isNullOrUndefined(element.parentElement)) {
232
+ element.parentElement.appendChild(cloneElement);
233
+ }
234
+ cloneElement.style.width = formatUnit(cloneElement.offsetWidth - 2);
235
+ const dragElement: HTMLElement = document.querySelector(this.parent.eventDragArea);
236
+ if (this.parent.eventDragArea && this.actionObj.action === 'drag' && dragElement) {
237
+ dragElement.appendChild(cloneElement);
238
+ }
239
+ setStyleAttribute(cloneElement, { border: '0px' });
240
+ return cloneElement;
241
+ }
242
+
243
+ public removeCloneElementClasses(): void {
244
+ let elements: HTMLElement[] = this.actionObj.originalElement;
245
+ if (this.parent.currentView === 'Month' || this.parent.currentView === 'TimelineYear' ||
246
+ this.parent.currentView === 'Day' || this.parent.currentView === 'Week' || this.parent.currentView === 'WorkWeek') {
247
+ elements = [].slice.call(this.parent.element.querySelectorAll('.' + cls.EVENT_ACTION_CLASS));
248
+ }
249
+ removeClass(elements, cls.EVENT_ACTION_CLASS);
250
+ }
251
+
252
+ public removeCloneElement(): void {
253
+ this.actionObj.originalElement = [];
254
+ const dynamicEle: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.e-dynamic-clone'));
255
+ for (const cloneEle of dynamicEle) {
256
+ remove(cloneEle);
257
+ }
258
+ for (const cloneElement of this.actionObj.cloneElement) {
259
+ if (!isNullOrUndefined(cloneElement.parentNode)) { remove(cloneElement); }
260
+ }
261
+ this.actionObj.cloneElement = [];
262
+ const timeIndicator: Element = this.parent.element.querySelector('.' + cls.CLONE_TIME_INDICATOR_CLASS);
263
+ if (timeIndicator) {
264
+ remove(timeIndicator);
265
+ }
266
+ }
267
+
268
+ public getCursorElement(e: MouseEvent & TouchEvent): HTMLElement {
269
+ const pages: (MouseEvent & TouchEvent) | Touch = this.parent.eventBase.getPageCoordinates(e);
270
+ return document.elementFromPoint(pages.clientX, pages.clientY) as HTMLElement;
271
+ }
272
+
273
+ public autoScroll(): void {
274
+ const parent: HTMLElement = this.parent.element.querySelector('.' + cls.CONTENT_WRAP_CLASS) as HTMLElement;
275
+ const yIsScrollable: boolean = parent.offsetHeight <= parent.scrollHeight;
276
+ const xIsScrollable: boolean = parent.offsetWidth <= parent.scrollWidth;
277
+ const yInBounds: boolean = yIsScrollable && parent.scrollTop >= 0 && parent.scrollTop + parent.offsetHeight <= parent.scrollHeight;
278
+ let xInBounds: boolean = xIsScrollable && parent.scrollLeft >= 0 && parent.scrollLeft + parent.offsetWidth <= parent.scrollWidth;
279
+ if (this.actionObj.action === 'resize' && this.scrollEdges.right && (parent.scrollLeft + parent.offsetWidth) > parent.scrollWidth) {
280
+ const tdCollections: number = ([].slice.call((this.parent.getContentTable().querySelector('tr') as HTMLTableRowElement).children)).length - 1;
281
+ const cellIndex: number = Math.ceil((this.actionObj.clone.offsetLeft + (this.actionObj.clone.offsetWidth)) /
282
+ this.actionObj.cellWidth);
283
+ xInBounds = cellIndex === tdCollections;
284
+ }
285
+ if (yInBounds && (this.scrollEdges.top || this.scrollEdges.bottom)) {
286
+ parent.scrollTop += this.scrollEdges.top ? -this.actionObj.scroll.scrollBy : this.actionObj.scroll.scrollBy;
287
+ if (this.actionObj.action === 'resize') {
288
+ if (parent.scrollHeight !== parent.offsetHeight + parent.scrollTop && parent.scrollTop > 0) {
289
+ this.actionObj.Y += this.scrollEdges.top ? this.actionObj.scroll.scrollBy : -this.actionObj.scroll.scrollBy;
290
+ }
291
+ }
292
+ }
293
+ if (xInBounds && (this.scrollEdges.left || this.scrollEdges.right)) {
294
+ parent.scrollLeft += this.scrollEdges.left ? -this.actionObj.scroll.scrollBy : this.actionObj.scroll.scrollBy;
295
+ if (this.actionObj.action === 'resize') {
296
+ if (parent.scrollWidth !== parent.offsetWidth + parent.scrollLeft && parent.scrollLeft > 0) {
297
+ this.actionObj.X += this.scrollEdges.left ? this.actionObj.scroll.scrollBy : -this.actionObj.scroll.scrollBy;
298
+ }
299
+ }
300
+ }
301
+ }
302
+
303
+ public autoScrollValidation(): boolean {
304
+ if (!this.actionObj.scroll.enable) {
305
+ return false;
306
+ }
307
+ const res: ResizeEdges = this.parent.boundaryValidation(this.actionObj.pageY, this.actionObj.pageX);
308
+ this.scrollEdges = res;
309
+ return res.bottom || res.top || res.left || res.right;
310
+ }
311
+
312
+ public actionClass(type: string): void {
313
+ if (type === 'addClass') {
314
+ addClass([this.parent.element], cls.EVENT_ACTION_CLASS);
315
+ } else {
316
+ removeClass([this.parent.element], cls.EVENT_ACTION_CLASS);
317
+ }
318
+ }
319
+
320
+ public updateScrollPosition(e: MouseEvent & TouchEvent): void {
321
+ this.scrollEventArgs = e;
322
+ if (this.actionObj.scroll.enable && isNullOrUndefined(this.actionObj.scrollInterval)) {
323
+ this.actionObj.scrollInterval = window.setInterval(
324
+ () => {
325
+ if (this.autoScrollValidation() && !this.actionObj.clone.classList.contains(cls.ALLDAY_APPOINTMENT_CLASS)) {
326
+ if (this.parent.activeView.isTimelineView() && this.parent.activeViewOptions.group.resources.length > 0
327
+ && this.actionObj.groupIndex < 0) {
328
+ return;
329
+ }
330
+ this.autoScroll();
331
+ if (this.actionObj.action === 'drag') {
332
+ this.parent.dragAndDropModule.updateDraggingDateTime(this.scrollEventArgs);
333
+ } else {
334
+ this.parent.resizeModule.updateResizingDirection(this.scrollEventArgs);
335
+ }
336
+ }
337
+ },
338
+ this.actionObj.scroll.timeDelay);
339
+ }
340
+ }
341
+
342
+ public updateOriginalElement(cloneElement: HTMLElement): void {
343
+ let query: string = '[data-id="' + cloneElement.getAttribute('data-id') + '"]';
344
+ if (this.parent.activeViewOptions.group.resources.length > 0) {
345
+ query = query.concat('[data-group-index = "' + cloneElement.getAttribute('data-group-index') + '"]');
346
+ }
347
+ if (cloneElement.hasAttribute('data-guid')) {
348
+ query += '[data-guid="' + cloneElement.getAttribute('data-guid') + '"]';
349
+ }
350
+ const elements: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll(query));
351
+ addClass(elements, cls.EVENT_ACTION_CLASS);
352
+ const eventWrappers: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.CLONE_ELEMENT_CLASS));
353
+ removeClass(eventWrappers, cls.EVENT_ACTION_CLASS);
354
+ }
355
+
356
+ public getUpdatedEvent(startTime: Date, endTime: Date, eventObj: Record<string, any>): Record<string, any> {
357
+ const event: Record<string, any> = JSON.parse(JSON.stringify(eventObj));
358
+ event[this.parent.eventFields.startTime] = startTime;
359
+ event[this.parent.eventFields.endTime] = endTime;
360
+ return event;
361
+ }
362
+
363
+ public dynamicYearlyEventsRendering(event: Record<string, any>, isResize: boolean = false): void {
364
+ if (!isNullOrUndefined(this.parent.eventDragArea)) {
365
+ return;
366
+ }
367
+ let appWidth: number = this.actionObj.cellWidth - 7;
368
+ if (isResize && (this.resizeEdges.left || this.resizeEdges.right)) {
369
+ appWidth = this.actionObj.cellWidth * (event.count as number);
370
+ }
371
+ if (!isResize && (
372
+ this.parent.activeViewOptions.orientation === 'Horizontal' && this.parent.activeViewOptions.group.resources.length === 0)) {
373
+ const eventObj: Record<string, any> = this.yearEvent.isSpannedEvent(event, event[this.parent.eventFields.startTime]);
374
+ if ((eventObj[this.parent.eventFields.startTime] as Date).getTime() ===
375
+ (eventObj[this.parent.eventFields.endTime] as Date).getTime()) {
376
+ (<{ [key: string]: number }>eventObj.isSpanned).count = 1;
377
+ }
378
+ appWidth = (<{ [key: string]: number }>eventObj.isSpanned).count * this.actionObj.cellWidth;
379
+ }
380
+ if (!isResize && this.parent.activeViewOptions.orientation === 'Vertical' && this.parent.activeViewOptions.group.resources.length !== 0) {
381
+ const eventObj: Record<string, any> = this.yearEvent.isSpannedEvent(event, event[this.parent.eventFields.startTime]);
382
+ appWidth = eventObj.isSpanned.count * this.actionObj.cellWidth;
383
+ }
384
+ const appointmentElement: HTMLElement =
385
+ this.createAppointmentElement(this.actionObj.groupIndex, event[this.parent.eventFields.subject] as string);
386
+ appointmentElement.setAttribute('drag', 'true');
387
+ addClass([appointmentElement], cls.CLONE_ELEMENT_CLASS);
388
+ setStyleAttribute(appointmentElement, {
389
+ 'width': appWidth + 'px', 'border': '0px', 'pointer-events': 'none',
390
+ 'position': 'absolute', 'overflow': 'hidden', 'padding': '3px'
391
+ });
392
+ if (this.actionObj.clone.style.backgroundColor !== '') {
393
+ setStyleAttribute(appointmentElement, { 'backgroundColor': this.actionObj.clone.style.backgroundColor });
394
+ }
395
+ const date: number = util.resetTime(event[this.parent.eventFields.startTime] as Date).getTime();
396
+ let query: string = '.' + cls.WORK_CELLS_CLASS + '[data-date="' + date + '"]';
397
+ if (this.parent.activeViewOptions.group.resources.length > 0 && !this.parent.uiStateValues.isGroupAdaptive) {
398
+ query = '.' + cls.WORK_CELLS_CLASS + '[data-date="' + date + '"][data-group-index="' + this.actionObj.groupIndex + '"]';
399
+ }
400
+ const cellTd: Element = this.parent.element.querySelector(query);
401
+ if (isNullOrUndefined(cellTd)) {
402
+ return;
403
+ }
404
+ if (isResize) {
405
+ const dateHeader: HTMLElement = cellTd.querySelector('.' + cls.DATE_HEADER_CLASS) as HTMLElement;
406
+ let appHeight: number = this.actionObj.cellHeight * (event.count as number) -
407
+ (dateHeader ? dateHeader.offsetHeight : 0) - 7;
408
+ if (this.resizeEdges.right || this.resizeEdges.left) {
409
+ appHeight = parseInt(this.actionObj.clone.style.height, 10);
410
+ }
411
+ setStyleAttribute(appointmentElement, { 'height': appHeight + 'px' });
412
+ }
413
+ this.renderDynamicElement(cellTd, appointmentElement, true);
414
+ this.actionObj.cloneElement.push(appointmentElement);
415
+ }
416
+
417
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
418
+ public renderDynamicElement(cellTd: HTMLElement | Element, element: HTMLElement, isAppointment: boolean = false): void {
419
+ if (cellTd.querySelector('.' + cls.APPOINTMENT_WRAPPER_CLASS)) {
420
+ cellTd.querySelector('.' + cls.APPOINTMENT_WRAPPER_CLASS).appendChild(element);
421
+ } else {
422
+ const wrapper: HTMLElement = createElement('div', { className: cls.APPOINTMENT_WRAPPER_CLASS });
423
+ wrapper.appendChild(element);
424
+ cellTd.appendChild(wrapper);
425
+ }
426
+ }
427
+
428
+ public createAppointmentElement(resIndex: number, innerText: string): HTMLElement {
429
+ const appointmentWrapper: HTMLElement = createElement('div', {
430
+ className: cls.APPOINTMENT_CLASS,
431
+ innerHTML: innerText
432
+ });
433
+ if (this.parent.activeViewOptions.group.resources.length > 0) {
434
+ appointmentWrapper.setAttribute('data-group-index', resIndex.toString());
435
+ }
436
+ return appointmentWrapper;
437
+ }
438
+
439
+ public dynamicEventsRendering(event: Record<string, any>): void {
440
+ if (!isNullOrUndefined(this.parent.eventDragArea)) {
441
+ return;
442
+ }
443
+ let dateRender: Date[] = this.parent.activeView.renderDates;
444
+ let workCells: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.WORK_CELLS_CLASS));
445
+ let workDays: number[] = this.parent.activeViewOptions.workDays;
446
+ let groupOrder: string[];
447
+ if (this.parent.activeViewOptions.group.resources.length > 0) {
448
+ const renderedResource: TdData[] = this.parent.virtualScrollModule && this.parent.virtualScrollModule.isHorizontalScroll ?
449
+ this.parent.resourceBase.renderedResources : this.parent.resourceBase.lastResourceLevel;
450
+ const resources: TdData[] = renderedResource.
451
+ filter((res: TdData) => res.groupIndex === this.actionObj.groupIndex);
452
+ dateRender = resources[0].renderDates;
453
+ const elementSelector: string = `.${cls.WORK_CELLS_CLASS}[data-group-index="${this.actionObj.groupIndex}"]`;
454
+ workCells = [].slice.call(this.parent.element.querySelectorAll(elementSelector));
455
+ workDays = resources[0].workDays;
456
+ groupOrder = resources[0].groupOrder;
457
+ }
458
+ this.monthEvent.dateRender = dateRender;
459
+ this.monthEvent.getSlotDates(workDays);
460
+ if (this.resizeEdges.left || this.resizeEdges.right) {
461
+ const eventWrappers: HTMLElement[] = [].slice.call(this.parent.element.querySelectorAll('.' + cls.CLONE_ELEMENT_CLASS));
462
+ for (const wrapper of eventWrappers) {
463
+ remove(wrapper);
464
+ }
465
+ }
466
+ const spannedEvents: Record<string, any>[] = this.monthEvent.splitEvent(event, dateRender);
467
+ for (const event of spannedEvents) {
468
+ const day: number = this.parent.getIndexOfDate(dateRender, util.resetTime(event[this.monthEvent.fields.startTime] as Date));
469
+ const diffInDays: number = (event.data as Record<string, any>).count as number;
470
+ const appWidth: number = (diffInDays * this.actionObj.cellWidth) - 7;
471
+ const appointmentElement: HTMLElement = this.monthEvent.createAppointmentElement(event, this.actionObj.groupIndex, true);
472
+ appointmentElement.setAttribute('drag', 'true');
473
+ addClass([appointmentElement], cls.CLONE_ELEMENT_CLASS);
474
+ this.monthEvent.applyResourceColor(appointmentElement, event, 'backgroundColor', groupOrder);
475
+ setStyleAttribute(appointmentElement, { 'width': appWidth + 'px', 'border': '0px', 'pointer-events': 'none' });
476
+ const cellTd: Element = workCells[parseInt(day.toString(), 10)];
477
+ if (cellTd) {
478
+ this.monthEvent.renderElement(cellTd, appointmentElement, true);
479
+ this.actionObj.cloneElement.push(appointmentElement);
480
+ }
481
+ }
482
+ }
483
+
484
+ public destroy(): void {
485
+ if (!this.parent || this.parent && this.parent.isDestroyed) {
486
+ return;
487
+ }
488
+ this.actionObj = {};
489
+ this.scrollArgs = {};
490
+ this.resizeEdges = { left: false, right: false, top: false, bottom: false };
491
+ this.scrollEdges = { left: false, right: false, top: false, bottom: false };
492
+ }
493
+ }
@@ -0,0 +1,41 @@
1
+ import { CrudAction } from '../base/interface';
2
+ import { ReturnType, CurrentAction } from '../base/type';
3
+ import { Schedule } from '../base/schedule';
4
+ /**
5
+ * Schedule CRUD operations
6
+ */
7
+ export declare class Crud {
8
+ private parent;
9
+ crudObj: CrudAction;
10
+ constructor(parent: Schedule);
11
+ private getQuery;
12
+ private getTable;
13
+ refreshDataManager(): void;
14
+ private dataManagerSuccess;
15
+ dataManagerFailure(e: ReturnType): void;
16
+ refreshProcessedData(isVirtualScrollAction?: boolean, dynamicEvents?: Record<string, any>[]): void;
17
+ private refreshData;
18
+ private processAddEvent;
19
+ private processSaveEvent;
20
+ private processDeleteEvent;
21
+ addEvent(eventData: Record<string, any> | Record<string, any>[]): void;
22
+ saveEvent(eventData: Record<string, any> | Record<string, any>[], action: CurrentAction): void;
23
+ deleteEvent(eventData: string | number | Record<string, any> | Record<string, any>[], action: CurrentAction): void;
24
+ private processOccurrences;
25
+ private processFollowSeries;
26
+ private processEntireSeries;
27
+ private processDelete;
28
+ private processSave;
29
+ private getParentEvent;
30
+ private excludeDateCheck;
31
+ private processRecurrenceRule;
32
+ private getUpdatedRecurrenceRule;
33
+ private isBlockEvent;
34
+ /**
35
+ * To destroy the crud module.
36
+ *
37
+ * @returns {void}
38
+ * @private
39
+ */
40
+ destroy(): void;
41
+ }