@guiexpert/table 0.0.2 → 1.0.1

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 (348) hide show
  1. package/.eslintrc.json +42 -0
  2. package/LICENSE +35 -0
  3. package/README.md +102 -0
  4. package/jest.config.ts +18 -0
  5. package/ng-package.json +7 -0
  6. package/package.json +10 -20
  7. package/project.json +47 -0
  8. package/{index.d.ts → src/index.ts} +69 -20
  9. package/src/lib/table/action/action-id.type.ts +24 -0
  10. package/{lib/table/action/on-action-triggered.if.d.ts → src/lib/table/action/on-action-triggered.if.ts} +4 -1
  11. package/src/lib/table/action/osx-shortcut-actionId-mapping.ts +29 -0
  12. package/src/lib/table/action/shortcut-actionid-mapping.type.ts +3 -0
  13. package/src/lib/table/action/shortcut.service.ts +134 -0
  14. package/src/lib/table/action/windows-shortcut-actionId-mapping.ts +27 -0
  15. package/src/lib/table/checkbox/checkbox-model.if.ts +16 -0
  16. package/src/lib/table/checkbox/checkbox-model.ts +62 -0
  17. package/src/lib/table/checkbox/tree-checkbox-model.ts +123 -0
  18. package/src/lib/table/color/color-rgb.if.ts +7 -0
  19. package/src/lib/table/color/color-rgb.ts +10 -0
  20. package/src/lib/table/color/ge-css-color-util.ts +43 -0
  21. package/src/lib/table/color/three-color-gradient-arg.if.ts +10 -0
  22. package/src/lib/table/color/three-color-gradient-arg.ts +14 -0
  23. package/src/lib/table/color/two-color-gradient-arg.if.ts +8 -0
  24. package/src/lib/table/color/two-color-gradient-arg.ts +12 -0
  25. package/src/lib/table/css-vars.ts +243 -0
  26. package/src/lib/table/data/common/aligns.ts +19 -0
  27. package/src/lib/table/data/common/area-map-factory.ts +14 -0
  28. package/src/lib/table/data/common/area-map.ts +11 -0
  29. package/src/lib/table/data/common/area-map.type.ts +5 -0
  30. package/{lib/table/data/common/args-adjust-columns-to-row-parent-params.d.ts → src/lib/table/data/common/args-adjust-columns-to-row-parent-params.ts} +11 -9
  31. package/src/lib/table/data/common/args-render-cell-div.ts +18 -0
  32. package/src/lib/table/data/common/boolean-function.ts +4 -0
  33. package/src/lib/table/data/common/cell-range.ts +57 -0
  34. package/src/lib/table/data/common/checkbox-column-def.ts +25 -0
  35. package/src/lib/table/data/common/checked-type.ts +1 -0
  36. package/src/lib/table/data/common/event/ge-cell-indices.ts +9 -0
  37. package/src/lib/table/data/common/event/ge-key-event.ts +10 -0
  38. package/src/lib/table/data/common/event/ge-model-change-event.ts +13 -0
  39. package/src/lib/table/data/common/event/ge-mouse-event.ts +38 -0
  40. package/src/lib/table/data/common/event/input/table-cell-update-event.if.ts +10 -0
  41. package/src/lib/table/data/common/event/input/table-cell-update-event.ts +14 -0
  42. package/src/lib/table/data/common/index-and-px.ts +9 -0
  43. package/src/lib/table/data/common/size.if.ts +4 -0
  44. package/src/lib/table/data/common/size.ts +9 -0
  45. package/src/lib/table/data/common/sizes.ts +35 -0
  46. package/src/lib/table/data/common/sort-item.ts +11 -0
  47. package/src/lib/table/data/common/tree-row-if.ts +11 -0
  48. package/src/lib/table/data/common/tree-row.ts +16 -0
  49. package/src/lib/table/data/common/value-label.if.ts +6 -0
  50. package/src/lib/table/data/common/value-label.ts +13 -0
  51. package/src/lib/table/data/div-scope.type.ts +5 -0
  52. package/src/lib/table/data/event/mouse-target-data.ts +45 -0
  53. package/src/lib/table/data/geo-data.ts +13 -0
  54. package/src/lib/table/data/options/auto-restore-options.if.ts +21 -0
  55. package/src/lib/table/data/options/auto-restore-options.ts +50 -0
  56. package/src/lib/table/data/options/default-row-heights.if.ts +5 -0
  57. package/src/lib/table/data/options/default-row-heights.ts +10 -0
  58. package/src/lib/table/data/options/icon.if.ts +7 -0
  59. package/src/lib/table/data/options/icon.ts +10 -0
  60. package/{lib/table/data/options/sorted-options.if.d.ts → src/lib/table/data/options/sorted-options.if.ts} +6 -3
  61. package/src/lib/table/data/options/sorted-options.ts +15 -0
  62. package/src/lib/table/data/options/table-options.if.ts +54 -0
  63. package/src/lib/table/data/options/table-options.ts +66 -0
  64. package/src/lib/table/data/options/tree-options.if.ts +10 -0
  65. package/src/lib/table/data/options/tree-options.ts +32 -0
  66. package/src/lib/table/data/table-model-and-options.if.ts +8 -0
  67. package/src/lib/table/data/table-model-and-options.ts +13 -0
  68. package/src/lib/table/data/tablemodel/area-ident.type.ts +18 -0
  69. package/src/lib/table/data/tablemodel/areamodel/abstract-area-model.ts +183 -0
  70. package/src/lib/table/data/tablemodel/areamodel/area-model-array-of-arrays.ts +59 -0
  71. package/src/lib/table/data/tablemodel/areamodel/area-model-cell-groups.ts +210 -0
  72. package/src/lib/table/data/tablemodel/areamodel/area-model-hidden.ts +120 -0
  73. package/src/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.ts +23 -0
  74. package/src/lib/table/data/tablemodel/areamodel/area-model-object-array.ts +105 -0
  75. package/src/lib/table/data/tablemodel/areamodel/area-model-tree.ts +215 -0
  76. package/src/lib/table/data/tablemodel/areamodel/area-model.if.ts +186 -0
  77. package/src/lib/table/data/tablemodel/areamodel/area-model.ts +110 -0
  78. package/src/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.ts +61 -0
  79. package/src/lib/table/data/tablemodel/areamodel/has-default-row-height-if.ts +3 -0
  80. package/src/lib/table/data/tablemodel/cellgroup/cell-group-ext.ts +167 -0
  81. package/src/lib/table/data/tablemodel/cellgroup/cell-group.if.ts +12 -0
  82. package/src/lib/table/data/tablemodel/cellgroup/cell-group.ts +18 -0
  83. package/src/lib/table/data/tablemodel/cellgroup/cellgroup-factory.ts +148 -0
  84. package/src/lib/table/data/tablemodel/column/column-def.if.ts +28 -0
  85. package/src/lib/table/data/tablemodel/column/column-def.ts +104 -0
  86. package/src/lib/table/data/tablemodel/padding.ts +9 -0
  87. package/src/lib/table/data/tablemodel/table-model.if.ts +90 -0
  88. package/src/lib/table/data/tablemodel/table-model.ts +352 -0
  89. package/src/lib/table/ele-scope.ts +283 -0
  90. package/src/lib/table/event-adapter.ts +28 -0
  91. package/src/lib/table/event-listener.if.ts +19 -0
  92. package/src/lib/table/factory/table-factory.ts +378 -0
  93. package/src/lib/table/factory/tree-factory.ts +51 -0
  94. package/src/lib/table/focus/focus-model.if.ts +14 -0
  95. package/src/lib/table/focus/focus-model.ts +48 -0
  96. package/{lib/table/focus/focus.type.d.ts → src/lib/table/focus/focus.type.ts} +3 -0
  97. package/src/lib/table/input-handler.ts +34 -0
  98. package/src/lib/table/mouse-handler.ts +237 -0
  99. package/src/lib/table/render-scope.ts +936 -0
  100. package/src/lib/table/renderer/cell-group-ext-cell-renderer.ts +27 -0
  101. package/{lib/table/renderer/cell-render.if.d.ts → src/lib/table/renderer/cell-render.if.ts} +10 -1
  102. package/src/lib/table/renderer/checkbox-boolean-property-cell-renderer.ts +58 -0
  103. package/src/lib/table/renderer/checkbox-cell-renderer.ts +39 -0
  104. package/src/lib/table/renderer/date-to-int-date-cell-renderer.ts +34 -0
  105. package/src/lib/table/renderer/date-to-iso-cell-renderer.ts +25 -0
  106. package/src/lib/table/renderer/date-to-locale-date-cell-renderer.ts +24 -0
  107. package/src/lib/table/renderer/date-to-tec-cell-renderer.ts +28 -0
  108. package/{lib/table/renderer/edit/edit-cell-renderer.type.d.ts → src/lib/table/renderer/edit/edit-cell-renderer.type.ts} +1 -0
  109. package/src/lib/table/renderer/edit/edit-input-pipe-for-number.ts +6 -0
  110. package/src/lib/table/renderer/edit/edit-input-pipe.if.ts +7 -0
  111. package/src/lib/table/renderer/edit/input-cell-renderer.ts +41 -0
  112. package/src/lib/table/renderer/edit/select-cell-renderer.ts +60 -0
  113. package/src/lib/table/renderer/male-female-to-icon-cell-renderer.ts +26 -0
  114. package/src/lib/table/renderer/number-cell-renderer.ts +38 -0
  115. package/src/lib/table/renderer/renderer.ts +11 -0
  116. package/src/lib/table/renderer/true-false-cell-renderer.ts +28 -0
  117. package/src/lib/table/selection/selection-model.if.ts +20 -0
  118. package/src/lib/table/selection/selection-model.ts +109 -0
  119. package/src/lib/table/selection/selection-service.ts +120 -0
  120. package/{lib/table/selection/selection.type.d.ts → src/lib/table/selection/selection.type.ts} +3 -0
  121. package/src/lib/table/service/abstract-store-state.service.ts +105 -0
  122. package/src/lib/table/service/convenience-dom.service.ts +548 -0
  123. package/src/lib/table/service/data/collapsed-expanded.data.ts +11 -0
  124. package/src/lib/table/service/data/html-style.type.ts +1 -0
  125. package/src/lib/table/service/dom-service.if.ts +16 -0
  126. package/src/lib/table/service/ge-filter.service.ts +123 -0
  127. package/src/lib/table/service/simple-dom-service.ts +46 -0
  128. package/src/lib/table/service/sorter.service.ts +30 -0
  129. package/src/lib/table/service/store-state-collapsed-expand.service.ts +76 -0
  130. package/src/lib/table/service/store-state-scroll-pos.service.ts +40 -0
  131. package/src/lib/table/service/store-state-sorting.service.ts +41 -0
  132. package/src/lib/table/service/tree-row.service.ts +31 -0
  133. package/src/lib/table/table-api.ts +61 -0
  134. package/src/lib/table/table-scope.ts +433 -0
  135. package/src/test-setup.ts +1 -0
  136. package/tsconfig.json +22 -0
  137. package/tsconfig.lib.json +19 -0
  138. package/tsconfig.lib.prod.json +7 -0
  139. package/tsconfig.spec.json +20 -0
  140. package/esm2020/guiexpert-table.mjs +0 -5
  141. package/esm2020/index.mjs +0 -108
  142. package/esm2020/lib/table/action/action-id.type.mjs +0 -20
  143. package/esm2020/lib/table/action/on-action-triggered.if.mjs +0 -2
  144. package/esm2020/lib/table/action/osx-shortcut-actionId-mapping.mjs +0 -17
  145. package/esm2020/lib/table/action/shortcut-actionid-mapping.type.mjs +0 -2
  146. package/esm2020/lib/table/action/shortcut.service.mjs +0 -105
  147. package/esm2020/lib/table/action/windows-shortcut-actionId-mapping.mjs +0 -15
  148. package/esm2020/lib/table/checkbox/checkbox-model.if.mjs +0 -2
  149. package/esm2020/lib/table/checkbox/checkbox-model.mjs +0 -52
  150. package/esm2020/lib/table/checkbox/tree-checkbox-model.mjs +0 -106
  151. package/esm2020/lib/table/data/common/aligns.mjs +0 -19
  152. package/esm2020/lib/table/data/common/area-map-factory.mjs +0 -7
  153. package/esm2020/lib/table/data/common/area-map.mjs +0 -8
  154. package/esm2020/lib/table/data/common/area-map.type.mjs +0 -2
  155. package/esm2020/lib/table/data/common/args-adjust-columns-to-row-parent-params.mjs +0 -2
  156. package/esm2020/lib/table/data/common/args-render-cell-div.mjs +0 -2
  157. package/esm2020/lib/table/data/common/boolean-function.mjs +0 -3
  158. package/esm2020/lib/table/data/common/cell-range.mjs +0 -27
  159. package/esm2020/lib/table/data/common/checkbox-column.mjs +0 -15
  160. package/esm2020/lib/table/data/common/checked-type.mjs +0 -2
  161. package/esm2020/lib/table/data/common/event/ge-cell-indices.mjs +0 -7
  162. package/esm2020/lib/table/data/common/event/ge-key-event.mjs +0 -7
  163. package/esm2020/lib/table/data/common/event/ge-model-change-event.mjs +0 -10
  164. package/esm2020/lib/table/data/common/event/ge-mouse-event.mjs +0 -19
  165. package/esm2020/lib/table/data/common/filter-function.mjs +0 -2
  166. package/esm2020/lib/table/data/common/get-t.mjs +0 -2
  167. package/esm2020/lib/table/data/common/index-and-px.mjs +0 -7
  168. package/esm2020/lib/table/data/common/size.if.mjs +0 -2
  169. package/esm2020/lib/table/data/common/size.mjs +0 -7
  170. package/esm2020/lib/table/data/common/sizes.mjs +0 -33
  171. package/esm2020/lib/table/data/common/sort-item.mjs +0 -7
  172. package/esm2020/lib/table/data/common/sort-state.type.mjs +0 -2
  173. package/esm2020/lib/table/data/common/tree-arrow.type.mjs +0 -2
  174. package/esm2020/lib/table/data/common/tree-row-if.mjs +0 -2
  175. package/esm2020/lib/table/data/common/tree-row.mjs +0 -12
  176. package/esm2020/lib/table/data/common/value-label.if.mjs +0 -2
  177. package/esm2020/lib/table/data/common/value-label.mjs +0 -7
  178. package/esm2020/lib/table/data/div-scope.type.mjs +0 -2
  179. package/esm2020/lib/table/data/geo-data.mjs +0 -10
  180. package/esm2020/lib/table/data/options/auto-restore-options.if.mjs +0 -2
  181. package/esm2020/lib/table/data/options/auto-restore-options.mjs +0 -42
  182. package/esm2020/lib/table/data/options/default-row-heights.if.mjs +0 -2
  183. package/esm2020/lib/table/data/options/default-row-heights.mjs +0 -8
  184. package/esm2020/lib/table/data/options/icon.if.mjs +0 -2
  185. package/esm2020/lib/table/data/options/icon.mjs +0 -8
  186. package/esm2020/lib/table/data/options/sorted-options.if.mjs +0 -2
  187. package/esm2020/lib/table/data/options/sorted-options.mjs +0 -9
  188. package/esm2020/lib/table/data/options/table-options.if.mjs +0 -2
  189. package/esm2020/lib/table/data/options/table-options.mjs +0 -37
  190. package/esm2020/lib/table/data/options/tree-options.if.mjs +0 -2
  191. package/esm2020/lib/table/data/options/tree-options.mjs +0 -10
  192. package/esm2020/lib/table/data/side-ident.type.mjs +0 -2
  193. package/esm2020/lib/table/data/tablemodel/area-ident.type.mjs +0 -10
  194. package/esm2020/lib/table/data/tablemodel/areamodel/abstract-area-model.mjs +0 -108
  195. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-array-array.mjs +0 -34
  196. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-hidden.mjs +0 -80
  197. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.mjs +0 -11
  198. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-object-array.mjs +0 -79
  199. package/esm2020/lib/table/data/tablemodel/areamodel/area-model-tree.mjs +0 -166
  200. package/esm2020/lib/table/data/tablemodel/areamodel/area-model.if.mjs +0 -2
  201. package/esm2020/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.mjs +0 -48
  202. package/esm2020/lib/table/data/tablemodel/column/column-def.if.mjs +0 -2
  203. package/esm2020/lib/table/data/tablemodel/column/column-def.mjs +0 -32
  204. package/esm2020/lib/table/data/tablemodel/padding.mjs +0 -9
  205. package/esm2020/lib/table/data/tablemodel/table-model.if.mjs +0 -2
  206. package/esm2020/lib/table/data/tablemodel/table-model.mjs +0 -268
  207. package/esm2020/lib/table/ele-scope.mjs +0 -173
  208. package/esm2020/lib/table/event-adapter.mjs +0 -17
  209. package/esm2020/lib/table/event-listener.if.mjs +0 -2
  210. package/esm2020/lib/table/focus/focus-model.if.mjs +0 -2
  211. package/esm2020/lib/table/focus/focus-model.mjs +0 -22
  212. package/esm2020/lib/table/focus/focus.type.mjs +0 -2
  213. package/esm2020/lib/table/input-handler.mjs +0 -24
  214. package/esm2020/lib/table/mouse-handler.mjs +0 -191
  215. package/esm2020/lib/table/render-scope.mjs +0 -595
  216. package/esm2020/lib/table/renderer/cell-render.if.mjs +0 -2
  217. package/esm2020/lib/table/renderer/checkbox-cell-renderer.mjs +0 -22
  218. package/esm2020/lib/table/renderer/date-to-int-date-cell-renderer.mjs +0 -21
  219. package/esm2020/lib/table/renderer/date-to-iso-cell-renderer.mjs +0 -9
  220. package/esm2020/lib/table/renderer/date-to-locale-date-cell-renderer.mjs +0 -9
  221. package/esm2020/lib/table/renderer/date-to-tec-cell-renderer.mjs +0 -12
  222. package/esm2020/lib/table/renderer/edit/edit-cell-renderer.type.mjs +0 -2
  223. package/esm2020/lib/table/renderer/edit/input-cell-renderer.mjs +0 -23
  224. package/esm2020/lib/table/renderer/edit/select-cell-renderer.mjs +0 -35
  225. package/esm2020/lib/table/renderer/male-female-to-icon-cell-renderer.mjs +0 -12
  226. package/esm2020/lib/table/renderer/number-cell-renderer.mjs +0 -19
  227. package/esm2020/lib/table/renderer/renderer-cleanup-fn.type.mjs +0 -2
  228. package/esm2020/lib/table/renderer/renderer.mjs +0 -7
  229. package/esm2020/lib/table/renderer/true-false-cell-renderer.mjs +0 -15
  230. package/esm2020/lib/table/selection/selection-model.if.mjs +0 -2
  231. package/esm2020/lib/table/selection/selection-model.mjs +0 -97
  232. package/esm2020/lib/table/selection/selection-service.mjs +0 -97
  233. package/esm2020/lib/table/selection/selection.type.mjs +0 -2
  234. package/esm2020/lib/table/service/abstract-store-state.service.mjs +0 -49
  235. package/esm2020/lib/table/service/convenience-dom.service.mjs +0 -394
  236. package/esm2020/lib/table/service/data/collapsed-expanded.data.mjs +0 -9
  237. package/esm2020/lib/table/service/data/html-style.type.mjs +0 -2
  238. package/esm2020/lib/table/service/dom-service.if.mjs +0 -2
  239. package/esm2020/lib/table/service/ge-filter.service.mjs +0 -98
  240. package/esm2020/lib/table/service/simple-dom-service.mjs +0 -34
  241. package/esm2020/lib/table/service/sorter.service.mjs +0 -27
  242. package/esm2020/lib/table/service/store-state-collapsed-expand.service.mjs +0 -57
  243. package/esm2020/lib/table/service/store-state-scroll-pos.service.mjs +0 -29
  244. package/esm2020/lib/table/service/store-state-sorting.service.mjs +0 -29
  245. package/esm2020/lib/table/service/tree-row.service.mjs +0 -23
  246. package/esm2020/lib/table/table-api.mjs +0 -38
  247. package/esm2020/lib/table/table-model-factory.mjs +0 -124
  248. package/esm2020/lib/table/table-scope.mjs +0 -313
  249. package/lib/table/action/action-id.type.d.ts +0 -2
  250. package/lib/table/action/osx-shortcut-actionId-mapping.d.ts +0 -6
  251. package/lib/table/action/shortcut-actionid-mapping.type.d.ts +0 -4
  252. package/lib/table/action/shortcut.service.d.ts +0 -17
  253. package/lib/table/action/windows-shortcut-actionId-mapping.d.ts +0 -6
  254. package/lib/table/checkbox/checkbox-model.d.ts +0 -12
  255. package/lib/table/checkbox/checkbox-model.if.d.ts +0 -9
  256. package/lib/table/checkbox/tree-checkbox-model.d.ts +0 -17
  257. package/lib/table/data/common/aligns.d.ts +0 -24
  258. package/lib/table/data/common/area-map-factory.d.ts +0 -5
  259. package/lib/table/data/common/area-map.d.ts +0 -7
  260. package/lib/table/data/common/area-map.type.d.ts +0 -5
  261. package/lib/table/data/common/args-render-cell-div.d.ts +0 -13
  262. package/lib/table/data/common/boolean-function.d.ts +0 -3
  263. package/lib/table/data/common/cell-range.d.ts +0 -17
  264. package/lib/table/data/common/checkbox-column.d.ts +0 -13
  265. package/lib/table/data/common/checked-type.d.ts +0 -1
  266. package/lib/table/data/common/event/ge-cell-indices.d.ts +0 -5
  267. package/lib/table/data/common/event/ge-key-event.d.ts +0 -5
  268. package/lib/table/data/common/event/ge-model-change-event.d.ts +0 -6
  269. package/lib/table/data/common/event/ge-mouse-event.d.ts +0 -17
  270. package/lib/table/data/common/index-and-px.d.ts +0 -5
  271. package/lib/table/data/common/size.d.ts +0 -6
  272. package/lib/table/data/common/size.if.d.ts +0 -4
  273. package/lib/table/data/common/sizes.d.ts +0 -32
  274. package/lib/table/data/common/sort-item.d.ts +0 -6
  275. package/lib/table/data/common/tree-row-if.d.ts +0 -10
  276. package/lib/table/data/common/tree-row.d.ts +0 -11
  277. package/lib/table/data/common/value-label.d.ts +0 -6
  278. package/lib/table/data/common/value-label.if.d.ts +0 -4
  279. package/lib/table/data/div-scope.type.d.ts +0 -7
  280. package/lib/table/data/geo-data.d.ts +0 -8
  281. package/lib/table/data/options/auto-restore-options.d.ts +0 -11
  282. package/lib/table/data/options/auto-restore-options.if.d.ts +0 -16
  283. package/lib/table/data/options/default-row-heights.d.ts +0 -7
  284. package/lib/table/data/options/default-row-heights.if.d.ts +0 -5
  285. package/lib/table/data/options/icon.d.ts +0 -7
  286. package/lib/table/data/options/icon.if.d.ts +0 -5
  287. package/lib/table/data/options/sorted-options.d.ts +0 -8
  288. package/lib/table/data/options/table-options.d.ts +0 -35
  289. package/lib/table/data/options/table-options.if.d.ts +0 -36
  290. package/lib/table/data/options/tree-options.d.ts +0 -9
  291. package/lib/table/data/options/tree-options.if.d.ts +0 -7
  292. package/lib/table/data/tablemodel/area-ident.type.d.ts +0 -2
  293. package/lib/table/data/tablemodel/areamodel/abstract-area-model.d.ts +0 -43
  294. package/lib/table/data/tablemodel/areamodel/area-model-array-array.d.ts +0 -18
  295. package/lib/table/data/tablemodel/areamodel/area-model-hidden.d.ts +0 -37
  296. package/lib/table/data/tablemodel/areamodel/area-model-object-array-with-columndefs.d.ts +0 -10
  297. package/lib/table/data/tablemodel/areamodel/area-model-object-array.d.ts +0 -27
  298. package/lib/table/data/tablemodel/areamodel/area-model-tree.d.ts +0 -39
  299. package/lib/table/data/tablemodel/areamodel/area-model.if.d.ts +0 -146
  300. package/lib/table/data/tablemodel/areamodel/col-and-rowspan-model.d.ts +0 -12
  301. package/lib/table/data/tablemodel/column/column-def.d.ts +0 -46
  302. package/lib/table/data/tablemodel/column/column-def.if.d.ts +0 -22
  303. package/lib/table/data/tablemodel/padding.d.ts +0 -7
  304. package/lib/table/data/tablemodel/table-model.d.ts +0 -61
  305. package/lib/table/data/tablemodel/table-model.if.d.ts +0 -35
  306. package/lib/table/ele-scope.d.ts +0 -37
  307. package/lib/table/event-adapter.d.ts +0 -12
  308. package/lib/table/event-listener.if.d.ts +0 -11
  309. package/lib/table/focus/focus-model.d.ts +0 -12
  310. package/lib/table/focus/focus-model.if.d.ts +0 -6
  311. package/lib/table/input-handler.d.ts +0 -6
  312. package/lib/table/mouse-handler.d.ts +0 -25
  313. package/lib/table/render-scope.d.ts +0 -82
  314. package/lib/table/renderer/checkbox-cell-renderer.d.ts +0 -8
  315. package/lib/table/renderer/date-to-int-date-cell-renderer.d.ts +0 -9
  316. package/lib/table/renderer/date-to-iso-cell-renderer.d.ts +0 -8
  317. package/lib/table/renderer/date-to-locale-date-cell-renderer.d.ts +0 -8
  318. package/lib/table/renderer/date-to-tec-cell-renderer.d.ts +0 -8
  319. package/lib/table/renderer/edit/input-cell-renderer.d.ts +0 -8
  320. package/lib/table/renderer/edit/select-cell-renderer.d.ts +0 -12
  321. package/lib/table/renderer/male-female-to-icon-cell-renderer.d.ts +0 -8
  322. package/lib/table/renderer/number-cell-renderer.d.ts +0 -11
  323. package/lib/table/renderer/renderer.d.ts +0 -5
  324. package/lib/table/renderer/true-false-cell-renderer.d.ts +0 -8
  325. package/lib/table/selection/selection-model.d.ts +0 -21
  326. package/lib/table/selection/selection-model.if.d.ts +0 -11
  327. package/lib/table/selection/selection-service.d.ts +0 -17
  328. package/lib/table/service/abstract-store-state.service.d.ts +0 -10
  329. package/lib/table/service/convenience-dom.service.d.ts +0 -46
  330. package/lib/table/service/data/collapsed-expanded.data.d.ts +0 -7
  331. package/lib/table/service/data/html-style.type.d.ts +0 -3
  332. package/lib/table/service/dom-service.if.d.ts +0 -9
  333. package/lib/table/service/ge-filter.service.d.ts +0 -5
  334. package/lib/table/service/simple-dom-service.d.ts +0 -10
  335. package/lib/table/service/sorter.service.d.ts +0 -3
  336. package/lib/table/service/store-state-collapsed-expand.service.d.ts +0 -15
  337. package/lib/table/service/store-state-scroll-pos.service.d.ts +0 -10
  338. package/lib/table/service/store-state-sorting.service.d.ts +0 -11
  339. package/lib/table/service/tree-row.service.d.ts +0 -5
  340. package/lib/table/table-api.d.ts +0 -16
  341. package/lib/table/table-model-factory.d.ts +0 -60
  342. package/lib/table/table-scope.d.ts +0 -56
  343. /package/{lib/table/data/common/filter-function.d.ts → src/lib/table/data/common/filter-function.ts} +0 -0
  344. /package/{lib/table/data/common/get-t.d.ts → src/lib/table/data/common/get-t.ts} +0 -0
  345. /package/{lib/table/data/common/sort-state.type.d.ts → src/lib/table/data/common/sort-state.type.ts} +0 -0
  346. /package/{lib/table/data/common/tree-arrow.type.d.ts → src/lib/table/data/common/tree-arrow.type.ts} +0 -0
  347. /package/{lib/table/data/side-ident.type.d.ts → src/lib/table/data/side-ident.type.ts} +0 -0
  348. /package/{lib/table/renderer/renderer-cleanup-fn.type.d.ts → src/lib/table/renderer/renderer-cleanup-fn.type.ts} +0 -0
@@ -0,0 +1,936 @@
1
+ import { EleScope } from "./ele-scope";
2
+ import { TableModelIf } from "./data/tablemodel/table-model.if";
3
+ import { ConvenienceDomService } from "./service/convenience-dom.service";
4
+ import { TableOptionsIf } from "./data/options/table-options.if";
5
+ import { CellRange } from "./data/common/cell-range";
6
+ import { RendererCleanupFnType } from "./renderer/renderer-cleanup-fn.type";
7
+ import { AreaIdent } from "./data/tablemodel/area-ident.type";
8
+ import { SideIdent } from "./data/side-ident.type";
9
+ import { DivScope } from "./data/div-scope.type";
10
+ import { AreaModelIf } from "./data/tablemodel/areamodel/area-model.if";
11
+ import { ArgsAdjustColumnsToRowParentParams } from "./data/common/args-adjust-columns-to-row-parent-params";
12
+ import { ArgsRenderCellDiv } from "./data/common/args-render-cell-div";
13
+ import { TreeArrowType } from "./data/common/tree-arrow.type";
14
+ import { TreeRow } from "./data/common/tree-row";
15
+ import { StoreStateScrollPosService } from "./service/store-state-scroll-pos.service";
16
+ import { GeMouseEvent } from "./data/common/event/ge-mouse-event";
17
+ import { AreaModelTree } from "./data/tablemodel/areamodel/area-model-tree";
18
+ import { GeoData } from "./data/geo-data";
19
+ import { CellRendererIf } from "./renderer/cell-render.if";
20
+ import { SelectionModelIf } from "./selection/selection-model.if";
21
+ import { GetT } from "./data/common/get-t";
22
+ import { FocusModelIf } from "./focus/focus-model.if";
23
+ import { ColAndRowspanModel } from "./data/tablemodel/areamodel/col-and-rowspan-model";
24
+ import { AreaObjectMapType } from "./data/common/area-map.type";
25
+ import { AreaObjectMap } from "./data/common/area-map";
26
+ import { TableCellUpdateEventIf } from "./data/common/event/input/table-cell-update-event.if";
27
+
28
+
29
+ interface ArgsRenderCell {
30
+ areaModel: AreaModelIf;
31
+ areaIdent: AreaIdent;
32
+ sideIdent: SideIdent;
33
+ rowIndex: number;
34
+ columnIndex: number;
35
+ left: number;
36
+ top: number;
37
+ width: number;
38
+ height: number;
39
+ parent: HTMLDivElement;
40
+ cellSelected: boolean;
41
+ lastRowOfModel: boolean;
42
+ gammaRange: boolean;
43
+ }
44
+
45
+ interface ArgsRenderHeaderCellResizeHandle {
46
+ rowIndex: number;
47
+ columnIndex: number;
48
+ cellLeft: number;
49
+ cellTop: number;
50
+ cellWidth: number;
51
+ cellHeight: number;
52
+ parent: HTMLDivElement;
53
+ }
54
+
55
+ export class RenderScope extends EleScope {
56
+
57
+ protected storeScrollPosStateService?: StoreStateScrollPosService;
58
+ protected getSelectionModel?: GetT<SelectionModelIf>;
59
+ protected getFocusModel?: GetT<FocusModelIf>; // TODO use it!
60
+ protected scrollLeft = 0;
61
+ protected scrollViewportLeft = 0;
62
+ protected scrollFactorY = 0;
63
+ protected scrollFactorX = 0;
64
+
65
+ protected readonly cleanupFunctions: {
66
+ header: (RendererCleanupFnType)[],
67
+ body: (RendererCleanupFnType)[],
68
+ footer: (RendererCleanupFnType)[],
69
+ } = {
70
+ header: [],
71
+ body: [],
72
+ footer: []
73
+ };
74
+ protected tree = false;
75
+ // TODO delete? protected rangeEles: HTMLDivElement[] = [];
76
+ protected colAndRowspanModels: AreaObjectMapType<ColAndRowspanModel> = new AreaObjectMap<ColAndRowspanModel>();
77
+ protected firstVisibleRowIndex = -1;
78
+
79
+ protected draggingTargetColumnIndex = -1;
80
+ protected mouseEvent?: GeMouseEvent;
81
+ private debounceTimeout?: ReturnType<typeof setTimeout> | null;
82
+ private editorRenderer?: CellRendererIf;
83
+ private editorRendererColumn?: number;
84
+ private editorRendererRow?: number;
85
+ private removables: HTMLDivElement[] = [];
86
+
87
+ constructor(
88
+ hostElement: HTMLDivElement,
89
+ tableModel: TableModelIf,
90
+ dom: ConvenienceDomService,
91
+ tableOptions: TableOptionsIf
92
+ ) {
93
+ super(hostElement, tableModel, dom, tableOptions);
94
+
95
+ if (this.tableModel.getSelectionModel) {
96
+ this.getSelectionModel = this.tableModel.getSelectionModel;
97
+
98
+ } else if (this.tableOptions?.getSelectionModel) {
99
+ this.getSelectionModel = this.tableOptions.getSelectionModel;
100
+ }
101
+
102
+ if (this.tableOptions?.getFocusModel) {
103
+ this.getFocusModel = this.tableOptions.getFocusModel;
104
+ }
105
+ if (tableModel.getAreaModel("body") instanceof AreaModelTree) {
106
+ this.tree = true;
107
+ }
108
+ const aereaIds: AreaIdent[] = ["header", "body", "footer"];
109
+ aereaIds.forEach(
110
+ areaIdent => {
111
+ this.colAndRowspanModels[areaIdent] = new ColAndRowspanModel(tableModel, tableModel.getAreaModel(areaIdent));
112
+ this.colAndRowspanModels[areaIdent]?.init();
113
+ }
114
+ );
115
+ }
116
+
117
+ protected editing = false;
118
+ isEditing(){
119
+ return this.editing;
120
+ }
121
+
122
+ resetEditorRenderer() {
123
+ this.editorRenderer = undefined;
124
+ this.editorRendererRow = -1;
125
+ this.editorRendererColumn = -1;
126
+ this.editing = false;
127
+ }
128
+
129
+ clearSelection() {
130
+ if (this.getSelectionModel) {
131
+ const sm = this.getSelectionModel();
132
+ sm?.clear();
133
+ }
134
+ }
135
+
136
+ initRenderEditor(rowIdx: number, colIdx: number) {
137
+ let rnFn = this.tableModel.getColumnDef(colIdx)?.getEditRenderer;
138
+ if (!rnFn) {
139
+ rnFn = this.tableOptions.getEditRenderer;
140
+ }
141
+
142
+ if (rnFn) {
143
+ this.editorRenderer = rnFn(rowIdx, colIdx);
144
+
145
+ if (this.editorRenderer) {
146
+ this.editorRendererRow = rowIdx;
147
+ this.editorRendererColumn = colIdx;
148
+ this.editing = true;
149
+ this.repaint();
150
+ // request focus:
151
+ const input = document.querySelector("input.ge-table-cell-editor-input") as HTMLInputElement;
152
+ if (input) {
153
+ input.focus();
154
+ }
155
+
156
+ } else {
157
+ this.resetEditorRenderer();
158
+ }
159
+ }
160
+ }
161
+
162
+ repaint() {
163
+ this.adjustAfterScrolling();
164
+ }
165
+
166
+ override adjustAfterScrolling() {
167
+ for (const cleaning of this.removables) {
168
+ cleaning.remove();
169
+ }
170
+ this.hideHoverRow();
171
+ this.hideHoverColumn();
172
+
173
+ this.scrollTop = this.scrollViewport.scrollTop;
174
+ this.scrollLeft = this.scrollViewport.scrollLeft;
175
+ this.debounce(this.checkForScrollPosSaving.bind(this));
176
+
177
+ this.scrollFactorY = this.scrollTop / (this.scrollViewport.scrollHeight - this.scrollViewport.clientHeight);
178
+ this.scrollFactorX = this.scrollLeft / (this.scrollViewport.scrollWidth - this.scrollViewport.clientWidth);
179
+
180
+ if (isNaN(this.scrollFactorY)) {
181
+ this.scrollFactorY = 0;
182
+ }
183
+ if (isNaN(this.scrollFactorX)) {
184
+ this.scrollFactorX = 0;
185
+ }
186
+
187
+ this.adjustBody();
188
+ this.adjustArea("footer");
189
+ this.adjustArea("header");
190
+
191
+
192
+ if (this.tableOptions.tableTopBorderVisible) {
193
+ this.removables.push(this.dom.addHorizontalBorder(
194
+ new GeoData(0, this.hostElement.clientWidth, 1, 0),
195
+ this.hostElement,
196
+ "ge-table-border"));
197
+ }
198
+ if (this.tableOptions.tableBottomBorderVisible) {
199
+ this.removables.push(this.dom.addHorizontalBorder(
200
+ new GeoData(0, this.hostElement.clientWidth, 1, this.hostElement.clientHeight - 1),
201
+ this.hostElement,
202
+ "ge-table-border"));
203
+ }
204
+ // The border between east and center in header/body/footer (full height):
205
+ if (this.tableModel.getFixedLeftColumnCount() > 0) {
206
+ this.removables.push(this.dom.addVerticalBorder(
207
+ new GeoData(this.areaBodyWest.child.clientWidth, 1, this.hostElement.clientHeight, 0),
208
+ this.hostElement,
209
+ "ge-table-body-west-vertical-border"));
210
+ }
211
+ // The border between header and body (full width):
212
+ if (this.tableModel.getAreaModel("header")?.getRowCount() > 0) {
213
+ this.removables.push(this.dom.addHorizontalBorder(
214
+ new GeoData(0, this.hostElement.clientWidth, 1, this.areaHeaderCenter.child.clientHeight),
215
+ this.hostElement,
216
+ "ge-table-body-west-vertical-border"));
217
+ }
218
+ }
219
+
220
+ checkForScrollPosSaving() {
221
+ if (this.storeScrollPosStateService
222
+ && this.tableOptions?.autoRestoreOptions?.autoRestoreScrollPosition) {
223
+ this.storeScrollPosStateService.updateScrollOffset([this.scrollLeft, this.scrollTop]);
224
+ }
225
+ }
226
+
227
+ updateCells(events: TableCellUpdateEventIf[]) {
228
+ events.forEach(evt => this.tableModel
229
+ .getAreaModel(evt.area)
230
+ .setValue(evt.rowIndex, evt.columnIndex, evt.value)
231
+ );
232
+ this.repaint();
233
+ }
234
+
235
+ protected getAreaAndSideIdentByAttr(srcElement: HTMLElement): [AreaIdent | undefined, SideIdent | undefined] {
236
+ if (srcElement) {
237
+ const dataArea = this.getStringByAttr(srcElement, "data-area");
238
+ const dataSide = this.getStringByAttr(srcElement, "data-side");
239
+ if (dataSide && dataArea) {
240
+ return [dataArea, dataSide] as [AreaIdent, SideIdent];
241
+ }
242
+ }
243
+ return [undefined, undefined];
244
+ }
245
+
246
+ protected getArea(rowIdent: AreaIdent, sideIdent: SideIdent): DivScope {
247
+ if (rowIdent === "header") {
248
+ if (sideIdent === "west") return this.areaHeaderWest;
249
+ if (sideIdent === "center") return this.areaHeaderCenter;
250
+ if (sideIdent === "east") return this.areaHeaderEast;
251
+ } else if (rowIdent === "body") {
252
+ if (sideIdent === "west") return this.areaBodyWest;
253
+ if (sideIdent === "center") return this.areaBodyCenter;
254
+ if (sideIdent === "east") return this.areaBodyEast;
255
+ } else if (rowIdent === "footer") {
256
+ if (sideIdent === "west") return this.areaFooterWest;
257
+ if (sideIdent === "center") return this.areaFooterCenter;
258
+ if (sideIdent === "east") return this.areaFooterEast;
259
+ }
260
+ throw Error(`Wrong area identifier: row:${rowIdent}, col:${sideIdent}`);
261
+ }
262
+
263
+ protected adjustBody() {
264
+ const virtualRowDivTopF1 = this.areaBodyCenterGeo.height - this.tableModel.getContentHeightInPixel();
265
+ const virtualRowDivTop = this.scrollFactorY * virtualRowDivTopF1;
266
+
267
+ this.dom.setStyle(this.contentDiv, "top", `${this.scrollTop}px`);
268
+ this.dom.setStyle(this.contentDiv, "left", `${this.scrollViewport.scrollLeft}px`);
269
+
270
+ this.adjustArea("body", virtualRowDivTop);
271
+ }
272
+
273
+ protected getNumberByAttr(srcElement: HTMLElement, key: string): number {
274
+ if (srcElement) {
275
+ const attr = srcElement.closest("[" + key + "]")?.getAttribute(key);
276
+ if (attr) return Number(attr);
277
+ }
278
+ return -1;
279
+ }
280
+
281
+ protected getStringByAttr(srcElement: HTMLElement, key: string): string {
282
+ if (srcElement) {
283
+ const attr = srcElement.closest("[" + key + "]")?.getAttribute(key);
284
+ if (attr) return attr;
285
+ }
286
+ return "";
287
+ }
288
+
289
+ protected adjustArea(areaIdent: AreaIdent, yStart: number = 0) {
290
+ const westArea = this.getArea(areaIdent, "west");
291
+ const centerArea = this.getArea(areaIdent, "center");
292
+ const eastArea = this.getArea(areaIdent, "east");
293
+ const divHeight = centerArea.child.clientHeight;
294
+
295
+ westArea.child.innerText = "";
296
+ centerArea.child.innerText = "";
297
+ eastArea.child.innerText = "";
298
+ const left = 0;
299
+ const width = this.areaBodyCenterGeo.width;
300
+ const padding = this.tableModel.getPadding();
301
+ const areaModel = this.tableModel.getAreaModel(areaIdent);
302
+ const rowCount = areaModel.getRowCount();
303
+
304
+ while (this.cleanupFunctions[areaIdent].length) {
305
+ const fn = this.cleanupFunctions[areaIdent].shift();
306
+ if (fn) {
307
+ fn();
308
+ }
309
+ }
310
+ let y = yStart;
311
+
312
+ const columnCount = this.tableModel.getColumnCount();
313
+ const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
314
+ const fixedLeftColumnCount = this.tableModel.getFixedLeftColumnCount();
315
+
316
+ for (let index = 0; index < rowCount; index++) {
317
+ const top = y;
318
+ const lastRowOfModel = index === rowCount - 1;
319
+ const height = this.tableModel.getRowHeight(areaIdent, index);
320
+
321
+ if (top + height > 0) {
322
+ // It's not scrolled out on top:
323
+ // Visible!
324
+ this.firstVisibleRowIndex = index;
325
+
326
+ // center -------------------------------------------
327
+ let geo = { left, width, height, top, index };
328
+ let rowDiv = this.dom.addRowDiv(centerArea, geo, index, areaIdent, "center");
329
+ const centerStartCol = fixedLeftColumnCount;
330
+
331
+ this.adjustColumnsToRowParent({
332
+ areaIdent,
333
+ sideIdent: "center",
334
+ areaModel,
335
+ geo,
336
+ parent: rowDiv,
337
+ rowIndex: index,
338
+ columnIndexStart: centerStartCol,
339
+ columnIndexEnd: columnCount - fixedRightColumnCount - 1,
340
+ verticalFixed: false,
341
+ lastRowOfModel
342
+ });
343
+
344
+ // west -------------------------------------------
345
+ if (padding.left > 0) {
346
+ geo = { left, width: this.areaBodyWestGeo.width, height, top, index };
347
+ rowDiv = this.dom.addRowDiv(westArea, geo, index, areaIdent, "west");
348
+ this.adjustColumnsToRowParent({
349
+ areaIdent,
350
+ sideIdent: "west",
351
+ areaModel,
352
+ geo,
353
+ parent: rowDiv,
354
+ rowIndex: index,
355
+ columnIndexStart: 0,
356
+ columnIndexEnd: centerStartCol - 1,
357
+ verticalFixed: true,
358
+ lastRowOfModel
359
+ });
360
+ }
361
+
362
+ // east -------------------------------------------
363
+ if (padding.right > 0) {
364
+ geo = { left, width: this.areaBodyEastGeo.width, height, top, index };
365
+ rowDiv = this.dom.addRowDiv(eastArea, geo, index, areaIdent, "east");
366
+ this.adjustColumnsToRowParent({
367
+ areaIdent,
368
+ sideIdent: "east",
369
+ areaModel,
370
+ geo,
371
+ parent: rowDiv,
372
+ rowIndex: index,
373
+ columnIndexStart: columnCount - fixedRightColumnCount,
374
+ columnIndexEnd: columnCount - 1,
375
+ verticalFixed: true,
376
+ lastRowOfModel
377
+ });
378
+ }
379
+
380
+ // "collapse / expand all" event handler action attribute:
381
+ if (areaIdent === "header" && this.tree && index === rowCount - 1) {
382
+ const div =
383
+ this.dom.applyStyle(
384
+ this.dom.setAttribute(
385
+ this.dom.addDiv(rowDiv, new GeoData(16, 20, 20, 8)),
386
+ "data-ge-action", "toggleExpandCollapseAll"
387
+ ),
388
+ { "cursor": "pointer" }
389
+ );
390
+ const treeOptionsArrow = this.tableOptions.treeOptions.arrowExpandCollapseAll;
391
+ if (treeOptionsArrow) {
392
+ const textElement = this.dom.domService.createText(treeOptionsArrow.content);
393
+ this.dom.domService.appendChild(div, textElement);
394
+ if (treeOptionsArrow.style) {
395
+ this.dom.applyStyleString(div, treeOptionsArrow.style);
396
+ }
397
+ }
398
+ }
399
+
400
+ }
401
+ y = y + height;
402
+ // lastVisibleRowIndex = index;
403
+ if (y > divHeight) { // + 1000) {
404
+ break;
405
+ }
406
+ } // for
407
+
408
+ // We draw the big colspan and rowspan cells at the end.
409
+ // This fixes the 'half cutted big cell' problem:
410
+ if (this.colAndRowspanModels && this.colAndRowspanModels[areaIdent]) {
411
+ // draw col/rowspan cells again:
412
+ const ranges = this.colAndRowspanModels[areaIdent]?.getRanges() ?? [];
413
+ if (ranges.length) {
414
+
415
+ for (const range of ranges) {
416
+ let xStart = 0;
417
+ let child: HTMLDivElement = centerArea.child;
418
+ let sideIdent: SideIdent = "center";
419
+ if (range.c1 < fixedLeftColumnCount) {
420
+ // West:
421
+ child = westArea.child;
422
+ sideIdent = "west";
423
+ } else if (fixedRightColumnCount > 0 && range.c1 >= columnCount - fixedRightColumnCount) {
424
+ // East:
425
+ child = eastArea.child;
426
+ sideIdent = "east";
427
+ } else {
428
+ // Center:
429
+ const virtualRowDivLeftF1 = this.areaBodyCenterGeo.width - this.tableModel.getContentWidthInPixel();
430
+ xStart = (this.scrollFactorX * virtualRowDivLeftF1) - this.areaBodyWestGeo.width;
431
+ sideIdent = "center";
432
+ }
433
+ this.drawBigCell(range, xStart, yStart, areaModel, child, sideIdent);
434
+ }
435
+ }
436
+ }
437
+ }
438
+
439
+ /**
440
+ * Draws big cells (rowspan and or colspan) in body/center
441
+ * @param range CellRange
442
+ * @param xStart X position in pixel for top left corner
443
+ * @param yStart Y position in pixel for top left corner
444
+ * @param areaModel AreaModelIf
445
+ * @param parentDiv Parent div as HTMLDivElement
446
+ * @param sideIdent SideIdent (west,center,east)
447
+ * @protected
448
+ */
449
+ protected drawBigCell(
450
+ range: CellRange,
451
+ xStart: number,
452
+ yStart: number,
453
+ areaModel: AreaModelIf,
454
+ parentDiv: HTMLDivElement,
455
+ sideIdent: SideIdent) {
456
+
457
+ const y1 = yStart + this.getRowHeights(0, range.r1 - 1, areaModel).reduce((a, b) => a + b, 0);
458
+
459
+ const columnCount = this.tableModel.getColumnCount();
460
+ const fixedRightColumnCount = this.tableModel.getFixedRightColumnCount();
461
+ let firstColIdx = 0;
462
+ if (fixedRightColumnCount > 0 && range.c1 >= columnCount - fixedRightColumnCount) {
463
+ // We are on the (fixed) east side, so we have to fix firstColIdx:
464
+ firstColIdx = columnCount - fixedRightColumnCount;
465
+ }
466
+ const x1 = xStart + this.getColumnWidths(firstColIdx, range.c1 - 1).reduce((a, b) => a + b, 0);
467
+
468
+ const h = this.getRowHeights(range.r1, range.r2, areaModel).reduce((a, b) => a + b, 0);
469
+ const w = this.getColumnWidths(range.c1, range.c2).reduce((a, b) => a + b, 0);
470
+
471
+ let cellSelected = false;
472
+ const selectionModel = this.getSelectionModel ? this.getSelectionModel() : undefined;
473
+ if (selectionModel) {
474
+ const count = selectionModel.getSelectionCount(range.r1, range.c1);
475
+ cellSelected = count > 0;
476
+ }
477
+ if (range.gammaRange) {
478
+ // TODO render hierarchy cell
479
+ console.info('TODO here', range);
480
+
481
+ this.renderCell({
482
+ areaModel,
483
+ areaIdent: areaModel.areaIdent,
484
+ sideIdent,
485
+ rowIndex: range.r1,
486
+ columnIndex: range.c1,
487
+ left: x1,
488
+ top: y1,
489
+ width: w,
490
+ height: h,
491
+ parent: parentDiv,
492
+ cellSelected,
493
+ lastRowOfModel: true,
494
+ gammaRange:range.gammaRange
495
+ });
496
+ } else {
497
+ this.renderCell({
498
+ areaModel,
499
+ areaIdent: areaModel.areaIdent,
500
+ sideIdent,
501
+ rowIndex: range.r1,
502
+ columnIndex: range.c1,
503
+ left: x1,
504
+ top: y1,
505
+ width: w,
506
+ height: h,
507
+ parent: parentDiv,
508
+ cellSelected,
509
+ lastRowOfModel: true,
510
+ gammaRange:range.gammaRange
511
+ });
512
+ }
513
+
514
+ if (areaModel.areaIdent === "header" && this.tableOptions.columnsResizable) {
515
+ this.renderHeaderCellResizeHandle({
516
+ rowIndex: range.r1,
517
+ columnIndex: range.c1,
518
+ cellLeft: x1,
519
+ cellTop: y1,
520
+ cellWidth: w,
521
+ cellHeight: h,
522
+ parent: parentDiv
523
+ });
524
+ }
525
+ }
526
+
527
+
528
+ protected findRowOfImportantRowspanCell(areaModel: AreaModelIf, rowIndex: number, colIndex: number): number {
529
+ const maxRowspan = areaModel.getMaxRowspan();
530
+ for (let r = rowIndex - 1; r > -1; r--) {
531
+ const rowspan = areaModel.getRowspanAt(r, colIndex);
532
+ if (rowspan > 1 && r + rowspan + 1 >= rowIndex) {
533
+ return r;
534
+ }
535
+ if (rowIndex - r > maxRowspan) {
536
+ return -1;
537
+ }
538
+ }
539
+ return -1;
540
+ }
541
+
542
+
543
+ protected adjustColumnsToRowParent(
544
+ {
545
+ areaIdent,
546
+ sideIdent,
547
+ areaModel,
548
+ geo,
549
+ parent,
550
+ rowIndex,
551
+ columnIndexStart,
552
+ columnIndexEnd,
553
+ verticalFixed = false,
554
+ lastRowOfModel = false
555
+ }: ArgsAdjustColumnsToRowParentParams
556
+ ): void {
557
+
558
+ this.scrollViewportLeft = this.scrollViewport.scrollLeft;
559
+ let virtualRowDivLeft = 0;
560
+ if (!verticalFixed) {
561
+ const virtualRowDivLeftF1 = (this.areaBodyCenterGeo.width) - this.tableModel.getContentWidthInPixel();
562
+ virtualRowDivLeft = this.scrollFactorX * virtualRowDivLeftF1;
563
+ }
564
+
565
+ const top = 0;
566
+ const renderSelection = !!(areaIdent === "body" && sideIdent);
567
+
568
+ let x = virtualRowDivLeft;
569
+ for (let index = columnIndexStart; index <= columnIndexEnd; index++) {
570
+ const left = x;
571
+ const w = this.tableModel.getColumnWidth(index);
572
+ if (w > 0 && left + w > 0) {
573
+ // Visible! Render cell div:
574
+
575
+ // calc height:
576
+ let height = geo.height;
577
+ const rowspan = areaModel.getRowspanAt(rowIndex, index);
578
+ const colspan = areaModel.getColspanAt(rowIndex, index);
579
+ // if (areaIdent==='header') {
580
+ // console.info(rowIndex+'/'+index, rowspan+'_'+colspan)
581
+ // }
582
+
583
+ if (rowspan > 1) {
584
+ height = this.getRowHeights(rowIndex, rowIndex + rowspan - 1, areaModel).reduce((a, b) => a + b, 0);
585
+ }
586
+
587
+ let width = w;
588
+ if (colspan > 1) {
589
+ width = this.getColumnWidths(index, index + colspan - 1).reduce((a, b) => a + b, 0);
590
+ }
591
+
592
+ let skip = false;
593
+ if (this.colAndRowspanModels && this.colAndRowspanModels[areaIdent]) {
594
+ if (this.colAndRowspanModels[areaIdent]?.isInRange(rowIndex, index)) {
595
+ skip = true; // for the body area we don't want to to render the small single cells
596
+ }
597
+ }
598
+
599
+ if (this.draggingTargetColumnIndex === index
600
+ && areaIdent !== "header") {
601
+ // For a running drag and drop action:
602
+ this.renderDragTargetDiv(parent, left, top, width, height);
603
+ const geo1 = { left, top, width, height };
604
+ this.dom.addColumnBorderDivs(this.tableOptions, parent, geo1, areaIdent, sideIdent);
605
+
606
+ } else {
607
+ const cellSelected = this.renderSelectedBackgroundDiv(skip, renderSelection, sideIdent, areaModel, rowIndex, index, parent, left, top, width, height);
608
+
609
+ if (!skip) {
610
+ this.renderCell({
611
+ areaModel,
612
+ areaIdent,
613
+ sideIdent,
614
+ rowIndex,
615
+ columnIndex: index,
616
+ left,
617
+ top,
618
+ width,
619
+ height,
620
+ parent,
621
+ cellSelected,
622
+ lastRowOfModel,
623
+ gammaRange:true
624
+ });
625
+ }
626
+ if (areaIdent === "header" && this.tableOptions.columnsResizable) {
627
+ this.renderHeaderCellResizeHandle({
628
+ rowIndex: rowIndex,
629
+ columnIndex: index,
630
+ cellLeft: left,
631
+ cellTop: top,
632
+ cellWidth: width,
633
+ cellHeight: height,
634
+ parent: parent
635
+ });
636
+ }
637
+ }
638
+ }
639
+
640
+ x = x + w;
641
+ if (x > this.areaBodyCenterGeo.width) {
642
+ break;
643
+ }
644
+ }
645
+ // Right vertical border:
646
+ if (this.tableOptions.verticalBorderVisible) {
647
+ this.dom.addVerticalBorder(new GeoData(x - 1, 1, geo.height, 0), parent);
648
+ }
649
+ }
650
+
651
+ protected getTreeArrowColumnIndex(): 0 | 1 {
652
+ if (this.tableOptions.showCheckboxWihoutExtraColumn) {
653
+ return 0;
654
+ }
655
+ if (this.tableModel.isRowCheckboxVisible()) {
656
+ return 1;
657
+ }
658
+ return 0;
659
+ }
660
+
661
+ protected addAndRenderCellDiv(
662
+ {
663
+ areaModel,
664
+ areaIdent,
665
+ sideIdent,
666
+ rowIndex,
667
+ index,
668
+ left,
669
+ width,
670
+ height,
671
+ top,
672
+ parent,
673
+ lastRowOfModel
674
+ }: ArgsRenderCellDiv): [HTMLDivElement, RendererCleanupFnType | undefined] {
675
+
676
+
677
+ const editor = this.editorRenderer && this.editorRendererRow === rowIndex && this.editorRendererColumn === index;
678
+ const cellRenderer = (editor) ? this.editorRenderer : areaModel.getCellRenderer(rowIndex, index);
679
+ const geo = { left, width, height, top, index };
680
+ const rowObject = areaModel.getRowByIndex(rowIndex);
681
+ let treeArrow: TreeArrowType = "none";
682
+
683
+ const arrowIndexOk = index === this.getTreeArrowColumnIndex();
684
+
685
+ if (arrowIndexOk && rowObject instanceof TreeRow) {
686
+ const tr = rowObject as TreeRow<any>;
687
+ if (tr.children?.length) {
688
+ if (tr.expanded) {
689
+ treeArrow = "expanded";
690
+ } else {
691
+ treeArrow = "collapsed";
692
+ }
693
+ } else {
694
+ treeArrow = "hidden";
695
+ }
696
+ }
697
+
698
+ let sortState = undefined;
699
+ if (areaIdent === "header") {
700
+ const columnDef = this.tableModel.getColumnDef(index);
701
+ if (!columnDef?.sortIconVisible || columnDef?.sortIconVisible()) {
702
+ sortState = columnDef?.sortState;
703
+ }
704
+ }
705
+
706
+ const val = areaModel.getValueAt(rowIndex, index);
707
+ const text = cellRenderer ? "" : `${val}`;
708
+ const checkedType = areaModel.isRowChecked(rowIndex);
709
+ const cell = this.dom.addColumnDiv(
710
+ parent, geo, rowIndex, index, areaIdent, sideIdent,
711
+ text, treeArrow, this.tableOptions, checkedType, sortState);
712
+
713
+ const tooltip = areaModel.getTooltipAt(rowIndex, index);
714
+ if (tooltip) {
715
+ this.dom.setAttribute(cell, "title", tooltip);
716
+ }
717
+
718
+ const columnDef = this.tableModel.getColumnDef(index);
719
+ if (columnDef && columnDef.classes[areaIdent]) {
720
+ this.dom.addClasses(columnDef.classes[areaIdent], cell);
721
+ }
722
+
723
+ let fn: RendererCleanupFnType | undefined = undefined;
724
+ if (cellRenderer) {
725
+ fn = cellRenderer.render(cell, rowIndex, index, areaIdent, areaModel, val, this.dom.domService);
726
+ }
727
+
728
+ const classes = areaModel.getCustomClassesAt(rowIndex, index);
729
+ if (classes.length) {
730
+ this.dom.addClasses(classes, cell);
731
+ }
732
+
733
+ this.dom.addColumnBorderDivs(this.tableOptions, parent, geo, areaIdent, sideIdent);
734
+ if (lastRowOfModel) {
735
+ this.dom.addHorizontalBorder({ left, width, height, top: top + height }, parent);
736
+ }
737
+ if (this.getFocusModel && areaIdent === "body") {
738
+ const fm = this.getFocusModel();
739
+ if (fm?.hasFocus(rowIndex, index)) {
740
+ this.dom.addFocusBorderDivs(parent, geo, {});
741
+ }
742
+ }
743
+ if (areaIdent === "header") {
744
+ this.dom.setAttribute(cell, "data-ge-action", "drag-column");
745
+ }
746
+
747
+ const styles = areaModel.getCustomStyleAt(rowIndex, index);
748
+ if (styles) {
749
+ for (const css in styles) {
750
+ this.dom.setStyle(cell, css, styles[css]);
751
+ }
752
+ }
753
+ return [cell, fn];
754
+ }
755
+
756
+ protected getColumnWidths(startIndex: number, endIndex: number): number[] {
757
+ const ret: number[] = [];
758
+ for (let i = startIndex; i <= endIndex; i++) {
759
+ ret.push(this.tableModel.getColumnWidth(i));
760
+ }
761
+ return ret;
762
+ }
763
+
764
+ protected getRowHeights(startIndex: number, endIndex: number, areaModel: AreaModelIf): number[] {
765
+ const ret: number[] = [];
766
+ for (let i = startIndex; i <= endIndex; i++) {
767
+ ret.push(areaModel.getRowHeight(i));
768
+ }
769
+ return ret;
770
+ }
771
+
772
+ protected adjustHoverRows(mouseMoveEvent: GeMouseEvent) {
773
+ if (this.tableOptions.hoverRowVisible && mouseMoveEvent.rowIndex > -1) {
774
+ const width = this.hostElement.clientWidth;
775
+ const rowHeight = this.tableModel.getAreaModel("body").getRowHeight(mouseMoveEvent.rowIndex);
776
+ const top = mouseMoveEvent.rowTop + this.areaHeaderCenter.parent.clientHeight - this.scrollTop;
777
+ this.dom.applyStyle(this.hoverRow, {
778
+ "left": "0",
779
+ "top": top + "px",
780
+ "width": width + "px",
781
+ "height": rowHeight + "px",
782
+ "display": "block"
783
+ });
784
+ } else {
785
+ this.hideHoverRow();
786
+ }
787
+ }
788
+
789
+ protected hideHoverRow() {
790
+ this.dom.applyStyle(this.hoverRow, {
791
+ "display": "none"
792
+ });
793
+ }
794
+
795
+ protected adjustHoverColumns(mouseMoveEvent: GeMouseEvent) {
796
+ if (this.tableOptions.hoverColumnVisible && mouseMoveEvent.rowIndex > -1) {
797
+ const height = this.hostElement.clientHeight;
798
+ const width = this.tableModel.getColumnWidth(mouseMoveEvent.columnIndex);
799
+ const fixedWest = this.areaBodyWestGeo.width;
800
+ const left = mouseMoveEvent.columnLeft + this.tableModel.getPadding().left - this.scrollLeft - fixedWest;
801
+ this.dom.applyStyle(this.hoverColumn, {
802
+ "left": (left) + "px",
803
+ "top": "0px",
804
+ "width": width + "px",
805
+ "height": height + "px",
806
+ "display": "block"
807
+ });
808
+ } else {
809
+ this.hideHoverColumn();
810
+ }
811
+ }
812
+
813
+ protected hideHoverColumn() {
814
+ this.dom.applyStyle(this.hoverColumn, {
815
+ "display": "none"
816
+ });
817
+ }
818
+
819
+ protected debounce(fn: Function, delay: number = 1000) {
820
+ if (this.debounceTimeout) {
821
+ clearTimeout(this.debounceTimeout);
822
+ }
823
+ this.debounceTimeout = setTimeout(fn.bind(this), delay);
824
+ }
825
+
826
+ private renderDragTargetDiv(parent: HTMLDivElement, left: number, top: number, width: number, height: number): HTMLDivElement {
827
+ const div = this.dom.applyStylePosistionAbsolute(
828
+ this.dom.createDivWithClass("ge-table-drop-zone", parent)
829
+ );
830
+ this.dom.setStyle(div, "left", `${left}px`);
831
+ this.dom.setStyle(div, "top", `${top}px`);
832
+ this.dom.setStyle(div, "width", `${width}px`);
833
+ this.dom.setStyle(div, "height", `${height}px`);
834
+ return div;
835
+ }
836
+
837
+
838
+ private renderSelectedBackgroundDiv(
839
+ skip: boolean,
840
+ renderSelection: boolean,
841
+ sideIdent: SideIdent,
842
+ areaModel: AreaModelIf,
843
+ rowIndex: number,
844
+ index: number,
845
+ parent: HTMLDivElement,
846
+ left: number, top: number, width: number, height: number) {
847
+ let cellSelected = false;
848
+ if (!skip && renderSelection && areaModel.isSelectable(rowIndex, index)) {
849
+ if (this.getSelectionModel) {
850
+ const selectionModel = this.getSelectionModel();
851
+ if (selectionModel) {
852
+ const count = selectionModel.getSelectionCount(rowIndex, index);
853
+ cellSelected = count > 0;
854
+ for (let i = 0; i < count; i++) {
855
+ const div = this.dom.applyStylePosistionAbsolute(
856
+ // ge-table-body-west-selected-range
857
+ this.dom.createDivWithClass(`ge-table-${areaModel.areaIdent}-${sideIdent}-selected-range`, parent)
858
+ );
859
+ this.dom.setStyle(div, "left", `${left}px`);
860
+ this.dom.setStyle(div, "top", `${top}px`);
861
+ this.dom.setStyle(div, "width", `${width}px`);
862
+ this.dom.setStyle(div, "height", `${height}px`);
863
+ }
864
+ }
865
+ }
866
+ }
867
+ return cellSelected;
868
+ }
869
+
870
+ private renderCell(
871
+ {
872
+ areaModel,
873
+ areaIdent,
874
+ sideIdent,
875
+ rowIndex,
876
+ columnIndex,
877
+ left,
878
+ top,
879
+ width,
880
+ height,
881
+ parent,
882
+ cellSelected,
883
+ lastRowOfModel,
884
+ gammaRange
885
+ }: ArgsRenderCell
886
+ ) {
887
+ const [div, fn] = this.addAndRenderCellDiv({
888
+ areaModel,
889
+ areaIdent,
890
+ sideIdent,
891
+ rowIndex,
892
+ index: columnIndex,
893
+ left,
894
+ width,
895
+ height,
896
+ top,
897
+ parent,
898
+ lastRowOfModel,
899
+ gammaRange: gammaRange
900
+ });
901
+ if (cellSelected) {
902
+ this.dom.addClass(`ge-table-${areaIdent}-${sideIdent}-selected-range`, div);
903
+ }
904
+ if (fn) {
905
+ this.cleanupFunctions[areaIdent].push(fn);
906
+ }
907
+ }
908
+
909
+
910
+ private renderHeaderCellResizeHandle(
911
+ { rowIndex, columnIndex, cellLeft, cellTop, cellWidth, cellHeight, parent }: ArgsRenderHeaderCellResizeHandle
912
+ ) {
913
+
914
+ const domService = this.dom.domService;
915
+ const handleWidth = this.tableOptions.columnResizeHandleWidthInPx ?? 2;
916
+
917
+ const div = domService.createElement<HTMLDivElement>("div");
918
+ domService.setAttribute(div, "data-col-index", `${columnIndex}`);
919
+ domService.setAttribute(div, "data-row-index", `${rowIndex}`);
920
+ domService.setAttribute(div, "data-area", "header");
921
+ domService.setAttribute(div, "data-ge-action", "resize-column");
922
+ // domService.setAttribute(div, 'data-ge-action', 'column-resize');
923
+ domService.addClass(div, `ge-table-column-resize-handle`);
924
+ domService.setStyle(div, "display", "clip");
925
+ domService.setStyle(div, "position", "absolute");
926
+ domService.setStyle(div, "cursor", "col-resize");
927
+ domService.setStyle(div, "left", `${(cellLeft + cellWidth - handleWidth)}px`);
928
+ domService.setStyle(div, "top", `${cellTop}px`);
929
+ domService.setStyle(div, "width", `${handleWidth}px`);
930
+ domService.setStyle(div, "height", `${cellHeight}px`);
931
+ domService.appendChild(parent, div);
932
+ }
933
+
934
+
935
+ }
936
+