mmhglobal-dynamicform 1.2.3 → 1.3.2

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 (198) hide show
  1. package/README.md +14 -2
  2. package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
  3. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
  4. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
  5. package/esm2020/lib/services/main.service.mjs +752 -0
  6. package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
  7. package/esm2020/lib/services/zcomponent.service.mjs +81 -0
  8. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
  9. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
  10. package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
  11. package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
  12. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
  13. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
  14. package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
  15. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
  16. package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
  17. package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
  18. package/esm2020/lib/zcard/zcard.component.mjs +72 -0
  19. package/esm2020/lib/zchart/zchart.component.mjs +201 -0
  20. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
  21. package/esm2020/lib/zchip/zchip.component.mjs +121 -0
  22. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
  23. package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
  24. package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
  25. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
  26. package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
  27. package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
  28. package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
  29. package/esm2020/lib/zform/zform.component.mjs +147 -0
  30. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
  31. package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
  32. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
  33. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
  34. package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
  35. package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
  36. package/esm2020/lib/zimg/zimg.component.mjs +121 -0
  37. package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
  38. package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
  39. package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
  40. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
  41. package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
  42. package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
  43. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
  44. package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
  45. package/esm2020/lib/zreport/zreport.component.mjs +105 -0
  46. package/esm2020/lib/zreport/zreport.config.mjs +117 -0
  47. package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
  48. package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
  49. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
  50. package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
  51. package/esm2020/lib/ztab/ztab.component.mjs +187 -0
  52. package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
  53. package/esm2020/lib/ztext/ztext.component.mjs +297 -0
  54. package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
  55. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
  56. package/esm2020/lib/ztree/ztree.component.mjs +380 -0
  57. package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
  58. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
  59. package/esm2020/lib/zudf/zudf.component.mjs +205 -0
  60. package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
  61. package/esm2020/lib/zupload/zupload.component.mjs +359 -0
  62. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
  63. package/esm2020/mmhglobal-dynamicform.mjs +5 -0
  64. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  65. package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
  66. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
  67. package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
  68. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
  69. package/lib/directives/fieldelement.directive.d.ts +3 -0
  70. package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
  71. package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
  72. package/lib/services/main.service.d.ts +3 -0
  73. package/lib/services/zcomponent.debug.service.d.ts +8 -5
  74. package/lib/services/zcomponent.service.d.ts +7 -2
  75. package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
  76. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
  77. package/lib/uicontent/uicontent.component.d.ts +3 -0
  78. package/lib/uiheader/uiheader.component.d.ts +3 -0
  79. package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
  80. package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
  81. package/lib/uipage/uipage.component.d.ts +3 -0
  82. package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
  83. package/lib/zbullet/zbullet.component.d.ts +3 -0
  84. package/lib/zbuttons/zbuttons.component.d.ts +3 -0
  85. package/lib/zcard/zcard.component.d.ts +3 -0
  86. package/lib/zchart/zchart.component.d.ts +3 -0
  87. package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
  88. package/lib/zchip/zchip.component.d.ts +3 -0
  89. package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
  90. package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
  91. package/lib/zdaterange/zdaterange.component.d.ts +3 -0
  92. package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
  93. package/lib/zdatetime/zdatetime.component.d.ts +3 -0
  94. package/lib/zdiv/zdiv.component.d.ts +3 -0
  95. package/lib/zdiv/zdiv.pipe.d.ts +3 -0
  96. package/lib/zform/zform.component.d.ts +3 -0
  97. package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
  98. package/lib/zgauge/zgauge.component.d.ts +3 -0
  99. package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
  100. package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
  101. package/lib/zgrid/zgrid.component.d.ts +4 -1
  102. package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
  103. package/lib/zimg/zimg.component.d.ts +3 -0
  104. package/lib/zkcard/zkcard.component.d.ts +3 -0
  105. package/lib/zlabel/zlabel.component.d.ts +3 -0
  106. package/lib/zmfb/zmfb.component.d.ts +3 -0
  107. package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
  108. package/lib/zmodal/zmodal.component.d.ts +3 -0
  109. package/lib/znumeric/znumeric.component.d.ts +3 -0
  110. package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
  111. package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
  112. package/lib/zreport/zreport.component.d.ts +3 -0
  113. package/lib/zreport/zreport.config.d.ts +3 -0
  114. package/lib/zscheduler/zscheduler.component.d.ts +3 -0
  115. package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
  116. package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
  117. package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
  118. package/lib/ztab/ztab.component.d.ts +3 -0
  119. package/lib/ztab/ztab.pipe.d.ts +3 -0
  120. package/lib/ztext/ztext.component.d.ts +3 -0
  121. package/lib/ztextarea/ztextarea.component.d.ts +3 -0
  122. package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
  123. package/lib/ztree/ztree.component.d.ts +3 -0
  124. package/lib/ztreelist/ztreelist.component.d.ts +3 -0
  125. package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
  126. package/lib/zudf/zudf.component.d.ts +3 -0
  127. package/lib/zunknown/zunknown.component.d.ts +3 -0
  128. package/lib/zupload/zupload.component.d.ts +3 -0
  129. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
  130. package/mmhglobal-dynamicform.d.ts +1 -2
  131. package/package.json +20 -11
  132. package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
  133. package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
  134. package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
  135. package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
  136. package/esm2015/lib/directives/fieldelement.directive.js +0 -15
  137. package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
  138. package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
  139. package/esm2015/lib/services/main.service.js +0 -766
  140. package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
  141. package/esm2015/lib/services/zcomponent.service.js +0 -167
  142. package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
  143. package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
  144. package/esm2015/lib/uicontent/uicontent.component.js +0 -41
  145. package/esm2015/lib/uiheader/uiheader.component.js +0 -65
  146. package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
  147. package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
  148. package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
  149. package/esm2015/lib/zbullet/zbullet.component.js +0 -71
  150. package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
  151. package/esm2015/lib/zcard/zcard.component.js +0 -68
  152. package/esm2015/lib/zchart/zchart.component.js +0 -199
  153. package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
  154. package/esm2015/lib/zchip/zchip.component.js +0 -117
  155. package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
  156. package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
  157. package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
  158. package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
  159. package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
  160. package/esm2015/lib/zdiv/zdiv.component.js +0 -48
  161. package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
  162. package/esm2015/lib/zform/zform.component.js +0 -148
  163. package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
  164. package/esm2015/lib/zgauge/zgauge.component.js +0 -146
  165. package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
  166. package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
  167. package/esm2015/lib/zgrid/zgrid.component.js +0 -834
  168. package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
  169. package/esm2015/lib/zimg/zimg.component.js +0 -123
  170. package/esm2015/lib/zkcard/zkcard.component.js +0 -372
  171. package/esm2015/lib/zlabel/zlabel.component.js +0 -59
  172. package/esm2015/lib/zmfb/zmfb.component.js +0 -215
  173. package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
  174. package/esm2015/lib/zmodal/zmodal.component.js +0 -130
  175. package/esm2015/lib/znumeric/znumeric.component.js +0 -114
  176. package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
  177. package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
  178. package/esm2015/lib/zreport/zreport.component.js +0 -104
  179. package/esm2015/lib/zreport/zreport.config.js +0 -115
  180. package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
  181. package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
  182. package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
  183. package/esm2015/lib/ztab/ztab.component.js +0 -180
  184. package/esm2015/lib/ztab/ztab.pipe.js +0 -22
  185. package/esm2015/lib/ztext/ztext.component.js +0 -286
  186. package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
  187. package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
  188. package/esm2015/lib/ztree/ztree.component.js +0 -374
  189. package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
  190. package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
  191. package/esm2015/lib/zudf/zudf.component.js +0 -206
  192. package/esm2015/lib/zunknown/zunknown.component.js +0 -20
  193. package/esm2015/lib/zupload/zupload.component.js +0 -358
  194. package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
  195. package/esm2015/mmhglobal-dynamicform.js +0 -7
  196. package/fesm2015/mmhglobal-dynamicform.js +0 -10729
  197. package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
  198. package/mmhglobal-dynamicform.metadata.json +0 -1
@@ -0,0 +1,60 @@
1
+ /********** Angular **********/
2
+ import { Pipe } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ /********** Ionic **********/
5
+ /********** Plugin **********/
6
+ /********** Component & Service **********/
7
+ export class EditorFilter {
8
+ transform(source) {
9
+ if (!source) {
10
+ return;
11
+ }
12
+ if (typeof source === "string") {
13
+ try {
14
+ const jsonValue = JSON.parse(source);
15
+ return JSON.stringify(jsonValue, null, 2);
16
+ // return this.safeStringify(jsonValue);
17
+ }
18
+ catch {
19
+ return source;
20
+ }
21
+ }
22
+ if (typeof source === "object" || Array.isArray(source)) {
23
+ try {
24
+ return JSON.stringify(source, null, 2);
25
+ // return this.safeStringify(source);
26
+ }
27
+ catch {
28
+ return "problem - [Circular structure to JSON]";
29
+ }
30
+ }
31
+ }
32
+ safeStringify(jsonValue) {
33
+ // Note: cache should not be re-used by repeated calls to JSON.stringify.
34
+ const cache = [];
35
+ return JSON.stringify(jsonValue, (key, value) => {
36
+ if (typeof value === 'object' && value !== null) {
37
+ // Duplicate reference found, discard key
38
+ if (cache.includes(value)) {
39
+ // debugger;
40
+ // return "problem - [Circular structure to JSON]";
41
+ return;
42
+ }
43
+ // Store value in our collection
44
+ cache.push(value);
45
+ }
46
+ return value;
47
+ }, 2);
48
+ // cache = null; // Enable garbage collection
49
+ }
50
+ }
51
+ EditorFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: EditorFilter, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
52
+ EditorFilter.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: EditorFilter, name: "editorfilter", pure: false });
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: EditorFilter, decorators: [{
54
+ type: Pipe,
55
+ args: [{
56
+ name: 'editorfilter',
57
+ pure: false
58
+ }]
59
+ }] });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemNvZGVlZGl0b3IucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pjb2RlZWRpdG9yL3pjb2RlZWRpdG9yLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUVwRCw2QkFBNkI7QUFFN0IsOEJBQThCO0FBRTlCLDJDQUEyQztBQU8zQyxNQUFNLE9BQU8sWUFBWTtJQUNyQixTQUFTLENBQUMsTUFBVztRQUNqQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDNUIsSUFBSTtnQkFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUMsd0NBQXdDO2FBQzNDO1lBQUMsTUFBTTtnQkFDSixPQUFPLE1BQU0sQ0FBQzthQUNqQjtTQUNKO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyRCxJQUFJO2dCQUNBLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxxQ0FBcUM7YUFDeEM7WUFBQyxNQUFNO2dCQUNKLE9BQU8sd0NBQXdDLENBQUM7YUFDbkQ7U0FDSjtJQUVMLENBQUM7SUFFTyxhQUFhLENBQUMsU0FBYztRQUNoQyx5RUFBeUU7UUFDekUsTUFBTSxLQUFLLEdBQWUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtnQkFDN0MseUNBQXlDO2dCQUN6QyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3ZCLFlBQVk7b0JBQ1osbURBQW1EO29CQUNuRCxPQUFPO2lCQUNWO2dCQUNELGdDQUFnQztnQkFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNOLDZDQUE2QztJQUNqRCxDQUFDOzt5R0ExQ1EsWUFBWTt1R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBSnhCLElBQUk7bUJBQUM7b0JBQ0YsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLElBQUksRUFBRSxLQUFLO2lCQUNkIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcblxyXG5cclxuQFBpcGUoe1xyXG4gICAgbmFtZTogJ2VkaXRvcmZpbHRlcicsXHJcbiAgICBwdXJlOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRWRpdG9yRmlsdGVyIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgICB0cmFuc2Zvcm0oc291cmNlOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICghc291cmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25WYWx1ZSA9IEpTT04ucGFyc2Uoc291cmNlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShqc29uVmFsdWUsIG51bGwsIDIpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoaXMuc2FmZVN0cmluZ2lmeShqc29uVmFsdWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc291cmNlLCBudWxsLCAyKTtcclxuICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGlzLnNhZmVTdHJpbmdpZnkoc291cmNlKTtcclxuICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwcm9ibGVtIC0gW0NpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OXVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhZmVTdHJpbmdpZnkoanNvblZhbHVlOiBhbnkpIHtcclxuICAgICAgICAvLyBOb3RlOiBjYWNoZSBzaG91bGQgbm90IGJlIHJlLXVzZWQgYnkgcmVwZWF0ZWQgY2FsbHMgdG8gSlNPTi5zdHJpbmdpZnkuXHJcbiAgICAgICAgY29uc3QgY2FjaGU6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvblZhbHVlLCAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlIHJlZmVyZW5jZSBmb3VuZCwgZGlzY2FyZCBrZXlcclxuICAgICAgICAgICAgICAgIGlmIChjYWNoZS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gXCJwcm9ibGVtIC0gW0NpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OXVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIFN0b3JlIHZhbHVlIGluIG91ciBjb2xsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSwgMik7XHJcbiAgICAgICAgLy8gY2FjaGUgPSBudWxsOyAvLyBFbmFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uXHJcbiAgICB9XHJcbn0iXX0=
@@ -0,0 +1,70 @@
1
+ /********** Angular **********/
2
+ import { Component, Input, ViewChild } from '@angular/core';
3
+ import { Validators } from '@angular/forms';
4
+ /********** Component & Service **********/
5
+ import { ZComponentProperties, ZComponentHelper } from 'mmhglobal-zcore';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ionic/angular";
8
+ import * as i2 from "@progress/kendo-angular-dateinputs";
9
+ import * as i3 from "../uivalidationmessage/uivalidationmessage.component";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@angular/forms";
12
+ export class ZdaterangeComponent {
13
+ constructor() {
14
+ // @ViewChild('endDateInput', { static: true }) public endInput: ElementRef;
15
+ this.range = { start: null, end: null };
16
+ this.componentProperties = new ZComponentProperties();
17
+ this.setEnable = (status) => {
18
+ this.componentProperties.isReadOnly = !status;
19
+ };
20
+ this.setVisible = (status) => {
21
+ this.componentProperties.isVisible = status;
22
+ this.data.Visible = status;
23
+ };
24
+ this.setRequire = (status) => {
25
+ this.componentProperties.isRequired = status;
26
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
27
+ };
28
+ }
29
+ ngOnInit() {
30
+ ZComponentHelper.setComponentProperties(this);
31
+ ZComponentHelper.registerComponent(this);
32
+ const rangeDateArray = this.data.Value.split(',');
33
+ const fromDateString = rangeDateArray[0].trim();
34
+ const toDateString = rangeDateArray[1].trim();
35
+ const fromDate = ZComponentHelper.getGroupEvalValue.call(this, fromDateString);
36
+ const toDate = ZComponentHelper.getGroupEvalValue.call(this, toDateString);
37
+ // this.range = {
38
+ // start: fromDate,
39
+ // end: toDate
40
+ // }
41
+ const options = ZComponentHelper.getGroupEvalValue.call(this, this.data.Options);
42
+ if (options) {
43
+ if (options.min && options.max) {
44
+ this.setNewRange(new Date(options.min), new Date(options.max));
45
+ }
46
+ }
47
+ }
48
+ setNewRange(min, max) {
49
+ this.zdaterange.setRange({
50
+ start: min,
51
+ end: max
52
+ });
53
+ }
54
+ }
55
+ ZdaterangeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdaterangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
56
+ ZdaterangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.4", type: ZdaterangeComponent, selector: "app-zdaterange", inputs: { data: "data", group: "group", form: "form" }, viewQueries: [{ propertyName: "zdaterange", first: true, predicate: ["zdaterange"], descendants: true }], ngImport: i0, template: "<ion-item [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <kendo-daterange #zdaterange class=\"ion-row\">\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">Start</span> -->\r\n <kendo-dateinput style=\"flex: 1;\" kendoDateRangeStartInput [(value)]=\"range.start\" \r\n [attr.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"></kendo-dateinput>\r\n <!-- </label> -->\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">End</span> -->\r\n <!-- <kendo-dateinput style=\"flex: 1;\" kendoDateRangeEndInput [(value)]=\"range.end\"></kendo-dateinput> -->\r\n <!-- </label> -->\r\n\r\n <kendo-daterange-popup [animate]=\"false\"></kendo-daterange-popup>\r\n </kendo-daterange>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\" [data]=\"data\" [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>", styles: [".item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-dateinput{color:var(--z-text-color)}\n"], components: [{ type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i2.DateRangeComponent, selector: "kendo-daterange" }, { type: i2.DateInputComponent, selector: "kendo-dateinput", inputs: ["focusableId", "disabled", "readonly", "title", "tabindex", "role", "ariaReadOnly", "format", "placeholder", "steps", "rangeValidation", "autoCorrect", "incompleteDateValidation", "twoDigitYearMax", "spinners", "isPopupOpen", "hasPopup", "tabIndex", "value", "size", "rounded", "fillMode", "formatPlaceholder", "max", "min"], outputs: ["valueChange", "valueUpdate", "focus", "blur"], exportAs: ["kendo-dateinput"] }, { type: i2.DateRangePopupComponent, selector: "kendo-daterange-popup", inputs: ["animate", "collision", "anchor", "anchorAlign", "appendTo", "popupAlign", "margin"], outputs: ["open", "close", "blur", "focus", "cancel"], exportAs: ["kendo-daterange-popup"] }, { type: i3.UivalidationmessageComponent, selector: "app-uivalidationmessage", inputs: ["group", "data", "form"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DateRangeStartInputDirective, selector: "[kendoDateRangeStartInput]", inputs: ["navigateCalendarOnFocus", "autoCorrectOn"] }] });
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdaterangeComponent, decorators: [{
58
+ type: Component,
59
+ args: [{ selector: 'app-zdaterange', template: "<ion-item [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <kendo-daterange #zdaterange class=\"ion-row\">\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">Start</span> -->\r\n <kendo-dateinput style=\"flex: 1;\" kendoDateRangeStartInput [(value)]=\"range.start\" \r\n [attr.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"></kendo-dateinput>\r\n <!-- </label> -->\r\n <!-- <label style=\"flex: 1;\"> -->\r\n <!-- <span class=\"label\">End</span> -->\r\n <!-- <kendo-dateinput style=\"flex: 1;\" kendoDateRangeEndInput [(value)]=\"range.end\"></kendo-dateinput> -->\r\n <!-- </label> -->\r\n\r\n <kendo-daterange-popup [animate]=\"false\"></kendo-daterange-popup>\r\n </kendo-daterange>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\" [data]=\"data\" [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>", styles: [".item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-dateinput{color:var(--z-text-color)}\n"] }]
60
+ }], ctorParameters: function () { return []; }, propDecorators: { data: [{
61
+ type: Input
62
+ }], group: [{
63
+ type: Input
64
+ }], form: [{
65
+ type: Input
66
+ }], zdaterange: [{
67
+ type: ViewChild,
68
+ args: ['zdaterange']
69
+ }] } });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemRhdGVyYW5nZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96ZGF0ZXJhbmdlL3pkYXRlcmFuZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemRhdGVyYW5nZS96ZGF0ZXJhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3ZELDJDQUEyQztBQUMzQyxPQUFPLEVBQ1csb0JBQW9CLEVBQ3hCLGdCQUFnQixFQUM3QixNQUFNLGlCQUFpQixDQUFDOzs7Ozs7O0FBUXpCLE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFKQSw0RUFBNEU7UUFDNUUsVUFBSyxHQUE4QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxDQUFDO1FBQzdELHdCQUFtQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQW9DMUMsY0FBUyxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0IsQ0FBQyxDQUFBO1FBRU0sZUFBVSxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDN0MsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkgsQ0FBQyxDQUFBO0lBOUNlLENBQUM7SUFFakIsUUFBUTtRQUNOLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTlDLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDL0UsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRSxpQkFBaUI7UUFDakIscUJBQXFCO1FBQ3JCLGdCQUFnQjtRQUNoQixJQUFJO1FBR0osTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pGLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hFO1NBQ0Y7SUFFSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVMsRUFBRSxHQUFTO1FBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3ZCLEtBQUssRUFBRSxHQUFHO1lBQ1YsR0FBRyxFQUFFLEdBQUc7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDOztnSEF6Q1UsbUJBQW1CO29HQUFuQixtQkFBbUIsd05DckJoQyxtaURBc0JXOzJGRERFLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7MEVBS2pCLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUMwQixVQUFVO3NCQUF6QyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgRGF0ZVJhbmdlU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRhdGVpbnB1dHMnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBcclxuICBaRmllbGQsIFpHcm91cCwgWkNvbXBvbmVudFByb3BlcnRpZXMsXHJcbiAgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciBcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXpkYXRlcmFuZ2UnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96ZGF0ZXJhbmdlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi96ZGF0ZXJhbmdlLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaZGF0ZXJhbmdlQ29tcG9uZW50IGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0IHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgQFZpZXdDaGlsZCgnemRhdGVyYW5nZScpIHB1YmxpYyB6ZGF0ZXJhbmdlOiBEYXRlUmFuZ2VTZXJ2aWNlO1xyXG4gIC8vIEBWaWV3Q2hpbGQoJ2VuZERhdGVJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBlbmRJbnB1dDogRWxlbWVudFJlZjtcclxuICByYW5nZTogeyBzdGFydDogRGF0ZSwgZW5kOiBEYXRlfSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbH07XHJcbiAgY29tcG9uZW50UHJvcGVydGllcyA9IG5ldyBaQ29tcG9uZW50UHJvcGVydGllcygpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0Q29tcG9uZW50UHJvcGVydGllcyh0aGlzKTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVnaXN0ZXJDb21wb25lbnQodGhpcyk7XHJcblxyXG4gICAgY29uc3QgcmFuZ2VEYXRlQXJyYXkgPSB0aGlzLmRhdGEuVmFsdWUuc3BsaXQoJywnKTtcclxuICAgIGNvbnN0IGZyb21EYXRlU3RyaW5nID0gcmFuZ2VEYXRlQXJyYXlbMF0udHJpbSgpO1xyXG4gICAgY29uc3QgdG9EYXRlU3RyaW5nID0gcmFuZ2VEYXRlQXJyYXlbMV0udHJpbSgpO1xyXG4gIFxyXG4gICAgY29uc3QgZnJvbURhdGUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgZnJvbURhdGVTdHJpbmcpO1xyXG4gICAgY29uc3QgdG9EYXRlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRvRGF0ZVN0cmluZyk7XHJcbiAgICAvLyB0aGlzLnJhbmdlID0ge1xyXG4gICAgLy8gICBzdGFydDogZnJvbURhdGUsXHJcbiAgICAvLyAgIGVuZDogdG9EYXRlXHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLk9wdGlvbnMpO1xyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgaWYgKG9wdGlvbnMubWluICYmIG9wdGlvbnMubWF4KSB7XHJcbiAgICAgICAgdGhpcy5zZXROZXdSYW5nZShuZXcgRGF0ZShvcHRpb25zLm1pbiksIG5ldyBEYXRlKG9wdGlvbnMubWF4KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXROZXdSYW5nZShtaW46IERhdGUsIG1heDogRGF0ZSkge1xyXG4gICAgdGhpcy56ZGF0ZXJhbmdlLnNldFJhbmdlKHtcclxuICAgICAgc3RhcnQ6IG1pbixcclxuICAgICAgZW5kOiBtYXhcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEVuYWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5ID0gIXN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSA9IHN0YXR1cztcclxuICAgIHRoaXMuZGF0YS5WaXNpYmxlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlcXVpcmUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCA9IHN0YXR1cztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGlvbi1pdGVtIFtmb3JtR3JvdXBdPVwiZm9ybVwiICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCI+XHJcbiAgPGlvbi1sYWJlbCBbYXR0ci5mb3JdPVwiZGF0YS5WYWx1ZVwiICpuZ0lmPVwiZGF0YS5TaG93TGFiZWwgPT09IHVuZGVmaW5lZCB8fCBkYXRhLlNob3dMYWJlbFwiIHBvc2l0aW9uPVwic3RhY2tlZFwiPlxyXG4gICAge3tkYXRhLkxhYmVsfX0gPGlvbi10ZXh0ICpuZ0lmPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWRGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQpXCIgY29sb3I9XCJkYW5nZXJcIj4qPC9pb24tdGV4dD5cclxuICA8L2lvbi1sYWJlbD5cclxuICA8ZGl2IGNsYXNzPVwiaW9uLXJvd1wiIHN0eWxlPVwianVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyB3aWR0aDogMTAwJVwiPlxyXG4gICAgPHNwYW4gc3R5bGU9XCJmbGV4OiAxO1wiPlxyXG4gICAgICA8a2VuZG8tZGF0ZXJhbmdlICN6ZGF0ZXJhbmdlIGNsYXNzPVwiaW9uLXJvd1wiPlxyXG4gICAgICAgIDwhLS0gPGxhYmVsIHN0eWxlPVwiZmxleDogMTtcIj4gLS0+XHJcbiAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImxhYmVsXCI+U3RhcnQ8L3NwYW4+IC0tPlxyXG4gICAgICAgIDxrZW5kby1kYXRlaW5wdXQgc3R5bGU9XCJmbGV4OiAxO1wiIGtlbmRvRGF0ZVJhbmdlU3RhcnRJbnB1dCBbKHZhbHVlKV09XCJyYW5nZS5zdGFydFwiIFxyXG4gICAgICAgIFthdHRyLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiPjwva2VuZG8tZGF0ZWlucHV0PlxyXG4gICAgICAgIDwhLS0gPC9sYWJlbD4gLS0+XHJcbiAgICAgICAgPCEtLSA8bGFiZWwgc3R5bGU9XCJmbGV4OiAxO1wiPiAtLT5cclxuICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwibGFiZWxcIj5FbmQ8L3NwYW4+IC0tPlxyXG4gICAgICAgIDwhLS0gPGtlbmRvLWRhdGVpbnB1dCBzdHlsZT1cImZsZXg6IDE7XCIga2VuZG9EYXRlUmFuZ2VFbmRJbnB1dCBbKHZhbHVlKV09XCJyYW5nZS5lbmRcIj48L2tlbmRvLWRhdGVpbnB1dD4gLS0+XHJcbiAgICAgICAgPCEtLSA8L2xhYmVsPiAtLT5cclxuXHJcbiAgICAgICAgPGtlbmRvLWRhdGVyYW5nZS1wb3B1cCBbYW5pbWF0ZV09XCJmYWxzZVwiPjwva2VuZG8tZGF0ZXJhbmdlLXBvcHVwPlxyXG4gICAgICA8L2tlbmRvLWRhdGVyYW5nZT5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxhcHAtdWl2YWxpZGF0aW9ubWVzc2FnZSBbZ3JvdXBdPVwiZ3JvdXBcIiBbZGF0YV09XCJkYXRhXCIgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXVpdmFsaWRhdGlvbm1lc3NhZ2U+XHJcbiAgPC9kaXY+XHJcbjwvaW9uLWl0ZW0+Il19
@@ -0,0 +1,30 @@
1
+ import { Pipe } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class DateParserFilter {
4
+ transform(items) {
5
+ // debugger;
6
+ if (!items) {
7
+ return items;
8
+ }
9
+ // filter items array, items which match and return true will be
10
+ // kept, false will be filtered out
11
+ try {
12
+ const d = new Date(items);
13
+ return d;
14
+ }
15
+ catch (error) {
16
+ console.log("DateParserFilter error: ", error);
17
+ return null;
18
+ }
19
+ }
20
+ }
21
+ DateParserFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: DateParserFilter, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
22
+ DateParserFilter.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: DateParserFilter, name: "dateParser" });
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: DateParserFilter, decorators: [{
24
+ type: Pipe,
25
+ args: [{
26
+ name: "dateParser",
27
+ pure: true,
28
+ }]
29
+ }] });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZVBhcnNlci5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemRhdGV0aW1lL2RhdGVQYXJzZXIucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFNcEQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixTQUFTLENBQUMsS0FBVTtRQUNsQixZQUFZO1FBQ1osSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxnRUFBZ0U7UUFDaEUsbUNBQW1DO1FBQ25DLElBQUk7WUFDRixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDOzs2R0FmVSxnQkFBZ0I7MkdBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUo1QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxZQUFZO29CQUNsQixJQUFJLEVBQUUsSUFBSTtpQkFDWCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQFBpcGUoe1xyXG4gIG5hbWU6IFwiZGF0ZVBhcnNlclwiLFxyXG4gIHB1cmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlUGFyc2VyRmlsdGVyIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XHJcbiAgdHJhbnNmb3JtKGl0ZW1zOiBhbnkpOiBhbnkge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBpdGVtcyBhcnJheSwgaXRlbXMgd2hpY2ggbWF0Y2ggYW5kIHJldHVybiB0cnVlIHdpbGwgYmVcclxuICAgIC8vIGtlcHQsIGZhbHNlIHdpbGwgYmUgZmlsdGVyZWQgb3V0XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoaXRlbXMpO1xyXG4gICAgICByZXR1cm4gZDtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRGF0ZVBhcnNlckZpbHRlciBlcnJvcjogXCIsIGVycm9yKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,285 @@
1
+ /********** Angular **********/
2
+ import { Component, Input } from "@angular/core";
3
+ import { Validators } from "@angular/forms";
4
+ /********** Component & Service **********/
5
+ import { ZComponentHelper, ZComponentProperties } from "mmhglobal-zcore";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@ionic/angular";
8
+ import * as i2 from "@progress/kendo-angular-dateinputs";
9
+ import * as i3 from "../uivalidationmessage/uivalidationmessage.component";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@angular/forms";
12
+ import * as i6 from "./dateParser.pipe";
13
+ export class ZdatetimeComponent {
14
+ constructor() {
15
+ this.dateFormat = "DD-MMM-YYYY";
16
+ // dateValue = null;
17
+ this.componentProperties = new ZComponentProperties();
18
+ this.setEnable = (status) => {
19
+ const fc = this.group.form.controls[this.data.Value];
20
+ status ? fc.enable() : fc.disable();
21
+ this.componentProperties.isReadOnly = !status;
22
+ };
23
+ this.setVisible = (status) => {
24
+ this.componentProperties.isVisible = status;
25
+ this.data.Visible = status;
26
+ };
27
+ this.setRequire = (status) => {
28
+ this.componentProperties.isRequired = status;
29
+ ZComponentHelper.changeValidator(status, this.group, this.data.Value, this.componentProperties, Validators.required);
30
+ };
31
+ this.SetDateRange = (MinDate, MaxDate) => {
32
+ var thisComponent = this;
33
+ if (!isNaN(Date.parse(MinDate))) {
34
+ this.data.MinDate = new Date(MinDate);
35
+ }
36
+ if (!isNaN(Date.parse(MaxDate))) {
37
+ this.data.MaxDate = new Date(MaxDate);
38
+ }
39
+ };
40
+ }
41
+ ngOnInit() {
42
+ ZComponentHelper.setComponentProperties(this);
43
+ ZComponentHelper.registerComponent(this);
44
+ if (this.data.Type === "ztime") {
45
+ this.dateFormat = "HH:mm";
46
+ }
47
+ if (this.data.Type === "zuidatetime") {
48
+ this.dateFormat = "DD-MMM-YYYY h:mm A";
49
+ }
50
+ if (this.data.Type === "zuitime") {
51
+ this.dateFormat = "HH:mm:ss";
52
+ }
53
+ if (this.data.Type === "zshortdate") {
54
+ this.dateFormat = "MMM-YYYY";
55
+ }
56
+ // if (this.group.zModel[this.data.Value]) {
57
+ // this.dateValue = new Date(this.group.zModel[this.data.Value]);
58
+ // }
59
+ }
60
+ toKendoDateFormat() {
61
+ return this.dateFormat
62
+ .replace("DD", "dd")
63
+ .replace("YYYY", "yyyy")
64
+ .replace("h", "H")
65
+ .replace("A", "a");
66
+ }
67
+ getReadOnlyValue() {
68
+ const readOnlyValue = ZComponentHelper.getGroupEvalValue.call(this, this.data.ReadOnly, this.group);
69
+ if (typeof readOnlyValue === "function") {
70
+ return readOnlyValue();
71
+ }
72
+ return readOnlyValue;
73
+ }
74
+ isMobileScreen() {
75
+ const v = ZComponentHelper.isMobileScreen();
76
+ return v;
77
+ }
78
+ getDateValue() {
79
+ const value = this.form.controls[this.data.Value].value;
80
+ if (value) {
81
+ return new Date(value);
82
+ }
83
+ else {
84
+ return null;
85
+ }
86
+ }
87
+ GetDate(date) {
88
+ // convert the date to ISOString
89
+ const myDate = new Date(date).toISOString();
90
+ // assign to the zModel
91
+ ZComponentHelper.setModelValue(this.data.Value, myDate, this.group);
92
+ }
93
+ onChange(value) {
94
+ // console.log(
95
+ // "date change ",
96
+ // value.toISOString(),
97
+ // " date value: ",
98
+ // new Date(value.toISOString())
99
+ // );
100
+ // // this.group.zModel[this.data.Value] = value.toISOString();
101
+ // const v = value.toISOString();
102
+ // this.dateValue = new Date(value.toISOString());
103
+ if (value === null) {
104
+ ZComponentHelper.setModelValue(this.data.Value, value, this.group);
105
+ }
106
+ else {
107
+ ZComponentHelper.setModelValue(this.data.Value, value.toISOString(), this.group);
108
+ const fc = this.form.controls[this.data.Value];
109
+ fc.setValue(value.toISOString());
110
+ }
111
+ this.group.subject.next({
112
+ type: "onChange",
113
+ target: this.data.OnChange,
114
+ data: value,
115
+ });
116
+ }
117
+ handlePreventableEvent(event, eventName, preventDefault) {
118
+ // keep "this" to use in binding.
119
+ var thisComponent = this;
120
+ // need a timeout for ui to display the calender popup
121
+ setTimeout(function () {
122
+ // only available when popup is shown, get the element by class
123
+ // for date
124
+ thisComponent.dateAppendEvent(thisComponent);
125
+ // for time
126
+ thisComponent.timeAppendEvent(thisComponent);
127
+ }, 500);
128
+ }
129
+ dateAppendEvent(thisComponent) {
130
+ let dateCell = $("tbody.k-calendar-tbody").find("td.k-calendar-td");
131
+ for (var i = 0; i < dateCell.length; i++) {
132
+ const node = dateCell[i];
133
+ if (node.title != "") {
134
+ // when date clicked
135
+ node.addEventListener("click", function () {
136
+ if (!isNaN(Date.parse(node.title))) {
137
+ const nodeDate = new Date(node.title).toISOString();
138
+ // assign to the zModel
139
+ ZComponentHelper.setModelValue(thisComponent.data.Value, nodeDate, thisComponent.group);
140
+ }
141
+ // timeout append time click event
142
+ setTimeout(function () {
143
+ thisComponent.hoursOnClick(thisComponent);
144
+ thisComponent.minutesOnClick(thisComponent);
145
+ thisComponent.ampmOnClick(thisComponent);
146
+ thisComponent.nowOnClick(thisComponent);
147
+ }, 500);
148
+ });
149
+ }
150
+ }
151
+ // Today clicked
152
+ const todayDate = $("span.k-today")[0];
153
+ todayDate.addEventListener("click", function () {
154
+ const dateNow = new Date().toJSON().slice(0, 10).replace(/-/g, '/');
155
+ // set to Model
156
+ thisComponent.setDateTimeToModel(thisComponent, dateNow);
157
+ thisComponent.hoursOnClick(thisComponent);
158
+ thisComponent.minutesOnClick(thisComponent);
159
+ thisComponent.ampmOnClick(thisComponent);
160
+ thisComponent.nowOnClick(thisComponent);
161
+ });
162
+ }
163
+ timeAppendEvent(thisComponent) {
164
+ var timeTab = $("button.k-button.k-time-tab")[0];
165
+ timeTab.addEventListener("click", function () {
166
+ thisComponent.hoursOnClick(thisComponent);
167
+ thisComponent.minutesOnClick(thisComponent);
168
+ thisComponent.ampmOnClick(thisComponent);
169
+ thisComponent.nowOnClick(thisComponent);
170
+ });
171
+ }
172
+ nowOnClick(thisComponent) {
173
+ const nowTime = $("button.k-button.k-bare.k-time-now")[0];
174
+ if (nowTime) {
175
+ nowTime.addEventListener("click", function (e) {
176
+ // get model current value
177
+ let valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
178
+ const dateTimeNow = new Date();
179
+ // convert current value to datetime
180
+ valueDateTime.setHours(dateTimeNow.getHours());
181
+ valueDateTime.setMinutes(dateTimeNow.getMinutes());
182
+ valueDateTime.setSeconds(dateTimeNow.getSeconds());
183
+ // set to Model
184
+ thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
185
+ });
186
+ }
187
+ }
188
+ hoursOnClick(thisComponent) {
189
+ const timeWrapper = $("div.k-time-list-wrapper").find("ul");
190
+ if (timeWrapper.length > 0) {
191
+ const hour = timeWrapper[0].children;
192
+ for (var i = 0; i < hour.length; i++) {
193
+ hour[i].addEventListener("click", function (e) {
194
+ // get clicked node value
195
+ const nodeValue = e.currentTarget.textContent;
196
+ // get model current value
197
+ let valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
198
+ // set new hour
199
+ valueDateTime.setHours(nodeValue);
200
+ // set to Model
201
+ thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
202
+ });
203
+ }
204
+ }
205
+ }
206
+ minutesOnClick(thisComponent) {
207
+ const timeWrapper = $("div.k-time-list-wrapper").find("ul");
208
+ if (timeWrapper.length > 0) {
209
+ const minutes = timeWrapper[1].children;
210
+ for (var i = 0; i < minutes.length; i++) {
211
+ minutes[i].addEventListener("click", function (e) {
212
+ // get clicked node value
213
+ const nodeValue = e.currentTarget.textContent;
214
+ // get model current value
215
+ const valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
216
+ // set new minute
217
+ valueDateTime.setMinutes(nodeValue);
218
+ // set to Model
219
+ thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
220
+ });
221
+ }
222
+ }
223
+ }
224
+ ampmOnClick(thisComponent) {
225
+ const timeWrapper = $("div.k-time-list-wrapper").find("ul");
226
+ if (timeWrapper.length > 0) {
227
+ const ampm = timeWrapper[2].children;
228
+ for (var i = 0; i < ampm.length; i++) {
229
+ ampm[i].addEventListener("click", function (e) {
230
+ // get clicked node value
231
+ const nodeValue = e.currentTarget.textContent;
232
+ // get model current value
233
+ const valueDateTime = thisComponent.currentDateTimeValue(thisComponent);
234
+ // set new minutes
235
+ var _hour = valueDateTime.getHours();
236
+ if (nodeValue.toLowerCase() == "am") {
237
+ _hour -= 12;
238
+ }
239
+ else {
240
+ _hour += 12;
241
+ }
242
+ valueDateTime.setHours(_hour);
243
+ // set to Model
244
+ thisComponent.setDateTimeToModel(thisComponent, valueDateTime);
245
+ });
246
+ }
247
+ }
248
+ }
249
+ currentDateTimeValue(thisComponent) {
250
+ // get current value
251
+ const zModelValue = ZComponentHelper.getZModelValue(thisComponent.data.Value, thisComponent.group, thisComponent.group.zModel);
252
+ let valueDateTime = new Date();
253
+ if (zModelValue != "" && zModelValue != undefined) {
254
+ // convert current value to datetime
255
+ valueDateTime = new Date(zModelValue);
256
+ }
257
+ return valueDateTime;
258
+ }
259
+ setDateTimeToModel(thisComponent, valueDateTime) {
260
+ // convert the date to ISOString
261
+ const newDateTime = new Date(valueDateTime).toISOString();
262
+ // assign to the zModel
263
+ ZComponentHelper.setModelValue(thisComponent.data.Value, newDateTime, thisComponent.group);
264
+ // set timeout do add event again after node clicked. if not it only work 1 time.
265
+ setTimeout(function () {
266
+ thisComponent.hoursOnClick(thisComponent);
267
+ thisComponent.minutesOnClick(thisComponent);
268
+ thisComponent.ampmOnClick(thisComponent);
269
+ thisComponent.nowOnClick(thisComponent);
270
+ }, 500);
271
+ }
272
+ }
273
+ ZdatetimeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdatetimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
274
+ ZdatetimeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.4", type: ZdatetimeComponent, selector: "app-zdatetime", inputs: { data: "data", group: "group", form: "form" }, ngImport: i0, template: "<ion-item [ngClass]=\"data.Class\" [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"componentProperties.isRequired\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <ion-datetime *ngIf=\"isMobileScreen()\"\r\n style=\"padding: 8px 0px;\"\r\n [required]=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [id]=\"data.Value\"\r\n [displayFormat]=\"dateFormat\"\r\n [pickerFormat]=\"dateFormat\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [formControlName]=\"data.Value\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\">\r\n </ion-datetime>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n [activeView]=\"'year'\"\r\n [bottomView]=\"'year'\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n </kendo-datepicker>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-datepicker>\r\n <kendo-datetimepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY h:mm A'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n (open)=\"handlePreventableEvent($event, 'open', false)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n <ng-template kendoCalendarMonthCellTemplate let-date>\r\n <span (click)=\"GetDate(date)\">{{date.getDate()}}</span>\r\n </ng-template>\r\n </kendo-datetimepicker>\r\n <kendo-timepicker *ngIf=\"!isMobileScreen() && (dateFormat==='HH:mm:ss' || dateFormat==='HH:mm')\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-timepicker>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>\r\n", styles: [".gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-datepicker{color:var(--z-text-color)}\n"], components: [{ type: i1.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { type: i1.IonDatetime, selector: "ion-datetime", inputs: ["cancelText", "clearText", "color", "dayValues", "disabled", "doneText", "firstDayOfWeek", "hourCycle", "hourValues", "isDateEnabled", "locale", "max", "min", "minuteValues", "mode", "monthValues", "name", "presentation", "readonly", "showClearButton", "showDefaultButtons", "showDefaultTimeLabel", "showDefaultTitle", "size", "value", "yearValues"] }, { type: i2.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "navigation", "min", "max", "incompleteDateValidation", "focusedDate", "format", "twoDigitYearMax", "placeholder", "tabindex", "title", "rangeValidation", "disabledDatesValidation", "weekNumber", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "popupSettings", "value", "tabIndex", "disabledDates", "size", "rounded", "fillMode", "formatPlaceholder"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }, { type: i2.DateTimePickerComponent, selector: "kendo-datetimepicker", inputs: ["twoDigitYearMax", "focusableId", "title", "disabled", "readonly", "readOnlyInput", "cancelButton", "steps", "calendarType", "animateCalendarNavigation", "weekNumber", "rangeValidation", "disabledDatesValidation", "incompleteDateValidation", "value", "format", "tabindex", "disabledDates", "popupSettings", "min", "max", "defaultTab", "size", "rounded", "fillMode", "formatPlaceholder", "placeholder", "focusedDate"], outputs: ["valueChange", "open", "close", "focus", "blur"], exportAs: ["kendo-datetimepicker"] }, { type: i2.TimePickerComponent, selector: "kendo-timepicker", inputs: ["focusableId", "disabled", "readonly", "readOnlyInput", "format", "placeholder", "incompleteDateValidation", "cancelButton", "nowButton", "tabindex", "title", "rangeValidation", "min", "max", "steps", "popupSettings", "tabIndex", "value", "size", "rounded", "fillMode", "formatPlaceholder"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-timepicker"] }, { type: i3.UivalidationmessageComponent, selector: "app-uivalidationmessage", inputs: ["group", "data", "form"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.MonthCellTemplateDirective, selector: "[kendoCalendarMonthCellTemplate]" }], pipes: { "dateParser": i6.DateParserFilter } });
275
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: ZdatetimeComponent, decorators: [{
276
+ type: Component,
277
+ args: [{ selector: "app-zdatetime", template: "<ion-item [ngClass]=\"data.Class\" [formGroup]=\"form\" *ngIf=\"(!!componentProperties.isVisibleField ? group[componentProperties.isVisibleField] : componentProperties.isVisible)\">\r\n <ion-label [attr.for]=\"data.Value\" *ngIf=\"data.ShowLabel === undefined || data.ShowLabel\" position=\"stacked\">\r\n {{data.Label}} <ion-text *ngIf=\"componentProperties.isRequired\" color=\"danger\">*</ion-text>\r\n </ion-label>\r\n <div class=\"ion-row\" style=\"justify-content: space-between; width: 100%\">\r\n <span style=\"flex: 1;\">\r\n <ion-datetime *ngIf=\"isMobileScreen()\"\r\n style=\"padding: 8px 0px;\"\r\n [required]=\"(!!componentProperties.isRequiredField ? group[componentProperties.isRequiredField] : componentProperties.isRequired)\"\r\n [placeholder]=\"data.PlaceHolder\"\r\n [id]=\"data.Value\"\r\n [displayFormat]=\"dateFormat\"\r\n [pickerFormat]=\"dateFormat\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [formControlName]=\"data.Value\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\">\r\n </ion-datetime>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n [activeView]=\"'year'\"\r\n [bottomView]=\"'year'\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n </kendo-datepicker>\r\n <kendo-datepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n [min]=\"data.MinDate\"\r\n [max]=\"data.MaxDate\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-datepicker>\r\n <kendo-datetimepicker *ngIf=\"!isMobileScreen() && dateFormat==='DD-MMM-YYYY h:mm A'\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n (open)=\"handlePreventableEvent($event, 'open', false)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\">\r\n <ng-template kendoCalendarMonthCellTemplate let-date>\r\n <span (click)=\"GetDate(date)\">{{date.getDate()}}</span>\r\n </ng-template>\r\n </kendo-datetimepicker>\r\n <kendo-timepicker *ngIf=\"!isMobileScreen() && (dateFormat==='HH:mm:ss' || dateFormat==='HH:mm')\"\r\n [id]=\"data.Value\"\r\n [value]=\"form.get(data.Value).value | dateParser\"\r\n (valueChange)=\"onChange($event)\"\r\n style=\"margin-top: 7px; width: 100%;\"\r\n [class.disabled]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n [format]=\"toKendoDateFormat()\"\r\n [placeholder]=\"data.PlaceHolder\"></kendo-timepicker>\r\n </span>\r\n <app-uivalidationmessage [group]=\"group\"\r\n [data]=\"data\"\r\n [form]=\"form\"></app-uivalidationmessage>\r\n </div>\r\n</ion-item>\r\n", styles: [".gridInlineEdit{--background: transparent}.item.sc-ion-label-md-h,.item .sc-ion-label-md-h{font-weight:var(--z-label-weight);color:var(--z-label-color);text-shadow:var(--z-label-shadow)}.k-datepicker{color:var(--z-text-color)}\n"] }]
278
+ }], ctorParameters: function () { return []; }, propDecorators: { data: [{
279
+ type: Input
280
+ }], group: [{
281
+ type: Input
282
+ }], form: [{
283
+ type: Input
284
+ }] } });
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemRhdGV0aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21taGdsb2JhbC1keW5hbWljZm9ybS9zcmMvbGliL3pkYXRldGltZS96ZGF0ZXRpbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvemRhdGV0aW1lL3pkYXRldGltZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3ZELDJDQUEyQztBQUMzQyxPQUFPLEVBQ08sZ0JBQWdCLEVBQ1osb0JBQW9CLEVBQ3JDLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBV3pCLE1BQU0sT0FBTyxrQkFBa0I7SUFTN0I7UUFMQSxlQUFVLEdBQUcsYUFBYSxDQUFDO1FBQzNCLG9CQUFvQjtRQUVwQix3QkFBbUIsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFtRzFDLGNBQVMsR0FBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUN0QyxJQUFJ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QWEsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDOzsrR0FuVVUsa0JBQWtCO21HQUFsQixrQkFBa0IsNkdDeEIvQix3M0tBdUVBOzJGRC9DYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZUFBZTswRUFLaEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBQcmV2ZW50YWJsZUV2ZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGF0ZWlucHV0cyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgWkNvbXBvbmVudCwgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gIFpGaWVsZCwgWkdyb3VwLCBaQ29tcG9uZW50UHJvcGVydGllc1xyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuXHJcblxyXG4vLyBpbXBvcnQgKiBhcyAkIGZyb20gJ2pxdWVyeSc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC16ZGF0ZXRpbWVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3pkYXRldGltZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi96ZGF0ZXRpbWUuY29tcG9uZW50LnNjc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaZGF0ZXRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGRhdGE6IFpGaWVsZDtcclxuICBASW5wdXQoKSBncm91cDogWkdyb3VwO1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cDtcclxuICBkYXRlRm9ybWF0ID0gXCJERC1NTU0tWVlZWVwiO1xyXG4gIC8vIGRhdGVWYWx1ZSA9IG51bGw7XHJcblxyXG4gIGNvbXBvbmVudFByb3BlcnRpZXMgPSBuZXcgWkNvbXBvbmVudFByb3BlcnRpZXMoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldENvbXBvbmVudFByb3BlcnRpZXModGhpcyk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGEuVHlwZSA9PT0gXCJ6dGltZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiSEg6bW1cIjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRhdGEuVHlwZSA9PT0gXCJ6dWlkYXRldGltZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiREQtTU1NLVlZWVkgaDptbSBBXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kYXRhLlR5cGUgPT09IFwienVpdGltZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgIH1cclxuXHRpZiAodGhpcy5kYXRhLlR5cGUgPT09IFwienNob3J0ZGF0ZVwiKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IFwiTU1NLVlZWVlcIjtcclxuICAgIH1cclxuICAgIC8vIGlmICh0aGlzLmdyb3VwLnpNb2RlbFt0aGlzLmRhdGEuVmFsdWVdKSB7XHJcbiAgICAvLyAgIHRoaXMuZGF0ZVZhbHVlID0gbmV3IERhdGUodGhpcy5ncm91cC56TW9kZWxbdGhpcy5kYXRhLlZhbHVlXSk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICB0b0tlbmRvRGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGVGb3JtYXRcclxuICAgICAgLnJlcGxhY2UoXCJERFwiLCBcImRkXCIpXHJcbiAgICAgIC5yZXBsYWNlKFwiWVlZWVwiLCBcInl5eXlcIilcclxuICAgICAgLnJlcGxhY2UoXCJoXCIsIFwiSFwiKVxyXG4gICAgICAucmVwbGFjZShcIkFcIiwgXCJhXCIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVhZE9ubHlWYWx1ZSgpIHtcclxuICAgIGNvbnN0IHJlYWRPbmx5VmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgIHRoaXMsXHJcbiAgICAgIHRoaXMuZGF0YS5SZWFkT25seSxcclxuICAgICAgdGhpcy5ncm91cFxyXG4gICAgKTtcclxuICAgIGlmICh0eXBlb2YgcmVhZE9ubHlWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHJldHVybiByZWFkT25seVZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVhZE9ubHlWYWx1ZTtcclxuICB9XHJcblxyXG4gIGlzTW9iaWxlU2NyZWVuKCkge1xyXG4gICAgY29uc3QgdiA9IFpDb21wb25lbnRIZWxwZXIuaXNNb2JpbGVTY3JlZW4oKTtcclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZVZhbHVlKCkge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXS52YWx1ZTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0RGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICAvLyBjb252ZXJ0IHRoZSBkYXRlIHRvIElTT1N0cmluZ1xyXG4gICAgY29uc3QgbXlEYXRlID0gbmV3IERhdGUoZGF0ZSkudG9JU09TdHJpbmcoKTtcclxuICAgIC8vIGFzc2lnbiB0byB0aGUgek1vZGVsXHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUodGhpcy5kYXRhLlZhbHVlLCBteURhdGUsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiBEYXRlKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcclxuICAgIC8vICAgXCJkYXRlIGNoYW5nZSBcIixcclxuICAgIC8vICAgdmFsdWUudG9JU09TdHJpbmcoKSxcclxuICAgIC8vICAgXCIgZGF0ZSB2YWx1ZTogXCIsXHJcbiAgICAvLyAgIG5ldyBEYXRlKHZhbHVlLnRvSVNPU3RyaW5nKCkpXHJcbiAgICAvLyApO1xyXG4gICAgLy8gLy8gdGhpcy5ncm91cC56TW9kZWxbdGhpcy5kYXRhLlZhbHVlXSA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAvLyBjb25zdCB2ID0gdmFsdWUudG9JU09TdHJpbmcoKTtcclxuICAgIC8vIHRoaXMuZGF0ZVZhbHVlID0gbmV3IERhdGUodmFsdWUudG9JU09TdHJpbmcoKSk7XHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKFxyXG4gICAgICAgIHRoaXMuZGF0YS5WYWx1ZSxcclxuICAgICAgICB2YWx1ZSxcclxuICAgICAgICB0aGlzLmdyb3VwXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoXHJcbiAgICAgICAgdGhpcy5kYXRhLlZhbHVlLFxyXG4gICAgICAgIHZhbHVlLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgdGhpcy5ncm91cFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgZmMgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgICAgZmMuc2V0VmFsdWUodmFsdWUudG9JU09TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgIHR5cGU6IFwib25DaGFuZ2VcIixcclxuICAgICAgdGFyZ2V0OiB0aGlzLmRhdGEuT25DaGFuZ2UsXHJcbiAgICAgIGRhdGE6IHZhbHVlLFxyXG4gICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEVuYWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIGNvbnN0IGZjID0gdGhpcy5ncm91cC5mb3JtLmNvbnRyb2xzW3RoaXMuZGF0YS5WYWx1ZV07XHJcbiAgICBzdGF0dXMgPyBmYy5lbmFibGUoKSA6IGZjLmRpc2FibGUoKTtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5ID0gIXN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSA9IHN0YXR1cztcclxuICAgIHRoaXMuZGF0YS5WaXNpYmxlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlcXVpcmUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCA9IHN0YXR1cztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFNldERhdGVSYW5nZSA9IChNaW5EYXRlOiBzdHJpbmcsTWF4RGF0ZTogc3RyaW5nKTogYW55ID0+XHJcbiAge1xyXG4gICAgdmFyIHRoaXNDb21wb25lbnQgPSB0aGlzO1xyXG5cclxuICAgIGlmICghaXNOYU4oRGF0ZS5wYXJzZShNaW5EYXRlKSkpXHJcbiAgICB7XHJcbiAgICAgIHRoaXMuZGF0YS5NaW5EYXRlID0gbmV3IERhdGUoTWluRGF0ZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzTmFOKERhdGUucGFyc2UoTWF4RGF0ZSkpKVxyXG4gICAge1xyXG4gICAgICB0aGlzLmRhdGEuTWF4RGF0ZSA9IG5ldyBEYXRlKE1heERhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVByZXZlbnRhYmxlRXZlbnQoZXZlbnQ6IFByZXZlbnRhYmxlRXZlbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBwcmV2ZW50RGVmYXVsdDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgLy8ga2VlcCBcInRoaXNcIiB0byB1c2UgaW4gYmluZGluZy5cclxuICAgIHZhciB0aGlzQ29tcG9uZW50ID0gdGhpcztcclxuXHJcbiAgICAvLyBuZWVkIGEgdGltZW91dCBmb3IgdWkgdG8gZGlzcGxheSB0aGUgY2FsZW5kZXIgcG9wdXBcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAvLyBvbmx5IGF2YWlsYWJsZSB3aGVuIHBvcHVwIGlzIHNob3duLCBnZXQgdGhlIGVsZW1lbnQgYnkgY2xhc3NcclxuICAgICAgLy8gZm9yIGRhdGVcclxuICAgICAgdGhpc0NvbXBvbmVudC5kYXRlQXBwZW5kRXZlbnQodGhpc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAvLyBmb3IgdGltZVxyXG4gICAgICB0aGlzQ29tcG9uZW50LnRpbWVBcHBlbmRFdmVudCh0aGlzQ29tcG9uZW50KTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRhdGVBcHBlbmRFdmVudCh0aGlzQ29tcG9uZW50OiBhbnkpIHtcclxuICAgIGxldCBkYXRlQ2VsbCA9ICQoXCJ0Ym9keS5rLWNhbGVuZGFyLXRib2R5XCIpLmZpbmQoXCJ0ZC5rLWNhbGVuZGFyLXRkXCIpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRlQ2VsbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBub2RlID0gZGF0ZUNlbGxbaV07XHJcblxyXG4gICAgICBpZiAobm9kZS50aXRsZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgLy8gd2hlbiBkYXRlIGNsaWNrZWRcclxuICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAoIWlzTmFOKERhdGUucGFyc2Uobm9kZS50aXRsZSkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRlID0gbmV3IERhdGUobm9kZS50aXRsZSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy8gYXNzaWduIHRvIHRoZSB6TW9kZWxcclxuICAgICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKHRoaXNDb21wb25lbnQuZGF0YS5WYWx1ZSwgbm9kZURhdGUsIHRoaXNDb21wb25lbnQuZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRpbWVvdXQgYXBwZW5kIHRpbWUgY2xpY2sgZXZlbnRcclxuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzQ29tcG9uZW50LmhvdXJzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5taW51dGVzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5hbXBtT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgICAgICAgdGhpc0NvbXBvbmVudC5ub3dPbkNsaWNrKHRoaXNDb21wb25lbnQpO1xyXG4gICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRvZGF5IGNsaWNrZWRcclxuICAgIGNvbnN0IHRvZGF5RGF0ZSA9ICQoXCJzcGFuLmstdG9kYXlcIilbMF07XHJcbiAgICB0b2RheURhdGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgY29uc3QgZGF0ZU5vdyA9IG5ldyBEYXRlKCkudG9KU09OKCkuc2xpY2UoMCwgMTApLnJlcGxhY2UoLy0vZywgJy8nKTtcclxuICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgIHRoaXNDb21wb25lbnQuc2V0RGF0ZVRpbWVUb01vZGVsKHRoaXNDb21wb25lbnQsIGRhdGVOb3cpO1xyXG5cclxuICAgICAgdGhpc0NvbXBvbmVudC5ob3Vyc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubWludXRlc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQuYW1wbU9uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubm93T25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aW1lQXBwZW5kRXZlbnQodGhpc0NvbXBvbmVudDogYW55KSB7XHJcbiAgICB2YXIgdGltZVRhYiA9ICQoXCJidXR0b24uay1idXR0b24uay10aW1lLXRhYlwiKVswXTtcclxuICAgIHRpbWVUYWIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpc0NvbXBvbmVudC5ob3Vyc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubWludXRlc09uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQuYW1wbU9uQ2xpY2sodGhpc0NvbXBvbmVudCk7XHJcbiAgICAgIHRoaXNDb21wb25lbnQubm93T25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3dPbkNsaWNrKHRoaXNDb21wb25lbnQ6IGFueSkge1xyXG4gICAgY29uc3Qgbm93VGltZSA9ICQoXCJidXR0b24uay1idXR0b24uay1iYXJlLmstdGltZS1ub3dcIilbMF07XHJcbiAgICBpZiAobm93VGltZSkge1xyXG4gICAgICBub3dUaW1lLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vIGdldCBtb2RlbCBjdXJyZW50IHZhbHVlXHJcbiAgICAgICAgbGV0IHZhbHVlRGF0ZVRpbWUgPSB0aGlzQ29tcG9uZW50LmN1cnJlbnREYXRlVGltZVZhbHVlKHRoaXNDb21wb25lbnQpO1xyXG4gICAgICAgIGNvbnN0IGRhdGVUaW1lTm93ID0gbmV3IERhdGUoKTtcclxuXHJcbiAgICAgICAgLy8gY29udmVydCBjdXJyZW50IHZhbHVlIHRvIGRhdGV0aW1lXHJcbiAgICAgICAgdmFsdWVEYXRlVGltZS5zZXRIb3VycyhkYXRlVGltZU5vdy5nZXRIb3VycygpKTtcclxuICAgICAgICB2YWx1ZURhdGVUaW1lLnNldE1pbnV0ZXMoZGF0ZVRpbWVOb3cuZ2V0TWludXRlcygpKTtcclxuICAgICAgICB2YWx1ZURhdGVUaW1lLnNldFNlY29uZHMoZGF0ZVRpbWVOb3cuZ2V0U2Vjb25kcygpKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgICAgdGhpc0NvbXBvbmVudC5zZXREYXRlVGltZVRvTW9kZWwodGhpc0NvbXBvbmVudCwgdmFsdWVEYXRlVGltZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBob3Vyc09uQ2xpY2sodGhpc0NvbXBvbmVudDogYW55KSB7XHJcbiAgICBjb25zdCB0aW1lV3JhcHBlciA9ICQoXCJkaXYuay10aW1lLWxpc3Qtd3JhcHBlclwiKS5maW5kKFwidWxcIik7XHJcbiAgICBpZiAodGltZVdyYXBwZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBob3VyID0gdGltZVdyYXBwZXJbMF0uY2hpbGRyZW47XHJcblxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvdXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBob3VyW2ldLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgLy8gZ2V0IGNsaWNrZWQgbm9kZSB2YWx1ZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZVZhbHVlID0gZS5jdXJyZW50VGFyZ2V0LnRleHRDb250ZW50O1xyXG5cclxuICAgICAgICAgIC8vIGdldCBtb2RlbCBjdXJyZW50IHZhbHVlXHJcbiAgICAgICAgICBsZXQgdmFsdWVEYXRlVGltZSA9IHRoaXNDb21wb25lbnQuY3VycmVudERhdGVUaW1lVmFsdWUodGhpc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IG5ldyBob3VyXHJcbiAgICAgICAgICB2YWx1ZURhdGVUaW1lLnNldEhvdXJzKG5vZGVWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgICAgICB0aGlzQ29tcG9uZW50LnNldERhdGVUaW1lVG9Nb2RlbCh0aGlzQ29tcG9uZW50LCB2YWx1ZURhdGVUaW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtaW51dGVzT25DbGljayh0aGlzQ29tcG9uZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHRpbWVXcmFwcGVyID0gJChcImRpdi5rLXRpbWUtbGlzdC13cmFwcGVyXCIpLmZpbmQoXCJ1bFwiKTtcclxuICAgIGlmICh0aW1lV3JhcHBlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSB0aW1lV3JhcHBlclsxXS5jaGlsZHJlbjtcclxuXHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWludXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG1pbnV0ZXNbaV0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAvLyBnZXQgY2xpY2tlZCBub2RlIHZhbHVlXHJcbiAgICAgICAgICBjb25zdCBub2RlVmFsdWUgPSBlLmN1cnJlbnRUYXJnZXQudGV4dENvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IG1vZGVsIGN1cnJlbnQgdmFsdWVcclxuICAgICAgICAgIGNvbnN0IHZhbHVlRGF0ZVRpbWUgPSB0aGlzQ29tcG9uZW50LmN1cnJlbnREYXRlVGltZVZhbHVlKHRoaXNDb21wb25lbnQpO1xyXG5cclxuICAgICAgICAgIC8vIHNldCBuZXcgbWludXRlXHJcbiAgICAgICAgICB2YWx1ZURhdGVUaW1lLnNldE1pbnV0ZXMobm9kZVZhbHVlKTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgdG8gTW9kZWxcclxuICAgICAgICAgIHRoaXNDb21wb25lbnQuc2V0RGF0ZVRpbWVUb01vZGVsKHRoaXNDb21wb25lbnQsIHZhbHVlRGF0ZVRpbWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFtcG1PbkNsaWNrKHRoaXNDb21wb25lbnQ6IGFueSkge1xyXG4gICAgY29uc3QgdGltZVdyYXBwZXIgPSAkKFwiZGl2LmstdGltZS1saXN0LXdyYXBwZXJcIikuZmluZChcInVsXCIpO1xyXG4gICAgaWYgKHRpbWVXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgYW1wbSA9IHRpbWVXcmFwcGVyWzJdLmNoaWxkcmVuO1xyXG5cclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbXBtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYW1wbVtpXS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIC8vIGdldCBjbGlja2VkIG5vZGUgdmFsdWVcclxuICAgICAgICAgIGNvbnN0IG5vZGVWYWx1ZSA9IGUuY3VycmVudFRhcmdldC50ZXh0Q29udGVudDtcclxuXHJcbiAgICAgICAgICAvLyBnZXQgbW9kZWwgY3VycmVudCB2YWx1ZVxyXG4gICAgICAgICAgY29uc3QgdmFsdWVEYXRlVGltZSA9IHRoaXNDb21wb25lbnQuY3VycmVudERhdGVUaW1lVmFsdWUodGhpc0NvbXBvbmVudCk7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IG5ldyBtaW51dGVzXHJcbiAgICAgICAgICB2YXIgX2hvdXIgPSB2YWx1ZURhdGVUaW1lLmdldEhvdXJzKCk7XHJcbiAgICAgICAgICBpZiAobm9kZVZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gXCJhbVwiKSB7XHJcbiAgICAgICAgICAgIF9ob3VyIC09IDEyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIF9ob3VyICs9IDEyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFsdWVEYXRlVGltZS5zZXRIb3VycyhfaG91cik7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IHRvIE1vZGVsXHJcbiAgICAgICAgICB0aGlzQ29tcG9uZW50LnNldERhdGVUaW1lVG9Nb2RlbCh0aGlzQ29tcG9uZW50LCB2YWx1ZURhdGVUaW1lKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RGF0ZVRpbWVWYWx1ZSh0aGlzQ29tcG9uZW50OiBhbnkpIHtcclxuICAgIC8vIGdldCBjdXJyZW50IHZhbHVlXHJcbiAgICBjb25zdCB6TW9kZWxWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Wk1vZGVsVmFsdWUodGhpc0NvbXBvbmVudC5kYXRhLlZhbHVlLCB0aGlzQ29tcG9uZW50Lmdyb3VwLCB0aGlzQ29tcG9uZW50Lmdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgbGV0IHZhbHVlRGF0ZVRpbWUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGlmICh6TW9kZWxWYWx1ZSAhPSBcIlwiICYmIHpNb2RlbFZhbHVlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBjb252ZXJ0IGN1cnJlbnQgdmFsdWUgdG8gZGF0ZXRpbWVcclxuICAgICAgdmFsdWVEYXRlVGltZSA9IG5ldyBEYXRlKHpNb2RlbFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWVEYXRlVGltZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREYXRlVGltZVRvTW9kZWwodGhpc0NvbXBvbmVudDogYW55LCB2YWx1ZURhdGVUaW1lOiBhbnkpIHtcclxuICAgIC8vIGNvbnZlcnQgdGhlIGRhdGUgdG8gSVNPU3RyaW5nXHJcbiAgICBjb25zdCBuZXdEYXRlVGltZSA9IG5ldyBEYXRlKHZhbHVlRGF0ZVRpbWUpLnRvSVNPU3RyaW5nKCk7XHJcblxyXG4gICAgLy8gYXNzaWduIHRvIHRoZSB6TW9kZWxcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSh0aGlzQ29tcG9uZW50LmRhdGEuVmFsdWUsIG5ld0RhdGVUaW1lLCB0aGlzQ29tcG9uZW50Lmdyb3VwKTtcclxuXHJcbiAgICAvLyBzZXQgdGltZW91dCBkbyBhZGQgZXZlbnQgYWdhaW4gYWZ0ZXIgbm9kZSBjbGlja2VkLiBpZiBub3QgaXQgb25seSB3b3JrIDEgdGltZS5cclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzQ29tcG9uZW50LmhvdXJzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgdGhpc0NvbXBvbmVudC5taW51dGVzT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgdGhpc0NvbXBvbmVudC5hbXBtT25DbGljayh0aGlzQ29tcG9uZW50KTtcclxuICAgICAgdGhpc0NvbXBvbmVudC5ub3dPbkNsaWNrKHRoaXNDb21wb25lbnQpO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcbn1cclxuIiwiPGlvbi1pdGVtIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIiBbZm9ybUdyb3VwXT1cImZvcm1cIiAqbmdJZj1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiPlxyXG4gIDxpb24tbGFiZWwgW2F0dHIuZm9yXT1cImRhdGEuVmFsdWVcIiAqbmdJZj1cImRhdGEuU2hvd0xhYmVsID09PSB1bmRlZmluZWQgfHwgZGF0YS5TaG93TGFiZWxcIiBwb3NpdGlvbj1cInN0YWNrZWRcIj5cclxuICAgIHt7ZGF0YS5MYWJlbH19IDxpb24tdGV4dCAqbmdJZj1cImNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZFwiIGNvbG9yPVwiZGFuZ2VyXCI+KjwvaW9uLXRleHQ+XHJcbiAgPC9pb24tbGFiZWw+XHJcbiAgPGRpdiBjbGFzcz1cImlvbi1yb3dcIiBzdHlsZT1cImp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjsgd2lkdGg6IDEwMCVcIj5cclxuICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj5cclxuICAgICAgPGlvbi1kYXRldGltZSAqbmdJZj1cImlzTW9iaWxlU2NyZWVuKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDBweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWRGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZEZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BpY2tlckZvcm1hdF09XCJkYXRlRm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIj5cclxuICAgICAgPC9pb24tZGF0ZXRpbWU+XHJcbiAgICAgIDxrZW5kby1kYXRlcGlja2VyICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0ZUZvcm1hdD09PSdNTU0tWVlZWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiZGF0YS5NaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJkYXRhLk1heERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aXZlVmlld109XCIneWVhcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYm90dG9tVmlld109XCIneWVhcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDdweDsgd2lkdGg6IDEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cInRvS2VuZG9EYXRlRm9ybWF0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiPlxyXG4gICAgICA8L2tlbmRvLWRhdGVwaWNrZXI+XHJcbiAgICAgIDxrZW5kby1kYXRlcGlja2VyICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0ZUZvcm1hdD09PSdERC1NTU0tWVlZWSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiZGF0YS5NaW5EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJkYXRhLk1heERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDdweDsgd2lkdGg6IDEwMCU7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cInRvS2VuZG9EYXRlRm9ybWF0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiPjwva2VuZG8tZGF0ZXBpY2tlcj5cclxuICAgICAgPGtlbmRvLWRhdGV0aW1lcGlja2VyICpuZ0lmPVwiIWlzTW9iaWxlU2NyZWVuKCkgJiYgZGF0ZUZvcm1hdD09PSdERC1NTU0tWVlZWSBoOm1tIEEnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW4pPVwiaGFuZGxlUHJldmVudGFibGVFdmVudCgkZXZlbnQsICdvcGVuJywgZmFsc2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogN3B4OyB3aWR0aDogMTAwJTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwidG9LZW5kb0RhdGVGb3JtYXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0YS5QbGFjZUhvbGRlclwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBrZW5kb0NhbGVuZGFyTW9udGhDZWxsVGVtcGxhdGUgbGV0LWRhdGU+XHJcbiAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiR2V0RGF0ZShkYXRlKVwiPnt7ZGF0ZS5nZXREYXRlKCl9fTwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2tlbmRvLWRhdGV0aW1lcGlja2VyPlxyXG4gICAgICA8a2VuZG8tdGltZXBpY2tlciAqbmdJZj1cIiFpc01vYmlsZVNjcmVlbigpICYmIChkYXRlRm9ybWF0PT09J0hIOm1tOnNzJyB8fCBkYXRlRm9ybWF0PT09J0hIOm1tJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChkYXRhLlZhbHVlKS52YWx1ZSB8IGRhdGVQYXJzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogN3B4OyB3aWR0aDogMTAwJTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwidG9LZW5kb0RhdGVGb3JtYXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRhLlBsYWNlSG9sZGVyXCI+PC9rZW5kby10aW1lcGlja2VyPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPGFwcC11aXZhbGlkYXRpb25tZXNzYWdlIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiZGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiPjwvYXBwLXVpdmFsaWRhdGlvbm1lc3NhZ2U+XHJcbiAgPC9kaXY+XHJcbjwvaW9uLWl0ZW0+XHJcbiJdfQ==