@energycap/components 0.41.0 → 0.41.1-ECAP-27592-angular-17.20241220-1140

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 (258) hide show
  1. package/{esm2020 → esm2022}/energycap-components.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/components.module.mjs +418 -418
  3. package/{esm2020 → esm2022}/lib/controls/banner/banner.component.mjs +109 -109
  4. package/{esm2020 → esm2022}/lib/controls/button/button.component.mjs +106 -106
  5. package/{esm2020 → esm2022}/lib/controls/button/copy-button-base.directive.mjs +67 -67
  6. package/{esm2020 → esm2022}/lib/controls/button/copy-button.directive.mjs +28 -28
  7. package/{esm2020 → esm2022}/lib/controls/button/copy-table-button.directive.mjs +43 -43
  8. package/{esm2020 → esm2022}/lib/controls/calendar/calendar-item.component.mjs +59 -59
  9. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.component.mjs +200 -200
  10. package/{esm2020 → esm2022}/lib/controls/calendar/calendar.types.mjs +3 -3
  11. package/{esm2020 → esm2022}/lib/controls/checkbox/checkbox.component.mjs +140 -140
  12. package/{esm2020 → esm2022}/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -38
  13. package/{esm2020 → esm2022}/lib/controls/combobox/combobox.component.mjs +879 -879
  14. package/{esm2020 → esm2022}/lib/controls/date-input/date-input.component.mjs +256 -256
  15. package/{esm2020 → esm2022}/lib/controls/dropdown/dropdown.component.mjs +243 -243
  16. package/{esm2020 → esm2022}/lib/controls/file-upload/file-upload.component.mjs +261 -261
  17. package/{esm2020 → esm2022}/lib/controls/form-control/form-control.component.mjs +104 -104
  18. package/{esm2020 → esm2022}/lib/controls/form-control-base.mjs +151 -151
  19. package/{esm2020 → esm2022}/lib/controls/form-control-label/form-control-label.component.mjs +136 -136
  20. package/{esm2020 → esm2022}/lib/controls/form-group/form-group.component.mjs +261 -261
  21. package/{esm2020 → esm2022}/lib/controls/help-popover/help-popover.component.mjs +31 -31
  22. package/{esm2020 → esm2022}/lib/controls/item-picker/item-picker.component.mjs +329 -329
  23. package/{esm2020 → esm2022}/lib/controls/link-button/link-button.component.mjs +11 -11
  24. package/{esm2020 → esm2022}/lib/controls/menu/menu.component.mjs +485 -485
  25. package/{esm2020 → esm2022}/lib/controls/navigation/link-item.mjs +1 -1
  26. package/{esm2020 → esm2022}/lib/controls/navigation/nav-group.mjs +38 -38
  27. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item-active.directive.mjs +92 -92
  28. package/{esm2020 → esm2022}/lib/controls/navigation/nav-item.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/controls/numericbox/numericbox.component.mjs +372 -372
  30. package/{esm2020 → esm2022}/lib/controls/popover/popover.component.mjs +117 -117
  31. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button-option.mjs +2 -2
  32. package/{esm2020 → esm2022}/lib/controls/radio-button/radio-button.component.mjs +82 -82
  33. package/{esm2020 → esm2022}/lib/controls/select/select.component.mjs +88 -88
  34. package/{esm2020 → esm2022}/lib/controls/tabs/tabs.component.mjs +47 -47
  35. package/{esm2020 → esm2022}/lib/controls/textbox/textbox.component.mjs +155 -155
  36. package/{esm2020 → esm2022}/lib/core/cache.service.mjs +105 -105
  37. package/esm2022/lib/core/custom-validators.mjs +29 -0
  38. package/esm2022/lib/core/date-time-helper.mjs +220 -0
  39. package/{esm2020 → esm2022}/lib/core/error.service.mjs +61 -61
  40. package/{esm2020 → esm2022}/lib/core/router-helper.service.mjs +111 -111
  41. package/{esm2020 → esm2022}/lib/core/scroll.service.mjs +89 -89
  42. package/{esm2020 → esm2022}/lib/core/telemetry-tracker.service.mjs +16 -16
  43. package/{esm2020 → esm2022}/lib/core/telemetry.service.mjs +38 -38
  44. package/{esm2020 → esm2022}/lib/core/validation-message.service.mjs +185 -185
  45. package/{esm2020 → esm2022}/lib/core/validation-patterns.mjs +30 -30
  46. package/{esm2020 → esm2022}/lib/core/window.service.mjs +186 -186
  47. package/{esm2020 → esm2022}/lib/display/app-bar/app-bar.component.mjs +46 -46
  48. package/esm2022/lib/display/avatar/avatar.component.mjs +67 -0
  49. package/{esm2020 → esm2022}/lib/display/avatar/avatar.service.mjs +64 -64
  50. package/{esm2020 → esm2022}/lib/display/confirm/confirm.component.mjs +168 -168
  51. package/{esm2020 → esm2022}/lib/display/dialog/dialog-content.mjs +1 -1
  52. package/{esm2020 → esm2022}/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -63
  53. package/{esm2020 → esm2022}/lib/display/dialog/dialog-types.mjs +76 -76
  54. package/{esm2020 → esm2022}/lib/display/dialog/dialog.component.mjs +281 -281
  55. package/{esm2020 → esm2022}/lib/display/dialog/dialog.service.mjs +71 -71
  56. package/{esm2020 → esm2022}/lib/display/help/help-types.mjs +1 -1
  57. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-base.mjs +111 -111
  58. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-mocks.spec.mjs +53 -53
  59. package/{esm2020 → esm2022}/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +61 -61
  60. package/{esm2020 → esm2022}/lib/display/item-display/item-display.component.mjs +81 -81
  61. package/{esm2020 → esm2022}/lib/display/json-display/json-display.component.mjs +47 -47
  62. package/{esm2020 → esm2022}/lib/display/resizable/resizable-base.mjs +120 -120
  63. package/{esm2020 → esm2022}/lib/display/resizable/resizable.component.mjs +52 -52
  64. package/{esm2020 → esm2022}/lib/display/spinner/spinner.component.mjs +12 -12
  65. package/{esm2020 → esm2022}/lib/display/splash/splash.component.mjs +42 -42
  66. package/{esm2020 → esm2022}/lib/display/splash/splash.service.mjs +35 -35
  67. package/{esm2020 → esm2022}/lib/display/table/resizable-column.component.mjs +20 -20
  68. package/{esm2020 → esm2022}/lib/display/table/resizable-table.directive.mjs +227 -227
  69. package/{esm2020 → esm2022}/lib/display/table/searchable-table.component.mjs +342 -342
  70. package/{esm2020 → esm2022}/lib/display/table/table-detail-row.component.mjs +19 -19
  71. package/{esm2020 → esm2022}/lib/display/table/table-locked-column.component.mjs +58 -58
  72. package/{esm2020 → esm2022}/lib/display/table/table-master-header-row.component.mjs +14 -14
  73. package/{esm2020 → esm2022}/lib/display/table/table-master-row.component.mjs +163 -163
  74. package/{esm2020 → esm2022}/lib/display/table/table-pagination.component.mjs +155 -155
  75. package/{esm2020 → esm2022}/lib/display/table/table-selectable-row.component.mjs +235 -235
  76. package/{esm2020 → esm2022}/lib/display/table/table.component.mjs +249 -249
  77. package/{esm2020 → esm2022}/lib/display/tags/tag.mjs +17 -17
  78. package/{esm2020 → esm2022}/lib/display/tags/tags.component.mjs +77 -77
  79. package/{esm2020 → esm2022}/lib/display/toast/toast/toast.component.mjs +77 -77
  80. package/{esm2020 → esm2022}/lib/display/toast/toast-types.mjs +7 -7
  81. package/{esm2020 → esm2022}/lib/display/toast/toast.service.mjs +35 -35
  82. package/{esm2020 → esm2022}/lib/display/toast/toaster/toaster.component.mjs +114 -114
  83. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.component.mjs +28 -28
  84. package/{esm2020 → esm2022}/lib/display/tooltip/tooltip.service.mjs +78 -78
  85. package/{esm2020 → esm2022}/lib/display/tooltip-directive/tooltip.directive.mjs +173 -173
  86. package/{esm2020 → esm2022}/lib/display/tour/tour-types.mjs +33 -33
  87. package/{esm2020 → esm2022}/lib/display/tour/tour.component.mjs +398 -398
  88. package/{esm2020 → esm2022}/lib/display/tour/tour.service.mjs +75 -75
  89. package/{esm2020 → esm2022}/lib/display/tree/tree.component.mjs +135 -135
  90. package/{esm2020 → esm2022}/lib/display/view-overlay/view-overlay.component.mjs +58 -58
  91. package/{esm2020 → esm2022}/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -32
  92. package/{esm2020 → esm2022}/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -111
  93. package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +166 -0
  94. package/{esm2020 → esm2022}/lib/shared/display/pipes/date-display.pipe.mjs +50 -50
  95. package/{esm2020 → esm2022}/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -30
  96. package/{esm2020 → esm2022}/lib/shared/display/pipes/relative-date.pipe.mjs +62 -62
  97. package/{esm2020 → esm2022}/lib/shared/display/pipes/row-count.pipe.mjs +48 -48
  98. package/{esm2020 → esm2022}/lib/shared/display/pipes/time-display.pipe.mjs +41 -41
  99. package/esm2022/lib/shared/display.mjs +6 -0
  100. package/esm2022/lib/shared/form-group.helper.mjs +67 -0
  101. package/{esm2020 → esm2022}/lib/shared/json-helper.mjs +18 -18
  102. package/esm2022/lib/shared/lodash-helper.mjs +52 -0
  103. package/{esm2020 → esm2022}/lib/shared/page/page-base/page-base.component.mjs +387 -387
  104. package/{esm2020 → esm2022}/lib/shared/page/page-statuses.mjs +22 -22
  105. package/{esm2020 → esm2022}/lib/shared/page/page-title/page-title.component.mjs +23 -23
  106. package/{esm2020 → esm2022}/lib/shared/page/page-view/page-view.component.mjs +147 -147
  107. package/{esm2020 → esm2022}/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +16 -16
  108. package/{esm2020 → esm2022}/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +16 -16
  109. package/{esm2020 → esm2022}/lib/shared/testing/page-base-component-test-helper.spec.mjs +37 -37
  110. package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +98 -0
  111. package/{esm2020 → esm2022}/lib/shared/testing/public-mocks.spec.mjs +148 -148
  112. package/{esm2020 → esm2022}/lib/shared/testing/spy-factory.spec.mjs +39 -39
  113. package/{esm2020 → esm2022}/lib/shared/testing/translation-mocks.spec.mjs +56 -56
  114. package/{esm2020 → esm2022}/lib/shared/user-preference.service.mjs +17 -17
  115. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -246
  116. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -68
  117. package/{esm2020 → esm2022}/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -18
  118. package/{esm2020 → esm2022}/public-api.mjs +114 -114
  119. package/{fesm2020 → fesm2022}/energycap-components.mjs +11797 -11793
  120. package/fesm2022/energycap-components.mjs.map +1 -0
  121. package/index.d.ts +5 -5
  122. package/lib/components.module.d.ts +91 -91
  123. package/lib/controls/banner/banner.component.d.ts +50 -50
  124. package/lib/controls/button/button.component.d.ts +78 -78
  125. package/lib/controls/button/copy-button-base.directive.d.ts +20 -20
  126. package/lib/controls/button/copy-button.directive.d.ts +14 -14
  127. package/lib/controls/button/copy-table-button.directive.d.ts +19 -19
  128. package/lib/controls/calendar/calendar-item.component.d.ts +17 -17
  129. package/lib/controls/calendar/calendar.component.d.ts +54 -54
  130. package/lib/controls/calendar/calendar.types.d.ts +7 -7
  131. package/lib/controls/checkbox/checkbox.component.d.ts +65 -65
  132. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +25 -25
  133. package/lib/controls/combobox/combobox.component.d.ts +418 -418
  134. package/lib/controls/date-input/date-input.component.d.ts +80 -80
  135. package/lib/controls/dropdown/dropdown.component.d.ts +161 -161
  136. package/lib/controls/file-upload/file-upload.component.d.ts +124 -124
  137. package/lib/controls/form-control/form-control.component.d.ts +30 -30
  138. package/lib/controls/form-control-base.d.ts +110 -110
  139. package/lib/controls/form-control-label/form-control-label.component.d.ts +73 -73
  140. package/lib/controls/form-group/form-group.component.d.ts +105 -105
  141. package/lib/controls/help-popover/help-popover.component.d.ts +11 -11
  142. package/lib/controls/item-picker/item-picker.component.d.ts +164 -164
  143. package/lib/controls/link-button/link-button.component.d.ts +5 -5
  144. package/lib/controls/menu/menu.component.d.ts +255 -255
  145. package/lib/controls/navigation/link-item.d.ts +32 -32
  146. package/lib/controls/navigation/nav-group.d.ts +18 -18
  147. package/lib/controls/navigation/nav-item-active.directive.d.ts +42 -42
  148. package/lib/controls/navigation/nav-item.d.ts +31 -31
  149. package/lib/controls/numericbox/numericbox.component.d.ts +148 -148
  150. package/lib/controls/popover/popover.component.d.ts +51 -51
  151. package/lib/controls/radio-button/radio-button-option.d.ts +19 -19
  152. package/lib/controls/radio-button/radio-button.component.d.ts +53 -53
  153. package/lib/controls/select/select.component.d.ts +44 -44
  154. package/lib/controls/tabs/tabs.component.d.ts +30 -30
  155. package/lib/controls/textbox/textbox.component.d.ts +107 -107
  156. package/lib/core/cache.service.d.ts +33 -33
  157. package/lib/core/custom-validators.d.ts +20 -20
  158. package/lib/core/date-time-helper.d.ts +101 -101
  159. package/lib/core/error.service.d.ts +20 -20
  160. package/lib/core/router-helper.service.d.ts +48 -48
  161. package/lib/core/scroll.service.d.ts +36 -36
  162. package/lib/core/telemetry-tracker.service.d.ts +13 -13
  163. package/lib/core/telemetry.service.d.ts +31 -31
  164. package/lib/core/validation-message.service.d.ts +26 -26
  165. package/lib/core/validation-patterns.d.ts +22 -22
  166. package/lib/core/window.service.d.ts +116 -116
  167. package/lib/display/app-bar/app-bar.component.d.ts +20 -20
  168. package/lib/display/avatar/avatar.component.d.ts +35 -35
  169. package/lib/display/avatar/avatar.service.d.ts +24 -24
  170. package/lib/display/confirm/confirm.component.d.ts +123 -123
  171. package/lib/display/dialog/dialog-content.d.ts +19 -19
  172. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +32 -32
  173. package/lib/display/dialog/dialog-types.d.ts +130 -130
  174. package/lib/display/dialog/dialog.component.d.ts +120 -120
  175. package/lib/display/dialog/dialog.service.d.ts +48 -48
  176. package/lib/display/help/help-types.d.ts +33 -33
  177. package/lib/display/hierarchy/hierarchy-base.d.ts +97 -97
  178. package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +53 -53
  179. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +34 -34
  180. package/lib/display/item-display/item-display.component.d.ts +43 -43
  181. package/lib/display/json-display/json-display.component.d.ts +16 -16
  182. package/lib/display/resizable/resizable-base.d.ts +67 -67
  183. package/lib/display/resizable/resizable.component.d.ts +31 -31
  184. package/lib/display/spinner/spinner.component.d.ts +5 -5
  185. package/lib/display/splash/splash.component.d.ts +16 -16
  186. package/lib/display/splash/splash.service.d.ts +22 -22
  187. package/lib/display/table/resizable-column.component.d.ts +10 -10
  188. package/lib/display/table/resizable-table.directive.d.ts +93 -93
  189. package/lib/display/table/searchable-table.component.d.ts +206 -206
  190. package/lib/display/table/table-detail-row.component.d.ts +8 -8
  191. package/lib/display/table/table-locked-column.component.d.ts +20 -20
  192. package/lib/display/table/table-master-header-row.component.d.ts +9 -9
  193. package/lib/display/table/table-master-row.component.d.ts +113 -113
  194. package/lib/display/table/table-pagination.component.d.ts +91 -91
  195. package/lib/display/table/table-selectable-row.component.d.ts +102 -102
  196. package/lib/display/table/table.component.d.ts +121 -121
  197. package/lib/display/tags/tag.d.ts +18 -18
  198. package/lib/display/tags/tags.component.d.ts +48 -48
  199. package/lib/display/toast/toast/toast.component.d.ts +23 -23
  200. package/lib/display/toast/toast-types.d.ts +24 -24
  201. package/lib/display/toast/toast.service.d.ts +20 -20
  202. package/lib/display/toast/toaster/toaster.component.d.ts +35 -35
  203. package/lib/display/tooltip/tooltip.component.d.ts +70 -70
  204. package/lib/display/tooltip/tooltip.service.d.ts +16 -16
  205. package/lib/display/tooltip-directive/tooltip.directive.d.ts +44 -44
  206. package/lib/display/tour/tour-types.d.ts +70 -70
  207. package/lib/display/tour/tour.component.d.ts +147 -147
  208. package/lib/display/tour/tour.service.d.ts +38 -38
  209. package/lib/display/tree/tree.component.d.ts +75 -75
  210. package/lib/display/view-overlay/view-overlay.component.d.ts +38 -38
  211. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +14 -14
  212. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +60 -60
  213. package/lib/shared/directives/popup/popup-container.directive.d.ts +101 -101
  214. package/lib/shared/display/pipes/date-display.pipe.d.ts +21 -21
  215. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +9 -9
  216. package/lib/shared/display/pipes/relative-date.pipe.d.ts +36 -36
  217. package/lib/shared/display/pipes/row-count.pipe.d.ts +23 -23
  218. package/lib/shared/display/pipes/time-display.pipe.d.ts +18 -18
  219. package/lib/shared/display.d.ts +42 -42
  220. package/lib/shared/form-group.helper.d.ts +31 -31
  221. package/lib/shared/json-helper.d.ts +7 -7
  222. package/lib/shared/lodash-helper.d.ts +18 -18
  223. package/lib/shared/page/page-base/page-base.component.d.ts +259 -259
  224. package/lib/shared/page/page-statuses.d.ts +13 -13
  225. package/lib/shared/page/page-title/page-title.component.d.ts +9 -9
  226. package/lib/shared/page/page-view/page-view.component.d.ts +102 -102
  227. package/lib/shared/testing/copy-button-base-test-injector-factory.spec.d.ts +4 -4
  228. package/lib/shared/testing/hierarchy-base-test-injector-factory.spec.d.ts +4 -4
  229. package/lib/shared/testing/page-base-component-test-helper.spec.d.ts +30 -30
  230. package/lib/shared/testing/page-base-component-test-injector-factory.spec.d.ts +28 -28
  231. package/lib/shared/testing/public-mocks.spec.d.ts +90 -90
  232. package/lib/shared/testing/spy-factory.spec.d.ts +27 -27
  233. package/lib/shared/testing/translation-mocks.spec.d.ts +30 -30
  234. package/lib/shared/user-preference.service.d.ts +13 -13
  235. package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +134 -134
  236. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +27 -27
  237. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +10 -10
  238. package/package.json +12 -18
  239. package/public-api.d.ts +111 -111
  240. package/schematics/rxjs-7-upgrade/index.d.ts +3 -3
  241. package/schematics/rxjs-7-upgrade/index.js +67 -67
  242. package/schematics/rxjs-7-upgrade/schema.d.ts +4 -4
  243. package/schematics/rxjs-7-upgrade/schema.js +2 -2
  244. package/schematics/utilities/typescript.d.ts +7 -7
  245. package/schematics/utilities/typescript.js +41 -41
  246. package/schematics/utilities/workspace.d.ts +8 -8
  247. package/schematics/utilities/workspace.js +71 -71
  248. package/esm2020/lib/core/custom-validators.mjs +0 -29
  249. package/esm2020/lib/core/date-time-helper.mjs +0 -220
  250. package/esm2020/lib/display/avatar/avatar.component.mjs +0 -67
  251. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +0 -163
  252. package/esm2020/lib/shared/display.mjs +0 -6
  253. package/esm2020/lib/shared/form-group.helper.mjs +0 -67
  254. package/esm2020/lib/shared/lodash-helper.mjs +0 -51
  255. package/esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
  256. package/fesm2015/energycap-components.mjs +0 -12211
  257. package/fesm2015/energycap-components.mjs.map +0 -1
  258. package/fesm2020/energycap-components.mjs.map +0 -1
@@ -1,227 +1,227 @@
1
- import { Directive, Inject, Input } from '@angular/core';
2
- import { DOCUMENT } from '@angular/common';
3
- import { ResizableBase } from '../resizable/resizable-base';
4
- import { Subject } from 'rxjs';
5
- import { takeUntil } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../core/cache.service";
8
- /**
9
- * Add the ability to resize columns to a standard HTML table.
10
- * Specify a column as resizable by adding the .is-resizable class to a <th>.
11
- *
12
- * Usage:
13
- ```html
14
- <table [ecResizableTable]>
15
- <colgroup><col><col><col></colgroup>
16
- <thead>
17
- <tr>
18
- <th class="is-resizable">Resizable</th>
19
- <th class="is-resizable">Resizable</th>
20
- <th>Static</th>
21
- </tr>
22
- </thead>
23
- ...
24
- </table>
25
-
26
- ```
27
- * Note: this directive is meant to be used internally with the TableComponent
28
- * and is not exposed in the public-api of the library
29
- */
30
- export class ResizableTableDirective extends ResizableBase {
31
- constructor(el, renderer, cacheService, document) {
32
- super(renderer, cacheService, document);
33
- this.el = el;
34
- this.sortableTable = false;
35
- /**
36
- * Stored reference to the <col> element children. Will throw if none are found. Will
37
- * warn if the number of <col> elements do not match the number of <th> elements
38
- */
39
- this.cols = [];
40
- /**
41
- * The widths of each table column. These are updated as columns are resized and
42
- * are used to calculate the new table width.
43
- */
44
- this.colWidths = [];
45
- /**
46
- * The current table width
47
- */
48
- this.currentTableWidth = 0;
49
- /**
50
- * The width of the table when the component was initialized. The table cannot
51
- * be shrunk below this width. If a column resize would cause the current table
52
- * width to be below this value, the last column is widened instead.
53
- */
54
- this.minTableWidth = 0;
55
- /**
56
- * The width the column can not be resized below.
57
- */
58
- this.minColWidth = 32;
59
- this.destroyed = new Subject();
60
- }
61
- ngOnInit() {
62
- this.initResizableColumns();
63
- this.resizableColumns.changes.pipe(takeUntil(this.destroyed)).subscribe(() => this.initResizableColumns());
64
- }
65
- ngOnDestroy() {
66
- this.destroyed.next();
67
- this.destroyed.complete();
68
- }
69
- /**
70
- * Initialize
71
- * * Check that the host element is a table and that <col> elements are present
72
- * * Save the initial width of table as the minimum table width
73
- * * Store a reference to all <col> elements
74
- * * Add a handle to each resizable column and set up mousedown listeners to start dragging
75
- */
76
- initResizableColumns() {
77
- if (this.isResizable !== false) {
78
- this.tableEl = this.el.nativeElement;
79
- if (this.tableEl.tagName !== 'TABLE') {
80
- throw new Error(`The 'ecResizableTable' directive can only be placed on a <table> element.`);
81
- }
82
- if (this.sortableTable) {
83
- this.minColWidth = 48;
84
- }
85
- const headers = this.tableEl.querySelectorAll('th');
86
- const cols = this.tableEl.querySelectorAll('col');
87
- this.cols = [];
88
- this.colWidths = [];
89
- if (cols.length === 0) {
90
- const fragment = this.document.createDocumentFragment();
91
- const colgroup = this.renderer.createElement('colgroup');
92
- headers.forEach(() => {
93
- const col = this.renderer.createElement('col');
94
- this.cols.push(col);
95
- this.renderer.appendChild(fragment, col);
96
- });
97
- this.renderer.appendChild(colgroup, fragment);
98
- this.renderer.insertBefore(this.tableEl, colgroup, this.tableEl.firstElementChild);
99
- }
100
- else {
101
- cols.forEach(colEl => {
102
- this.cols.push(colEl);
103
- });
104
- if (headers.length !== cols.length) {
105
- console.warn(`There are ${headers.length} <th> elements and ${this.cols.length} <col> elements in this this table. The number of columns and table headers must match. <th> elements with a 'colspan' attribute are currently not supported.`);
106
- }
107
- }
108
- const lastResizableIndex = Array.from(headers).reverse().findIndex(el => el.classList.contains('is-resizable')) + 1;
109
- this.lastColIndex = this.cols.length - lastResizableIndex;
110
- headers.forEach(th => {
111
- if (th.classList.contains('is-resizable')) {
112
- const handle = th.querySelector('.handle');
113
- this.renderer.listen(handle, 'mousedown', (event) => {
114
- this.currentEl = th;
115
- this.startDrag(event);
116
- });
117
- }
118
- });
119
- // We need to wait a tick for a view that was previously loaded to be removed
120
- // from the DOM and allow this directive's parent view to fully expand in the
121
- // viewport before getting widths.
122
- window.setTimeout(() => {
123
- this.setInitialWidths(headers);
124
- });
125
- }
126
- }
127
- /**
128
- * Update the column with the calculated width while resizing.
129
- * If the column is narrowed so that the table would be narrower than the min-width,
130
- * expand the last column. If the table is then widened, return the last column
131
- * to its initial width.
132
- * @param width
133
- */
134
- setWidth(width) {
135
- if (this.currentEl) {
136
- const cellIndex = this.currentEl.cellIndex;
137
- width = Math.max(width, this.minColWidth);
138
- this.colWidths[cellIndex] = width;
139
- this.renderer.setStyle(this.cols[cellIndex], 'width', width + 'px');
140
- let totalColWidths = 0;
141
- this.colWidths.forEach(w => {
142
- totalColWidths += w;
143
- });
144
- const containerWidth = this.containerEl.nativeElement.clientWidth;
145
- if (this.minTableWidth !== containerWidth) {
146
- this.minTableWidth = containerWidth;
147
- }
148
- const diff = totalColWidths - this.minTableWidth;
149
- if (diff < 0) {
150
- const colIndex = cellIndex === this.lastColIndex ? this.lastColIndex - 1 : this.lastColIndex;
151
- const colWidth = Math.max(this.colWidths[colIndex] + Math.abs(diff), this.minColWidth);
152
- this.renderer.setStyle(this.cols[colIndex], 'width', colWidth + 'px');
153
- this.renderer.setStyle(this.tableEl, 'width', this.minTableWidth + 'px');
154
- }
155
- else {
156
- this.renderer.setStyle(this.tableEl, 'width', totalColWidths + 'px');
157
- }
158
- }
159
- }
160
- stopDrag(event) {
161
- super.stopDrag(event);
162
- if (this.currentEl) {
163
- const cellIndex = this.currentEl.cellIndex;
164
- const currentCol = this.resizableColumns.find(col => col.el.nativeElement.cellIndex === cellIndex);
165
- if (currentCol) {
166
- currentCol.emitWidth(Math.round(this.colWidths[cellIndex]));
167
- }
168
- }
169
- }
170
- /**
171
- * Capture the initial width of the table and the table headers.
172
- * @param headers
173
- */
174
- setInitialWidths(headers) {
175
- this.currentTableWidth = this.tableEl.offsetWidth;
176
- this.minTableWidth = this.containerEl.nativeElement.clientWidth;
177
- headers.forEach(th => {
178
- this.colWidths[th.cellIndex] = th.offsetWidth;
179
- const width = th.style.width;
180
- if (width) {
181
- this.renderer.setStyle(this.cols[th.cellIndex], 'width', width);
182
- this.renderer.removeStyle(th, 'width');
183
- }
184
- });
185
- let totalColWidths = 0;
186
- this.colWidths.forEach(w => {
187
- totalColWidths += w;
188
- });
189
- // Check to see if our total column widths is greater than our table width
190
- let colWidthDifference = totalColWidths - this.currentTableWidth;
191
- // If the total column widths is greater than zero then its larger than our table container
192
- // To prevent a horizontal scroll we will bump a columns width down to match the table size
193
- if (colWidthDifference > 0) {
194
- // Ideally we will choose the second to the last column, but if there is only one that'll do
195
- let columnToReduce = headers.length > 1 ? headers.length - 2 : 0;
196
- // Shrink the column
197
- let th = headers[columnToReduce];
198
- this.colWidths[th.cellIndex] = th.offsetWidth - colWidthDifference;
199
- this.renderer.setStyle(this.cols[th.cellIndex], 'width', this.colWidths[th.cellIndex] + 'px');
200
- // Reduce our totalColWidths to reflect
201
- totalColWidths = totalColWidths - colWidthDifference;
202
- }
203
- this.renderer.setStyle(this.tableEl, 'width', Math.max(this.currentTableWidth, totalColWidths) + 'px');
204
- this.renderer.setStyle(this.tableEl, 'minWidth', '100%');
205
- }
206
- }
207
- ResizableTableDirectivefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ResizableTableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.CacheService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });
208
- ResizableTableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: ResizableTableDirective, selector: "[ecResizableTable]", inputs: { isResizable: ["ecResizableTable", "isResizable"], containerEl: "containerEl", sortableTable: "sortableTable", resizableColumns: "resizableColumns" }, usesInheritance: true, ngImport: i0 });
209
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ResizableTableDirective, decorators: [{
210
- type: Directive,
211
- args: [{
212
- selector: '[ecResizableTable]'
213
- }]
214
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.CacheService }, { type: Document, decorators: [{
215
- type: Inject,
216
- args: [DOCUMENT]
217
- }] }]; }, propDecorators: { isResizable: [{
218
- type: Input,
219
- args: ['ecResizableTable']
220
- }], containerEl: [{
221
- type: Input
222
- }], sortableTable: [{
223
- type: Input
224
- }], resizableColumns: [{
225
- type: Input
226
- }] } });
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLXRhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L3RhYmxlL3Jlc2l6YWJsZS10YWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBaUMsTUFBTSxFQUFFLEtBQUssRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRzNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFJSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsYUFBYTtJQStDeEQsWUFDVSxFQUFjLEVBQ3RCLFFBQW1CLEVBQ25CLFlBQTBCLEVBQ1IsUUFBa0I7UUFFcEMsS0FBSyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFMaEMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQTdDZixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQVd4Qzs7O1dBR0c7UUFDSyxTQUFJLEdBQTBCLEVBQUUsQ0FBQztRQUV6Qzs7O1dBR0c7UUFDSyxjQUFTLEdBQWEsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ0ssc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBRXRDOzs7O1dBSUc7UUFDSyxrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUVsQzs7V0FFRztRQUNLLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBSXpCLGNBQVMsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQVNqRCxDQUFDO0lBRU0sUUFBUTtR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LENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2RyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDOztvSEFoT1UsdUJBQXVCLGlHQW1EeEIsUUFBUTt3R0FuRFAsdUJBQXVCOzJGQUF2Qix1QkFBdUI7a0JBSG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7OzBCQW9ESSxNQUFNOzJCQUFDLFFBQVE7NENBbERTLFdBQVc7c0JBQXJDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNoQixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBTUcsZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIFJlbmRlcmVyMiwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSZXNpemFibGVCYXNlIH0gZnJvbSAnLi4vcmVzaXphYmxlL3Jlc2l6YWJsZS1iYXNlJztcclxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vcmVzaXphYmxlLWNvbHVtbi5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIEFkZCB0aGUgYWJpbGl0eSB0byByZXNpemUgY29sdW1ucyB0byBhIHN0YW5kYXJkIEhUTUwgdGFibGUuXHJcbiAqIFNwZWNpZnkgYSBjb2x1bW4gYXMgcmVzaXphYmxlIGJ5IGFkZGluZyB0aGUgLmlzLXJlc2l6YWJsZSBjbGFzcyB0byBhIDx0aD4uXHJcbiAqIFxyXG4gKiBVc2FnZTpcclxuICBgYGBodG1sXHJcbiAgPHRhYmxlIFtlY1Jlc2l6YWJsZVRhYmxlXT5cclxuICAgIDxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPlxyXG4gICAgPHRoZWFkPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwiaXMtcmVzaXphYmxlXCI+UmVzaXphYmxlPC90aD5cclxuICAgICAgICA8dGggY2xhc3M9XCJpcy1yZXNpemFibGVcIj5SZXNpemFibGU8L3RoPlxyXG4gICAgICAgIDx0aD5TdGF0aWM8L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90aGVhZD5cclxuICAgIC4uLlxyXG4gIDwvdGFibGU+XHJcblxyXG4gIGBgYFxyXG4gICogTm90ZTogdGhpcyBkaXJlY3RpdmUgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IHdpdGggdGhlIFRhYmxlQ29tcG9uZW50XHJcbiAgKiBhbmQgaXMgbm90IGV4cG9zZWQgaW4gdGhlIHB1YmxpYy1hcGkgb2YgdGhlIGxpYnJhcnlcclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2VjUmVzaXphYmxlVGFibGVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVzaXphYmxlVGFibGVEaXJlY3RpdmUgZXh0ZW5kcyBSZXNpemFibGVCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgnZWNSZXNpemFibGVUYWJsZScpIGlzUmVzaXphYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGNvbnRhaW5lckVsITogRWxlbWVudFJlZjtcclxuICBASW5wdXQoKSBzb3J0YWJsZVRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBVc2VkIHRvIG5vdGlmeSB0aGUgcmVzaXphYmxlIGRpcmVjdGl2ZSB0aGF0IHRoZSBjb2x1bW5zIGFyZSByZWFkeSB0byBiZSBjb25maWd1cmVkLlxyXG4gICAqIE11c3QgYmUgdXNlZCBpZiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgY2FuIGNoYW5nZSBvdmVyIHRoZSB0YWJsZSdzIGxpZmVjeWNsZS5cclxuICAgKi9cclxuICBASW5wdXQoKSByZXNpemFibGVDb2x1bW5zITogUXVlcnlMaXN0PFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudD47XHJcblxyXG4gIC8qKiBUaGUgaG9zdCA8dGFibGU+IGVsZW1lbnQuIFdpbGwgdGhyb3cgaWYgaG9zdCBlbGVtZW50IGlzIG5vdCBhIDx0YWJsZT4gKi9cclxuICBwcml2YXRlIHRhYmxlRWwhOiBIVE1MVGFibGVFbGVtZW50O1xyXG5cclxuICAvKiogXHJcbiAgICogU3RvcmVkIHJlZmVyZW5jZSB0byB0aGUgPGNvbD4gZWxlbWVudCBjaGlsZHJlbi4gV2lsbCB0aHJvdyBpZiBub25lIGFyZSBmb3VuZC4gV2lsbFxyXG4gICAqIHdhcm4gaWYgdGhlIG51bWJlciBvZiA8Y29sPiBlbGVtZW50cyBkbyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiA8dGg+IGVsZW1lbnRzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHdpZHRocyBvZiBlYWNoIHRhYmxlIGNvbHVtbi4gVGhlc2UgYXJlIHVwZGF0ZWQgYXMgY29sdW1ucyBhcmUgcmVzaXplZCBhbmRcclxuICAgKiBhcmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5ldyB0YWJsZSB3aWR0aC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbFdpZHRoczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgdGFibGUgd2lkdGhcclxuICAgKi9cclxuICBwcml2YXRlIGN1cnJlbnRUYWJsZVdpZHRoOiBudW1iZXIgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgd2lkdGggb2YgdGhlIHRhYmxlIHdoZW4gdGhlIGNvbXBvbmVudCB3YXMgaW5pdGlhbGl6ZWQuIFRoZSB0YWJsZSBjYW5ub3RcclxuICAgKiBiZSBzaHJ1bmsgYmVsb3cgdGhpcyB3aWR0aC4gSWYgYSBjb2x1bW4gcmVzaXplIHdvdWxkIGNhdXNlIHRoZSBjdXJyZW50IHRhYmxlXHJcbiAgICogd2lkdGggdG8gYmUgYmVsb3cgdGhpcyB2YWx1ZSwgdGhlIGxhc3QgY29sdW1uIGlzIHdpZGVuZWQgaW5zdGVhZC5cclxuICAgKi9cclxuICBwcml2YXRlIG1pblRhYmxlV2lkdGg6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB3aWR0aCB0aGUgY29sdW1uIGNhbiBub3QgYmUgcmVzaXplZCBiZWxvdy5cclxuICAgKi9cclxuICBwcml2YXRlIG1pbkNvbFdpZHRoOiBudW1iZXIgPSAzMjtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0Q29sSW5kZXghOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveWVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnQ6IERvY3VtZW50XHJcbiAgKSB7XHJcbiAgICBzdXBlcihyZW5kZXJlciwgY2FjaGVTZXJ2aWNlLCBkb2N1bWVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRSZXNpemFibGVDb2x1bW5zKCk7XHJcblxyXG4gICAgdGhpcy5yZXNpemFibGVDb2x1bW5zLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5pbml0UmVzaXphYmxlQ29sdW1ucygpKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemVcclxuICAgKiAqIENoZWNrIHRoYXQgdGhlIGhvc3QgZWxlbWVudCBpcyBhIHRhYmxlIGFuZCB0aGF0IDxjb2w+IGVsZW1lbnRzIGFyZSBwcmVzZW50XHJcbiAgICogKiBTYXZlIHRoZSBpbml0aWFsIHdpZHRoIG9mIHRhYmxlIGFzIHRoZSBtaW5pbXVtIHRhYmxlIHdpZHRoXHJcbiAgICogKiBTdG9yZSBhIHJlZmVyZW5jZSB0byBhbGwgPGNvbD4gZWxlbWVudHNcclxuICAgKiAqIEFkZCBhIGhhbmRsZSB0byBlYWNoIHJlc2l6YWJsZSBjb2x1bW4gYW5kIHNldCB1cCBtb3VzZWRvd24gbGlzdGVuZXJzIHRvIHN0YXJ0IGRyYWdnaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0UmVzaXphYmxlQ29sdW1ucygpIHtcclxuICAgIGlmICh0aGlzLmlzUmVzaXphYmxlICE9PSBmYWxzZSkge1xyXG5cclxuICAgICAgdGhpcy50YWJsZUVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBpZiAodGhpcy50YWJsZUVsLnRhZ05hbWUgIT09ICdUQUJMRScpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnZWNSZXNpemFibGVUYWJsZScgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHBsYWNlZCBvbiBhIDx0YWJsZT4gZWxlbWVudC5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc29ydGFibGVUYWJsZSkge1xyXG4gICAgICAgIHRoaXMubWluQ29sV2lkdGggPSA0ODtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy50YWJsZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJyk7XHJcbiAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnRhYmxlRWwucXVlcnlTZWxlY3RvckFsbCgnY29sJyk7XHJcbiAgICAgIHRoaXMuY29scyA9IFtdO1xyXG4gICAgICB0aGlzLmNvbFdpZHRocyA9IFtdO1xyXG4gIFxyXG4gICAgICBpZiAoY29scy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbGdyb3VwOiBIVE1MRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnY29sZ3JvdXAnKTtcclxuICAgICAgICBoZWFkZXJzLmZvckVhY2goKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29sID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdjb2wnKTtcclxuICAgICAgICAgIHRoaXMuY29scy5wdXNoKGNvbCk7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGZyYWdtZW50LCBjb2wpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoY29sZ3JvdXAsIGZyYWdtZW50KTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZSh0aGlzLnRhYmxlRWwsIGNvbGdyb3VwLCB0aGlzLnRhYmxlRWwuZmlyc3RFbGVtZW50Q2hpbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbHMuZm9yRWFjaChjb2xFbCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbHMucHVzaChjb2xFbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICE9PSBjb2xzLmxlbmd0aCkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaGVyZSBhcmUgJHtoZWFkZXJzLmxlbmd0aH0gPHRoPiBlbGVtZW50cyBhbmQgJHt0aGlzLmNvbHMubGVuZ3RofSA8Y29sPiBlbGVtZW50cyBpbiB0aGlzIHRoaXMgdGFibGUuIFRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgdGFibGUgaGVhZGVycyBtdXN0IG1hdGNoLiA8dGg+IGVsZW1lbnRzIHdpdGggYSAnY29sc3BhbicgYXR0cmlidXRlIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGxhc3RSZXNpemFibGVJbmRleCA9IEFycmF5LmZyb20oaGVhZGVycykucmV2ZXJzZSgpLmZpbmRJbmRleChlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLXJlc2l6YWJsZScpKSArIDE7XHJcbiAgICAgIHRoaXMubGFzdENvbEluZGV4ID0gdGhpcy5jb2xzLmxlbmd0aCAtIGxhc3RSZXNpemFibGVJbmRleDtcclxuICBcclxuICAgICAgaGVhZGVycy5mb3JFYWNoKHRoID0+IHtcclxuICAgICAgICBpZiAodGguY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1yZXNpemFibGUnKSkge1xyXG4gICAgICAgICAgY29uc3QgaGFuZGxlID0gdGgucXVlcnlTZWxlY3RvcignLmhhbmRsZScpO1xyXG5cclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGhhbmRsZSwgJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRFbCA9IHRoO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RHJhZyhldmVudCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgYSB0aWNrIGZvciBhIHZpZXcgdGhhdCB3YXMgcHJldmlvdXNseSBsb2FkZWQgdG8gYmUgcmVtb3ZlZFxyXG4gICAgICAvLyBmcm9tIHRoZSBET00gYW5kIGFsbG93IHRoaXMgZGlyZWN0aXZlJ3MgcGFyZW50IHZpZXcgdG8gZnVsbHkgZXhwYW5kIGluIHRoZSBcclxuICAgICAgLy8gdmlld3BvcnQgYmVmb3JlIGdldHRpbmcgd2lkdGhzLlxyXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsV2lkdGhzKGhlYWRlcnMpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgY29sdW1uIHdpdGggdGhlIGNhbGN1bGF0ZWQgd2lkdGggd2hpbGUgcmVzaXppbmcuXHJcbiAgICogSWYgdGhlIGNvbHVtbiBpcyBuYXJyb3dlZCBzbyB0aGF0IHRoZSB0YWJsZSB3b3VsZCBiZSBuYXJyb3dlciB0aGFuIHRoZSBtaW4td2lkdGgsXHJcbiAgICogZXhwYW5kIHRoZSBsYXN0IGNvbHVtbi4gSWYgdGhlIHRhYmxlIGlzIHRoZW4gd2lkZW5lZCwgcmV0dXJuIHRoZSBsYXN0IGNvbHVtblxyXG4gICAqIHRvIGl0cyBpbml0aWFsIHdpZHRoLlxyXG4gICAqIEBwYXJhbSB3aWR0aCBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2V0V2lkdGgod2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEVsKSB7XHJcbiAgICAgIGNvbnN0IGNlbGxJbmRleDogbnVtYmVyID0gKDxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudD50aGlzLmN1cnJlbnRFbCkuY2VsbEluZGV4O1xyXG4gICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCB0aGlzLm1pbkNvbFdpZHRoKTtcclxuICAgICAgdGhpcy5jb2xXaWR0aHNbY2VsbEluZGV4XSA9IHdpZHRoO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29sc1tjZWxsSW5kZXhdLCAnd2lkdGgnLCB3aWR0aCArICdweCcpO1xyXG5cclxuICAgICAgbGV0IHRvdGFsQ29sV2lkdGhzID0gMDtcclxuICAgICAgdGhpcy5jb2xXaWR0aHMuZm9yRWFjaCh3ID0+IHtcclxuICAgICAgICB0b3RhbENvbFdpZHRocyArPSB3O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gKDxIVE1MRGl2RWxlbWVudD50aGlzLmNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQpLmNsaWVudFdpZHRoO1xyXG4gICAgICBpZiAodGhpcy5taW5UYWJsZVdpZHRoICE9PSBjb250YWluZXJXaWR0aCkge1xyXG4gICAgICAgIHRoaXMubWluVGFibGVXaWR0aCA9IGNvbnRhaW5lcldpZHRoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkaWZmID0gdG90YWxDb2xXaWR0aHMgLSB0aGlzLm1pblRhYmxlV2lkdGg7ICAgICAgXHJcbiAgICAgIGlmIChkaWZmIDwgMCkge1xyXG4gICAgICAgIGNvbnN0IGNvbEluZGV4ID0gY2VsbEluZGV4ID09PSB0aGlzLmxhc3RDb2xJbmRleCA/IHRoaXMubGFzdENvbEluZGV4IC0gMSA6IHRoaXMubGFzdENvbEluZGV4O1xyXG4gICAgICAgIGNvbnN0IGNvbFdpZHRoID0gTWF0aC5tYXgodGhpcy5jb2xXaWR0aHNbY29sSW5kZXhdICsgTWF0aC5hYnMoZGlmZiksIHRoaXMubWluQ29sV2lkdGgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jb2xzW2NvbEluZGV4XSwgJ3dpZHRoJywgY29sV2lkdGggKyAncHgnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVFbCwgJ3dpZHRoJywgdGhpcy5taW5UYWJsZVdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWwsICd3aWR0aCcsIHRvdGFsQ29sV2lkdGhzICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdG9wRHJhZyhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgc3VwZXIuc3RvcERyYWcoZXZlbnQpO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5jdXJyZW50RWwpIHtcclxuICAgICAgY29uc3QgY2VsbEluZGV4ID0gKDxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudD50aGlzLmN1cnJlbnRFbCkuY2VsbEluZGV4O1xyXG4gICAgICBjb25zdCBjdXJyZW50Q29sID0gdGhpcy5yZXNpemFibGVDb2x1bW5zLmZpbmQoY29sID0+ICg8SFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ+Y29sLmVsLm5hdGl2ZUVsZW1lbnQpLmNlbGxJbmRleCA9PT0gY2VsbEluZGV4KTtcclxuICAgICAgaWYgKGN1cnJlbnRDb2wpIHtcclxuICAgICAgICBjdXJyZW50Q29sLmVtaXRXaWR0aChNYXRoLnJvdW5kKHRoaXMuY29sV2lkdGhzW2NlbGxJbmRleF0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FwdHVyZSB0aGUgaW5pdGlhbCB3aWR0aCBvZiB0aGUgdGFibGUgYW5kIHRoZSB0YWJsZSBoZWFkZXJzLlxyXG4gICAqIEBwYXJhbSBoZWFkZXJzIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0SW5pdGlhbFdpZHRocyhoZWFkZXJzOiBOb2RlTGlzdE9mPEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50VGFibGVXaWR0aCA9IHRoaXMudGFibGVFbC5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMubWluVGFibGVXaWR0aCA9IHRoaXMuY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuXHJcbiAgICBoZWFkZXJzLmZvckVhY2godGggPT4ge1xyXG4gICAgICB0aGlzLmNvbFdpZHRoc1t0aC5jZWxsSW5kZXhdID0gdGgub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGNvbnN0IHdpZHRoID0gdGguc3R5bGUud2lkdGg7XHJcbiAgICAgIGlmICh3aWR0aCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jb2xzW3RoLmNlbGxJbmRleF0sICd3aWR0aCcsIHdpZHRoKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoLCAnd2lkdGgnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHRvdGFsQ29sV2lkdGhzID0gMDtcclxuICAgIHRoaXMuY29sV2lkdGhzLmZvckVhY2godyA9PiB7XHJcbiAgICAgIHRvdGFsQ29sV2lkdGhzICs9IHc7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDaGVjayB0byBzZWUgaWYgb3VyIHRvdGFsIGNvbHVtbiB3aWR0aHMgaXMgZ3JlYXRlciB0aGFuIG91ciB0YWJsZSB3aWR0aFxyXG4gICAgbGV0IGNvbFdpZHRoRGlmZmVyZW5jZSA9IHRvdGFsQ29sV2lkdGhzIC0gdGhpcy5jdXJyZW50VGFibGVXaWR0aDtcclxuICAgXHJcbiAgICAvLyBJZiB0aGUgdG90YWwgY29sdW1uIHdpZHRocyBpcyBncmVhdGVyIHRoYW4gemVybyB0aGVuIGl0cyBsYXJnZXIgdGhhbiBvdXIgdGFibGUgY29udGFpbmVyXHJcbiAgICAvLyBUbyBwcmV2ZW50IGEgaG9yaXpvbnRhbCBzY3JvbGwgd2Ugd2lsbCBidW1wIGEgY29sdW1ucyB3aWR0aCBkb3duIHRvIG1hdGNoIHRoZSB0YWJsZSBzaXplXHJcbiAgICBpZiAoY29sV2lkdGhEaWZmZXJlbmNlID4gMCkge1xyXG4gICAgICAvLyBJZGVhbGx5IHdlIHdpbGwgY2hvb3NlIHRoZSBzZWNvbmQgdG8gdGhlIGxhc3QgY29sdW1uLCBidXQgaWYgdGhlcmUgaXMgb25seSBvbmUgdGhhdCdsbCBkb1xyXG4gICAgICBsZXQgY29sdW1uVG9SZWR1Y2UgPSBoZWFkZXJzLmxlbmd0aCA+IDEgPyBoZWFkZXJzLmxlbmd0aCAtIDIgOiAwO1xyXG5cclxuICAgICAgLy8gU2hyaW5rIHRoZSBjb2x1bW5cclxuICAgICAgbGV0IHRoID0gaGVhZGVyc1tjb2x1bW5Ub1JlZHVjZV07XHJcbiAgICAgIHRoaXMuY29sV2lkdGhzW3RoLmNlbGxJbmRleF0gPSB0aC5vZmZzZXRXaWR0aCAtIGNvbFdpZHRoRGlmZmVyZW5jZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNvbHNbdGguY2VsbEluZGV4XSwgJ3dpZHRoJywgdGhpcy5jb2xXaWR0aHNbdGguY2VsbEluZGV4XSArICdweCcpO1xyXG4gICAgXHJcbiAgICAgIC8vIFJlZHVjZSBvdXIgdG90YWxDb2xXaWR0aHMgdG8gcmVmbGVjdFxyXG4gICAgICB0b3RhbENvbFdpZHRocyA9IHRvdGFsQ29sV2lkdGhzIC0gY29sV2lkdGhEaWZmZXJlbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZUVsLCAnd2lkdGgnLCBNYXRoLm1heCh0aGlzLmN1cnJlbnRUYWJsZVdpZHRoLCB0b3RhbENvbFdpZHRocykgKyAncHgnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZUVsLCAnbWluV2lkdGgnLCAnMTAwJScpO1xyXG4gIH1cclxufVxyXG4iXX0=
1
+ import { Directive, Inject, Input } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import { ResizableBase } from '../resizable/resizable-base';
4
+ import { Subject } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../core/cache.service";
8
+ /**
9
+ * Add the ability to resize columns to a standard HTML table.
10
+ * Specify a column as resizable by adding the .is-resizable class to a <th>.
11
+ *
12
+ * Usage:
13
+ ```html
14
+ <table [ecResizableTable]>
15
+ <colgroup><col><col><col></colgroup>
16
+ <thead>
17
+ <tr>
18
+ <th class="is-resizable">Resizable</th>
19
+ <th class="is-resizable">Resizable</th>
20
+ <th>Static</th>
21
+ </tr>
22
+ </thead>
23
+ ...
24
+ </table>
25
+
26
+ ```
27
+ * Note: this directive is meant to be used internally with the TableComponent
28
+ * and is not exposed in the public-api of the library
29
+ */
30
+ export class ResizableTableDirective extends ResizableBase {
31
+ constructor(el, renderer, cacheService, document) {
32
+ super(renderer, cacheService, document);
33
+ this.el = el;
34
+ this.sortableTable = false;
35
+ /**
36
+ * Stored reference to the <col> element children. Will throw if none are found. Will
37
+ * warn if the number of <col> elements do not match the number of <th> elements
38
+ */
39
+ this.cols = [];
40
+ /**
41
+ * The widths of each table column. These are updated as columns are resized and
42
+ * are used to calculate the new table width.
43
+ */
44
+ this.colWidths = [];
45
+ /**
46
+ * The current table width
47
+ */
48
+ this.currentTableWidth = 0;
49
+ /**
50
+ * The width of the table when the component was initialized. The table cannot
51
+ * be shrunk below this width. If a column resize would cause the current table
52
+ * width to be below this value, the last column is widened instead.
53
+ */
54
+ this.minTableWidth = 0;
55
+ /**
56
+ * The width the column can not be resized below.
57
+ */
58
+ this.minColWidth = 32;
59
+ this.destroyed = new Subject();
60
+ }
61
+ ngOnInit() {
62
+ this.initResizableColumns();
63
+ this.resizableColumns.changes.pipe(takeUntil(this.destroyed)).subscribe(() => this.initResizableColumns());
64
+ }
65
+ ngOnDestroy() {
66
+ this.destroyed.next();
67
+ this.destroyed.complete();
68
+ }
69
+ /**
70
+ * Initialize
71
+ * * Check that the host element is a table and that <col> elements are present
72
+ * * Save the initial width of table as the minimum table width
73
+ * * Store a reference to all <col> elements
74
+ * * Add a handle to each resizable column and set up mousedown listeners to start dragging
75
+ */
76
+ initResizableColumns() {
77
+ if (this.isResizable !== false) {
78
+ this.tableEl = this.el.nativeElement;
79
+ if (this.tableEl.tagName !== 'TABLE') {
80
+ throw new Error(`The 'ecResizableTable' directive can only be placed on a <table> element.`);
81
+ }
82
+ if (this.sortableTable) {
83
+ this.minColWidth = 48;
84
+ }
85
+ const headers = this.tableEl.querySelectorAll('th');
86
+ const cols = this.tableEl.querySelectorAll('col');
87
+ this.cols = [];
88
+ this.colWidths = [];
89
+ if (cols.length === 0) {
90
+ const fragment = this.document.createDocumentFragment();
91
+ const colgroup = this.renderer.createElement('colgroup');
92
+ headers.forEach(() => {
93
+ const col = this.renderer.createElement('col');
94
+ this.cols.push(col);
95
+ this.renderer.appendChild(fragment, col);
96
+ });
97
+ this.renderer.appendChild(colgroup, fragment);
98
+ this.renderer.insertBefore(this.tableEl, colgroup, this.tableEl.firstElementChild);
99
+ }
100
+ else {
101
+ cols.forEach(colEl => {
102
+ this.cols.push(colEl);
103
+ });
104
+ if (headers.length !== cols.length) {
105
+ console.warn(`There are ${headers.length} <th> elements and ${this.cols.length} <col> elements in this this table. The number of columns and table headers must match. <th> elements with a 'colspan' attribute are currently not supported.`);
106
+ }
107
+ }
108
+ const lastResizableIndex = Array.from(headers).reverse().findIndex(el => el.classList.contains('is-resizable')) + 1;
109
+ this.lastColIndex = this.cols.length - lastResizableIndex;
110
+ headers.forEach(th => {
111
+ if (th.classList.contains('is-resizable')) {
112
+ const handle = th.querySelector('.handle');
113
+ this.renderer.listen(handle, 'mousedown', (event) => {
114
+ this.currentEl = th;
115
+ this.startDrag(event);
116
+ });
117
+ }
118
+ });
119
+ // We need to wait a tick for a view that was previously loaded to be removed
120
+ // from the DOM and allow this directive's parent view to fully expand in the
121
+ // viewport before getting widths.
122
+ window.setTimeout(() => {
123
+ this.setInitialWidths(headers);
124
+ });
125
+ }
126
+ }
127
+ /**
128
+ * Update the column with the calculated width while resizing.
129
+ * If the column is narrowed so that the table would be narrower than the min-width,
130
+ * expand the last column. If the table is then widened, return the last column
131
+ * to its initial width.
132
+ * @param width
133
+ */
134
+ setWidth(width) {
135
+ if (this.currentEl) {
136
+ const cellIndex = this.currentEl.cellIndex;
137
+ width = Math.max(width, this.minColWidth);
138
+ this.colWidths[cellIndex] = width;
139
+ this.renderer.setStyle(this.cols[cellIndex], 'width', width + 'px');
140
+ let totalColWidths = 0;
141
+ this.colWidths.forEach(w => {
142
+ totalColWidths += w;
143
+ });
144
+ const containerWidth = this.containerEl.nativeElement.clientWidth;
145
+ if (this.minTableWidth !== containerWidth) {
146
+ this.minTableWidth = containerWidth;
147
+ }
148
+ const diff = totalColWidths - this.minTableWidth;
149
+ if (diff < 0) {
150
+ const colIndex = cellIndex === this.lastColIndex ? this.lastColIndex - 1 : this.lastColIndex;
151
+ const colWidth = Math.max(this.colWidths[colIndex] + Math.abs(diff), this.minColWidth);
152
+ this.renderer.setStyle(this.cols[colIndex], 'width', colWidth + 'px');
153
+ this.renderer.setStyle(this.tableEl, 'width', this.minTableWidth + 'px');
154
+ }
155
+ else {
156
+ this.renderer.setStyle(this.tableEl, 'width', totalColWidths + 'px');
157
+ }
158
+ }
159
+ }
160
+ stopDrag(event) {
161
+ super.stopDrag(event);
162
+ if (this.currentEl) {
163
+ const cellIndex = this.currentEl.cellIndex;
164
+ const currentCol = this.resizableColumns.find(col => col.el.nativeElement.cellIndex === cellIndex);
165
+ if (currentCol) {
166
+ currentCol.emitWidth(Math.round(this.colWidths[cellIndex]));
167
+ }
168
+ }
169
+ }
170
+ /**
171
+ * Capture the initial width of the table and the table headers.
172
+ * @param headers
173
+ */
174
+ setInitialWidths(headers) {
175
+ this.currentTableWidth = this.tableEl.offsetWidth;
176
+ this.minTableWidth = this.containerEl.nativeElement.clientWidth;
177
+ headers.forEach(th => {
178
+ this.colWidths[th.cellIndex] = th.offsetWidth;
179
+ const width = th.style.width;
180
+ if (width) {
181
+ this.renderer.setStyle(this.cols[th.cellIndex], 'width', width);
182
+ this.renderer.removeStyle(th, 'width');
183
+ }
184
+ });
185
+ let totalColWidths = 0;
186
+ this.colWidths.forEach(w => {
187
+ totalColWidths += w;
188
+ });
189
+ // Check to see if our total column widths is greater than our table width
190
+ let colWidthDifference = totalColWidths - this.currentTableWidth;
191
+ // If the total column widths is greater than zero then its larger than our table container
192
+ // To prevent a horizontal scroll we will bump a columns width down to match the table size
193
+ if (colWidthDifference > 0) {
194
+ // Ideally we will choose the second to the last column, but if there is only one that'll do
195
+ let columnToReduce = headers.length > 1 ? headers.length - 2 : 0;
196
+ // Shrink the column
197
+ let th = headers[columnToReduce];
198
+ this.colWidths[th.cellIndex] = th.offsetWidth - colWidthDifference;
199
+ this.renderer.setStyle(this.cols[th.cellIndex], 'width', this.colWidths[th.cellIndex] + 'px');
200
+ // Reduce our totalColWidths to reflect
201
+ totalColWidths = totalColWidths - colWidthDifference;
202
+ }
203
+ this.renderer.setStyle(this.tableEl, 'width', Math.max(this.currentTableWidth, totalColWidths) + 'px');
204
+ this.renderer.setStyle(this.tableEl, 'minWidth', '100%');
205
+ }
206
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResizableTableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.CacheService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
207
+ static { thisdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ResizableTableDirective, selector: "[ecResizableTable]", inputs: { isResizable: ["ecResizableTable", "isResizable"], containerEl: "containerEl", sortableTable: "sortableTable", resizableColumns: "resizableColumns" }, usesInheritance: true, ngImport: i0 }); }
208
+ }
209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ResizableTableDirective, decorators: [{
210
+ type: Directive,
211
+ args: [{
212
+ selector: '[ecResizableTable]'
213
+ }]
214
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.CacheService }, { type: Document, decorators: [{
215
+ type: Inject,
216
+ args: [DOCUMENT]
217
+ }] }]; }, propDecorators: { isResizable: [{
218
+ type: Input,
219
+ args: ['ecResizableTable']
220
+ }], containerEl: [{
221
+ type: Input
222
+ }], sortableTable: [{
223
+ type: Input
224
+ }], resizableColumns: [{
225
+ type: Input
226
+ }] } });
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLXRhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L3RhYmxlL3Jlc2l6YWJsZS10YWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBaUMsTUFBTSxFQUFFLEtBQUssRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRzNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFJSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsYUFBYTtJQStDeEQsWUFDVSxFQUFjLEVBQ3RCLFFBQW1CLEVBQ25CLFlBQTBCLEVBQ1IsUUFBa0I7UUFFcEMsS0FBSyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFMaEMsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQTdDZixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQVd4Qzs7O1dBR0c7UUFDSyxTQUFJLEdBQTBCLEVBQUUsQ0FBQztRQUV6Qzs7O1dBR0c7UUFDSyxjQUFTLEdBQWEsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ0ssc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBRXRDOzs7O1dBSUc7UUFDSyxrQkFBYSxHQUFXLENBQUMsQ0FBQztRQUVsQzs7V0FFRztRQUNLLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBSXpCLGNBQVMsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQVNqRCxDQUFDO0lBRU0sUUFBUTtR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LENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2RyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDOytHQWhPVSx1QkFBdUIsaUdBbUR4QixRQUFRO21HQW5EUCx1QkFBdUI7OzRGQUF2Qix1QkFBdUI7a0JBSG5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7OzBCQW9ESSxNQUFNOzJCQUFDLFFBQVE7NENBbERTLFdBQVc7c0JBQXJDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNoQixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBTUcsZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIFJlbmRlcmVyMiwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBSZXNpemFibGVCYXNlIH0gZnJvbSAnLi4vcmVzaXphYmxlL3Jlc2l6YWJsZS1iYXNlJztcclxuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9jYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vcmVzaXphYmxlLWNvbHVtbi5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIEFkZCB0aGUgYWJpbGl0eSB0byByZXNpemUgY29sdW1ucyB0byBhIHN0YW5kYXJkIEhUTUwgdGFibGUuXHJcbiAqIFNwZWNpZnkgYSBjb2x1bW4gYXMgcmVzaXphYmxlIGJ5IGFkZGluZyB0aGUgLmlzLXJlc2l6YWJsZSBjbGFzcyB0byBhIDx0aD4uXHJcbiAqIFxyXG4gKiBVc2FnZTpcclxuICBgYGBodG1sXHJcbiAgPHRhYmxlIFtlY1Jlc2l6YWJsZVRhYmxlXT5cclxuICAgIDxjb2xncm91cD48Y29sPjxjb2w+PGNvbD48L2NvbGdyb3VwPlxyXG4gICAgPHRoZWFkPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwiaXMtcmVzaXphYmxlXCI+UmVzaXphYmxlPC90aD5cclxuICAgICAgICA8dGggY2xhc3M9XCJpcy1yZXNpemFibGVcIj5SZXNpemFibGU8L3RoPlxyXG4gICAgICAgIDx0aD5TdGF0aWM8L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90aGVhZD5cclxuICAgIC4uLlxyXG4gIDwvdGFibGU+XHJcblxyXG4gIGBgYFxyXG4gICogTm90ZTogdGhpcyBkaXJlY3RpdmUgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IHdpdGggdGhlIFRhYmxlQ29tcG9uZW50XHJcbiAgKiBhbmQgaXMgbm90IGV4cG9zZWQgaW4gdGhlIHB1YmxpYy1hcGkgb2YgdGhlIGxpYnJhcnlcclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2VjUmVzaXphYmxlVGFibGVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVzaXphYmxlVGFibGVEaXJlY3RpdmUgZXh0ZW5kcyBSZXNpemFibGVCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgnZWNSZXNpemFibGVUYWJsZScpIGlzUmVzaXphYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGNvbnRhaW5lckVsITogRWxlbWVudFJlZjtcclxuICBASW5wdXQoKSBzb3J0YWJsZVRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBcclxuICAgKiBVc2VkIHRvIG5vdGlmeSB0aGUgcmVzaXphYmxlIGRpcmVjdGl2ZSB0aGF0IHRoZSBjb2x1bW5zIGFyZSByZWFkeSB0byBiZSBjb25maWd1cmVkLlxyXG4gICAqIE11c3QgYmUgdXNlZCBpZiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgY2FuIGNoYW5nZSBvdmVyIHRoZSB0YWJsZSdzIGxpZmVjeWNsZS5cclxuICAgKi9cclxuICBASW5wdXQoKSByZXNpemFibGVDb2x1bW5zITogUXVlcnlMaXN0PFJlc2l6YWJsZUNvbHVtbkNvbXBvbmVudD47XHJcblxyXG4gIC8qKiBUaGUgaG9zdCA8dGFibGU+IGVsZW1lbnQuIFdpbGwgdGhyb3cgaWYgaG9zdCBlbGVtZW50IGlzIG5vdCBhIDx0YWJsZT4gKi9cclxuICBwcml2YXRlIHRhYmxlRWwhOiBIVE1MVGFibGVFbGVtZW50O1xyXG5cclxuICAvKiogXHJcbiAgICogU3RvcmVkIHJlZmVyZW5jZSB0byB0aGUgPGNvbD4gZWxlbWVudCBjaGlsZHJlbi4gV2lsbCB0aHJvdyBpZiBub25lIGFyZSBmb3VuZC4gV2lsbFxyXG4gICAqIHdhcm4gaWYgdGhlIG51bWJlciBvZiA8Y29sPiBlbGVtZW50cyBkbyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiA8dGg+IGVsZW1lbnRzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb2xzOiBIVE1MVGFibGVDb2xFbGVtZW50W10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHdpZHRocyBvZiBlYWNoIHRhYmxlIGNvbHVtbi4gVGhlc2UgYXJlIHVwZGF0ZWQgYXMgY29sdW1ucyBhcmUgcmVzaXplZCBhbmRcclxuICAgKiBhcmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5ldyB0YWJsZSB3aWR0aC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbFdpZHRoczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgdGFibGUgd2lkdGhcclxuICAgKi9cclxuICBwcml2YXRlIGN1cnJlbnRUYWJsZVdpZHRoOiBudW1iZXIgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgd2lkdGggb2YgdGhlIHRhYmxlIHdoZW4gdGhlIGNvbXBvbmVudCB3YXMgaW5pdGlhbGl6ZWQuIFRoZSB0YWJsZSBjYW5ub3RcclxuICAgKiBiZSBzaHJ1bmsgYmVsb3cgdGhpcyB3aWR0aC4gSWYgYSBjb2x1bW4gcmVzaXplIHdvdWxkIGNhdXNlIHRoZSBjdXJyZW50IHRhYmxlXHJcbiAgICogd2lkdGggdG8gYmUgYmVsb3cgdGhpcyB2YWx1ZSwgdGhlIGxhc3QgY29sdW1uIGlzIHdpZGVuZWQgaW5zdGVhZC5cclxuICAgKi9cclxuICBwcml2YXRlIG1pblRhYmxlV2lkdGg6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB3aWR0aCB0aGUgY29sdW1uIGNhbiBub3QgYmUgcmVzaXplZCBiZWxvdy5cclxuICAgKi9cclxuICBwcml2YXRlIG1pbkNvbFdpZHRoOiBudW1iZXIgPSAzMjtcclxuXHJcbiAgcHJpdmF0ZSBsYXN0Q29sSW5kZXghOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgZGVzdHJveWVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgZG9jdW1lbnQ6IERvY3VtZW50XHJcbiAgKSB7XHJcbiAgICBzdXBlcihyZW5kZXJlciwgY2FjaGVTZXJ2aWNlLCBkb2N1bWVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRSZXNpemFibGVDb2x1bW5zKCk7XHJcblxyXG4gICAgdGhpcy5yZXNpemFibGVDb2x1bW5zLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5pbml0UmVzaXphYmxlQ29sdW1ucygpKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemVcclxuICAgKiAqIENoZWNrIHRoYXQgdGhlIGhvc3QgZWxlbWVudCBpcyBhIHRhYmxlIGFuZCB0aGF0IDxjb2w+IGVsZW1lbnRzIGFyZSBwcmVzZW50XHJcbiAgICogKiBTYXZlIHRoZSBpbml0aWFsIHdpZHRoIG9mIHRhYmxlIGFzIHRoZSBtaW5pbXVtIHRhYmxlIHdpZHRoXHJcbiAgICogKiBTdG9yZSBhIHJlZmVyZW5jZSB0byBhbGwgPGNvbD4gZWxlbWVudHNcclxuICAgKiAqIEFkZCBhIGhhbmRsZSB0byBlYWNoIHJlc2l6YWJsZSBjb2x1bW4gYW5kIHNldCB1cCBtb3VzZWRvd24gbGlzdGVuZXJzIHRvIHN0YXJ0IGRyYWdnaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0UmVzaXphYmxlQ29sdW1ucygpIHtcclxuICAgIGlmICh0aGlzLmlzUmVzaXphYmxlICE9PSBmYWxzZSkge1xyXG5cclxuICAgICAgdGhpcy50YWJsZUVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBpZiAodGhpcy50YWJsZUVsLnRhZ05hbWUgIT09ICdUQUJMRScpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnZWNSZXNpemFibGVUYWJsZScgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHBsYWNlZCBvbiBhIDx0YWJsZT4gZWxlbWVudC5gKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc29ydGFibGVUYWJsZSkge1xyXG4gICAgICAgIHRoaXMubWluQ29sV2lkdGggPSA0ODtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy50YWJsZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJyk7XHJcbiAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLnRhYmxlRWwucXVlcnlTZWxlY3RvckFsbCgnY29sJyk7XHJcbiAgICAgIHRoaXMuY29scyA9IFtdO1xyXG4gICAgICB0aGlzLmNvbFdpZHRocyA9IFtdO1xyXG4gIFxyXG4gICAgICBpZiAoY29scy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbGdyb3VwOiBIVE1MRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnY29sZ3JvdXAnKTtcclxuICAgICAgICBoZWFkZXJzLmZvckVhY2goKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29sID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdjb2wnKTtcclxuICAgICAgICAgIHRoaXMuY29scy5wdXNoKGNvbCk7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGZyYWdtZW50LCBjb2wpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoY29sZ3JvdXAsIGZyYWdtZW50KTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZSh0aGlzLnRhYmxlRWwsIGNvbGdyb3VwLCB0aGlzLnRhYmxlRWwuZmlyc3RFbGVtZW50Q2hpbGQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbHMuZm9yRWFjaChjb2xFbCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbHMucHVzaChjb2xFbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICE9PSBjb2xzLmxlbmd0aCkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaGVyZSBhcmUgJHtoZWFkZXJzLmxlbmd0aH0gPHRoPiBlbGVtZW50cyBhbmQgJHt0aGlzLmNvbHMubGVuZ3RofSA8Y29sPiBlbGVtZW50cyBpbiB0aGlzIHRoaXMgdGFibGUuIFRoZSBudW1iZXIgb2YgY29sdW1ucyBhbmQgdGFibGUgaGVhZGVycyBtdXN0IG1hdGNoLiA8dGg+IGVsZW1lbnRzIHdpdGggYSAnY29sc3BhbicgYXR0cmlidXRlIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGxhc3RSZXNpemFibGVJbmRleCA9IEFycmF5LmZyb20oaGVhZGVycykucmV2ZXJzZSgpLmZpbmRJbmRleChlbCA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLXJlc2l6YWJsZScpKSArIDE7XHJcbiAgICAgIHRoaXMubGFzdENvbEluZGV4ID0gdGhpcy5jb2xzLmxlbmd0aCAtIGxhc3RSZXNpemFibGVJbmRleDtcclxuICBcclxuICAgICAgaGVhZGVycy5mb3JFYWNoKHRoID0+IHtcclxuICAgICAgICBpZiAodGguY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1yZXNpemFibGUnKSkge1xyXG4gICAgICAgICAgY29uc3QgaGFuZGxlID0gdGgucXVlcnlTZWxlY3RvcignLmhhbmRsZScpO1xyXG5cclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGhhbmRsZSwgJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRFbCA9IHRoO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RHJhZyhldmVudCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgYSB0aWNrIGZvciBhIHZpZXcgdGhhdCB3YXMgcHJldmlvdXNseSBsb2FkZWQgdG8gYmUgcmVtb3ZlZFxyXG4gICAgICAvLyBmcm9tIHRoZSBET00gYW5kIGFsbG93IHRoaXMgZGlyZWN0aXZlJ3MgcGFyZW50IHZpZXcgdG8gZnVsbHkgZXhwYW5kIGluIHRoZSBcclxuICAgICAgLy8gdmlld3BvcnQgYmVmb3JlIGdldHRpbmcgd2lkdGhzLlxyXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsV2lkdGhzKGhlYWRlcnMpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgY29sdW1uIHdpdGggdGhlIGNhbGN1bGF0ZWQgd2lkdGggd2hpbGUgcmVzaXppbmcuXHJcbiAgICogSWYgdGhlIGNvbHVtbiBpcyBuYXJyb3dlZCBzbyB0aGF0IHRoZSB0YWJsZSB3b3VsZCBiZSBuYXJyb3dlciB0aGFuIHRoZSBtaW4td2lkdGgsXHJcbiAgICogZXhwYW5kIHRoZSBsYXN0IGNvbHVtbi4gSWYgdGhlIHRhYmxlIGlzIHRoZW4gd2lkZW5lZCwgcmV0dXJuIHRoZSBsYXN0IGNvbHVtblxyXG4gICAqIHRvIGl0cyBpbml0aWFsIHdpZHRoLlxyXG4gICAqIEBwYXJhbSB3aWR0aCBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2V0V2lkdGgod2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEVsKSB7XHJcbiAgICAgIGNvbnN0IGNlbGxJbmRleDogbnVtYmVyID0gKDxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudD50aGlzLmN1cnJlbnRFbCkuY2VsbEluZGV4O1xyXG4gICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCB0aGlzLm1pbkNvbFdpZHRoKTtcclxuICAgICAgdGhpcy5jb2xXaWR0aHNbY2VsbEluZGV4XSA9IHdpZHRoO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29sc1tjZWxsSW5kZXhdLCAnd2lkdGgnLCB3aWR0aCArICdweCcpO1xyXG5cclxuICAgICAgbGV0IHRvdGFsQ29sV2lkdGhzID0gMDtcclxuICAgICAgdGhpcy5jb2xXaWR0aHMuZm9yRWFjaCh3ID0+IHtcclxuICAgICAgICB0b3RhbENvbFdpZHRocyArPSB3O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gKDxIVE1MRGl2RWxlbWVudD50aGlzLmNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQpLmNsaWVudFdpZHRoO1xyXG4gICAgICBpZiAodGhpcy5taW5UYWJsZVdpZHRoICE9PSBjb250YWluZXJXaWR0aCkge1xyXG4gICAgICAgIHRoaXMubWluVGFibGVXaWR0aCA9IGNvbnRhaW5lcldpZHRoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkaWZmID0gdG90YWxDb2xXaWR0aHMgLSB0aGlzLm1pblRhYmxlV2lkdGg7ICAgICAgXHJcbiAgICAgIGlmIChkaWZmIDwgMCkge1xyXG4gICAgICAgIGNvbnN0IGNvbEluZGV4ID0gY2VsbEluZGV4ID09PSB0aGlzLmxhc3RDb2xJbmRleCA/IHRoaXMubGFzdENvbEluZGV4IC0gMSA6IHRoaXMubGFzdENvbEluZGV4O1xyXG4gICAgICAgIGNvbnN0IGNvbFdpZHRoID0gTWF0aC5tYXgodGhpcy5jb2xXaWR0aHNbY29sSW5kZXhdICsgTWF0aC5hYnMoZGlmZiksIHRoaXMubWluQ29sV2lkdGgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jb2xzW2NvbEluZGV4XSwgJ3dpZHRoJywgY29sV2lkdGggKyAncHgnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVFbCwgJ3dpZHRoJywgdGhpcy5taW5UYWJsZVdpZHRoICsgJ3B4Jyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlRWwsICd3aWR0aCcsIHRvdGFsQ29sV2lkdGhzICsgJ3B4Jyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzdG9wRHJhZyhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgc3VwZXIuc3RvcERyYWcoZXZlbnQpO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5jdXJyZW50RWwpIHtcclxuICAgICAgY29uc3QgY2VsbEluZGV4ID0gKDxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudD50aGlzLmN1cnJlbnRFbCkuY2VsbEluZGV4O1xyXG4gICAgICBjb25zdCBjdXJyZW50Q29sID0gdGhpcy5yZXNpemFibGVDb2x1bW5zLmZpbmQoY29sID0+ICg8SFRNTFRhYmxlSGVhZGVyQ2VsbEVsZW1lbnQ+Y29sLmVsLm5hdGl2ZUVsZW1lbnQpLmNlbGxJbmRleCA9PT0gY2VsbEluZGV4KTtcclxuICAgICAgaWYgKGN1cnJlbnRDb2wpIHtcclxuICAgICAgICBjdXJyZW50Q29sLmVtaXRXaWR0aChNYXRoLnJvdW5kKHRoaXMuY29sV2lkdGhzW2NlbGxJbmRleF0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FwdHVyZSB0aGUgaW5pdGlhbCB3aWR0aCBvZiB0aGUgdGFibGUgYW5kIHRoZSB0YWJsZSBoZWFkZXJzLlxyXG4gICAqIEBwYXJhbSBoZWFkZXJzIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0SW5pdGlhbFdpZHRocyhoZWFkZXJzOiBOb2RlTGlzdE9mPEhUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50VGFibGVXaWR0aCA9IHRoaXMudGFibGVFbC5vZmZzZXRXaWR0aDtcclxuICAgIHRoaXMubWluVGFibGVXaWR0aCA9IHRoaXMuY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuXHJcbiAgICBoZWFkZXJzLmZvckVhY2godGggPT4ge1xyXG4gICAgICB0aGlzLmNvbFdpZHRoc1t0aC5jZWxsSW5kZXhdID0gdGgub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGNvbnN0IHdpZHRoID0gdGguc3R5bGUud2lkdGg7XHJcbiAgICAgIGlmICh3aWR0aCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jb2xzW3RoLmNlbGxJbmRleF0sICd3aWR0aCcsIHdpZHRoKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoLCAnd2lkdGgnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IHRvdGFsQ29sV2lkdGhzID0gMDtcclxuICAgIHRoaXMuY29sV2lkdGhzLmZvckVhY2godyA9PiB7XHJcbiAgICAgIHRvdGFsQ29sV2lkdGhzICs9IHc7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDaGVjayB0byBzZWUgaWYgb3VyIHRvdGFsIGNvbHVtbiB3aWR0aHMgaXMgZ3JlYXRlciB0aGFuIG91ciB0YWJsZSB3aWR0aFxyXG4gICAgbGV0IGNvbFdpZHRoRGlmZmVyZW5jZSA9IHRvdGFsQ29sV2lkdGhzIC0gdGhpcy5jdXJyZW50VGFibGVXaWR0aDtcclxuICAgXHJcbiAgICAvLyBJZiB0aGUgdG90YWwgY29sdW1uIHdpZHRocyBpcyBncmVhdGVyIHRoYW4gemVybyB0aGVuIGl0cyBsYXJnZXIgdGhhbiBvdXIgdGFibGUgY29udGFpbmVyXHJcbiAgICAvLyBUbyBwcmV2ZW50IGEgaG9yaXpvbnRhbCBzY3JvbGwgd2Ugd2lsbCBidW1wIGEgY29sdW1ucyB3aWR0aCBkb3duIHRvIG1hdGNoIHRoZSB0YWJsZSBzaXplXHJcbiAgICBpZiAoY29sV2lkdGhEaWZmZXJlbmNlID4gMCkge1xyXG4gICAgICAvLyBJZGVhbGx5IHdlIHdpbGwgY2hvb3NlIHRoZSBzZWNvbmQgdG8gdGhlIGxhc3QgY29sdW1uLCBidXQgaWYgdGhlcmUgaXMgb25seSBvbmUgdGhhdCdsbCBkb1xyXG4gICAgICBsZXQgY29sdW1uVG9SZWR1Y2UgPSBoZWFkZXJzLmxlbmd0aCA+IDEgPyBoZWFkZXJzLmxlbmd0aCAtIDIgOiAwO1xyXG5cclxuICAgICAgLy8gU2hyaW5rIHRoZSBjb2x1bW5cclxuICAgICAgbGV0IHRoID0gaGVhZGVyc1tjb2x1bW5Ub1JlZHVjZV07XHJcbiAgICAgIHRoaXMuY29sV2lkdGhzW3RoLmNlbGxJbmRleF0gPSB0aC5vZmZzZXRXaWR0aCAtIGNvbFdpZHRoRGlmZmVyZW5jZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNvbHNbdGguY2VsbEluZGV4XSwgJ3dpZHRoJywgdGhpcy5jb2xXaWR0aHNbdGguY2VsbEluZGV4XSArICdweCcpO1xyXG4gICAgXHJcbiAgICAgIC8vIFJlZHVjZSBvdXIgdG90YWxDb2xXaWR0aHMgdG8gcmVmbGVjdFxyXG4gICAgICB0b3RhbENvbFdpZHRocyA9IHRvdGFsQ29sV2lkdGhzIC0gY29sV2lkdGhEaWZmZXJlbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZUVsLCAnd2lkdGgnLCBNYXRoLm1heCh0aGlzLmN1cnJlbnRUYWJsZVdpZHRoLCB0b3RhbENvbFdpZHRocykgKyAncHgnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YWJsZUVsLCAnbWluV2lkdGgnLCAnMTAwJScpO1xyXG4gIH1cclxufVxyXG4iXX0=