balala-revogrid 1.0.0

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 (760) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/app-globals-D67EXhgK.js +16 -0
  3. package/dist/cjs/app-globals-D67EXhgK.js.map +1 -0
  4. package/dist/cjs/cell-renderer-B87qecTb.js +57 -0
  5. package/dist/cjs/cell-renderer-B87qecTb.js.map +1 -0
  6. package/dist/cjs/debounce-CcpHiH2p.js +498 -0
  7. package/dist/cjs/debounce-CcpHiH2p.js.map +1 -0
  8. package/dist/cjs/dimension.helpers-DA9-xqPT.js +3606 -0
  9. package/dist/cjs/dimension.helpers-DA9-xqPT.js.map +1 -0
  10. package/dist/cjs/edit.utils-CKsIiHlD.js +113 -0
  11. package/dist/cjs/edit.utils-CKsIiHlD.js.map +1 -0
  12. package/dist/cjs/events-DeLDyZlb.js +46 -0
  13. package/dist/cjs/events-DeLDyZlb.js.map +1 -0
  14. package/dist/cjs/filter.button-DSsWNs23.js +49 -0
  15. package/dist/cjs/filter.button-DSsWNs23.js.map +1 -0
  16. package/dist/cjs/grouping.row.renderer-BqR0ytMi.js +64 -0
  17. package/dist/cjs/grouping.row.renderer-BqR0ytMi.js.map +1 -0
  18. package/dist/cjs/header-cell-renderer-D-RjAVfe.js +1766 -0
  19. package/dist/cjs/header-cell-renderer-D-RjAVfe.js.map +1 -0
  20. package/dist/cjs/index-BF1c1pO3.js +2549 -0
  21. package/dist/cjs/index-BF1c1pO3.js.map +1 -0
  22. package/dist/cjs/index.cjs.js +6426 -0
  23. package/dist/cjs/index.cjs.js.map +1 -0
  24. package/dist/cjs/loader.cjs.js +19 -0
  25. package/dist/cjs/loader.cjs.js.map +1 -0
  26. package/dist/cjs/revo-grid.cjs.entry.js +3215 -0
  27. package/dist/cjs/revo-grid.cjs.entry.js.map +1 -0
  28. package/dist/cjs/revo-grid.cjs.js +31 -0
  29. package/dist/cjs/revo-grid.cjs.js.map +1 -0
  30. package/dist/cjs/revo-grid.entry.cjs.js.map +1 -0
  31. package/dist/cjs/revogr-attribution.revogr-extra.revogr-focus.revogr-grouping-overlay.revogr-header-unified.revogr-overlay-selection.revogr-row-headers.revogr-scroll-virtual.revogr-temp-range.entry.cjs.js.map +1 -0
  32. package/dist/cjs/revogr-attribution_9.cjs.entry.js +2629 -0
  33. package/dist/cjs/revogr-attribution_9.cjs.entry.js.map +1 -0
  34. package/dist/cjs/revogr-clipboard.revogr-edit.revogr-order-editor.entry.cjs.js.map +1 -0
  35. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +471 -0
  36. package/dist/cjs/revogr-clipboard_3.cjs.entry.js.map +1 -0
  37. package/dist/cjs/revogr-data.revogr-header.revogr-viewport-scroll.vnode-html.entry.cjs.js.map +1 -0
  38. package/dist/cjs/revogr-data_4.cjs.entry.js +1420 -0
  39. package/dist/cjs/revogr-data_4.cjs.entry.js.map +1 -0
  40. package/dist/cjs/revogr-filter-panel.cjs.entry.js +382 -0
  41. package/dist/cjs/revogr-filter-panel.cjs.entry.js.map +1 -0
  42. package/dist/cjs/revogr-filter-panel.entry.cjs.js.map +1 -0
  43. package/dist/cjs/row-renderer-BTE7VKD9.js +49 -0
  44. package/dist/cjs/row-renderer-BTE7VKD9.js.map +1 -0
  45. package/dist/cjs/text-editor-BdhmcrkS.js +81 -0
  46. package/dist/cjs/text-editor-BdhmcrkS.js.map +1 -0
  47. package/dist/cjs/throttle-2ZxfGjEI.js +533 -0
  48. package/dist/cjs/throttle-2ZxfGjEI.js.map +1 -0
  49. package/dist/cjs/tree-data.plugin-BRjwZtxI.js +5350 -0
  50. package/dist/cjs/tree-data.plugin-BRjwZtxI.js.map +1 -0
  51. package/dist/cjs/viewport.helpers-BAovztDd.js +61 -0
  52. package/dist/cjs/viewport.helpers-BAovztDd.js.map +1 -0
  53. package/dist/cjs/viewport.store-BTbPlyF-.js +525 -0
  54. package/dist/cjs/viewport.store-BTbPlyF-.js.map +1 -0
  55. package/dist/collection/collection-manifest.json +30 -0
  56. package/dist/collection/components/attribution/revogr-attribution.js +20 -0
  57. package/dist/collection/components/attribution/revogr-attribution.js.map +1 -0
  58. package/dist/collection/components/clipboard/revogr-clipboard.js +411 -0
  59. package/dist/collection/components/clipboard/revogr-clipboard.js.map +1 -0
  60. package/dist/collection/components/data/cell-renderer.js +44 -0
  61. package/dist/collection/components/data/cell-renderer.js.map +1 -0
  62. package/dist/collection/components/data/column.service.js +333 -0
  63. package/dist/collection/components/data/column.service.js.map +1 -0
  64. package/dist/collection/components/data/revogr-data-style.css +95 -0
  65. package/dist/collection/components/data/revogr-data.js +939 -0
  66. package/dist/collection/components/data/revogr-data.js.map +1 -0
  67. package/dist/collection/components/data/row-highlight.plugin.js +51 -0
  68. package/dist/collection/components/data/row-highlight.plugin.js.map +1 -0
  69. package/dist/collection/components/data/row-renderer.js +37 -0
  70. package/dist/collection/components/data/row-renderer.js.map +1 -0
  71. package/dist/collection/components/editors/edit.utils.js +13 -0
  72. package/dist/collection/components/editors/edit.utils.js.map +1 -0
  73. package/dist/collection/components/editors/revogr-edit-style.css +16 -0
  74. package/dist/collection/components/editors/revogr-edit.js +346 -0
  75. package/dist/collection/components/editors/revogr-edit.js.map +1 -0
  76. package/dist/collection/components/editors/text-editor.js +74 -0
  77. package/dist/collection/components/editors/text-editor.js.map +1 -0
  78. package/dist/collection/components/extra/revogr-extra.js +125 -0
  79. package/dist/collection/components/extra/revogr-extra.js.map +1 -0
  80. package/dist/collection/components/grouping-overlay/revogr-grouping-overlay.css +62 -0
  81. package/dist/collection/components/grouping-overlay/revogr-grouping-overlay.js +644 -0
  82. package/dist/collection/components/grouping-overlay/revogr-grouping-overlay.js.map +1 -0
  83. package/dist/collection/components/header/header-cell-renderer.js +49 -0
  84. package/dist/collection/components/header/header-cell-renderer.js.map +1 -0
  85. package/dist/collection/components/header/header-group-renderer.js +29 -0
  86. package/dist/collection/components/header/header-group-renderer.js.map +1 -0
  87. package/dist/collection/components/header/header-renderer.js +100 -0
  88. package/dist/collection/components/header/header-renderer.js.map +1 -0
  89. package/dist/collection/components/header/resizable.directive.js +274 -0
  90. package/dist/collection/components/header/resizable.directive.js.map +1 -0
  91. package/dist/collection/components/header/resizable.element.js +36 -0
  92. package/dist/collection/components/header/resizable.element.js.map +1 -0
  93. package/dist/collection/components/header/revogr-header-style.css +164 -0
  94. package/dist/collection/components/header/revogr-header-unified-style.css +205 -0
  95. package/dist/collection/components/header/revogr-header-unified.js +1013 -0
  96. package/dist/collection/components/header/revogr-header-unified.js.map +1 -0
  97. package/dist/collection/components/header/revogr-header.js +852 -0
  98. package/dist/collection/components/header/revogr-header.js.map +1 -0
  99. package/dist/collection/components/order/order-renderer.js +50 -0
  100. package/dist/collection/components/order/order-renderer.js.map +1 -0
  101. package/dist/collection/components/order/order-row.service.js +72 -0
  102. package/dist/collection/components/order/order-row.service.js.map +1 -0
  103. package/dist/collection/components/order/revogr-order-editor.js +461 -0
  104. package/dist/collection/components/order/revogr-order-editor.js.map +1 -0
  105. package/dist/collection/components/overlay/autofill.service.js +221 -0
  106. package/dist/collection/components/overlay/autofill.service.js.map +1 -0
  107. package/dist/collection/components/overlay/keyboard.service.js +178 -0
  108. package/dist/collection/components/overlay/keyboard.service.js.map +1 -0
  109. package/dist/collection/components/overlay/revogr-overlay-selection.js +1606 -0
  110. package/dist/collection/components/overlay/revogr-overlay-selection.js.map +1 -0
  111. package/dist/collection/components/overlay/revogr-overlay-style.css +95 -0
  112. package/dist/collection/components/overlay/selection.utils.js +136 -0
  113. package/dist/collection/components/overlay/selection.utils.js.map +1 -0
  114. package/dist/collection/components/revoGrid/grid.helpers.js +33 -0
  115. package/dist/collection/components/revoGrid/grid.helpers.js.map +1 -0
  116. package/dist/collection/components/revoGrid/plugin.service.js +81 -0
  117. package/dist/collection/components/revoGrid/plugin.service.js.map +1 -0
  118. package/dist/collection/components/revoGrid/revo-grid-style.css +897 -0
  119. package/dist/collection/components/revoGrid/revo-grid.js +4717 -0
  120. package/dist/collection/components/revoGrid/revo-grid.js.map +1 -0
  121. package/dist/collection/components/revoGrid/viewport.helpers.js +51 -0
  122. package/dist/collection/components/revoGrid/viewport.helpers.js.map +1 -0
  123. package/dist/collection/components/revoGrid/viewport.resize.service.js +55 -0
  124. package/dist/collection/components/revoGrid/viewport.resize.service.js.map +1 -0
  125. package/dist/collection/components/revoGrid/viewport.scrolling.service.js +139 -0
  126. package/dist/collection/components/revoGrid/viewport.scrolling.service.js.map +1 -0
  127. package/dist/collection/components/revoGrid/viewport.service.js +253 -0
  128. package/dist/collection/components/revoGrid/viewport.service.js.map +1 -0
  129. package/dist/collection/components/rowHeaders/revogr-row-headers.js +291 -0
  130. package/dist/collection/components/rowHeaders/revogr-row-headers.js.map +1 -0
  131. package/dist/collection/components/rowHeaders/row-header-render.js +5 -0
  132. package/dist/collection/components/rowHeaders/row-header-render.js.map +1 -0
  133. package/dist/collection/components/scroll/revogr-viewport-scroll-style.css +70 -0
  134. package/dist/collection/components/scroll/revogr-viewport-scroll.js +938 -0
  135. package/dist/collection/components/scroll/revogr-viewport-scroll.js.map +1 -0
  136. package/dist/collection/components/scrollable/autohide-scroll.plugin.js +44 -0
  137. package/dist/collection/components/scrollable/autohide-scroll.plugin.js.map +1 -0
  138. package/dist/collection/components/scrollable/revogr-scroll-style.css +34 -0
  139. package/dist/collection/components/scrollable/revogr-scroll-virtual.js +346 -0
  140. package/dist/collection/components/scrollable/revogr-scroll-virtual.js.map +1 -0
  141. package/dist/collection/components/selectionFocus/revogr-focus-style.css +7 -0
  142. package/dist/collection/components/selectionFocus/revogr-focus.js +429 -0
  143. package/dist/collection/components/selectionFocus/revogr-focus.js.map +1 -0
  144. package/dist/collection/components/selectionTempRange/revogr-temp-range-style.css +28 -0
  145. package/dist/collection/components/selectionTempRange/revogr-temp-range.js +171 -0
  146. package/dist/collection/components/selectionTempRange/revogr-temp-range.js.map +1 -0
  147. package/dist/collection/components/vnode/vnode-converter.js +84 -0
  148. package/dist/collection/components/vnode/vnode-converter.js.map +1 -0
  149. package/dist/collection/components/vnode/vnode.utils.js +18 -0
  150. package/dist/collection/components/vnode/vnode.utils.js.map +1 -0
  151. package/dist/collection/global/global.js +19 -0
  152. package/dist/collection/global/global.js.map +1 -0
  153. package/dist/collection/index.js +13 -0
  154. package/dist/collection/index.js.map +1 -0
  155. package/dist/collection/plugins/add-rows-on-paste.plugin.js +40 -0
  156. package/dist/collection/plugins/add-rows-on-paste.plugin.js.map +1 -0
  157. package/dist/collection/plugins/base.plugin.js +90 -0
  158. package/dist/collection/plugins/base.plugin.js.map +1 -0
  159. package/dist/collection/plugins/column-hide.plugin.js +532 -0
  160. package/dist/collection/plugins/column-hide.plugin.js.map +1 -0
  161. package/dist/collection/plugins/column-manage.plugin.js +1218 -0
  162. package/dist/collection/plugins/column-manage.plugin.js.map +1 -0
  163. package/dist/collection/plugins/column-stretch.plugin.js +921 -0
  164. package/dist/collection/plugins/column-stretch.plugin.js.map +1 -0
  165. package/dist/collection/plugins/column.auto-size.plugin.js +308 -0
  166. package/dist/collection/plugins/column.auto-size.plugin.js.map +1 -0
  167. package/dist/collection/plugins/column.stretch.plugin.js +96 -0
  168. package/dist/collection/plugins/column.stretch.plugin.js.map +1 -0
  169. package/dist/collection/plugins/customColumnDrag/column-move.helper.js +361 -0
  170. package/dist/collection/plugins/customColumnDrag/column-move.helper.js.map +1 -0
  171. package/dist/collection/plugins/customColumnDrag/custom-column-drag.plugin.js +145 -0
  172. package/dist/collection/plugins/customColumnDrag/custom-column-drag.plugin.js.map +1 -0
  173. package/dist/collection/plugins/customColumnDrag/drag.handler.js +726 -0
  174. package/dist/collection/plugins/customColumnDrag/drag.handler.js.map +1 -0
  175. package/dist/collection/plugins/customColumnDrag/example.js +282 -0
  176. package/dist/collection/plugins/customColumnDrag/example.js.map +1 -0
  177. package/dist/collection/plugins/customColumnDrag/index.js +8 -0
  178. package/dist/collection/plugins/customColumnDrag/index.js.map +1 -0
  179. package/dist/collection/plugins/customColumnDrag/types.js +2 -0
  180. package/dist/collection/plugins/customColumnDrag/types.js.map +1 -0
  181. package/dist/collection/plugins/dispatcher.js +40 -0
  182. package/dist/collection/plugins/dispatcher.js.map +1 -0
  183. package/dist/collection/plugins/enhanced-scrollbar.plugin.js +493 -0
  184. package/dist/collection/plugins/enhanced-scrollbar.plugin.js.map +1 -0
  185. package/dist/collection/plugins/export/csv.js +72 -0
  186. package/dist/collection/plugins/export/csv.js.map +1 -0
  187. package/dist/collection/plugins/export/export.plugin.js +157 -0
  188. package/dist/collection/plugins/export/export.plugin.js.map +1 -0
  189. package/dist/collection/plugins/export/types.js +2 -0
  190. package/dist/collection/plugins/export/types.js.map +1 -0
  191. package/dist/collection/plugins/filter/conditions/equal.js +21 -0
  192. package/dist/collection/plugins/filter/conditions/equal.js.map +1 -0
  193. package/dist/collection/plugins/filter/conditions/number/greaterThan.js +14 -0
  194. package/dist/collection/plugins/filter/conditions/number/greaterThan.js.map +1 -0
  195. package/dist/collection/plugins/filter/conditions/number/greaterThanOrEqual.js +11 -0
  196. package/dist/collection/plugins/filter/conditions/number/greaterThanOrEqual.js.map +1 -0
  197. package/dist/collection/plugins/filter/conditions/number/lessThan.js +16 -0
  198. package/dist/collection/plugins/filter/conditions/number/lessThan.js.map +1 -0
  199. package/dist/collection/plugins/filter/conditions/number/lessThanOrEqual.js +11 -0
  200. package/dist/collection/plugins/filter/conditions/number/lessThanOrEqual.js.map +1 -0
  201. package/dist/collection/plugins/filter/conditions/set.js +7 -0
  202. package/dist/collection/plugins/filter/conditions/set.js.map +1 -0
  203. package/dist/collection/plugins/filter/conditions/string/beginswith.js +21 -0
  204. package/dist/collection/plugins/filter/conditions/string/beginswith.js.map +1 -0
  205. package/dist/collection/plugins/filter/conditions/string/contains.js +25 -0
  206. package/dist/collection/plugins/filter/conditions/string/contains.js.map +1 -0
  207. package/dist/collection/plugins/filter/filter.button.js +28 -0
  208. package/dist/collection/plugins/filter/filter.button.js.map +1 -0
  209. package/dist/collection/plugins/filter/filter.indexed.js +49 -0
  210. package/dist/collection/plugins/filter/filter.indexed.js.map +1 -0
  211. package/dist/collection/plugins/filter/filter.panel.js +610 -0
  212. package/dist/collection/plugins/filter/filter.panel.js.map +1 -0
  213. package/dist/collection/plugins/filter/filter.plugin.js +388 -0
  214. package/dist/collection/plugins/filter/filter.plugin.js.map +1 -0
  215. package/dist/collection/plugins/filter/filter.style.css +165 -0
  216. package/dist/collection/plugins/filter/filter.types.js +9 -0
  217. package/dist/collection/plugins/filter/filter.types.js.map +1 -0
  218. package/dist/collection/plugins/grid-setup.js +131 -0
  219. package/dist/collection/plugins/grid-setup.js.map +1 -0
  220. package/dist/collection/plugins/groupingRow/grouping.const.js +18 -0
  221. package/dist/collection/plugins/groupingRow/grouping.const.js.map +1 -0
  222. package/dist/collection/plugins/groupingRow/grouping.row.expand.service.js +122 -0
  223. package/dist/collection/plugins/groupingRow/grouping.row.expand.service.js.map +1 -0
  224. package/dist/collection/plugins/groupingRow/grouping.row.plugin.js +252 -0
  225. package/dist/collection/plugins/groupingRow/grouping.row.plugin.js.map +1 -0
  226. package/dist/collection/plugins/groupingRow/grouping.row.renderer.js +49 -0
  227. package/dist/collection/plugins/groupingRow/grouping.row.renderer.js.map +1 -0
  228. package/dist/collection/plugins/groupingRow/grouping.row.types.js +2 -0
  229. package/dist/collection/plugins/groupingRow/grouping.row.types.js.map +1 -0
  230. package/dist/collection/plugins/groupingRow/grouping.service.js +215 -0
  231. package/dist/collection/plugins/groupingRow/grouping.service.js.map +1 -0
  232. package/dist/collection/plugins/groupingRow/grouping.trimmed.service.js +61 -0
  233. package/dist/collection/plugins/groupingRow/grouping.trimmed.service.js.map +1 -0
  234. package/dist/collection/plugins/index.js +26 -0
  235. package/dist/collection/plugins/index.js.map +1 -0
  236. package/dist/collection/plugins/manual-focus.plugin.js +353 -0
  237. package/dist/collection/plugins/manual-focus.plugin.js.map +1 -0
  238. package/dist/collection/plugins/moveColumn/column.drag.plugin.js +171 -0
  239. package/dist/collection/plugins/moveColumn/column.drag.plugin.js.map +1 -0
  240. package/dist/collection/plugins/moveColumn/order-column.handler.js +69 -0
  241. package/dist/collection/plugins/moveColumn/order-column.handler.js.map +1 -0
  242. package/dist/collection/plugins/pin-shadow.plugin.js +487 -0
  243. package/dist/collection/plugins/pin-shadow.plugin.js.map +1 -0
  244. package/dist/collection/plugins/resize-indicator.plugin.js +430 -0
  245. package/dist/collection/plugins/resize-indicator.plugin.js.map +1 -0
  246. package/dist/collection/plugins/row-select-plugin-2026228.js +1803 -0
  247. package/dist/collection/plugins/row-select-plugin-2026228.js.map +1 -0
  248. package/dist/collection/plugins/row-select.plugin.js +2096 -0
  249. package/dist/collection/plugins/row-select.plugin.js.map +1 -0
  250. package/dist/collection/plugins/rtl/rtl.plugin.js +110 -0
  251. package/dist/collection/plugins/rtl/rtl.plugin.js.map +1 -0
  252. package/dist/collection/plugins/sorting/sorting.func.js +82 -0
  253. package/dist/collection/plugins/sorting/sorting.func.js.map +1 -0
  254. package/dist/collection/plugins/sorting/sorting.plugin.js +224 -0
  255. package/dist/collection/plugins/sorting/sorting.plugin.js.map +1 -0
  256. package/dist/collection/plugins/sorting/sorting.sign.js +9 -0
  257. package/dist/collection/plugins/sorting/sorting.sign.js.map +1 -0
  258. package/dist/collection/plugins/sorting/sorting.types.js +2 -0
  259. package/dist/collection/plugins/sorting/sorting.types.js.map +1 -0
  260. package/dist/collection/plugins/tree-data.plugin.js +447 -0
  261. package/dist/collection/plugins/tree-data.plugin.js.map +1 -0
  262. package/dist/collection/plugins/wcag/index.js +84 -0
  263. package/dist/collection/plugins/wcag/index.js.map +1 -0
  264. package/dist/collection/serve/controller.js +344 -0
  265. package/dist/collection/serve/data.js +201 -0
  266. package/dist/collection/serve/realData.js +4148 -0
  267. package/dist/collection/services/cell.helpers.js +12 -0
  268. package/dist/collection/services/cell.helpers.js.map +1 -0
  269. package/dist/collection/services/column.data.provider.js +122 -0
  270. package/dist/collection/services/column.data.provider.js.map +1 -0
  271. package/dist/collection/services/data.provider.js +89 -0
  272. package/dist/collection/services/data.provider.js.map +1 -0
  273. package/dist/collection/services/dimension.provider.js +257 -0
  274. package/dist/collection/services/dimension.provider.js.map +1 -0
  275. package/dist/collection/services/local.scroll.service.js +136 -0
  276. package/dist/collection/services/local.scroll.service.js.map +1 -0
  277. package/dist/collection/services/local.scroll.timer.js +84 -0
  278. package/dist/collection/services/local.scroll.timer.js.map +1 -0
  279. package/dist/collection/services/selection.store.connector.js +274 -0
  280. package/dist/collection/services/selection.store.connector.js.map +1 -0
  281. package/dist/collection/services/viewport.provider.js +17 -0
  282. package/dist/collection/services/viewport.provider.js.map +1 -0
  283. package/dist/collection/store/dataSource/data.proxy.js +45 -0
  284. package/dist/collection/store/dataSource/data.proxy.js.map +1 -0
  285. package/dist/collection/store/dataSource/data.store.js +146 -0
  286. package/dist/collection/store/dataSource/data.store.js.map +1 -0
  287. package/dist/collection/store/dataSource/index.js +7 -0
  288. package/dist/collection/store/dataSource/index.js.map +1 -0
  289. package/dist/collection/store/dataSource/trimmed.plugin.js +34 -0
  290. package/dist/collection/store/dataSource/trimmed.plugin.js.map +1 -0
  291. package/dist/collection/store/dimension/dimension.helpers.js +101 -0
  292. package/dist/collection/store/dimension/dimension.helpers.js.map +1 -0
  293. package/dist/collection/store/dimension/dimension.recalculate.plugin.js +29 -0
  294. package/dist/collection/store/dimension/dimension.recalculate.plugin.js.map +1 -0
  295. package/dist/collection/store/dimension/dimension.store.js +124 -0
  296. package/dist/collection/store/dimension/dimension.store.js.map +1 -0
  297. package/dist/collection/store/dimension/dimension.trim.plugin.js +61 -0
  298. package/dist/collection/store/dimension/dimension.trim.plugin.js.map +1 -0
  299. package/dist/collection/store/dimension/index.js +6 -0
  300. package/dist/collection/store/dimension/index.js.map +1 -0
  301. package/dist/collection/store/index.js +17 -0
  302. package/dist/collection/store/index.js.map +1 -0
  303. package/dist/collection/store/selection/index.js +6 -0
  304. package/dist/collection/store/selection/index.js.map +1 -0
  305. package/dist/collection/store/selection/selection.helpers.js +49 -0
  306. package/dist/collection/store/selection/selection.helpers.js.map +1 -0
  307. package/dist/collection/store/selection/selection.store.js +85 -0
  308. package/dist/collection/store/selection/selection.store.js.map +1 -0
  309. package/dist/collection/store/vp/index.js +6 -0
  310. package/dist/collection/store/vp/index.js.map +1 -0
  311. package/dist/collection/store/vp/viewport.helpers.js +251 -0
  312. package/dist/collection/store/vp/viewport.helpers.js.map +1 -0
  313. package/dist/collection/store/vp/viewport.store.js +256 -0
  314. package/dist/collection/store/vp/viewport.store.js.map +1 -0
  315. package/dist/collection/themeManager/theme.compact.js +9 -0
  316. package/dist/collection/themeManager/theme.compact.js.map +1 -0
  317. package/dist/collection/themeManager/theme.default.js +9 -0
  318. package/dist/collection/themeManager/theme.default.js.map +1 -0
  319. package/dist/collection/themeManager/theme.material.js +9 -0
  320. package/dist/collection/themeManager/theme.material.js.map +1 -0
  321. package/dist/collection/themeManager/theme.service.js +53 -0
  322. package/dist/collection/themeManager/theme.service.js.map +1 -0
  323. package/dist/collection/types/dimension.js +2 -0
  324. package/dist/collection/types/dimension.js.map +1 -0
  325. package/dist/collection/types/events.js +124 -0
  326. package/dist/collection/types/events.js.map +1 -0
  327. package/dist/collection/types/index.js +12 -0
  328. package/dist/collection/types/index.js.map +1 -0
  329. package/dist/collection/types/interfaces.js +6 -0
  330. package/dist/collection/types/interfaces.js.map +1 -0
  331. package/dist/collection/types/plugin.js +2 -0
  332. package/dist/collection/types/plugin.js.map +1 -0
  333. package/dist/collection/types/plugin.types.js +2 -0
  334. package/dist/collection/types/plugin.types.js.map +1 -0
  335. package/dist/collection/types/selection.js +2 -0
  336. package/dist/collection/types/selection.js.map +1 -0
  337. package/dist/collection/types/theme.js +2 -0
  338. package/dist/collection/types/theme.js.map +1 -0
  339. package/dist/collection/types/viewport.interfaces.js +2 -0
  340. package/dist/collection/types/viewport.interfaces.js.map +1 -0
  341. package/dist/collection/utils/batchGroupCollapse.js +190 -0
  342. package/dist/collection/utils/batchGroupCollapse.js.map +1 -0
  343. package/dist/collection/utils/browser.js +7 -0
  344. package/dist/collection/utils/browser.js.map +1 -0
  345. package/dist/collection/utils/cell-template-helper.js +181 -0
  346. package/dist/collection/utils/cell-template-helper.js.map +1 -0
  347. package/dist/collection/utils/closest.polifill.js +22 -0
  348. package/dist/collection/utils/closest.polifill.js.map +1 -0
  349. package/dist/collection/utils/column.utils.js +448 -0
  350. package/dist/collection/utils/column.utils.js.map +1 -0
  351. package/dist/collection/utils/consts.js +26 -0
  352. package/dist/collection/utils/consts.js.map +1 -0
  353. package/dist/collection/utils/events.js +39 -0
  354. package/dist/collection/utils/events.js.map +1 -0
  355. package/dist/collection/utils/header.utils.js +24 -0
  356. package/dist/collection/utils/header.utils.js.map +1 -0
  357. package/dist/collection/utils/index.js +133 -0
  358. package/dist/collection/utils/index.js.map +1 -0
  359. package/dist/collection/utils/key.codes.js +80 -0
  360. package/dist/collection/utils/key.codes.js.map +1 -0
  361. package/dist/collection/utils/key.utils.js +86 -0
  362. package/dist/collection/utils/key.utils.js.map +1 -0
  363. package/dist/collection/utils/mobile.js +7 -0
  364. package/dist/collection/utils/mobile.js.map +1 -0
  365. package/dist/collection/utils/platform.js +9 -0
  366. package/dist/collection/utils/platform.js.map +1 -0
  367. package/dist/collection/utils/row-header-utils.js +9 -0
  368. package/dist/collection/utils/row-header-utils.js.map +1 -0
  369. package/dist/collection/utils/store.types.js +2 -0
  370. package/dist/collection/utils/store.types.js.map +1 -0
  371. package/dist/collection/utils/store.utils.js +15 -0
  372. package/dist/collection/utils/store.utils.js.map +1 -0
  373. package/dist/esm/app-globals-C3ZHKjnB.js +14 -0
  374. package/dist/esm/app-globals-C3ZHKjnB.js.map +1 -0
  375. package/dist/esm/cell-renderer-C2Td6LKY.js +54 -0
  376. package/dist/esm/cell-renderer-C2Td6LKY.js.map +1 -0
  377. package/dist/esm/debounce-BfO9dz9v.js +488 -0
  378. package/dist/esm/debounce-BfO9dz9v.js.map +1 -0
  379. package/dist/esm/dimension.helpers-DDil7Dg0.js +3546 -0
  380. package/dist/esm/dimension.helpers-DDil7Dg0.js.map +1 -0
  381. package/dist/esm/edit.utils-ClxXX_x9.js +99 -0
  382. package/dist/esm/edit.utils-ClxXX_x9.js.map +1 -0
  383. package/dist/esm/events-BvSmBueA.js +43 -0
  384. package/dist/esm/events-BvSmBueA.js.map +1 -0
  385. package/dist/esm/filter.button-DmOE7VCJ.js +39 -0
  386. package/dist/esm/filter.button-DmOE7VCJ.js.map +1 -0
  387. package/dist/esm/grouping.row.renderer-6NYszUJA.js +60 -0
  388. package/dist/esm/grouping.row.renderer-6NYszUJA.js.map +1 -0
  389. package/dist/esm/header-cell-renderer-BVHTuFGE.js +1715 -0
  390. package/dist/esm/header-cell-renderer-BVHTuFGE.js.map +1 -0
  391. package/dist/esm/index-Dyptvvxf.js +2519 -0
  392. package/dist/esm/index-Dyptvvxf.js.map +1 -0
  393. package/dist/esm/index.js +6232 -0
  394. package/dist/esm/index.js.map +1 -0
  395. package/dist/esm/loader.js +17 -0
  396. package/dist/esm/loader.js.map +1 -0
  397. package/dist/esm/revo-grid.entry.js +3213 -0
  398. package/dist/esm/revo-grid.entry.js.map +1 -0
  399. package/dist/esm/revo-grid.js +27 -0
  400. package/dist/esm/revo-grid.js.map +1 -0
  401. package/dist/esm/revogr-attribution.revogr-extra.revogr-focus.revogr-grouping-overlay.revogr-header-unified.revogr-overlay-selection.revogr-row-headers.revogr-scroll-virtual.revogr-temp-range.entry.js.map +1 -0
  402. package/dist/esm/revogr-attribution_9.entry.js +2619 -0
  403. package/dist/esm/revogr-attribution_9.entry.js.map +1 -0
  404. package/dist/esm/revogr-clipboard.revogr-edit.revogr-order-editor.entry.js.map +1 -0
  405. package/dist/esm/revogr-clipboard_3.entry.js +467 -0
  406. package/dist/esm/revogr-clipboard_3.entry.js.map +1 -0
  407. package/dist/esm/revogr-data.revogr-header.revogr-viewport-scroll.vnode-html.entry.js.map +1 -0
  408. package/dist/esm/revogr-data_4.entry.js +1415 -0
  409. package/dist/esm/revogr-data_4.entry.js.map +1 -0
  410. package/dist/esm/revogr-filter-panel.entry.js +380 -0
  411. package/dist/esm/revogr-filter-panel.entry.js.map +1 -0
  412. package/dist/esm/row-renderer-sb6QTqH-.js +46 -0
  413. package/dist/esm/row-renderer-sb6QTqH-.js.map +1 -0
  414. package/dist/esm/text-editor-CxXqoicM.js +79 -0
  415. package/dist/esm/text-editor-CxXqoicM.js.map +1 -0
  416. package/dist/esm/throttle-DXYrmEeb.js +525 -0
  417. package/dist/esm/throttle-DXYrmEeb.js.map +1 -0
  418. package/dist/esm/tree-data.plugin-C2eXkf9_.js +5319 -0
  419. package/dist/esm/tree-data.plugin-C2eXkf9_.js.map +1 -0
  420. package/dist/esm/viewport.helpers-VXhsJZtn.js +55 -0
  421. package/dist/esm/viewport.helpers-VXhsJZtn.js.map +1 -0
  422. package/dist/esm/viewport.store-C-GnV31k.js +512 -0
  423. package/dist/esm/viewport.store-C-GnV31k.js.map +1 -0
  424. package/dist/index.cjs.js +1 -0
  425. package/dist/index.js +1 -0
  426. package/dist/revo-grid/app-globals-C3ZHKjnB.js +14 -0
  427. package/dist/revo-grid/app-globals-C3ZHKjnB.js.map +1 -0
  428. package/dist/revo-grid/cell-renderer-C2Td6LKY.js +54 -0
  429. package/dist/revo-grid/cell-renderer-C2Td6LKY.js.map +1 -0
  430. package/dist/revo-grid/debounce-BfO9dz9v.js +488 -0
  431. package/dist/revo-grid/debounce-BfO9dz9v.js.map +1 -0
  432. package/dist/revo-grid/dimension.helpers-DDil7Dg0.js +3546 -0
  433. package/dist/revo-grid/dimension.helpers-DDil7Dg0.js.map +1 -0
  434. package/dist/revo-grid/edit.utils-ClxXX_x9.js +99 -0
  435. package/dist/revo-grid/edit.utils-ClxXX_x9.js.map +1 -0
  436. package/dist/revo-grid/events-BvSmBueA.js +43 -0
  437. package/dist/revo-grid/events-BvSmBueA.js.map +1 -0
  438. package/dist/revo-grid/filter.button-DmOE7VCJ.js +39 -0
  439. package/dist/revo-grid/filter.button-DmOE7VCJ.js.map +1 -0
  440. package/dist/revo-grid/grouping.row.renderer-6NYszUJA.js +60 -0
  441. package/dist/revo-grid/grouping.row.renderer-6NYszUJA.js.map +1 -0
  442. package/dist/revo-grid/header-cell-renderer-BVHTuFGE.js +1715 -0
  443. package/dist/revo-grid/header-cell-renderer-BVHTuFGE.js.map +1 -0
  444. package/dist/revo-grid/index-Dyptvvxf.js +2490 -0
  445. package/dist/revo-grid/index-Dyptvvxf.js.map +1 -0
  446. package/dist/revo-grid/index.esm.js +6232 -0
  447. package/dist/revo-grid/index.esm.js.map +1 -0
  448. package/dist/revo-grid/loader.esm.js.map +1 -0
  449. package/dist/revo-grid/revo-grid.entry.esm.js.map +1 -0
  450. package/dist/revo-grid/revo-grid.entry.js +3213 -0
  451. package/dist/revo-grid/revo-grid.entry.js.map +1 -0
  452. package/dist/revo-grid/revo-grid.esm.js +27 -0
  453. package/dist/revo-grid/revo-grid.esm.js.map +1 -0
  454. package/dist/revo-grid/revogr-attribution.revogr-extra.revogr-focus.revogr-grouping-overlay.revogr-header-unified.revogr-overlay-selection.revogr-row-headers.revogr-scroll-virtual.revogr-temp-range.entry.esm.js.map +1 -0
  455. package/dist/revo-grid/revogr-attribution_9.entry.js +2619 -0
  456. package/dist/revo-grid/revogr-attribution_9.entry.js.map +1 -0
  457. package/dist/revo-grid/revogr-clipboard.revogr-edit.revogr-order-editor.entry.esm.js.map +1 -0
  458. package/dist/revo-grid/revogr-clipboard_3.entry.js +467 -0
  459. package/dist/revo-grid/revogr-clipboard_3.entry.js.map +1 -0
  460. package/dist/revo-grid/revogr-data.revogr-header.revogr-viewport-scroll.vnode-html.entry.esm.js.map +1 -0
  461. package/dist/revo-grid/revogr-data_4.entry.js +1415 -0
  462. package/dist/revo-grid/revogr-data_4.entry.js.map +1 -0
  463. package/dist/revo-grid/revogr-filter-panel.entry.esm.js.map +1 -0
  464. package/dist/revo-grid/revogr-filter-panel.entry.js +380 -0
  465. package/dist/revo-grid/revogr-filter-panel.entry.js.map +1 -0
  466. package/dist/revo-grid/row-renderer-sb6QTqH-.js +46 -0
  467. package/dist/revo-grid/row-renderer-sb6QTqH-.js.map +1 -0
  468. package/dist/revo-grid/text-editor-CxXqoicM.js +79 -0
  469. package/dist/revo-grid/text-editor-CxXqoicM.js.map +1 -0
  470. package/dist/revo-grid/throttle-DXYrmEeb.js +525 -0
  471. package/dist/revo-grid/throttle-DXYrmEeb.js.map +1 -0
  472. package/dist/revo-grid/tree-data.plugin-C2eXkf9_.js +5319 -0
  473. package/dist/revo-grid/tree-data.plugin-C2eXkf9_.js.map +1 -0
  474. package/dist/revo-grid/viewport.helpers-VXhsJZtn.js +55 -0
  475. package/dist/revo-grid/viewport.helpers-VXhsJZtn.js.map +1 -0
  476. package/dist/revo-grid/viewport.store-C-GnV31k.js +512 -0
  477. package/dist/revo-grid/viewport.store-C-GnV31k.js.map +1 -0
  478. package/dist/types/components/attribution/revogr-attribution.d.ts +12 -0
  479. package/dist/types/components/clipboard/revogr-clipboard.d.ts +89 -0
  480. package/dist/types/components/data/cell-renderer.d.ts +12 -0
  481. package/dist/types/components/data/column.service.d.ts +65 -0
  482. package/dist/types/components/data/revogr-data.d.ts +132 -0
  483. package/dist/types/components/data/row-highlight.plugin.d.ts +10 -0
  484. package/dist/types/components/data/row-renderer.d.ts +13 -0
  485. package/dist/types/components/editors/edit.utils.d.ts +3 -0
  486. package/dist/types/components/editors/revogr-edit.d.ts +63 -0
  487. package/dist/types/components/editors/text-editor.d.ts +43 -0
  488. package/dist/types/components/extra/revogr-extra.d.ts +38 -0
  489. package/dist/types/components/grouping-overlay/revogr-grouping-overlay.d.ts +71 -0
  490. package/dist/types/components/header/header-cell-renderer.d.ts +10 -0
  491. package/dist/types/components/header/header-group-renderer.d.ts +17 -0
  492. package/dist/types/components/header/header-renderer.d.ts +24 -0
  493. package/dist/types/components/header/resizable.directive.d.ts +60 -0
  494. package/dist/types/components/header/resizable.element.d.ts +5 -0
  495. package/dist/types/components/header/revogr-header-unified.d.ts +168 -0
  496. package/dist/types/components/header/revogr-header.d.ts +131 -0
  497. package/dist/types/components/order/order-renderer.d.ts +29 -0
  498. package/dist/types/components/order/order-row.service.d.ts +27 -0
  499. package/dist/types/components/order/revogr-order-editor.d.ts +56 -0
  500. package/dist/types/components/overlay/autofill.service.d.ts +80 -0
  501. package/dist/types/components/overlay/keyboard.service.d.ts +29 -0
  502. package/dist/types/components/overlay/revogr-overlay-selection.d.ts +295 -0
  503. package/dist/types/components/overlay/selection.utils.d.ts +47 -0
  504. package/dist/types/components/revoGrid/grid.helpers.d.ts +17 -0
  505. package/dist/types/components/revoGrid/plugin.service.d.ts +37 -0
  506. package/dist/types/components/revoGrid/revo-grid.d.ts +801 -0
  507. package/dist/types/components/revoGrid/viewport.helpers.d.ts +42 -0
  508. package/dist/types/components/revoGrid/viewport.resize.service.d.ts +17 -0
  509. package/dist/types/components/revoGrid/viewport.scrolling.service.d.ts +24 -0
  510. package/dist/types/components/revoGrid/viewport.service.d.ts +59 -0
  511. package/dist/types/components/rowHeaders/revogr-row-headers.d.ts +51 -0
  512. package/dist/types/components/rowHeaders/row-header-render.d.ts +9 -0
  513. package/dist/types/components/scroll/revogr-viewport-scroll.d.ts +159 -0
  514. package/dist/types/components/scrollable/autohide-scroll.plugin.d.ts +22 -0
  515. package/dist/types/components/scrollable/revogr-scroll-virtual.d.ts +49 -0
  516. package/dist/types/components/selectionFocus/revogr-focus.d.ts +63 -0
  517. package/dist/types/components/selectionTempRange/revogr-temp-range.d.ts +28 -0
  518. package/dist/types/components/vnode/vnode-converter.d.ts +19 -0
  519. package/dist/types/components/vnode/vnode.utils.d.ts +9 -0
  520. package/dist/types/components.d.ts +2928 -0
  521. package/dist/types/global/global.d.ts +1 -0
  522. package/dist/types/index.d.ts +9 -0
  523. package/dist/types/plugins/add-rows-on-paste.plugin.d.ts +14 -0
  524. package/dist/types/plugins/base.plugin.d.ts +51 -0
  525. package/dist/types/plugins/column-hide.plugin.d.ts +110 -0
  526. package/dist/types/plugins/column-manage.plugin.d.ts +225 -0
  527. package/dist/types/plugins/column-stretch.plugin.d.ts +159 -0
  528. package/dist/types/plugins/column.auto-size.plugin.d.ts +69 -0
  529. package/dist/types/plugins/column.stretch.plugin.d.ts +20 -0
  530. package/dist/types/plugins/customColumnDrag/column-move.helper.d.ts +71 -0
  531. package/dist/types/plugins/customColumnDrag/custom-column-drag.plugin.d.ts +35 -0
  532. package/dist/types/plugins/customColumnDrag/drag.handler.d.ts +112 -0
  533. package/dist/types/plugins/customColumnDrag/example.d.ts +31 -0
  534. package/dist/types/plugins/customColumnDrag/index.d.ts +5 -0
  535. package/dist/types/plugins/customColumnDrag/types.d.ts +46 -0
  536. package/dist/types/plugins/dispatcher.d.ts +20 -0
  537. package/dist/types/plugins/enhanced-scrollbar.plugin.d.ts +76 -0
  538. package/dist/types/plugins/export/csv.d.ts +9 -0
  539. package/dist/types/plugins/export/export.plugin.d.ts +24 -0
  540. package/dist/types/plugins/export/types.d.ts +23 -0
  541. package/dist/types/plugins/filter/conditions/equal.d.ts +4 -0
  542. package/dist/types/plugins/filter/conditions/number/greaterThan.d.ts +3 -0
  543. package/dist/types/plugins/filter/conditions/number/greaterThanOrEqual.d.ts +3 -0
  544. package/dist/types/plugins/filter/conditions/number/lessThan.d.ts +3 -0
  545. package/dist/types/plugins/filter/conditions/number/lessThanOrEqual.d.ts +3 -0
  546. package/dist/types/plugins/filter/conditions/set.d.ts +4 -0
  547. package/dist/types/plugins/filter/conditions/string/beginswith.d.ts +3 -0
  548. package/dist/types/plugins/filter/conditions/string/contains.d.ts +4 -0
  549. package/dist/types/plugins/filter/filter.button.d.ts +14 -0
  550. package/dist/types/plugins/filter/filter.indexed.d.ts +20 -0
  551. package/dist/types/plugins/filter/filter.panel.d.ts +53 -0
  552. package/dist/types/plugins/filter/filter.plugin.d.ts +73 -0
  553. package/dist/types/plugins/filter/filter.types.d.ts +129 -0
  554. package/dist/types/plugins/grid-setup.d.ts +65 -0
  555. package/dist/types/plugins/groupingRow/grouping.const.d.ts +14 -0
  556. package/dist/types/plugins/groupingRow/grouping.row.expand.service.d.ts +15 -0
  557. package/dist/types/plugins/groupingRow/grouping.row.plugin.d.ts +39 -0
  558. package/dist/types/plugins/groupingRow/grouping.row.renderer.d.ts +6 -0
  559. package/dist/types/plugins/groupingRow/grouping.row.types.d.ts +144 -0
  560. package/dist/types/plugins/groupingRow/grouping.service.d.ts +36 -0
  561. package/dist/types/plugins/groupingRow/grouping.trimmed.service.d.ts +10 -0
  562. package/dist/types/plugins/index.d.ts +22 -0
  563. package/dist/types/plugins/manual-focus.plugin.d.ts +113 -0
  564. package/dist/types/plugins/moveColumn/column.drag.plugin.d.ts +50 -0
  565. package/dist/types/plugins/moveColumn/order-column.handler.d.ts +16 -0
  566. package/dist/types/plugins/pin-shadow.plugin.d.ts +73 -0
  567. package/dist/types/plugins/resize-indicator.plugin.d.ts +71 -0
  568. package/dist/types/plugins/row-select-plugin-2026228.d.ts +367 -0
  569. package/dist/types/plugins/row-select.plugin.d.ts +378 -0
  570. package/dist/types/plugins/rtl/rtl.plugin.d.ts +37 -0
  571. package/dist/types/plugins/sorting/sorting.func.d.ts +9 -0
  572. package/dist/types/plugins/sorting/sorting.plugin.d.ts +48 -0
  573. package/dist/types/plugins/sorting/sorting.sign.d.ts +6 -0
  574. package/dist/types/plugins/sorting/sorting.types.d.ts +14 -0
  575. package/dist/types/plugins/tree-data.plugin.d.ts +56 -0
  576. package/dist/types/plugins/wcag/index.d.ts +26 -0
  577. package/dist/types/services/cell.helpers.d.ts +2 -0
  578. package/dist/types/services/column.data.provider.d.ts +27 -0
  579. package/dist/types/services/data.provider.d.ts +36 -0
  580. package/dist/types/services/dimension.provider.d.ts +71 -0
  581. package/dist/types/services/local.scroll.service.d.ts +36 -0
  582. package/dist/types/services/local.scroll.timer.d.ts +32 -0
  583. package/dist/types/services/selection.store.connector.d.ts +74 -0
  584. package/dist/types/services/viewport.provider.d.ts +9 -0
  585. package/dist/types/stencil-public-runtime.d.ts +1709 -0
  586. package/dist/types/store/dataSource/data.proxy.d.ts +14 -0
  587. package/dist/types/store/dataSource/data.store.d.ts +77 -0
  588. package/dist/types/store/dataSource/index.d.ts +3 -0
  589. package/dist/types/store/dataSource/trimmed.plugin.d.ts +12 -0
  590. package/dist/types/store/dimension/dimension.helpers.d.ts +24 -0
  591. package/dist/types/store/dimension/dimension.recalculate.plugin.d.ts +15 -0
  592. package/dist/types/store/dimension/dimension.store.d.ts +34 -0
  593. package/dist/types/store/dimension/dimension.trim.plugin.d.ts +13 -0
  594. package/dist/types/store/dimension/index.d.ts +2 -0
  595. package/dist/types/store/index.d.ts +8 -0
  596. package/dist/types/store/selection/index.d.ts +2 -0
  597. package/dist/types/store/selection/selection.helpers.d.ts +5 -0
  598. package/dist/types/store/selection/selection.store.d.ts +22 -0
  599. package/dist/types/store/vp/index.d.ts +7 -0
  600. package/dist/types/store/vp/viewport.helpers.d.ts +54 -0
  601. package/dist/types/store/vp/viewport.store.d.ts +38 -0
  602. package/dist/types/themeManager/theme.compact.d.ts +4 -0
  603. package/dist/types/themeManager/theme.default.d.ts +4 -0
  604. package/dist/types/themeManager/theme.material.d.ts +4 -0
  605. package/dist/types/themeManager/theme.service.d.ts +13 -0
  606. package/dist/types/types/dimension.d.ts +8 -0
  607. package/dist/types/types/events.d.ts +2 -0
  608. package/dist/types/types/index.d.ts +8 -0
  609. package/dist/types/types/interfaces.d.ts +795 -0
  610. package/dist/types/types/plugin.d.ts +9 -0
  611. package/dist/types/types/plugin.types.d.ts +48 -0
  612. package/dist/types/types/selection.d.ts +178 -0
  613. package/dist/types/types/theme.d.ts +7 -0
  614. package/dist/types/types/viewport.interfaces.d.ts +45 -0
  615. package/dist/types/utils/batchGroupCollapse.d.ts +77 -0
  616. package/dist/types/utils/browser.d.ts +1 -0
  617. package/dist/types/utils/cell-template-helper.d.ts +74 -0
  618. package/dist/types/utils/closest.polifill.d.ts +0 -0
  619. package/dist/types/utils/column.utils.d.ts +110 -0
  620. package/dist/types/utils/consts.d.ts +22 -0
  621. package/dist/types/utils/events.d.ts +5 -0
  622. package/dist/types/utils/header.utils.d.ts +2 -0
  623. package/dist/types/utils/index.d.ts +32 -0
  624. package/dist/types/utils/key.codes.d.ts +73 -0
  625. package/dist/types/utils/key.utils.d.ts +12 -0
  626. package/dist/types/utils/mobile.d.ts +1 -0
  627. package/dist/types/utils/platform.d.ts +4 -0
  628. package/dist/types/utils/row-header-utils.d.ts +2 -0
  629. package/dist/types/utils/store.types.d.ts +97 -0
  630. package/dist/types/utils/store.utils.d.ts +10 -0
  631. package/hydrate/index.d.ts +273 -0
  632. package/hydrate/index.js +39851 -0
  633. package/hydrate/index.mjs +39843 -0
  634. package/hydrate/package.json +12 -0
  635. package/loader/cdn.js +4 -0
  636. package/loader/index.cjs.js +4 -0
  637. package/loader/index.d.ts +24 -0
  638. package/loader/index.es2017.js +4 -0
  639. package/loader/index.js +5 -0
  640. package/package.json +149 -0
  641. package/readme.md +303 -0
  642. package/standalone/column.service.js +1110 -0
  643. package/standalone/column.service.js.map +1 -0
  644. package/standalone/consts.js +30 -0
  645. package/standalone/consts.js.map +1 -0
  646. package/standalone/data.store.js +3101 -0
  647. package/standalone/data.store.js.map +1 -0
  648. package/standalone/debounce.js +215 -0
  649. package/standalone/debounce.js.map +1 -0
  650. package/standalone/dimension.helpers.js +229 -0
  651. package/standalone/dimension.helpers.js.map +1 -0
  652. package/standalone/filter.button.js +39 -0
  653. package/standalone/filter.button.js.map +1 -0
  654. package/standalone/grouping.service.js +234 -0
  655. package/standalone/grouping.service.js.map +1 -0
  656. package/standalone/header-group-renderer.js +634 -0
  657. package/standalone/header-group-renderer.js.map +1 -0
  658. package/standalone/index.d.ts +72 -0
  659. package/standalone/index.js +6272 -0
  660. package/standalone/index.js.map +1 -0
  661. package/standalone/index2.js +131 -0
  662. package/standalone/index2.js.map +1 -0
  663. package/standalone/local.scroll.timer.js +222 -0
  664. package/standalone/local.scroll.timer.js.map +1 -0
  665. package/standalone/platform.js +90 -0
  666. package/standalone/platform.js.map +1 -0
  667. package/standalone/revo-grid.d.ts +11 -0
  668. package/standalone/revo-grid.js +8734 -0
  669. package/standalone/revo-grid.js.map +1 -0
  670. package/standalone/revogr-attribution.d.ts +11 -0
  671. package/standalone/revogr-attribution.js +12 -0
  672. package/standalone/revogr-attribution.js.map +1 -0
  673. package/standalone/revogr-attribution2.js +32 -0
  674. package/standalone/revogr-attribution2.js.map +1 -0
  675. package/standalone/revogr-clipboard.d.ts +11 -0
  676. package/standalone/revogr-clipboard.js +12 -0
  677. package/standalone/revogr-clipboard.js.map +1 -0
  678. package/standalone/revogr-clipboard2.js +179 -0
  679. package/standalone/revogr-clipboard2.js.map +1 -0
  680. package/standalone/revogr-data.d.ts +11 -0
  681. package/standalone/revogr-data.js +12 -0
  682. package/standalone/revogr-data.js.map +1 -0
  683. package/standalone/revogr-data2.js +503 -0
  684. package/standalone/revogr-data2.js.map +1 -0
  685. package/standalone/revogr-edit.d.ts +11 -0
  686. package/standalone/revogr-edit.js +12 -0
  687. package/standalone/revogr-edit.js.map +1 -0
  688. package/standalone/revogr-edit2.js +330 -0
  689. package/standalone/revogr-edit2.js.map +1 -0
  690. package/standalone/revogr-extra.d.ts +11 -0
  691. package/standalone/revogr-extra.js +12 -0
  692. package/standalone/revogr-extra.js.map +1 -0
  693. package/standalone/revogr-extra2.js +73 -0
  694. package/standalone/revogr-extra2.js.map +1 -0
  695. package/standalone/revogr-filter-panel.d.ts +11 -0
  696. package/standalone/revogr-filter-panel.js +411 -0
  697. package/standalone/revogr-filter-panel.js.map +1 -0
  698. package/standalone/revogr-focus.d.ts +11 -0
  699. package/standalone/revogr-focus.js +12 -0
  700. package/standalone/revogr-focus.js.map +1 -0
  701. package/standalone/revogr-focus2.js +119 -0
  702. package/standalone/revogr-focus2.js.map +1 -0
  703. package/standalone/revogr-grouping-overlay.d.ts +11 -0
  704. package/standalone/revogr-grouping-overlay.js +12 -0
  705. package/standalone/revogr-grouping-overlay.js.map +1 -0
  706. package/standalone/revogr-grouping-overlay2.js +356 -0
  707. package/standalone/revogr-grouping-overlay2.js.map +1 -0
  708. package/standalone/revogr-header-unified.d.ts +11 -0
  709. package/standalone/revogr-header-unified.js +12 -0
  710. package/standalone/revogr-header-unified.js.map +1 -0
  711. package/standalone/revogr-header-unified2.js +781 -0
  712. package/standalone/revogr-header-unified2.js.map +1 -0
  713. package/standalone/revogr-header.d.ts +11 -0
  714. package/standalone/revogr-header.js +12 -0
  715. package/standalone/revogr-header.js.map +1 -0
  716. package/standalone/revogr-header2.js +343 -0
  717. package/standalone/revogr-header2.js.map +1 -0
  718. package/standalone/revogr-order-editor.d.ts +11 -0
  719. package/standalone/revogr-order-editor.js +12 -0
  720. package/standalone/revogr-order-editor.js.map +1 -0
  721. package/standalone/revogr-order-editor2.js +201 -0
  722. package/standalone/revogr-order-editor2.js.map +1 -0
  723. package/standalone/revogr-overlay-selection.d.ts +11 -0
  724. package/standalone/revogr-overlay-selection.js +12 -0
  725. package/standalone/revogr-overlay-selection.js.map +1 -0
  726. package/standalone/revogr-overlay-selection2.js +1068 -0
  727. package/standalone/revogr-overlay-selection2.js.map +1 -0
  728. package/standalone/revogr-row-headers.d.ts +11 -0
  729. package/standalone/revogr-row-headers.js +12 -0
  730. package/standalone/revogr-row-headers.js.map +1 -0
  731. package/standalone/revogr-row-headers2.js +625 -0
  732. package/standalone/revogr-row-headers2.js.map +1 -0
  733. package/standalone/revogr-scroll-virtual.d.ts +11 -0
  734. package/standalone/revogr-scroll-virtual.js +12 -0
  735. package/standalone/revogr-scroll-virtual.js.map +1 -0
  736. package/standalone/revogr-scroll-virtual2.js +235 -0
  737. package/standalone/revogr-scroll-virtual2.js.map +1 -0
  738. package/standalone/revogr-temp-range.d.ts +11 -0
  739. package/standalone/revogr-temp-range.js +12 -0
  740. package/standalone/revogr-temp-range.js.map +1 -0
  741. package/standalone/revogr-temp-range2.js +93 -0
  742. package/standalone/revogr-temp-range2.js.map +1 -0
  743. package/standalone/revogr-viewport-scroll.d.ts +11 -0
  744. package/standalone/revogr-viewport-scroll.js +12 -0
  745. package/standalone/revogr-viewport-scroll.js.map +1 -0
  746. package/standalone/revogr-viewport-scroll2.js +761 -0
  747. package/standalone/revogr-viewport-scroll2.js.map +1 -0
  748. package/standalone/row-renderer.js +41 -0
  749. package/standalone/row-renderer.js.map +1 -0
  750. package/standalone/selection.utils.js +179 -0
  751. package/standalone/selection.utils.js.map +1 -0
  752. package/standalone/throttle.js +75 -0
  753. package/standalone/throttle.js.map +1 -0
  754. package/standalone/toNumber.js +282 -0
  755. package/standalone/toNumber.js.map +1 -0
  756. package/standalone/vnode-converter.js +46 -0
  757. package/standalone/vnode-converter.js.map +1 -0
  758. package/standalone/vnode-html.d.ts +11 -0
  759. package/standalone/vnode-html.js +12 -0
  760. package/standalone/vnode-html.js.map +1 -0
@@ -0,0 +1,2629 @@
1
+ /*!
2
+ * Built by Revolist OU ❤️
3
+ */
4
+ 'use strict';
5
+
6
+ var index = require('./index-BF1c1pO3.js');
7
+ var dimension_helpers = require('./dimension.helpers-DA9-xqPT.js');
8
+ var events = require('./events-DeLDyZlb.js');
9
+ var headerCellRenderer = require('./header-cell-renderer-D-RjAVfe.js');
10
+ var grouping_row_renderer = require('./grouping.row.renderer-BqR0ytMi.js');
11
+ var throttle = require('./throttle-2ZxfGjEI.js');
12
+ var edit_utils = require('./edit.utils-CKsIiHlD.js');
13
+ var debounce = require('./debounce-CcpHiH2p.js');
14
+ var viewport_store = require('./viewport.store-BTbPlyF-.js');
15
+ var viewport_helpers = require('./viewport.helpers-BAovztDd.js');
16
+ require('./row-renderer-BTE7VKD9.js');
17
+ require('./filter.button-DSsWNs23.js');
18
+
19
+ const Attribution = class {
20
+ constructor(hostRef) {
21
+ index.registerInstance(this, hostRef);
22
+ }
23
+ render() {
24
+ return (index.h(index.Host, { key: '3d66475a019010c24b6c610ccc047e01c35178f9' }, index.h("a", { key: '777afddffef0309a697b9c14ee73c0001ac22b71', href: "https://rv-grid.com/guide/attribution", target: "_blank", rel: "noopener noreferrer", title: "Made with \u2764\uFE0F by Revolist OU Team", class: "value" }, "RevoGrid")));
25
+ }
26
+ };
27
+
28
+ const RevoGridExtra = class {
29
+ constructor(hostRef) {
30
+ index.registerInstance(this, hostRef);
31
+ /**
32
+ * Nodes to render
33
+ */
34
+ this.nodes = [];
35
+ /**
36
+ * Force component to re-render
37
+ */
38
+ this.update = 1;
39
+ }
40
+ /**
41
+ * Refreshes the extra component. Useful if you want to manually
42
+ * force the component to re-render.
43
+ */
44
+ async refresh() {
45
+ this.update *= -1;
46
+ }
47
+ render() {
48
+ var _a;
49
+ return (_a = this.nodes) === null || _a === void 0 ? void 0 : _a.map(node => {
50
+ // Check if node is a function or a stencil component
51
+ // If function wrap it in a stencil component with the refresh function
52
+ if (typeof node === 'function') {
53
+ const config = {};
54
+ const getNodes = () => [node({ refresh: () => { var _a; return (_a = config.refresh) === null || _a === void 0 ? void 0 : _a.call(config); } })];
55
+ return (index.h("revogr-extra", { nodes: getNodes(), ref: (el) => {
56
+ if (el) {
57
+ // Update exclusively for current node
58
+ config.refresh = () => {
59
+ el.nodes = getNodes();
60
+ };
61
+ }
62
+ } }));
63
+ }
64
+ return node;
65
+ });
66
+ }
67
+ };
68
+
69
+ function collectModelsOfRange(data, store) {
70
+ const models = {};
71
+ for (let i in data) {
72
+ const rowIndex = parseInt(i, 10);
73
+ models[rowIndex] = dimension_helpers.getSourceItem(store, rowIndex);
74
+ }
75
+ return models;
76
+ }
77
+ function getFocusCellBasedOnEvent(e, data) {
78
+ // If event default is prevented, return
79
+ if (e.defaultPrevented) {
80
+ return null;
81
+ }
82
+ // Get coordinates from event object
83
+ const x = events.getPropertyFromEvent(e, 'clientX');
84
+ const y = events.getPropertyFromEvent(e, 'clientY');
85
+ // If coordinates are not available, return
86
+ if (x === null || y === null) {
87
+ return null;
88
+ }
89
+ // Get current cell based on coordinates and data
90
+ const focusCell = getCurrentCell({ x, y }, data);
91
+ // If current cell is not available, return
92
+ if (isAfterLast(focusCell, data.lastCell)) {
93
+ return null;
94
+ }
95
+ return focusCell;
96
+ }
97
+ /**
98
+ * Calculate cell based on x, y position
99
+ */
100
+ function getCurrentCell({ x, y }, { el, rows, cols }) {
101
+ // Get the bounding rectangle of the element
102
+ const { top, left, height, width } = el.getBoundingClientRect();
103
+ // Calculate the cell position relative to the element
104
+ let cellY = y - top;
105
+ let cellX = x - left;
106
+ // Limit the cell position to the element height
107
+ if (cellY >= height) {
108
+ cellY = height - 1;
109
+ }
110
+ // Limit the cell position to the element width
111
+ if (cellX >= width) {
112
+ cellX = width - 1;
113
+ }
114
+ // Get the row and column items based on the cell position
115
+ const rgRow = dimension_helpers.getItemByPosition(rows, cellY);
116
+ const rgCol = dimension_helpers.getItemByPosition(cols, cellX);
117
+ // Set the row and column index to 0 if they are before the first item
118
+ if (rgCol.itemIndex < 0) {
119
+ rgCol.itemIndex = 0;
120
+ }
121
+ if (rgRow.itemIndex < 0) {
122
+ rgRow.itemIndex = 0;
123
+ }
124
+ return { x: rgCol.itemIndex, y: rgRow.itemIndex };
125
+ }
126
+ function getCoordinate(range, focus, changes, isMulti = false) {
127
+ const updateCoordinate = (c, pos = 0) => {
128
+ const start = { x: range.x, y: range.y };
129
+ const end = isMulti ? { x: range.x1, y: range.y1 } : start;
130
+ const point = end[c] > focus[c] ? end : start;
131
+ point[c] += pos;
132
+ return { start, end };
133
+ };
134
+ if (changes.x) {
135
+ return updateCoordinate('x', changes['x']);
136
+ }
137
+ if (changes.y) {
138
+ return updateCoordinate('y', changes['y']);
139
+ }
140
+ return null;
141
+ }
142
+ /**
143
+ * Check if the x coordinate of the cell position is after or equal to the x coordinate of the last cell position
144
+ * or if the y coordinate of the cell position is after or equal to the y coordinate of the last cell position
145
+ */
146
+ function isAfterLast({ x, y }, lastCell) {
147
+ return x >= lastCell.x || y >= lastCell.y;
148
+ }
149
+ /** check if out of range */
150
+ function isBeforeFirst({ x, y }) {
151
+ return x < 0 || y < 0;
152
+ }
153
+ /** Compare cells, only 1 coordinate difference is possible */
154
+ // export function getDirectionCoordinate(initial: Cell, last: Cell): Partial<Cell> | null {
155
+ // const c: (keyof Cell)[] = ['x', 'y'];
156
+ // for (let k of c) {
157
+ // if (initial[k] !== last[k]) {
158
+ // return { [k]: 1 };
159
+ // }
160
+ // }
161
+ // return null;
162
+ // }
163
+ // export function getLargestAxis(initial: Cell, last: Cell): Partial<Cell> | null {
164
+ // const cell: Partial<Cell> = {};
165
+ // const c: (keyof Cell)[] = ['x', 'y'];
166
+ // for (let k of c) {
167
+ // cell[k] = Math.abs(initial[k] - last[k]);
168
+ // }
169
+ // if (cell.x > cell.y) {
170
+ // return { x: 1 };
171
+ // }
172
+ // if (cell.y > cell.x) {
173
+ // return { y: 1 };
174
+ // }
175
+ // return null;
176
+ // }
177
+ function styleByCellProps(styles) {
178
+ return {
179
+ left: `${styles.left}px`,
180
+ top: `${styles.top}px`,
181
+ width: `${styles.width}px`,
182
+ height: `${styles.height}px`,
183
+ };
184
+ }
185
+ function getCell({ x, y, x1, y1 }, dimensionRow, dimensionCol) {
186
+ const top = dimension_helpers.getItemByIndex(dimensionRow, y).start;
187
+ const left = dimension_helpers.getItemByIndex(dimensionCol, x).start;
188
+ const bottom = dimension_helpers.getItemByIndex(dimensionRow, y1).end;
189
+ const right = dimension_helpers.getItemByIndex(dimensionCol, x1).end;
190
+ return {
191
+ left,
192
+ right,
193
+ top,
194
+ bottom,
195
+ width: right - left,
196
+ height: bottom - top,
197
+ };
198
+ }
199
+
200
+ const revogrFocusStyleCss = "revogr-focus.focused-cell{box-shadow:-1px 0 0 #0d63e8 inset, 1px 0 0 #0d63e8 inset, 0 -1px 0 #0d63e8 inset, 0 1px 0 #0d63e8 inset;position:absolute;pointer-events:none;z-index:9;display:block !important}";
201
+
202
+ const RevogrFocus$1 = class RevogrFocus {
203
+ constructor(hostRef) {
204
+ index.registerInstance(this, hostRef);
205
+ this.beforeFocusRender = index.createEvent(this, "beforefocusrender", 7);
206
+ this.beforeScrollIntoView = index.createEvent(this, "beforescrollintoview", 7);
207
+ this.afterFocus = index.createEvent(this, "afterfocus", 7);
208
+ /**
209
+ * Auto scroll to focused cell. When true, the grid will automatically scroll to make the focused cell visible.
210
+ * @default false
211
+ */
212
+ this.autoScrollToFocus = false;
213
+ /**
214
+ * Focus template custom function. Can be used to render custom focus layer.
215
+ */
216
+ this.focusTemplate = null;
217
+ this.activeFocus = null;
218
+ }
219
+ componentDidRender() {
220
+ var _a, _b;
221
+ const currentFocus = this.selectionStore.get('focus');
222
+ if (((_a = this.activeFocus) === null || _a === void 0 ? void 0 : _a.x) === (currentFocus === null || currentFocus === void 0 ? void 0 : currentFocus.x) &&
223
+ ((_b = this.activeFocus) === null || _b === void 0 ? void 0 : _b.y) === (currentFocus === null || currentFocus === void 0 ? void 0 : currentFocus.y)) {
224
+ return;
225
+ }
226
+ this.activeFocus = currentFocus;
227
+ if (currentFocus && this.el) {
228
+ const beforeScrollIn = this.beforeScrollIntoView.emit({ el: this.el });
229
+ // 只有在 autoScrollToFocus 为 true 时才执行自动滚动
230
+ if (this.autoScrollToFocus && !beforeScrollIn.defaultPrevented) {
231
+ this.el.scrollIntoView({
232
+ block: 'nearest',
233
+ inline: 'nearest',
234
+ });
235
+ }
236
+ const model = dimension_helpers.getSourceItem(this.dataStore, currentFocus.y);
237
+ const column = dimension_helpers.getSourceItem(this.colData, currentFocus.x);
238
+ this.afterFocus.emit({
239
+ model,
240
+ column,
241
+ rowType: this.rowType,
242
+ colType: this.colType,
243
+ rowIndex: currentFocus.y,
244
+ colIndex: currentFocus.x,
245
+ });
246
+ }
247
+ }
248
+ render() {
249
+ var _a;
250
+ const editCell = this.selectionStore.get('edit');
251
+ if (editCell) {
252
+ return;
253
+ }
254
+ const focusCell = this.selectionStore.get('focus');
255
+ if (!focusCell) {
256
+ return;
257
+ }
258
+ const event = this.beforeFocusRender.emit({
259
+ range: Object.assign(Object.assign({}, focusCell), { x1: focusCell.x, y1: focusCell.y }),
260
+ rowType: this.rowType,
261
+ colType: this.colType,
262
+ rowDimension: Object.assign({}, this.dimensionRow.state),
263
+ colDimension: Object.assign({}, this.dimensionCol.state),
264
+ });
265
+ if (event.defaultPrevented) {
266
+ return index.h("slot", null);
267
+ }
268
+ const { detail } = event;
269
+ const cell = getCell(detail.range, event.detail.rowDimension, event.detail.colDimension);
270
+ const styles = styleByCellProps(cell);
271
+ const extra = (_a = this.focusTemplate) === null || _a === void 0 ? void 0 : _a.call(this, index.h, detail);
272
+ const props = {
273
+ class: { [dimension_helpers.FOCUS_CLASS]: true },
274
+ style: styles,
275
+ };
276
+ return (index.h(index.Host, Object.assign({}, props), index.h("slot", null), extra));
277
+ }
278
+ get el() { return index.getElement(this); }
279
+ };
280
+ RevogrFocus$1.style = revogrFocusStyleCss;
281
+
282
+ const revogrGroupingOverlayCss = ":host{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;overflow:hidden}.grouping-overlay-viewport .header-wrapper>div{box-shadow:0 -1px 0 var(--rg-cell-border-color, #e0e0e0) inset}.grouping-rows-container{position:absolute;top:0;left:0;width:100%;height:100%}.grouping-rows-container .groupingRow{position:absolute;pointer-events:auto;width:100%;font-weight:600;text-align:left;mix-blend-mode:normal;z-index:1;transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.grouping-rows-container .groupingRow .group-expand{width:25px;height:100%;max-height:25px;margin-right:2px;background-color:transparent;border-color:transparent;vertical-align:middle;padding-left:5px;display:inline-flex;cursor:pointer}.grouping-rows-container .groupingRow .group-expand svg{width:7px}.grouping-rows-container .rgRow{border-bottom:1px solid var(--rg-cell-border-color, #e0e0e0)}.grouping-rows-container .dataRow{position:absolute;width:100%;box-sizing:border-box;background-color:transparent !important;pointer-events:auto;z-index:0;transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}";
283
+
284
+ const RevogrGroupingOverlay = class {
285
+ constructor(hostRef) {
286
+ index.registerInstance(this, hostRef);
287
+ this.type = 'rgRow';
288
+ this.colType = 'rgCol';
289
+ this.groupRows = [];
290
+ this.dataRows = [];
291
+ this.unsubscribers = [];
292
+ // ==================== 性能优化:缓存和节流 ====================
293
+ /** 缓存的选中行索引 */
294
+ this.cachedSelectedIndices = new Set();
295
+ /** 上次解析的选中行属性值 */
296
+ this.lastSelectedRowsAttr = null;
297
+ /** 上次的 viewport items 引用(用于变化检测) */
298
+ this.lastRowItems = null;
299
+ /** 上次的 col items 引用 */
300
+ this.lastColItems = null;
301
+ /** RAF 节流标记 */
302
+ this.updateScheduled = false;
303
+ /** MutationObserver 用于监听选中状态变化 */
304
+ this.selectionObserver = null;
305
+ // ==================== Resize 优化 ====================
306
+ /** ResizeObserver 用于监听表格宽度变化 */
307
+ this.resizeObserver = null;
308
+ }
309
+ onDataChange() {
310
+ this.scheduleUpdate();
311
+ }
312
+ /**
313
+ * 刷新分组行显示,用于选中状态变化后更新选中数量
314
+ */
315
+ async refresh() {
316
+ // 强制刷新时清除缓存
317
+ this.lastSelectedRowsAttr = null;
318
+ this.updateGroupRowsImmediate(true);
319
+ }
320
+ connectedCallback() {
321
+ this.providers = {
322
+ type: this.type,
323
+ colType: this.colType,
324
+ readonly: true,
325
+ data: this.dataStore,
326
+ columns: this.colData,
327
+ viewport: this.viewportCol,
328
+ dimension: this.dimensionRow,
329
+ selection: null,
330
+ };
331
+ // 数据变化时的处理函数
332
+ const onDataUpdate = () => {
333
+ this.scheduleUpdate();
334
+ };
335
+ if (this.viewportRow) {
336
+ this.unsubscribers.push(this.viewportRow.onChange('items', onDataUpdate));
337
+ }
338
+ if (this.dataStore) {
339
+ this.unsubscribers.push(this.dataStore.onChange('source', () => {
340
+ // 数据源变化时清除缓存
341
+ this.lastRowItems = null;
342
+ this.scheduleUpdate();
343
+ }));
344
+ }
345
+ if (this.viewportCol) {
346
+ this.unsubscribers.push(this.viewportCol.onChange('items', onDataUpdate));
347
+ }
348
+ // 监听选中状态变化
349
+ this.setupSelectionObserver();
350
+ // 监听表格宽度变化
351
+ this.setupResizeObserver();
352
+ this.updateGroupRowsImmediate(false);
353
+ }
354
+ disconnectedCallback() {
355
+ var _a, _b;
356
+ this.unsubscribers.forEach(unsub => unsub());
357
+ (_a = this.selectionObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
358
+ this.selectionObserver = null;
359
+ (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.disconnect();
360
+ this.resizeObserver = null;
361
+ }
362
+ /**
363
+ * 设置 ResizeObserver 监听表格宽度变化
364
+ */
365
+ setupResizeObserver() {
366
+ const revogrid = this.element.closest('revo-grid');
367
+ if (!revogrid)
368
+ return;
369
+ this.resizeObserver = new ResizeObserver(() => {
370
+ // 立即更新,不使用防抖
371
+ this.scheduleUpdate();
372
+ });
373
+ this.resizeObserver.observe(revogrid);
374
+ }
375
+ /**
376
+ * 设置 MutationObserver 监听选中状态变化
377
+ */
378
+ setupSelectionObserver() {
379
+ const revogrid = this.element.closest('revo-grid');
380
+ if (!revogrid)
381
+ return;
382
+ this.selectionObserver = new MutationObserver((mutations) => {
383
+ for (const mutation of mutations) {
384
+ if (mutation.attributeName === 'data-selected-rows' ||
385
+ mutation.attributeName === 'data-selected-rg-rows') {
386
+ // 选中状态变化,更新缓存并刷新
387
+ this.updateSelectedIndicesCache();
388
+ this.scheduleUpdate();
389
+ break;
390
+ }
391
+ }
392
+ });
393
+ this.selectionObserver.observe(revogrid, {
394
+ attributes: true,
395
+ attributeFilter: ['data-selected-rows', 'data-selected-rg-rows'],
396
+ });
397
+ }
398
+ /**
399
+ * 使用 RAF 节流的更新调度
400
+ */
401
+ scheduleUpdate() {
402
+ if (this.updateScheduled)
403
+ return;
404
+ this.updateScheduled = true;
405
+ requestAnimationFrame(() => {
406
+ this.updateScheduled = false;
407
+ this.updateGroupRowsImmediate(false);
408
+ });
409
+ }
410
+ /**
411
+ * 更新选中行索引缓存
412
+ */
413
+ updateSelectedIndicesCache() {
414
+ const revogrid = this.element.closest('revo-grid');
415
+ if (!revogrid) {
416
+ this.cachedSelectedIndices.clear();
417
+ this.lastSelectedRowsAttr = null;
418
+ return;
419
+ }
420
+ const selectedRowsAttr = revogrid.getAttribute('data-selected-rg-rows') ||
421
+ revogrid.getAttribute('data-selected-rows');
422
+ // 如果属性值没变,直接返回
423
+ if (selectedRowsAttr === this.lastSelectedRowsAttr) {
424
+ return;
425
+ }
426
+ this.lastSelectedRowsAttr = selectedRowsAttr;
427
+ this.cachedSelectedIndices.clear();
428
+ if (selectedRowsAttr) {
429
+ try {
430
+ const indices = JSON.parse(selectedRowsAttr);
431
+ if (Array.isArray(indices)) {
432
+ for (let i = 0; i < indices.length; i++) {
433
+ this.cachedSelectedIndices.add(indices[i]);
434
+ }
435
+ }
436
+ }
437
+ catch (e) {
438
+ // 忽略解析错误
439
+ }
440
+ }
441
+ }
442
+ /**
443
+ * 获取选中行索引(使用缓存)
444
+ */
445
+ getSelectedRowIndices() {
446
+ // 首次调用或缓存失效时更新
447
+ if (this.lastSelectedRowsAttr === null) {
448
+ this.updateSelectedIndicesCache();
449
+ }
450
+ return this.cachedSelectedIndices;
451
+ }
452
+ /**
453
+ * 立即更新分组行(带变化检测)
454
+ * @param forceUpdate 是否强制更新,忽略变化检测
455
+ */
456
+ async updateGroupRowsImmediate(forceUpdate = false) {
457
+ if (!this.dataStore || !this.viewportRow || !this.viewportCol) {
458
+ if (this.groupRows.length || this.dataRows.length) {
459
+ this.groupRows = [];
460
+ this.dataRows = [];
461
+ }
462
+ return;
463
+ }
464
+ const rows = this.viewportRow.get('items');
465
+ const cols = this.viewportCol.get('items');
466
+ // 变化检测:如果 items 引用没变且不是强制更新,跳过更新
467
+ if (!forceUpdate && rows === this.lastRowItems && cols === this.lastColItems) {
468
+ return;
469
+ }
470
+ this.lastRowItems = rows;
471
+ this.lastColItems = cols;
472
+ if (!rows.length) {
473
+ if (this.groupRows.length || this.dataRows.length) {
474
+ this.groupRows = [];
475
+ this.dataRows = [];
476
+ }
477
+ return;
478
+ }
479
+ const groupingCustomRenderer = this.dataStore.get('groupingCustomRenderer');
480
+ // 即使 cols 为空(所有列都冻结),也要渲染分组行
481
+ const firstCol = cols[0] || { start: 0, end: 0, size: 0, itemIndex: 0 };
482
+ // 使用缓存的选中行索引
483
+ const selectedRowIndices = this.getSelectedRowIndices();
484
+ // 获取当前可见的物理索引数组
485
+ const dataItems = this.dataStore.get('items');
486
+ const groupRowsData = [];
487
+ const dataRowsData = [];
488
+ for (let i = 0; i < rows.length; i++) {
489
+ const rgRow = rows[i];
490
+ const dataItem = dimension_helpers.getSourceItem(this.dataStore, rgRow.itemIndex);
491
+ if (!dataItem) {
492
+ continue;
493
+ }
494
+ const physicalIndex = dataItems[rgRow.itemIndex];
495
+ if (headerCellRenderer.isGrouping(dataItem)) {
496
+ const groupName = dataItem[headerCellRenderer.PSEUDO_GROUP_ITEM];
497
+ if (!groupName) {
498
+ this.groupRows = [];
499
+ this.dataRows = [];
500
+ return;
501
+ }
502
+ groupRowsData.push(Object.assign(Object.assign({}, rgRow), { index: rgRow.itemIndex, model: dataItem, groupingCustomRenderer, hasExpand: true, columnItems: [firstCol], providers: this.providers, getGroupSelection: this.getGroupSelection, paddingDepth: this.paddingDepth }));
503
+ }
504
+ else {
505
+ const isSelected = physicalIndex !== undefined && selectedRowIndices.has(physicalIndex);
506
+ dataRowsData.push(Object.assign(Object.assign({}, rgRow), { selected: isSelected }));
507
+ }
508
+ }
509
+ this.groupRows = groupRowsData;
510
+ this.dataRows = dataRowsData;
511
+ }
512
+ render() {
513
+ // 只有当既没有分组行也没有数据行时才不渲染
514
+ if (!this.groupRows.length && !this.dataRows.length) {
515
+ return null;
516
+ }
517
+ return (index.h(index.Host, null, index.h("div", { class: "grouping-rows-container" }, this.groupRows.map(rowProps => (index.h(grouping_row_renderer.GroupingRowRenderer, Object.assign({}, rowProps, { key: `group-${rowProps.itemIndex}` })))), this.dataRows.map(row => {
518
+ const attrs = {
519
+ class: 'rgRow dataRow',
520
+ key: `data-${row.itemIndex}`,
521
+ style: {
522
+ height: `${row.size}px`,
523
+ transform: `translateY(${row.start}px)`,
524
+ },
525
+ 'data-rgRow': row.itemIndex,
526
+ };
527
+ if (row.selected) {
528
+ attrs.selected = '';
529
+ }
530
+ return index.h("div", Object.assign({}, attrs));
531
+ }))));
532
+ }
533
+ get element() { return index.getElement(this); }
534
+ static get watchers() { return {
535
+ "dataStore": ["onDataChange"],
536
+ "viewportRow": ["onDataChange"],
537
+ "viewportCol": ["onDataChange"]
538
+ }; }
539
+ };
540
+ RevogrGroupingOverlay.style = revogrGroupingOverlayCss;
541
+
542
+ const revogrHeaderUnifiedStyleCss = "@charset \"UTF-8\";revogr-header-unified{display:flex;flex-direction:row;width:100%;position:absolute;top:0;left:0;right:0;z-index:5;pointer-events:none;background:transparent}revogr-header-unified .header-area{position:relative;display:block;pointer-events:auto;background:var(--revo-grid-header-bg, #f8f9fa);z-index:5;box-shadow:-1px 0 0 0 var(--revo-grid-header-border), -1px 0 0 0 var(--revo-grid-header-border) inset, 0 -1px 0 0 var(--revo-grid-header-border) inset, 0 -1px 0 0 var(--revo-grid-header-border)}revogr-header-unified .header-area .group-rgRow,revogr-header-unified .header-area .header-rgRow{display:block;position:relative}revogr-header-unified .header-area .group-rgRow{z-index:2;overflow:visible}revogr-header-unified .header-area .group-rgRow .rgHeaderCell.merged-header{z-index:5;top:0;align-items:center}revogr-header-unified .header-area .group-rgRow.header-rgRow.group{box-shadow:0 -1px 0 0 var(--revo-grid-header-border) inset}revogr-header-unified .header-area .header-rgRow.group{z-index:0}revogr-header-unified .header-area .header-rgRow:not(.group){box-shadow:0 -1px 0 0 var(--revo-grid-header-border), 0 -1px 0 0 var(--revo-grid-header-border) inset}revogr-header-unified .header-area .header-rgRow.actual-rgRow{z-index:1}revogr-header-unified .header-area .rgHeaderCell{position:absolute;box-sizing:border-box;height:100%;z-index:1;display:flex;user-select:text}revogr-header-unified .header-area .rgHeaderCell:has(.resizable-r:hover),revogr-header-unified .header-area .rgHeaderCell:has(.resizable-l:hover){z-index:92}revogr-header-unified .header-area .rgHeaderCell.group-header{text-align:center}revogr-header-unified .header-area .rgHeaderCell.align-center{text-align:center}revogr-header-unified .header-area .rgHeaderCell.align-left{text-align:left}revogr-header-unified .header-area .rgHeaderCell.align-right{text-align:right}revogr-header-unified .header-area .rgHeaderCell.sortable{cursor:pointer}revogr-header-unified .header-area .rgHeaderCell i.asc:after,revogr-header-unified .header-area .rgHeaderCell i.desc:after{font-size:13px}revogr-header-unified .header-area .rgHeaderCell i.asc:after{content:\"↑\"}revogr-header-unified .header-area .rgHeaderCell i.desc:after{content:\"↓\"}revogr-header-unified .header-area .rgHeaderCell.active{z-index:10}revogr-header-unified .header-area .rgHeaderCell.active .resizable{background-color:deepskyblue}revogr-header-unified .header-area .rgHeaderCell .header-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}revogr-header-unified .header-area .rgHeaderCell .resizable{display:block;position:absolute;z-index:90;touch-action:none;user-select:none;pointer-events:auto}revogr-header-unified .header-area .rgHeaderCell .resizable:not(.resizable-r):not(.resizable-l):hover{background-color:deepskyblue}revogr-header-unified .header-area .rgHeaderCell>.resizable-r{cursor:col-resize;width:14px;right:-7px;top:0;height:100%;background-color:transparent !important}revogr-header-unified .header-area .rgHeaderCell>.resizable-r::after{content:\"\";position:absolute;left:50%;transform:translateX(-50%);top:0;width:2px;min-width:2px;max-width:2px;height:100%;background-color:transparent;z-index:100}revogr-header-unified .header-area .rgHeaderCell>.resizable-l{cursor:col-resize;width:14px;left:-7px;height:100%;top:0;background-color:transparent !important}revogr-header-unified .header-area .rgHeaderCell>.resizable-l::after{content:\"\";position:absolute;left:50%;transform:translateX(-50%);top:0;width:2px;height:100%;background-color:transparent;z-index:100}revogr-header-unified .header-area .rgHeaderCell>.resizable-rb{cursor:se-resize;width:6px;height:6px;right:0;bottom:0}revogr-header-unified .header-area .rgHeaderCell>.resizable-b{cursor:s-resize;height:6px;bottom:0;width:100%;left:0}revogr-header-unified .header-area .rgHeaderCell>.resizable-lb{cursor:sw-resize;width:6px;height:6px;left:0;bottom:0}revogr-header-unified .header-area .rgHeaderCell>.resizable-lt{cursor:nw-resize;width:6px;height:6px;left:0;top:0}revogr-header-unified .header-area .rgHeaderCell>.resizable-t{cursor:n-resize;height:6px;top:0;width:100%;left:0}revogr-header-unified .header-area .rgHeaderCell>.resizable-rt{cursor:ne-resize;width:6px;height:6px;right:0;top:0}revogr-header-unified .header-area .rv-filter{visibility:hidden}revogr-header-unified .header-area-colPinStart{flex:0 0 auto;z-index:13}revogr-header-unified .header-area-rgCol{flex:0 1 auto;min-width:0;z-index:12;overflow-x:hidden;overflow-y:visible}revogr-header-unified .header-area-colPinEnd{flex:0 0 auto;z-index:13}";
543
+
544
+ const RevogrHeaderUnifiedComponent = class {
545
+ constructor(hostRef) {
546
+ index.registerInstance(this, hostRef);
547
+ this.initialHeaderClick = index.createEvent(this, "beforeheaderclick", 7);
548
+ this.headerresize = index.createEvent(this, "headerresize", 7);
549
+ this.beforeResize = index.createEvent(this, "beforeheaderresize", 7);
550
+ this.headerdblClick = index.createEvent(this, "headerdblclick", 7);
551
+ this.beforeHeaderRender = index.createEvent(this, "beforeheaderrender", 7);
552
+ this.beforeGroupHeaderRender = index.createEvent(this, "beforegroupheaderrender", 7);
553
+ this.afterHeaderRender = index.createEvent(this, "afterheaderrender", 7);
554
+ /**
555
+ * 强制刷新计数器,用于触发重新渲染
556
+ */
557
+ this.refreshCounter = 0;
558
+ this.rafScrollSyncId = null;
559
+ this.pendingScrollLeft = null;
560
+ this.lastAppliedScrollLeft = null;
561
+ this.scrollEndTimer = null;
562
+ this.mainViewportEl = null;
563
+ this.mainViewportResizeObserver = null;
564
+ this.rgColHeaderAreaEl = null;
565
+ this.rgColHeaderRows = [];
566
+ this.headerRowsNeedRefresh = true;
567
+ this.hasCachedBaseHeaderRowHeight = false;
568
+ this.cachedBaseHeaderRowHeight = null;
569
+ this.windowResizeHandler = null;
570
+ // 缓存扩展后的viewport items,用于在调整大小期间保持DOM稳定
571
+ this.cachedExpandedItems = new Map();
572
+ // 标记是否正在调整大小(不使用@State,避免触发重新渲染)
573
+ this.isResizingFlag = false;
574
+ // 缓存调整大小期间的areas,避免使用新的areas导致跳动
575
+ this.cachedAreas = null;
576
+ this.lastStableAreas = null;
577
+ // 定时器延迟时间(毫秒)
578
+ this.RESIZE_DEBOUNCE_TIME = 300;
579
+ }
580
+ setHeaderResizingState(active) {
581
+ const grid = this.gridElement || this.element.closest('revo-grid');
582
+ if (!grid) {
583
+ return;
584
+ }
585
+ const isActive = grid.hasAttribute('data-header-resizing');
586
+ if (active) {
587
+ if (!isActive) {
588
+ grid.setAttribute('data-header-resizing', '1');
589
+ }
590
+ return;
591
+ }
592
+ if (isActive) {
593
+ grid.removeAttribute('data-header-resizing');
594
+ grid.dispatchEvent(new CustomEvent('headerresizeend', {
595
+ bubbles: true,
596
+ }));
597
+ }
598
+ }
599
+ componentDidLoad() {
600
+ this.windowResizeHandler = () => {
601
+ this.hasCachedBaseHeaderRowHeight = false;
602
+ this.cachedBaseHeaderRowHeight = null;
603
+ this.scheduleHeaderScroll();
604
+ };
605
+ window.addEventListener('resize', this.windowResizeHandler, { passive: true });
606
+ // 延迟设置滚动同步,确保 viewport 元素已经渲染
607
+ setTimeout(() => {
608
+ this.setupScrollSync();
609
+ }, 100);
610
+ }
611
+ componentWillRender() {
612
+ var _a;
613
+ const grid = (_a = this.element) === null || _a === void 0 ? void 0 : _a.closest('revo-grid');
614
+ if (!grid || !grid.hasAttribute('data-columns-updating')) {
615
+ return;
616
+ }
617
+ // console.log('[header] wait columns update', {
618
+ // time: performance.now(),
619
+ // });
620
+ return new Promise(resolve => {
621
+ grid.addEventListener('columnsupdateend', () => {
622
+ // console.log('[header] columns update end', {
623
+ // time: performance.now(),
624
+ // });
625
+ resolve();
626
+ }, { once: true });
627
+ });
628
+ }
629
+ /**
630
+ * 公开方法:开始调整大小(用于自动列宽)
631
+ */
632
+ async startResizingForAutoSize(type) {
633
+ if (type === 'rgCol') {
634
+ const area = this.areas.find(area => area.type === type);
635
+ if (area) {
636
+ this.startResizing(area);
637
+ }
638
+ }
639
+ }
640
+ /**
641
+ * 公开方法:结束调整大小(用于自动列宽)
642
+ */
643
+ async endResizingForAutoSize() {
644
+ this.resetResizeTimer();
645
+ }
646
+ /**
647
+ * 公开方法:强制刷新表头(用于跨区域列宽同步)
648
+ * 当一个区域的列宽变化影响到另一个区域时调用
649
+ */
650
+ async forceRefresh() {
651
+ // 通过修改 @State 变量触发组件重新渲染
652
+ this.refreshCounter++;
653
+ }
654
+ disconnectedCallback() {
655
+ // 清理滚动监听器
656
+ if (this.gridElement && this.gridScrollHandler) {
657
+ this.gridElement.removeEventListener('viewportscroll', this.gridScrollHandler);
658
+ }
659
+ if (this.gridElement && this.enhancedScrollHandler) {
660
+ this.gridElement.removeEventListener('enhancedscrollsync', this.enhancedScrollHandler);
661
+ }
662
+ if (this.scrollHandler) {
663
+ const viewports = document.querySelectorAll('revogr-viewport-scroll.rgCol');
664
+ viewports.forEach(viewport => {
665
+ viewport.removeEventListener('scroll', this.scrollHandler);
666
+ });
667
+ }
668
+ if (this.rafScrollSyncId !== null) {
669
+ cancelAnimationFrame(this.rafScrollSyncId);
670
+ this.rafScrollSyncId = null;
671
+ }
672
+ if (this.scrollEndTimer !== null) {
673
+ clearTimeout(this.scrollEndTimer);
674
+ this.scrollEndTimer = null;
675
+ }
676
+ if (this.resizeTimer) {
677
+ clearTimeout(this.resizeTimer);
678
+ this.resizeTimer = undefined;
679
+ }
680
+ if (this.windowResizeHandler) {
681
+ window.removeEventListener('resize', this.windowResizeHandler);
682
+ this.windowResizeHandler = null;
683
+ }
684
+ if (this.mainViewportResizeObserver) {
685
+ this.mainViewportResizeObserver.disconnect();
686
+ this.mainViewportResizeObserver = null;
687
+ }
688
+ this.setHeaderResizingState(false);
689
+ }
690
+ /**
691
+ * 设置滚动同步
692
+ */
693
+ setupScrollSync() {
694
+ var _a;
695
+ if (!this.gridElement) {
696
+ this.gridElement =
697
+ this.element.closest('revo-grid') || undefined;
698
+ }
699
+ if (this.gridElement && !this.gridScrollHandler) {
700
+ this.gridScrollHandler = (e) => {
701
+ const detail = e.detail;
702
+ if (!detail || detail.dimension !== 'rgCol')
703
+ return;
704
+ this.scheduleHeaderScroll();
705
+ this.scheduleScrollEndSync();
706
+ };
707
+ this.gridElement.addEventListener('viewportscroll', this.gridScrollHandler);
708
+ }
709
+ if (this.gridElement && !this.enhancedScrollHandler) {
710
+ this.enhancedScrollHandler = (e) => {
711
+ const detail = e.detail;
712
+ if (!detail)
713
+ return;
714
+ this.scheduleHeaderScroll(detail.scrollLeft);
715
+ this.scheduleScrollEndSync();
716
+ };
717
+ this.gridElement.addEventListener('enhancedscrollsync', this.enhancedScrollHandler);
718
+ }
719
+ // 回退方案:直接监听 viewport 的 scroll 事件
720
+ this.scrollHandler = this.onViewportScroll.bind(this);
721
+ const viewports = document.querySelectorAll('revogr-viewport-scroll.rgCol');
722
+ this.mainViewportEl = (_a = this.gridElement) === null || _a === void 0 ? void 0 : _a.querySelector('revogr-viewport-scroll.rgCol:not(.grouping-overlay-viewport)');
723
+ if (this.mainViewportResizeObserver) {
724
+ this.mainViewportResizeObserver.disconnect();
725
+ this.mainViewportResizeObserver = null;
726
+ }
727
+ if (this.mainViewportEl) {
728
+ this.mainViewportResizeObserver = new ResizeObserver(() => {
729
+ this.syncHeaderTransformNow();
730
+ });
731
+ this.mainViewportResizeObserver.observe(this.mainViewportEl);
732
+ }
733
+ if (viewports.length === 0) {
734
+ // 如果还没找到,再延迟一次
735
+ setTimeout(() => this.setupScrollSync(), 200);
736
+ return;
737
+ }
738
+ viewports.forEach(viewport => {
739
+ viewport.addEventListener('scroll', this.scrollHandler);
740
+ });
741
+ // 初始化时同步一次,避免首次渲染有偏移
742
+ this.scheduleHeaderScroll();
743
+ }
744
+ /**
745
+ * Sync header translate with current rgCol scrollLeft immediately.
746
+ * Used during live resize to avoid one-frame lag between width update and transform update.
747
+ */
748
+ syncHeaderTransformNow() {
749
+ const scrollLeft = this.getMainViewportScrollLeft();
750
+ if (scrollLeft === null) {
751
+ return;
752
+ }
753
+ this.applyHeaderScroll(scrollLeft);
754
+ requestAnimationFrame(() => {
755
+ const latest = this.getMainViewportScrollLeft();
756
+ if (latest !== null) {
757
+ this.applyHeaderScroll(latest);
758
+ }
759
+ });
760
+ }
761
+ /**
762
+ * 处理 viewport 滚动事件
763
+ */
764
+ onViewportScroll(e) {
765
+ const viewport = e.target;
766
+ this.scheduleHeaderScroll(viewport.scrollLeft);
767
+ this.scheduleScrollEndSync();
768
+ }
769
+ scheduleHeaderScroll(scrollLeft) {
770
+ if (typeof scrollLeft === 'number') {
771
+ this.pendingScrollLeft = scrollLeft;
772
+ // 立即同步,减少快速滚动时的可见延迟
773
+ this.applyHeaderScroll(scrollLeft);
774
+ return;
775
+ }
776
+ if (this.rafScrollSyncId !== null) {
777
+ return;
778
+ }
779
+ this.rafScrollSyncId = requestAnimationFrame(() => {
780
+ var _a;
781
+ this.rafScrollSyncId = null;
782
+ let nextScrollLeft = (_a = this.pendingScrollLeft) !== null && _a !== void 0 ? _a : this.getMainViewportScrollLeft();
783
+ if (nextScrollLeft === null) {
784
+ nextScrollLeft = this.lastAppliedScrollLeft;
785
+ }
786
+ this.pendingScrollLeft = null;
787
+ if (nextScrollLeft === null) {
788
+ return;
789
+ }
790
+ this.applyHeaderScroll(nextScrollLeft);
791
+ });
792
+ }
793
+ scheduleScrollEndSync() {
794
+ if (this.scrollEndTimer !== null) {
795
+ clearTimeout(this.scrollEndTimer);
796
+ }
797
+ this.scrollEndTimer = window.setTimeout(() => {
798
+ this.scrollEndTimer = null;
799
+ // 滚动结束后再读取一次真实 scrollLeft,确保归位
800
+ this.scheduleHeaderScroll();
801
+ }, 80);
802
+ }
803
+ getMainViewportScrollLeft() {
804
+ var _a, _b;
805
+ if ((_a = this.mainViewportEl) === null || _a === void 0 ? void 0 : _a.isConnected) {
806
+ return this.mainViewportEl.scrollLeft;
807
+ }
808
+ const grid = this.gridElement || this.element.closest('revo-grid');
809
+ this.mainViewportEl = (_b = grid === null || grid === void 0 ? void 0 : grid.querySelector('revogr-viewport-scroll.rgCol:not(.grouping-overlay-viewport)')) !== null && _b !== void 0 ? _b : null;
810
+ return this.mainViewportEl ? this.mainViewportEl.scrollLeft : null;
811
+ }
812
+ ensureHeaderDomRefs() {
813
+ var _a;
814
+ if (!this.headerRowsNeedRefresh &&
815
+ ((_a = this.rgColHeaderAreaEl) === null || _a === void 0 ? void 0 : _a.isConnected) &&
816
+ this.rgColHeaderRows.length) {
817
+ return false;
818
+ }
819
+ this.rgColHeaderAreaEl = this.element.querySelector('.header-area-rgCol');
820
+ this.rgColHeaderRows = this.rgColHeaderAreaEl
821
+ ? Array.from(this.rgColHeaderAreaEl.querySelectorAll('.group-rgRow, .actual-rgRow'))
822
+ : [];
823
+ this.headerRowsNeedRefresh = false;
824
+ return true;
825
+ }
826
+ applyHeaderScroll(scrollLeft) {
827
+ const didRefreshRows = this.ensureHeaderDomRefs();
828
+ if (!this.rgColHeaderAreaEl || this.rgColHeaderRows.length === 0) {
829
+ return;
830
+ }
831
+ if (!didRefreshRows && this.lastAppliedScrollLeft === scrollLeft) {
832
+ return;
833
+ }
834
+ // 使用 transform 来移动表头内容
835
+ const transform = `translateX(${-scrollLeft}px)`;
836
+ this.rgColHeaderRows.forEach(row => {
837
+ if (row.style.transform !== transform) {
838
+ row.style.transform = transform;
839
+ }
840
+ });
841
+ this.lastAppliedScrollLeft = scrollLeft;
842
+ }
843
+ componentDidRender() {
844
+ var _a;
845
+ this.headerRowsNeedRefresh = true;
846
+ // 每次渲染后同步一次滚动位置,避免滚动后渲染导致的错位/消失
847
+ this.scheduleHeaderScroll();
848
+ // 触发每个区域的 afterHeaderRender 事件
849
+ (_a = this.areas) === null || _a === void 0 ? void 0 : _a.forEach(area => {
850
+ this.afterHeaderRender.emit({
851
+ type: area.type,
852
+ readonly: area.readonly,
853
+ data: area.colData,
854
+ viewport: area.viewportCol,
855
+ dimension: area.dimensionCol,
856
+ selection: area.selectionStore,
857
+ });
858
+ });
859
+ }
860
+ /**
861
+ * 处理表头区域的滚轮事件
862
+ */
863
+ onHeaderWheel(e) {
864
+ const viewportScroll = this.element.closest('revogr-viewport-scroll');
865
+ if (!viewportScroll) {
866
+ return;
867
+ }
868
+ const scrollWidth = viewportScroll.scrollWidth || 0;
869
+ const clientWidth = viewportScroll.clientWidth || 0;
870
+ const maxScrollLeft = Math.max(0, scrollWidth - clientWidth);
871
+ const SCROLL_THRESHOLD = 10;
872
+ const absX = Math.abs(e.deltaX);
873
+ const absY = Math.abs(e.deltaY);
874
+ const isHorizontalScroll = (absX > absY && absX > 0) || (e.shiftKey && absY > 0);
875
+ if (isHorizontalScroll && maxScrollLeft <= SCROLL_THRESHOLD) {
876
+ e.preventDefault();
877
+ e.stopPropagation();
878
+ return;
879
+ }
880
+ if (isHorizontalScroll) {
881
+ e.stopPropagation();
882
+ const customEvent = new CustomEvent('mousewheel-horizontal', {
883
+ bubbles: true,
884
+ detail: {
885
+ deltaX: e.deltaX,
886
+ deltaY: e.deltaY,
887
+ shiftKey: e.shiftKey,
888
+ preventDefault: () => e.preventDefault(),
889
+ },
890
+ });
891
+ this.element.dispatchEvent(customEvent);
892
+ }
893
+ }
894
+ render() {
895
+ // 在调整大小期间使用缓存的areas,避免使用新的areas导致跳动
896
+ let areasToRender = this.isResizingFlag && this.cachedAreas ? this.cachedAreas : this.areas;
897
+ if (!areasToRender || areasToRender.length === 0) {
898
+ return index.h(index.Host, null);
899
+ }
900
+ const isSynced = areasToRender.every(area => {
901
+ var _a;
902
+ const viewportVersion = (_a = area.viewportCol) === null || _a === void 0 ? void 0 : _a.get('version');
903
+ const colVersion = area.colVersion;
904
+ if (viewportVersion === undefined || colVersion === undefined) {
905
+ return true;
906
+ }
907
+ return viewportVersion === colVersion;
908
+ });
909
+ if (!isSynced && this.lastStableAreas) {
910
+ areasToRender = this.lastStableAreas;
911
+ }
912
+ else if (isSynced && !this.isResizingFlag) {
913
+ this.lastStableAreas = areasToRender;
914
+ }
915
+ // 渲染所有区域的表头
916
+ const areaHeaders = areasToRender.map(area => this.renderArea(area));
917
+ return (index.h(index.Host, { onWheel: (e) => this.onHeaderWheel(e) }, areaHeaders));
918
+ }
919
+ /**
920
+ * 创建包含所有列的扩展viewport items
921
+ * 用于在调整大小期间防止虚拟滚动移除DOM
922
+ */
923
+ createExpandedItems(area) {
924
+ const allCols = area.colData;
925
+ const expandedCols = [];
926
+ let currentStart = 0;
927
+ for (let i = 0; i < allCols.length; i++) {
928
+ const col = allCols[i];
929
+ const size = (col === null || col === void 0 ? void 0 : col.size) || 100;
930
+ expandedCols.push({
931
+ itemIndex: i,
932
+ start: currentStart,
933
+ end: currentStart + size,
934
+ size: size,
935
+ });
936
+ currentStart += size;
937
+ }
938
+ this.cachedExpandedItems.set(area.type, expandedCols);
939
+ }
940
+ buildFullItems(area, sizes) {
941
+ var _a, _b, _c, _d, _e;
942
+ const total = area.colData.length;
943
+ const defaultSize = ((_b = (_a = area.dimensionCol) === null || _a === void 0 ? void 0 : _a.state) === null || _b === void 0 ? void 0 : _b.originItemSize) || 100;
944
+ const items = [];
945
+ let currentStart = 0;
946
+ for (let i = 0; i < total; i++) {
947
+ const size = (_e = (_c = sizes[i]) !== null && _c !== void 0 ? _c : (_d = area.colData[i]) === null || _d === void 0 ? void 0 : _d.size) !== null && _e !== void 0 ? _e : defaultSize;
948
+ const end = currentStart + size;
949
+ items.push({
950
+ itemIndex: i,
951
+ start: currentStart,
952
+ end,
953
+ size,
954
+ });
955
+ currentStart = end;
956
+ }
957
+ return items;
958
+ }
959
+ /**
960
+ * 更新缓存中指定列的尺寸,并调整后续列的位置
961
+ */
962
+ updateCachedItemSize(type, index, newSize) {
963
+ const cached = this.cachedExpandedItems.get(type);
964
+ if (!cached)
965
+ return;
966
+ // 直接通过索引访问(假设itemIndex和数组索引一致)
967
+ const item = cached[index];
968
+ if (!item || item.itemIndex !== index) {
969
+ // 如果索引不匹配,回退到查找
970
+ const foundItem = cached.find(i => i.itemIndex === index);
971
+ if (!foundItem)
972
+ return;
973
+ const oldSize = foundItem.size;
974
+ const sizeDiff = newSize - oldSize;
975
+ foundItem.size = newSize;
976
+ foundItem.end = foundItem.start + newSize;
977
+ // 更新后续所有列的位置
978
+ for (const item of cached) {
979
+ if (item.itemIndex > index) {
980
+ item.start += sizeDiff;
981
+ item.end += sizeDiff;
982
+ }
983
+ }
984
+ return;
985
+ }
986
+ // 快速路径:直接通过索引更新
987
+ const oldSize = item.size;
988
+ const sizeDiff = newSize - oldSize;
989
+ item.size = newSize;
990
+ item.end = item.start + newSize;
991
+ // 更新后续所有列的位置
992
+ for (let i = index + 1; i < cached.length; i++) {
993
+ cached[i].start += sizeDiff;
994
+ cached[i].end += sizeDiff;
995
+ }
996
+ }
997
+ renderArea(area) {
998
+ var _a, _b, _c, _d, _e, _f;
999
+ // 直接从 Observable 读取最新数据,而不是使用 prop 中的缓存数据
1000
+ // 这样即使 revo-grid 没有重新渲染,我们也能获取到最新的列宽度
1001
+ const viewportItems = area.viewportCol.get('items');
1002
+ const dimensionState = area.dimensionCol.state;
1003
+ let cols = viewportItems;
1004
+ // 无论是否在调整大小,都需要使用最新的 dimensionState.sizes 更新列宽度
1005
+ // 因为 viewportItems 中的 size 可能是旧的
1006
+ const sizes = (dimensionState === null || dimensionState === void 0 ? void 0 : dimensionState.sizes) || {};
1007
+ const viewportStart = (_b = (_a = viewportItems[0]) === null || _a === void 0 ? void 0 : _a.start) !== null && _b !== void 0 ? _b : 0;
1008
+ let currentStart = 0;
1009
+ // 统一表头不依赖虚拟列列表,避免滚动时列缺失导致空白
1010
+ // rgCol 类型始终使用完整列表,避免虚拟滚动导致的重新渲染
1011
+ const useFullColumns = area.type === 'rgCol';
1012
+ // 如果正在调整大小,使用缓存的扩展列(包含所有列)
1013
+ if (this.isResizingFlag) {
1014
+ const cached = this.cachedExpandedItems.get(area.type);
1015
+ if (cached) {
1016
+ currentStart = (_d = (_c = cached[0]) === null || _c === void 0 ? void 0 : _c.start) !== null && _d !== void 0 ? _d : 0;
1017
+ // 使用最新尺寸重新计算位置
1018
+ cols = cached.map(item => {
1019
+ var _a;
1020
+ const size = (_a = sizes[item.itemIndex]) !== null && _a !== void 0 ? _a : item.size;
1021
+ const result = Object.assign(Object.assign({}, item), { size, start: currentStart, end: currentStart + size });
1022
+ currentStart += size;
1023
+ return result;
1024
+ });
1025
+ }
1026
+ }
1027
+ else if (useFullColumns || viewportItems.length === 0) {
1028
+ // rgCol 类型始终构建完整列表,避免虚拟滚动导致列重新渲染
1029
+ cols = this.buildFullItems(area, sizes);
1030
+ currentStart = (_f = (_e = cols[0]) === null || _e === void 0 ? void 0 : _e.start) !== null && _f !== void 0 ? _f : 0;
1031
+ }
1032
+ else {
1033
+ // 不在调整大小时,也需要使用最新的 sizes 更新 viewportItems
1034
+ currentStart = viewportStart;
1035
+ cols = viewportItems.map(item => {
1036
+ var _a;
1037
+ const size = (_a = sizes[item.itemIndex]) !== null && _a !== void 0 ? _a : item.size;
1038
+ const result = Object.assign(Object.assign({}, item), { size, start: currentStart, end: currentStart + size });
1039
+ currentStart += size;
1040
+ return result;
1041
+ });
1042
+ }
1043
+ const range = area.selectionRange;
1044
+ const groupedIndexes = this.getGroupedColumnIndexes(area);
1045
+ const { groupedCells, ungroupedCells } = this.renderHeaderColumns(area, cols, range, groupedIndexes);
1046
+ const groupRow = this.renderGroupingColumns(area, cols);
1047
+ const multiRowHeight = this.getMultiHeaderRowHeight(area);
1048
+ const rowStyle = multiRowHeight !== undefined
1049
+ ? { height: `${multiRowHeight}px`, lineHeight: `${multiRowHeight}px` }
1050
+ : undefined;
1051
+ // 计算区域宽度
1052
+ // 非冻结区域(rgCol)应该始终使用 realSize(所有列的总宽度)
1053
+ // 冻结区域使用视口列的宽度
1054
+ let areaWidth = 0;
1055
+ if (area.type === 'rgCol') {
1056
+ // 非冻结区域:使用 dimensionState.realSize(所有列的总宽度)
1057
+ areaWidth = (dimensionState === null || dimensionState === void 0 ? void 0 : dimensionState.realSize) || 0;
1058
+ if (!areaWidth && cols.length > 0) {
1059
+ areaWidth = cols[cols.length - 1].end - cols[0].start;
1060
+ }
1061
+ }
1062
+ else if (cols.length > 0) {
1063
+ // 冻结区域:使用视口列的宽度
1064
+ areaWidth = cols[cols.length - 1].end - cols[0].start;
1065
+ }
1066
+ const areaStyle = {
1067
+ width: areaWidth > 0 ? `${areaWidth}px` : undefined,
1068
+ };
1069
+ // 统一使用分组结构:
1070
+ // - 如果没有分组(groupingDepth === 0),所有列都放在 group-rgRow 中,actual-rgRow 为空
1071
+ // - 如果有分组(groupingDepth > 0),未分组的列放在 group-rgRow 中,分组的子列放在 actual-rgRow 中
1072
+ return (index.h("div", { class: `header-area header-area-${area.type}`, style: areaStyle, key: area.type }, index.h("div", { class: "group-rgRow", style: rowStyle }, groupRow, area.groupingDepth === 0 ? groupedCells : ungroupedCells), area.groupingDepth > 0 && (index.h("div", { class: `${dimension_helpers.HEADER_ROW_CLASS} ${dimension_helpers.HEADER_ACTUAL_ROW_CLASS}`, style: rowStyle }, groupedCells))));
1073
+ }
1074
+ getGroupedColumnIndexes(area) {
1075
+ const groupedIndexes = new Set();
1076
+ if (area.groupingDepth > 0 && area.groups) {
1077
+ for (let i = 0; i < area.groupingDepth; i++) {
1078
+ if (area.groups[i]) {
1079
+ for (const group of area.groups[i]) {
1080
+ for (const idx of group.indexes) {
1081
+ groupedIndexes.add(idx);
1082
+ }
1083
+ }
1084
+ }
1085
+ }
1086
+ }
1087
+ return groupedIndexes;
1088
+ }
1089
+ renderHeaderColumns(area, cols, range, groupedIndexes) {
1090
+ const groupedCells = [];
1091
+ const ungroupedCells = [];
1092
+ const lastColIndex = cols.length > 0 ? cols[cols.length - 1].itemIndex : -1;
1093
+ for (let i = 0; i < cols.length; i++) {
1094
+ const rgCol = cols[i];
1095
+ const colData = area.colData[rgCol.itemIndex];
1096
+ const isGrouped = area.groupingDepth > 0 && groupedIndexes.has(rgCol.itemIndex);
1097
+ const isLastColumn = rgCol.itemIndex === lastColIndex && ((area.hasColPinEnd && area.type === 'colPinEnd') ||
1098
+ (!area.hasColPinEnd && area.hasRgCol && area.type === 'rgCol') ||
1099
+ (!area.hasColPinEnd && !area.hasRgCol && area.type === 'colPinStart'));
1100
+ const props = {
1101
+ range,
1102
+ column: rgCol,
1103
+ data: Object.assign(Object.assign({}, colData), { index: rgCol.itemIndex, providers: {
1104
+ type: area.type,
1105
+ readonly: area.readonly,
1106
+ data: area.colData,
1107
+ viewport: area.viewportCol,
1108
+ dimension: area.dimensionCol,
1109
+ selection: area.selectionStore,
1110
+ } }),
1111
+ canFilter: !!area.columnFilter,
1112
+ canResize: (colData === null || colData === void 0 ? void 0 : colData.resizable) !== false && area.canResize,
1113
+ active: area.resizeHandler || ['r'],
1114
+ additionalData: area.additionalData,
1115
+ onResize: e => this.onResize(area, e, rgCol.itemIndex),
1116
+ onDblClick: e => this.headerdblClick.emit(e),
1117
+ onClick: e => this.initialHeaderClick.emit(e),
1118
+ merged: area.groupingDepth > 0 && !isGrouped,
1119
+ groupingDepth: area.groupingDepth,
1120
+ isGrouped,
1121
+ isLastColumn,
1122
+ };
1123
+ const event = this.beforeHeaderRender.emit(props);
1124
+ if (!event.defaultPrevented) {
1125
+ const columnKey = (colData === null || colData === void 0 ? void 0 : colData.prop)
1126
+ ? `header-${area.type}-${colData.prop}`
1127
+ : `header-${area.type}-idx-${rgCol.itemIndex}`;
1128
+ const cell = index.h(throttle.HeaderRenderer, Object.assign({ key: columnKey }, event.detail));
1129
+ if (isGrouped) {
1130
+ groupedCells.push(cell);
1131
+ }
1132
+ else if (area.groupingDepth > 0) {
1133
+ ungroupedCells.push(cell);
1134
+ }
1135
+ else {
1136
+ groupedCells.push(cell);
1137
+ }
1138
+ }
1139
+ }
1140
+ return { groupedCells, ungroupedCells };
1141
+ }
1142
+ renderGroupingColumns(area, cols) {
1143
+ var _a, _b, _c;
1144
+ const groupRow = [];
1145
+ const lastColIndex = cols.length > 0 ? cols[cols.length - 1].itemIndex : -1;
1146
+ const multiRowHeight = this.getMultiHeaderRowHeight(area);
1147
+ const groupDivStyle = multiRowHeight !== undefined ? { height: `${multiRowHeight}px` } : undefined;
1148
+ const dimensionState = (_b = (_a = area.dimensionCol) === null || _a === void 0 ? void 0 : _a.state) !== null && _b !== void 0 ? _b : area.dimensionState;
1149
+ for (let i = 0; i < area.groupingDepth; i++) {
1150
+ if (area.groups[i]) {
1151
+ for (let group of area.groups[i]) {
1152
+ const groupStartIndex = (_c = group.indexes[0]) !== null && _c !== void 0 ? _c : -1;
1153
+ if (groupStartIndex > -1) {
1154
+ const groupEndIndex = groupStartIndex + group.indexes.length - 1;
1155
+ // 使用维度数据的绝对坐标计算分组区间,避免受 viewport 裁剪影响导致分组标题丢失
1156
+ const startItem = dimension_helpers.getItemByIndex(dimensionState, groupStartIndex);
1157
+ const endItem = dimension_helpers.getItemByIndex(dimensionState, groupEndIndex);
1158
+ const groupStart = startItem.start;
1159
+ const groupEnd = endItem.end;
1160
+ const isLastColumn = groupEndIndex === lastColIndex && ((area.hasColPinEnd && area.type === 'colPinEnd') ||
1161
+ (!area.hasColPinEnd && area.hasRgCol && area.type === 'rgCol') ||
1162
+ (!area.hasColPinEnd && !area.hasRgCol && area.type === 'colPinStart'));
1163
+ const props = {
1164
+ providers: {
1165
+ type: area.type,
1166
+ readonly: area.readonly,
1167
+ data: area.colData,
1168
+ viewport: area.viewportCol,
1169
+ dimension: area.dimensionCol,
1170
+ selection: area.selectionStore,
1171
+ },
1172
+ start: groupStart,
1173
+ end: groupEnd,
1174
+ group,
1175
+ active: area.resizeHandler,
1176
+ canResize: false,
1177
+ additionalData: area.additionalData,
1178
+ onResize: e => { var _a; return this.onResizeGroup(area, (_a = e.changedX) !== null && _a !== void 0 ? _a : 0, groupStartIndex, groupEndIndex); },
1179
+ isLastColumn,
1180
+ };
1181
+ const event = this.beforeGroupHeaderRender.emit(props);
1182
+ if (!event.defaultPrevented) {
1183
+ const groupKey = `group-header-${area.type}-${i}-${groupStartIndex}`;
1184
+ groupRow.push(index.h(throttle.HeaderGroupRenderer, Object.assign({ key: groupKey }, event.detail)));
1185
+ }
1186
+ }
1187
+ }
1188
+ }
1189
+ groupRow.push(index.h("div", { class: `${dimension_helpers.HEADER_ROW_CLASS} group`, style: groupDivStyle }));
1190
+ }
1191
+ return groupRow;
1192
+ }
1193
+ /**
1194
+ * 开始调整大小(第一次拖动时调用)
1195
+ */
1196
+ startResizing(area) {
1197
+ if (!this.isResizingFlag) {
1198
+ this.isResizingFlag = true;
1199
+ this.setHeaderResizingState(true);
1200
+ // 缓存当前的areas,避免在调整大小期间使用新的areas
1201
+ this.cachedAreas = this.areas;
1202
+ // 为所有区域创建扩展列缓存(包含所有列)
1203
+ this.createExpandedItems(area);
1204
+ }
1205
+ }
1206
+ /**
1207
+ * 重置调整大小的定时器
1208
+ */
1209
+ resetResizeTimer() {
1210
+ if (this.resizeTimer) {
1211
+ clearTimeout(this.resizeTimer);
1212
+ }
1213
+ this.resizeTimer = window.setTimeout(() => {
1214
+ this.isResizingFlag = false;
1215
+ this.cachedExpandedItems.clear();
1216
+ this.cachedAreas = null;
1217
+ this.setHeaderResizingState(false);
1218
+ }, this.RESIZE_DEBOUNCE_TIME);
1219
+ }
1220
+ onResize(area, { width }, index) {
1221
+ this.startResizing(area);
1222
+ const col = area.colData[index];
1223
+ const event = this.beforeResize.emit([
1224
+ Object.assign(Object.assign({}, col), { size: width || undefined }),
1225
+ ]);
1226
+ if (event.defaultPrevented) {
1227
+ return;
1228
+ }
1229
+ const sizes = { [index]: width || 0 };
1230
+ this.emitResize(area, sizes);
1231
+ this.syncHeaderTransformNow();
1232
+ // 更新缓存中的列尺寸
1233
+ if (area.type === 'rgCol' && this.cachedExpandedItems.has(area.type)) {
1234
+ this.updateCachedItemSize(area.type, index, width || 0);
1235
+ }
1236
+ this.resetResizeTimer();
1237
+ }
1238
+ onResizeGroup(area, changedX, startIndex, endIndex) {
1239
+ this.startResizing(area);
1240
+ const sizes = {};
1241
+ const items = area.viewportItems;
1242
+ const cols = throttle.keyBy(items, 'itemIndex');
1243
+ const change = changedX / (endIndex - startIndex + 1);
1244
+ for (let i = startIndex; i <= endIndex; i++) {
1245
+ const item = cols[i];
1246
+ if (item) {
1247
+ sizes[i] = item.size + change;
1248
+ }
1249
+ }
1250
+ this.emitResize(area, sizes);
1251
+ this.syncHeaderTransformNow();
1252
+ // 批量更新缓存中的列尺寸
1253
+ if (area.type === 'rgCol' && this.cachedExpandedItems.has(area.type)) {
1254
+ for (const [idx, size] of Object.entries(sizes)) {
1255
+ this.updateCachedItemSize(area.type, parseInt(idx), size);
1256
+ }
1257
+ }
1258
+ this.resetResizeTimer();
1259
+ }
1260
+ /**
1261
+ * 触发 resize 事件
1262
+ */
1263
+ emitResize(area, sizes) {
1264
+ this.headerresize.emit(sizes);
1265
+ // 调用区域的 onHeaderresize 回调
1266
+ if (area.onHeaderresize) {
1267
+ area.onHeaderresize(new CustomEvent('headerresize', { detail: sizes }));
1268
+ }
1269
+ }
1270
+ getMultiHeaderRowHeight(area) {
1271
+ if (!this.hasCachedBaseHeaderRowHeight) {
1272
+ const computedStyle = getComputedStyle(this.element);
1273
+ const cssHeight = computedStyle.getPropertyValue('--rg-header-row-height').trim();
1274
+ const heightValue = cssHeight ? parseFloat(cssHeight) : NaN;
1275
+ this.cachedBaseHeaderRowHeight = !isNaN(heightValue) ? heightValue : null;
1276
+ this.hasCachedBaseHeaderRowHeight = true;
1277
+ }
1278
+ const baseHeight = this.cachedBaseHeaderRowHeight;
1279
+ if (baseHeight !== null) {
1280
+ // 如果有分组,每行高度为总高度的一半
1281
+ // 如果没有分组,使用完整高度
1282
+ return area.groupingDepth > 0 ? baseHeight / 2 : baseHeight;
1283
+ }
1284
+ return undefined;
1285
+ }
1286
+ get element() { return index.getElement(this); }
1287
+ };
1288
+ RevogrHeaderUnifiedComponent.style = revogrHeaderUnifiedStyleCss;
1289
+
1290
+ const DIRECTION_CODES = [
1291
+ dimension_helpers.codesLetter.TAB,
1292
+ dimension_helpers.codesLetter.ARROW_UP,
1293
+ dimension_helpers.codesLetter.ARROW_DOWN,
1294
+ dimension_helpers.codesLetter.ARROW_LEFT,
1295
+ dimension_helpers.codesLetter.ARROW_RIGHT,
1296
+ ];
1297
+ class KeyboardService {
1298
+ constructor(sv) {
1299
+ this.sv = sv;
1300
+ }
1301
+ async keyDown(e, canRange, isEditMode, { range, focus }) {
1302
+ // IF EDIT MODE
1303
+ if (isEditMode) {
1304
+ switch (e.code) {
1305
+ case dimension_helpers.codesLetter.ESCAPE:
1306
+ this.sv.cancel();
1307
+ break;
1308
+ case dimension_helpers.codesLetter.TAB:
1309
+ this.keyChangeSelection(e, canRange);
1310
+ break;
1311
+ }
1312
+ return;
1313
+ }
1314
+ // IF NOT EDIT MODE
1315
+ if (this.isEventFromEditable(e)) {
1316
+ return;
1317
+ }
1318
+ // pressed clear key
1319
+ if (range && edit_utils.isClear(e.code)) {
1320
+ this.sv.clearCell();
1321
+ return;
1322
+ }
1323
+ // below works with focus only
1324
+ if (!focus) {
1325
+ return;
1326
+ }
1327
+ // tab key means same as arrow right
1328
+ if (edit_utils.isTab(e.code)) {
1329
+ this.keyChangeSelection(e, canRange);
1330
+ return;
1331
+ }
1332
+ // pressed enter
1333
+ if (edit_utils.isEnterKeyValue(e.key)) {
1334
+ this.sv.change();
1335
+ return;
1336
+ }
1337
+ // copy operation
1338
+ if (edit_utils.isCopy(e)) {
1339
+ return;
1340
+ }
1341
+ // cut operation
1342
+ if (edit_utils.isCut(e)) {
1343
+ return;
1344
+ }
1345
+ // paste operation
1346
+ if (edit_utils.isPaste(e)) {
1347
+ this.sv.internalPaste();
1348
+ return;
1349
+ }
1350
+ // select all
1351
+ if (edit_utils.isAll(e)) {
1352
+ if (canRange) {
1353
+ this.selectAll(e);
1354
+ }
1355
+ return;
1356
+ }
1357
+ // pressed letter key
1358
+ if (e.key.length === 1) {
1359
+ this.sv.change(e.key);
1360
+ return;
1361
+ }
1362
+ // pressed arrow, change selection position
1363
+ if (await this.keyChangeSelection(e, canRange)) {
1364
+ return;
1365
+ }
1366
+ }
1367
+ selectAll(e) {
1368
+ const range = this.sv.selectionStore.get('range');
1369
+ const focus = this.sv.selectionStore.get('focus');
1370
+ // if no range or focus - do nothing
1371
+ if (!range || !focus) {
1372
+ return;
1373
+ }
1374
+ e.preventDefault();
1375
+ this.sv.selectAll();
1376
+ }
1377
+ async keyChangeSelection(e, canRange) {
1378
+ const data = this.changeDirectionKey(e, canRange);
1379
+ if (!data) {
1380
+ return false;
1381
+ }
1382
+ // this interval needed for several cases
1383
+ // grid could be resized before next click
1384
+ // at this case to avoid screen jump we use this interval
1385
+ await dimension_helpers.timeout(dimension_helpers.RESIZE_INTERVAL + 30);
1386
+ const range = this.sv.selectionStore.get('range');
1387
+ const focus = this.sv.selectionStore.get('focus');
1388
+ return this.keyPositionChange(data.changes, range, focus, data.isMulti);
1389
+ }
1390
+ keyPositionChange(changes, range, focus, isMulti = false) {
1391
+ if (!range || !focus) {
1392
+ return false;
1393
+ }
1394
+ const data = getCoordinate(range, focus, changes, isMulti);
1395
+ if (!data) {
1396
+ return false;
1397
+ }
1398
+ const eData = this.sv.getData();
1399
+ if (isMulti) {
1400
+ if (isAfterLast(data.end, eData.lastCell) || isBeforeFirst(data.start)) {
1401
+ return false;
1402
+ }
1403
+ const range = headerCellRenderer.getRange(data.start, data.end);
1404
+ return this.sv.range(range);
1405
+ }
1406
+ return this.sv.focus(data.start, changes, isAfterLast(data.start, eData.lastCell)
1407
+ ? 1
1408
+ : isBeforeFirst(data.start)
1409
+ ? -1
1410
+ : 0);
1411
+ }
1412
+ /** Monitor key direction changes */
1413
+ changeDirectionKey(e, canRange) {
1414
+ const isMulti = canRange && e.shiftKey;
1415
+ // If event comes from editable element, do not hijack browser key behavior.
1416
+ if (this.isEventFromEditable(e) && DIRECTION_CODES.includes(e.code)) {
1417
+ return;
1418
+ }
1419
+ if (DIRECTION_CODES.includes(e.code)) {
1420
+ e.preventDefault();
1421
+ }
1422
+ if (e.shiftKey) {
1423
+ switch (e.code) {
1424
+ case dimension_helpers.codesLetter.TAB:
1425
+ return { changes: { x: -1 }, isMulti: false };
1426
+ }
1427
+ }
1428
+ switch (e.code) {
1429
+ case dimension_helpers.codesLetter.ARROW_UP:
1430
+ return { changes: { y: -1 }, isMulti };
1431
+ case dimension_helpers.codesLetter.ARROW_DOWN:
1432
+ return { changes: { y: 1 }, isMulti };
1433
+ case dimension_helpers.codesLetter.ARROW_LEFT:
1434
+ return { changes: { x: -1 }, isMulti };
1435
+ case dimension_helpers.codesLetter.TAB:
1436
+ case dimension_helpers.codesLetter.ARROW_RIGHT:
1437
+ return { changes: { x: 1 }, isMulti };
1438
+ }
1439
+ }
1440
+ isEventFromEditable(e) {
1441
+ const target = e.target;
1442
+ if (target) {
1443
+ const tagName = target.tagName;
1444
+ if (tagName === 'INPUT' ||
1445
+ tagName === 'TEXTAREA' ||
1446
+ tagName === 'SELECT' ||
1447
+ target.isContentEditable) {
1448
+ return true;
1449
+ }
1450
+ }
1451
+ const activeElement = document.activeElement;
1452
+ if (!activeElement) {
1453
+ return false;
1454
+ }
1455
+ return (activeElement.tagName === 'INPUT' ||
1456
+ activeElement.tagName === 'TEXTAREA' ||
1457
+ activeElement.tagName === 'SELECT' ||
1458
+ activeElement.isContentEditable);
1459
+ }
1460
+ }
1461
+
1462
+ class AutoFillService {
1463
+ constructor(sv) {
1464
+ this.sv = sv;
1465
+ this.autoFillType = null;
1466
+ this.autoFillInitial = null;
1467
+ this.autoFillStart = null;
1468
+ this.autoFillLast = null;
1469
+ }
1470
+ /**
1471
+ * Render autofill box
1472
+ * @param range
1473
+ * @param selectionFocus
1474
+ */
1475
+ renderAutofill(range, selectionFocus, isMobile = false) {
1476
+ let handlerStyle;
1477
+ if (range) {
1478
+ handlerStyle = getCell(range, this.sv.dimensionRow.state, this.sv.dimensionCol.state);
1479
+ }
1480
+ else {
1481
+ handlerStyle = getCell(Object.assign(Object.assign({}, selectionFocus), { x1: selectionFocus.x, y1: selectionFocus.y }), this.sv.dimensionRow.state, this.sv.dimensionCol.state);
1482
+ }
1483
+ return (index.h("div", { class: {
1484
+ [dimension_helpers.CELL_HANDLER_CLASS]: true,
1485
+ [dimension_helpers.MOBILE_CLASS]: isMobile,
1486
+ }, style: {
1487
+ left: `${handlerStyle.right}px`,
1488
+ top: `${handlerStyle.bottom}px`,
1489
+ }, onMouseDown: (e) => this.autoFillHandler(e), onTouchStart: (e) => this.autoFillHandler(e) }));
1490
+ }
1491
+ autoFillHandler(e, type = "AutoFill" /* AutoFillType.autoFill */) {
1492
+ let target = null;
1493
+ if (e.target instanceof Element) {
1494
+ target = e.target;
1495
+ }
1496
+ if (!target) {
1497
+ return;
1498
+ }
1499
+ this.selectionStart(target, this.sv.getData(), type);
1500
+ e.preventDefault();
1501
+ }
1502
+ get isAutoFill() {
1503
+ return !!this.autoFillType;
1504
+ }
1505
+ /**
1506
+ * Process mouse move events
1507
+ */
1508
+ selectionMouseMove(e) {
1509
+ // initiate mouse move debounce if not present
1510
+ if (!this.onMouseMoveAutofill) {
1511
+ this.onMouseMoveAutofill = debounce.debounce((e, data) => this.doAutofillMouseMove(e, data), 5);
1512
+ }
1513
+ if (this.isAutoFill) {
1514
+ this.onMouseMoveAutofill(e, this.sv.getData());
1515
+ }
1516
+ }
1517
+ getFocus(focus, range) {
1518
+ // there was an issue that it was taking last cell from range but focus was out
1519
+ if (!focus && range) {
1520
+ focus = { x: range.x, y: range.y };
1521
+ }
1522
+ return focus || null;
1523
+ }
1524
+ /**
1525
+ * Autofill logic:
1526
+ * on mouse move apply based on previous direction (if present)
1527
+ */
1528
+ doAutofillMouseMove(event, data) {
1529
+ // if no initial - not started
1530
+ if (!this.autoFillInitial) {
1531
+ return;
1532
+ }
1533
+ const x = events.getPropertyFromEvent(event, 'clientX', dimension_helpers.MOBILE_CLASS);
1534
+ const y = events.getPropertyFromEvent(event, 'clientY', dimension_helpers.MOBILE_CLASS);
1535
+ // skip touch
1536
+ if (x === null || y === null) {
1537
+ return;
1538
+ }
1539
+ const current = getCurrentCell({ x, y }, data);
1540
+ // first time or direction equal to start(same as first time)
1541
+ if (!this.autoFillLast) {
1542
+ if (!this.autoFillLast) {
1543
+ this.autoFillLast = this.autoFillStart;
1544
+ }
1545
+ }
1546
+ // check if not the latest, if latest - do nothing
1547
+ if (isAfterLast(current, data.lastCell)) {
1548
+ return;
1549
+ }
1550
+ this.autoFillLast = current;
1551
+ const isSame = current.x === this.autoFillInitial.x &&
1552
+ current.y === this.autoFillInitial.y;
1553
+ // if same as initial - clear
1554
+ if (isSame) {
1555
+ this.sv.setTempRange(null);
1556
+ }
1557
+ else {
1558
+ const area = headerCellRenderer.getRange(this.autoFillInitial, this.autoFillLast);
1559
+ this.sv.setTempRange({
1560
+ area,
1561
+ type: this.autoFillType,
1562
+ });
1563
+ }
1564
+ }
1565
+ /**
1566
+ * Range selection started
1567
+ * Mode @param type:
1568
+ * Can be triggered from MouseDown selection on element
1569
+ * Or can be triggered on corner square drag
1570
+ */
1571
+ selectionStart(target, data, type = "Selection" /* AutoFillType.selection */) {
1572
+ /** Get cell by autofill element */
1573
+ const { top, left } = target.getBoundingClientRect();
1574
+ this.autoFillInitial = this.getFocus(data.focus, data.range);
1575
+ this.autoFillType = type;
1576
+ this.autoFillStart = getCurrentCell({ x: left, y: top }, data);
1577
+ }
1578
+ /**
1579
+ * Clear current range selection on mouse up and mouse leave events
1580
+ */
1581
+ clearAutoFillSelection(focus, oldRange) {
1582
+ // If autofill was active, apply autofill values
1583
+ if (this.autoFillInitial) {
1584
+ // Fetch latest focus
1585
+ this.autoFillInitial = this.getFocus(focus, oldRange);
1586
+ // Apply range data if autofill mode is active
1587
+ if (this.autoFillType === "AutoFill" /* AutoFillType.autoFill */) {
1588
+ const range = headerCellRenderer.getRange(this.autoFillInitial, this.autoFillLast);
1589
+ // If range is present, apply data
1590
+ if (range) {
1591
+ const { defaultPrevented: stopApply, detail: { range: newRange }, } = this.sv.clearRangeDataApply({
1592
+ range,
1593
+ });
1594
+ // If data apply was not prevented, apply new range
1595
+ if (!stopApply && oldRange) {
1596
+ this.applyRangeWithData(newRange, oldRange);
1597
+ }
1598
+ else {
1599
+ // If data apply was prevented, clear temporary range
1600
+ this.sv.setTempRange(null);
1601
+ }
1602
+ }
1603
+ }
1604
+ else {
1605
+ // If not autofill mode, apply range only
1606
+ this.applyRangeOnly(this.autoFillInitial, this.autoFillLast);
1607
+ }
1608
+ }
1609
+ // Reset autofill state
1610
+ this.resetAutoFillState();
1611
+ }
1612
+ /**
1613
+ * Reset autofill state
1614
+ */
1615
+ resetAutoFillState() {
1616
+ this.autoFillType = null;
1617
+ this.autoFillInitial = null;
1618
+ this.autoFillLast = null;
1619
+ this.autoFillStart = null;
1620
+ }
1621
+ /**
1622
+ * Trigger range apply events and handle responses
1623
+ */
1624
+ onRangeApply(newData, newRange, oldRange) {
1625
+ this.sv.rangeDataApply({
1626
+ data: newData,
1627
+ models: collectModelsOfRange(newData, this.sv.dataStore),
1628
+ type: this.sv.dataStore.get('type'),
1629
+ oldRange,
1630
+ newRange
1631
+ });
1632
+ this.sv.setRange(newRange);
1633
+ }
1634
+ /** Apply range and copy data during range application */
1635
+ applyRangeWithData(newRange, rangeToCopy) {
1636
+ const rangeData = {
1637
+ type: this.sv.dataStore.get('type'),
1638
+ colType: this.sv.columnService.type,
1639
+ newData: {},
1640
+ mapping: {},
1641
+ newRange,
1642
+ oldRange: rangeToCopy,
1643
+ };
1644
+ const { mapping, changed } = this.sv.columnService.getRangeData(rangeData, this.sv.columnService.columns);
1645
+ rangeData.newData = changed;
1646
+ rangeData.mapping = mapping;
1647
+ let e = this.sv.selectionChanged(rangeData);
1648
+ // if default prevented - clear range
1649
+ if (e.defaultPrevented) {
1650
+ this.sv.setTempRange(null);
1651
+ return;
1652
+ }
1653
+ e = this.sv.rangeCopy(rangeData);
1654
+ if (e.defaultPrevented) {
1655
+ this.sv.setRange(newRange);
1656
+ return;
1657
+ }
1658
+ this.onRangeApply(rangeData.newData, newRange, rangeToCopy);
1659
+ }
1660
+ /**
1661
+ * Update range selection only,
1662
+ * no data change (mouse selection)
1663
+ */
1664
+ applyRangeOnly(start, end) {
1665
+ // no changes to apply
1666
+ if (!start || !end) {
1667
+ return;
1668
+ }
1669
+ const newRange = headerCellRenderer.getRange(start, end);
1670
+ this.sv.setRange(newRange);
1671
+ }
1672
+ }
1673
+
1674
+ const revogrOverlayStyleCss = "revogr-overlay-selection{display:block;position:relative;width:100%}revogr-overlay-selection .autofill-handle{position:absolute;width:14px;height:14px;margin-left:-13px;margin-top:-13px;z-index:10;cursor:crosshair}revogr-overlay-selection .autofill-handle::before{content:\"\";position:absolute;right:0;bottom:0;width:10px;height:10px;background:#0d63e8;border:1px solid white;box-sizing:border-box}revogr-overlay-selection.mobile .autofill-handle{position:absolute;width:30px;height:30px;margin-left:-29px;margin-top:-29px;z-index:10;cursor:crosshair}revogr-overlay-selection.mobile .autofill-handle::before{content:\"\";position:absolute;right:0;bottom:0;width:12px;height:12px;background:#0d63e8;border:1px solid white;box-sizing:border-box}revogr-overlay-selection .selection-border-range{position:absolute;pointer-events:none;z-index:9;box-shadow:-1px 0 0 #0d63e8 inset, 1px 0 0 #0d63e8 inset, 0 -1px 0 #0d63e8 inset, 0 1px 0 #0d63e8 inset}revogr-overlay-selection .selection-border-range .range-handlers{height:100%;background-color:transparent;width:75%;max-width:50px;min-width:20px;left:50%;transform:translateX(-50%);position:absolute}revogr-overlay-selection .selection-border-range .range-handlers>span{pointer-events:auto;height:20px;width:20px;position:absolute;left:50%;transform:translateX(-50%)}revogr-overlay-selection .selection-border-range .range-handlers>span:before,revogr-overlay-selection .selection-border-range .range-handlers>span:after{position:absolute;border-radius:5px;width:15px;height:5px;left:50%;transform:translateX(-50%);background-color:rgba(0, 0, 0, 0.2)}revogr-overlay-selection .selection-border-range .range-handlers>span:first-child{top:-7px}revogr-overlay-selection .selection-border-range .range-handlers>span:first-child:before{content:\"\";top:0}revogr-overlay-selection .selection-border-range .range-handlers>span:last-child{bottom:-7px}revogr-overlay-selection .selection-border-range .range-handlers>span:last-child:after{content:\"\";bottom:0}revogr-overlay-selection revogr-edit{z-index:10}";
1675
+
1676
+ const OverlaySelection = class {
1677
+ constructor(hostRef) {
1678
+ index.registerInstance(this, hostRef);
1679
+ this.beforeCopyRegion = index.createEvent(this, "beforecopyregion", 7);
1680
+ this.beforeRegionPaste = index.createEvent(this, "beforepasteregion", 7);
1681
+ this.cellEditApply = index.createEvent(this, "celleditapply", 7);
1682
+ this.beforeFocusCell = index.createEvent(this, "beforecellfocusinit", 7);
1683
+ this.cellClick = index.createEvent(this, "cellclickinit", 7);
1684
+ this.beforeNextViewportFocus = index.createEvent(this, "beforenextvpfocus", 7);
1685
+ this.setEdit = index.createEvent(this, "setedit", 7);
1686
+ this.beforeApplyRange = index.createEvent(this, "beforeapplyrange", 7);
1687
+ this.beforeSetRange = index.createEvent(this, "beforesetrange", 7);
1688
+ this.setRange = index.createEvent(this, "setrange", 7);
1689
+ this.beforeEditRender = index.createEvent(this, "beforeeditrender", 7);
1690
+ this.selectAll = index.createEvent(this, "selectall", 7);
1691
+ this.cancelEdit = index.createEvent(this, "canceledit", 7);
1692
+ this.setTempRange = index.createEvent(this, "settemprange", 7);
1693
+ this.beforeSetTempRange = index.createEvent(this, "beforesettemprange", 7);
1694
+ this.applyFocus = index.createEvent(this, "applyfocus", 7);
1695
+ this.focusCell = index.createEvent(this, "focuscell", 7);
1696
+ this.beforeRangeDataApply = index.createEvent(this, "beforerangedataapply", 7);
1697
+ this.selectionChange = index.createEvent(this, "selectionchangeinit", 7);
1698
+ this.beforeRangeCopyApply = index.createEvent(this, "beforerangecopyapply", 7);
1699
+ this.rangeEditApply = index.createEvent(this, "rangeeditapply", 7);
1700
+ this.rangeClipboardCopy = index.createEvent(this, "clipboardrangecopy", 7);
1701
+ this.rangeClipboardPaste = index.createEvent(this, "clipboardrangepaste", 7);
1702
+ this.beforeKeyDown = index.createEvent(this, "beforekeydown", 7);
1703
+ this.beforeKeyUp = index.createEvent(this, "beforekeyup", 7);
1704
+ this.beforeCellSave = index.createEvent(this, "beforecellsave", 7);
1705
+ this.cellEditDone = index.createEvent(this, "celledit", 7);
1706
+ /**
1707
+ * If true applys changes when cell closes if not Escape.
1708
+ */
1709
+ this.applyChangesOnClose = false;
1710
+ this.keyboardService = null;
1711
+ this.autoFillService = null;
1712
+ this.unsubscribeSelectionStore = [];
1713
+ /** Long press detection for cell click */
1714
+ this.mouseDownTimestamp = 0;
1715
+ this.mouseDownCell = null;
1716
+ /** Long press threshold in milliseconds */
1717
+ this.LONG_PRESS_THRESHOLD = 300;
1718
+ }
1719
+ // #endregion
1720
+ // #region Listeners
1721
+ onMouseMove(e) {
1722
+ var _a;
1723
+ if (this.selectionStore.get('focus')) {
1724
+ (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.selectionMouseMove(e);
1725
+ }
1726
+ }
1727
+ /**
1728
+ * Action finished inside the document.
1729
+ * Pointer left document, clear any active operation.
1730
+ */
1731
+ onMouseUp() {
1732
+ var _a;
1733
+ // Clear autofill selection
1734
+ // when pointer left document,
1735
+ // clear any active operation.
1736
+ (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.clearAutoFillSelection(this.selectionStore.get('focus'), this.selectionStore.get('range'));
1737
+ }
1738
+ /**
1739
+ * Row drag started.
1740
+ * This event is fired when drag action started on cell.
1741
+ */
1742
+ onCellDrag(e) {
1743
+ var _a;
1744
+ // Invoke drag start on order editor.
1745
+ (_a = this.orderEditor) === null || _a === void 0 ? void 0 : _a.dragStart(e.detail);
1746
+ }
1747
+ /**
1748
+ * Get keyboard down from element.
1749
+ * This event is fired when keyboard key is released.
1750
+ */
1751
+ onKeyUp(e) {
1752
+ // Emit before key up event.
1753
+ this.beforeKeyUp.emit(Object.assign({ original: e }, this.getData()));
1754
+ }
1755
+ /**
1756
+ * Get keyboard down from element.
1757
+ * This event is fired when keyboard key is pressed.
1758
+ */
1759
+ onKeyDown(e) {
1760
+ var _a;
1761
+ // Emit before key down event and check if default prevention is set.
1762
+ const proxy = this.beforeKeyDown.emit(Object.assign({ original: e }, this.getData()));
1763
+ if (e.defaultPrevented || proxy.defaultPrevented) {
1764
+ return;
1765
+ }
1766
+ // Invoke key down on keyboard service.
1767
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.keyDown(e, this.range, !!this.selectionStore.get('edit'), {
1768
+ focus: this.selectionStore.get('focus'),
1769
+ range: this.selectionStore.get('range'),
1770
+ });
1771
+ }
1772
+ // #endregion
1773
+ /**
1774
+ * Selection & Keyboard
1775
+ */
1776
+ selectionServiceSet(selectionStore) {
1777
+ // clear subscriptions
1778
+ this.unsubscribeSelectionStore.forEach(v => v());
1779
+ this.unsubscribeSelectionStore.length = 0;
1780
+ this.unsubscribeSelectionStore.push(selectionStore.onChange('nextFocus', v => v && this.doFocus(v, v)));
1781
+ this.keyboardService = new KeyboardService({
1782
+ selectionStore,
1783
+ range: r => !!r && this.triggerRangeEvent(r),
1784
+ focus: (f, changes, focusNextViewport) => {
1785
+ if (focusNextViewport) {
1786
+ this.beforeNextViewportFocus.emit(f);
1787
+ return false;
1788
+ }
1789
+ else {
1790
+ return this.doFocus(f, f, changes);
1791
+ }
1792
+ },
1793
+ change: val => {
1794
+ if (this.readonly) {
1795
+ return;
1796
+ }
1797
+ this.doEdit(val);
1798
+ },
1799
+ cancel: async () => {
1800
+ var _a;
1801
+ await ((_a = this.revogrEdit) === null || _a === void 0 ? void 0 : _a.cancelChanges());
1802
+ this.closeEdit();
1803
+ },
1804
+ clearCell: () => !this.readonly && this.clearCell(),
1805
+ internalPaste: () => !this.readonly && this.beforeRegionPaste.emit(),
1806
+ getData: () => this.getData(),
1807
+ selectAll: () => this.selectAll.emit(),
1808
+ });
1809
+ this.createAutoFillService();
1810
+ }
1811
+ /** Autofill */
1812
+ createAutoFillService() {
1813
+ this.autoFillService = new AutoFillService({
1814
+ dimensionRow: this.dimensionRow,
1815
+ dimensionCol: this.dimensionCol,
1816
+ columnService: this.columnService,
1817
+ dataStore: this.dataStore,
1818
+ clearRangeDataApply: e => this.beforeRangeDataApply.emit(Object.assign(Object.assign(Object.assign({}, e), this.types), { rowDimension: Object.assign({}, this.dimensionRow.state), colDimension: Object.assign({}, this.dimensionCol.state) })),
1819
+ setTempRange: e => {
1820
+ const tempRangeEvent = this.beforeSetTempRange.emit(Object.assign(Object.assign({ tempRange: e }, this.getData()), this.types));
1821
+ if (tempRangeEvent.defaultPrevented) {
1822
+ return null;
1823
+ }
1824
+ return this.setTempRange.emit(tempRangeEvent.detail.tempRange);
1825
+ },
1826
+ selectionChanged: e => this.selectionChange.emit(e),
1827
+ rangeCopy: e => this.beforeRangeCopyApply.emit(e),
1828
+ rangeDataApply: e => this.rangeEditApply.emit(e),
1829
+ setRange: e => !!e && this.triggerRangeEvent(e),
1830
+ getData: () => this.getData(),
1831
+ });
1832
+ }
1833
+ /** Columns */
1834
+ columnServiceSet() {
1835
+ var _a;
1836
+ (_a = this.columnService) === null || _a === void 0 ? void 0 : _a.destroy();
1837
+ this.columnService = new headerCellRenderer.ColumnService(this.dataStore, this.colData);
1838
+ this.createAutoFillService();
1839
+ }
1840
+ connectedCallback() {
1841
+ this.columnServiceSet();
1842
+ this.selectionServiceSet(this.selectionStore);
1843
+ }
1844
+ disconnectedCallback() {
1845
+ var _a;
1846
+ // clear subscriptions
1847
+ this.unsubscribeSelectionStore.forEach(v => v());
1848
+ this.unsubscribeSelectionStore.length = 0;
1849
+ (_a = this.columnService) === null || _a === void 0 ? void 0 : _a.destroy();
1850
+ }
1851
+ async componentWillRender() {
1852
+ var _a, _b;
1853
+ const editCell = this.selectionStore.get('edit');
1854
+ if (!editCell) {
1855
+ await ((_b = (_a = this.revogrEdit) === null || _a === void 0 ? void 0 : _a.beforeDisconnect) === null || _b === void 0 ? void 0 : _b.call(_a));
1856
+ }
1857
+ }
1858
+ renderRange(range) {
1859
+ const cell = getCell(range, this.dimensionRow.state, this.dimensionCol.state);
1860
+ const styles = styleByCellProps(cell);
1861
+ return [
1862
+ index.h("div", { class: dimension_helpers.SELECTION_BORDER_CLASS, style: styles }, this.isMobileDevice && (index.h("div", { class: "range-handlers" }, index.h("span", { class: dimension_helpers.MOBILE_CLASS }), index.h("span", { class: dimension_helpers.MOBILE_CLASS })))),
1863
+ ];
1864
+ }
1865
+ renderEditor() {
1866
+ // Check if edit access
1867
+ const editCell = this.selectionStore.get('edit');
1868
+ // Readonly or Editor closed
1869
+ if (this.readonly || !editCell) {
1870
+ return null;
1871
+ }
1872
+ const enteredOrModelValue = editCell.val ||
1873
+ headerCellRenderer.getCellData(this.columnService.rowDataModel(editCell.y, editCell.x).value);
1874
+ const editable = Object.assign(Object.assign({}, editCell), this.columnService.getSaveData(editCell.y, editCell.x, enteredOrModelValue));
1875
+ const renderEvent = this.beforeEditRender.emit(Object.assign(Object.assign({ range: Object.assign(Object.assign({}, editCell), { x1: editCell.x, y1: editCell.y }) }, this.types), { rowDimension: Object.assign({}, this.dimensionRow.state), colDimension: Object.assign({}, this.dimensionCol.state) }));
1876
+ // Render prevented
1877
+ if (renderEvent.defaultPrevented) {
1878
+ return null;
1879
+ }
1880
+ const cell = getCell(renderEvent.detail.range, renderEvent.detail.rowDimension, renderEvent.detail.colDimension);
1881
+ const styles = styleByCellProps(cell);
1882
+ return (index.h("revogr-edit", { style: styles, ref: el => (this.revogrEdit = el), additionalData: this.additionalData, editCell: editable, saveOnClose: this.applyChangesOnClose, onCelleditinit: (e) => {
1883
+ this.cellEditDone.emit(e.detail);
1884
+ }, column: this.columnService.rowDataModel(editCell.y, editCell.x), editor: headerCellRenderer.getCellEditor(this.columnService.columns[editCell.x], this.editors) }));
1885
+ }
1886
+ onEditCell(e) {
1887
+ if (e.defaultPrevented) {
1888
+ return;
1889
+ }
1890
+ const saveEv = this.beforeCellSave.emit(e.detail);
1891
+ if (!saveEv.defaultPrevented) {
1892
+ this.cellEdit(saveEv.detail);
1893
+ }
1894
+ // if not clear navigate to next cell after edit
1895
+ if (!saveEv.detail.preventFocus) {
1896
+ this.focusNext();
1897
+ }
1898
+ }
1899
+ render() {
1900
+ var _a;
1901
+ const nodes = [];
1902
+ const editCell = this.renderEditor();
1903
+ // Editor
1904
+ if (editCell) {
1905
+ nodes.push(editCell);
1906
+ }
1907
+ else {
1908
+ const range = this.selectionStore.get('range');
1909
+ const focus = this.selectionStore.get('focus');
1910
+ // Clipboard
1911
+ if ((range || focus) && this.useClipboard) {
1912
+ nodes.push(index.h("revogr-clipboard", { readonly: this.readonly, onCopyregion: e => this.onCopy(e.detail), onClearregion: () => !this.readonly && this.clearCell(), ref: e => (this.clipboard = e), onPasteregion: e => this.onPaste(e.detail) }));
1913
+ }
1914
+ // Range
1915
+ if (range) {
1916
+ nodes.push(...this.renderRange(range));
1917
+ }
1918
+ // Autofill
1919
+ if (focus && !this.readonly && this.range) {
1920
+ nodes.push((_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.renderAutofill(range, focus, this.isMobileDevice));
1921
+ }
1922
+ // Order
1923
+ if (this.canDrag) {
1924
+ nodes.push(index.h("revogr-order-editor", { ref: e => (this.orderEditor = e), dataStore: this.dataStore, dimensionRow: this.dimensionRow, dimensionCol: this.dimensionCol, parent: this.element, rowType: this.types.rowType, onRowdragstartinit: e => this.rowDragStart(e) }));
1925
+ }
1926
+ }
1927
+ return (index.h(index.Host, { key: 'df967dd624daf8a7bbe5659dbb4b3de3607de9dc', class: { mobile: this.isMobileDevice }, onClick: (e) => this.onElementClick(e), onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true), onCloseedit: (e) => this.closeEdit(e),
1928
+ // it's done to be able to throw events from different levels, not just from editor
1929
+ onCelledit: (e) => this.onEditCell(e) }, nodes, index.h("slot", { key: '08683c584d712c1482ec37c86d151e45a27ef2bb', name: "data" })));
1930
+ }
1931
+ /**
1932
+ * Executes the focus operation on the specified range of cells.
1933
+ */
1934
+ doFocus(focus, end, changes) {
1935
+ var _a;
1936
+ // 0. Check if column allows focus
1937
+ const cellData = this.columnService.getSaveData(focus.y, focus.x);
1938
+ if (((_a = cellData.column) === null || _a === void 0 ? void 0 : _a.canFocus) === false) {
1939
+ return false;
1940
+ }
1941
+ // 1. Trigger beforeFocus event
1942
+ const { defaultPrevented } = this.beforeFocusCell.emit(cellData);
1943
+ if (defaultPrevented) {
1944
+ return false;
1945
+ }
1946
+ const evData = Object.assign(Object.assign({ range: Object.assign(Object.assign({}, focus), { x1: end.x, y1: end.y }), next: changes }, this.types), { rowDimension: Object.assign({}, this.dimensionRow.state), colDimension: Object.assign({}, this.dimensionCol.state) });
1947
+ // 2. Trigger apply focus event
1948
+ const applyEvent = this.applyFocus.emit(evData);
1949
+ if (applyEvent.defaultPrevented) {
1950
+ return false;
1951
+ }
1952
+ const { range } = applyEvent.detail;
1953
+ // 3. Trigger focus event
1954
+ return !this.focusCell.emit(Object.assign({ focus: {
1955
+ x: range.x,
1956
+ y: range.y,
1957
+ }, end: {
1958
+ x: range.x1,
1959
+ y: range.y1,
1960
+ } }, applyEvent.detail)).defaultPrevented;
1961
+ }
1962
+ triggerRangeEvent(range) {
1963
+ const type = this.types.rowType;
1964
+ // 1. Apply range
1965
+ const applyEvent = this.beforeApplyRange.emit(Object.assign(Object.assign({ range: Object.assign({}, range) }, this.types), { rowDimension: Object.assign({}, this.dimensionRow.state), colDimension: Object.assign({}, this.dimensionCol.state) }));
1966
+ if (applyEvent.defaultPrevented) {
1967
+ return false;
1968
+ }
1969
+ const data = this.columnService.getRangeTransformedToProps(applyEvent.detail.range, this.dataStore);
1970
+ // 2. Before set range
1971
+ let e = this.beforeSetRange.emit(data);
1972
+ if (e.defaultPrevented) {
1973
+ return false;
1974
+ }
1975
+ // 3. Set range
1976
+ e = this.setRange.emit(Object.assign(Object.assign({}, applyEvent.detail.range), { type }));
1977
+ if (e.defaultPrevented) {
1978
+ return false;
1979
+ }
1980
+ return !e.defaultPrevented;
1981
+ }
1982
+ /**
1983
+ * Open Editor on DblClick
1984
+ */
1985
+ onElementDblClick(e) {
1986
+ // DblClick prevented outside - Editor will not open
1987
+ if (e.defaultPrevented) {
1988
+ return;
1989
+ }
1990
+ // Allow native text selection flow, do not open editor.
1991
+ if (this.hasNativeTextSelection()) {
1992
+ return;
1993
+ }
1994
+ // Get data from the component
1995
+ const data = this.getData();
1996
+ const focusCell = getFocusCellBasedOnEvent(e, data);
1997
+ if (!focusCell) {
1998
+ return;
1999
+ }
2000
+ this.doEdit();
2001
+ }
2002
+ /**
2003
+ * Handle mouse down event on Host element
2004
+ */
2005
+ onElementMouseDown(e, touch = false) {
2006
+ var _a;
2007
+ // Get the target element from the event object
2008
+ const targetElement = e.target;
2009
+ // Ignore focus if clicked input
2010
+ if (edit_utils.isEditInput(targetElement) || e.defaultPrevented) {
2011
+ return;
2012
+ }
2013
+ // Ignore focus if clicked checkbox
2014
+ const isCheckboxClick = (targetElement === null || targetElement === void 0 ? void 0 : targetElement.closest('.rv-checkbox')) ||
2015
+ (targetElement === null || targetElement === void 0 ? void 0 : targetElement.closest('.row-checkbox')) ||
2016
+ (targetElement === null || targetElement === void 0 ? void 0 : targetElement.classList.contains('rv-checkbox')) ||
2017
+ (targetElement === null || targetElement === void 0 ? void 0 : targetElement.classList.contains('row-checkbox'));
2018
+ if (isCheckboxClick) {
2019
+ return;
2020
+ }
2021
+ // Ignore right click (button 2) and middle click (button 1)
2022
+ if (!touch && e.button !== 0) {
2023
+ return;
2024
+ }
2025
+ // Get data from the component
2026
+ const data = this.getData();
2027
+ const focusCell = getFocusCellBasedOnEvent(e, data);
2028
+ if (!focusCell) {
2029
+ return;
2030
+ }
2031
+ // Record mousedown timestamp and cell for long press detection
2032
+ this.mouseDownTimestamp = Date.now();
2033
+ this.mouseDownCell = focusCell;
2034
+ // Set focus on the current cell
2035
+ this.focus(focusCell, this.range && e.shiftKey);
2036
+ // Initiate autofill selection
2037
+ if (this.range) {
2038
+ targetElement &&
2039
+ ((_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.selectionStart(targetElement, this.getData()));
2040
+ // Prevent default behavior for mouse events,
2041
+ // but only if target element is not a mobile input
2042
+ if (!touch) {
2043
+ e.preventDefault();
2044
+ }
2045
+ else if (events.verifyTouchTarget(e.touches[0], dimension_helpers.MOBILE_CLASS)) {
2046
+ // Prevent default behavior for touch events
2047
+ // if target element is a mobile input
2048
+ e.preventDefault();
2049
+ }
2050
+ }
2051
+ }
2052
+ /**
2053
+ * Handle click event on Host element
2054
+ * This is triggered by native click event, which naturally handles long press
2055
+ * (long press won't trigger click event)
2056
+ */
2057
+ onElementClick(e) {
2058
+ var _a;
2059
+ // Get the target element from the event object
2060
+ const targetElement = e.target;
2061
+ // Ignore if clicked input or default prevented
2062
+ if (edit_utils.isEditInput(targetElement) || e.defaultPrevented) {
2063
+ return;
2064
+ }
2065
+ // Only handle left click
2066
+ if (e.button !== 0) {
2067
+ return;
2068
+ }
2069
+ // Get data from the component
2070
+ const data = this.getData();
2071
+ const focusCell = getFocusCellBasedOnEvent(e, data);
2072
+ if (!focusCell) {
2073
+ return;
2074
+ }
2075
+ const clickDuration = this.mouseDownTimestamp > 0
2076
+ ? Date.now() - this.mouseDownTimestamp
2077
+ : 0;
2078
+ // Allow native text selection flow, do not emit cell click.
2079
+ // But if this is a quick re-click on the same cell, keep cellclick behavior stable.
2080
+ if (this.hasNativeTextSelection()) {
2081
+ const sameCellQuickClick = !!this.mouseDownCell &&
2082
+ this.mouseDownCell.x === focusCell.x &&
2083
+ this.mouseDownCell.y === focusCell.y &&
2084
+ clickDuration < this.LONG_PRESS_THRESHOLD;
2085
+ if (!sameCellQuickClick) {
2086
+ this.mouseDownTimestamp = 0;
2087
+ this.mouseDownCell = null;
2088
+ return;
2089
+ }
2090
+ (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
2091
+ }
2092
+ // Check if this is a long press
2093
+ if (this.mouseDownTimestamp > 0 && this.mouseDownCell) {
2094
+ if (clickDuration >= this.LONG_PRESS_THRESHOLD) {
2095
+ // This is a long press, don't emit cellclick
2096
+ this.mouseDownTimestamp = 0;
2097
+ this.mouseDownCell = null;
2098
+ return;
2099
+ }
2100
+ }
2101
+ // Reset long press detection
2102
+ this.mouseDownTimestamp = 0;
2103
+ this.mouseDownCell = null;
2104
+ // Emit cell click event
2105
+ const cellData = this.columnService.getSaveData(focusCell.y, focusCell.x);
2106
+ this.cellClick.emit(Object.assign(Object.assign({}, cellData), { originalEvent: e }));
2107
+ }
2108
+ hasNativeTextSelection() {
2109
+ const selection = window.getSelection();
2110
+ if (!selection || selection.type !== 'Range' || selection.toString().length === 0) {
2111
+ return false;
2112
+ }
2113
+ if (!selection.rangeCount) {
2114
+ return false;
2115
+ }
2116
+ const range = selection.getRangeAt(0);
2117
+ const container = range.commonAncestorContainer;
2118
+ const selectionRoot = container.nodeType === Node.TEXT_NODE ? container.parentNode : container;
2119
+ return !!selectionRoot && this.element.contains(selectionRoot);
2120
+ }
2121
+ /**
2122
+ * Start cell editing
2123
+ */
2124
+ doEdit(val = '') {
2125
+ var _a;
2126
+ if (this.canEdit()) {
2127
+ const focus = this.selectionStore.get('focus');
2128
+ if (!focus) {
2129
+ return;
2130
+ }
2131
+ const data = this.columnService.getSaveData(focus.y, focus.x);
2132
+ (_a = this.setEdit) === null || _a === void 0 ? void 0 : _a.emit(Object.assign(Object.assign({}, data), { val }));
2133
+ }
2134
+ }
2135
+ /**
2136
+ * Close editor event triggered
2137
+ * @param details - if it requires focus next
2138
+ */
2139
+ async closeEdit(e) {
2140
+ this.cancelEdit.emit();
2141
+ if (e === null || e === void 0 ? void 0 : e.detail) {
2142
+ await this.focusNext();
2143
+ }
2144
+ }
2145
+ /**
2146
+ * Edit finished.
2147
+ * Close Editor and save.
2148
+ */
2149
+ cellEdit(e) {
2150
+ const dataToSave = this.columnService.getSaveData(e.rgRow, e.rgCol, e.val);
2151
+ this.cellEditApply.emit(dataToSave);
2152
+ }
2153
+ getRegion() {
2154
+ const focus = this.selectionStore.get('focus');
2155
+ let range = this.selectionStore.get('range');
2156
+ if (!range) {
2157
+ range = headerCellRenderer.getRange(focus, focus);
2158
+ }
2159
+ return range;
2160
+ }
2161
+ onCopy(e) {
2162
+ var _a;
2163
+ const range = this.getRegion();
2164
+ const canCopyEvent = this.beforeCopyRegion.emit(range);
2165
+ if (canCopyEvent.defaultPrevented) {
2166
+ return false;
2167
+ }
2168
+ let rangeData;
2169
+ if (range) {
2170
+ const { data, mapping } = this.columnService.copyRangeArray(range, this.dataStore);
2171
+ const event = this.rangeClipboardCopy.emit(Object.assign({ range,
2172
+ data,
2173
+ mapping }, this.types));
2174
+ if (!event.defaultPrevented) {
2175
+ rangeData = event.detail.data;
2176
+ }
2177
+ }
2178
+ (_a = this.clipboard) === null || _a === void 0 ? void 0 : _a.doCopy(e, rangeData);
2179
+ return true;
2180
+ }
2181
+ onPaste(data) {
2182
+ var _a;
2183
+ const focus = this.selectionStore.get('focus');
2184
+ const isEditing = this.selectionStore.get('edit') !== null;
2185
+ if (!focus || isEditing) {
2186
+ return;
2187
+ }
2188
+ let { changed, range } = this.columnService.getTransformedDataToApply(focus, data);
2189
+ const { defaultPrevented: canPaste } = this.rangeClipboardPaste.emit(Object.assign({ data: changed, models: collectModelsOfRange(changed, this.dataStore), range }, this.types));
2190
+ if (canPaste) {
2191
+ return;
2192
+ }
2193
+ (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.onRangeApply(changed, range, range);
2194
+ }
2195
+ async focusNext() {
2196
+ var _a;
2197
+ const canFocus = await ((_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.keyChangeSelection(new KeyboardEvent('keydown', {
2198
+ code: dimension_helpers.codesLetter.ARROW_DOWN,
2199
+ }), this.range));
2200
+ if (!canFocus) {
2201
+ this.closeEdit();
2202
+ }
2203
+ }
2204
+ clearCell() {
2205
+ var _a;
2206
+ const range = this.selectionStore.get('range');
2207
+ if (range && !headerCellRenderer.isRangeSingleCell(range)) {
2208
+ const data = this.columnService.getRangeStaticData(range, '');
2209
+ (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.onRangeApply(data, range, range);
2210
+ }
2211
+ else if (this.canEdit()) {
2212
+ const focused = this.selectionStore.get('focus');
2213
+ if (!focused) {
2214
+ return;
2215
+ }
2216
+ const cell = this.columnService.getSaveData(focused.y, focused.x);
2217
+ this.cellEdit({
2218
+ rgRow: focused.y,
2219
+ rgCol: focused.x,
2220
+ val: '',
2221
+ type: cell.type,
2222
+ prop: cell.prop,
2223
+ });
2224
+ }
2225
+ }
2226
+ rowDragStart({ detail }) {
2227
+ detail.text = headerCellRenderer.getCellData(this.columnService.rowDataModel(detail.cell.y, detail.cell.x).value);
2228
+ }
2229
+ /**
2230
+ * Verify if edit allowed.
2231
+ */
2232
+ canEdit() {
2233
+ var _a;
2234
+ if (this.readonly) {
2235
+ return false;
2236
+ }
2237
+ const focus = this.selectionStore.get('focus');
2238
+ return focus && !((_a = this.columnService) === null || _a === void 0 ? void 0 : _a.isReadOnly(focus.y, focus.x));
2239
+ }
2240
+ get edited() {
2241
+ return this.selectionStore.get('edit');
2242
+ }
2243
+ /**
2244
+ * Sets the focus on a cell and optionally edits a range.
2245
+ */
2246
+ focus(cell, isRangeEdit = false) {
2247
+ if (!cell)
2248
+ return false;
2249
+ const end = cell;
2250
+ const start = this.selectionStore.get('focus');
2251
+ if (isRangeEdit && start) {
2252
+ const range = headerCellRenderer.getRange(start, end);
2253
+ if (range) {
2254
+ return this.triggerRangeEvent(range);
2255
+ }
2256
+ }
2257
+ return this.doFocus(cell, end);
2258
+ }
2259
+ get types() {
2260
+ return {
2261
+ rowType: this.dataStore.get('type'),
2262
+ colType: this.columnService.type,
2263
+ };
2264
+ }
2265
+ /**
2266
+ * Collect data
2267
+ */
2268
+ getData() {
2269
+ return {
2270
+ el: this.element,
2271
+ rows: this.dimensionRow.state,
2272
+ cols: this.dimensionCol.state,
2273
+ lastCell: this.lastCell,
2274
+ focus: this.selectionStore.get('focus'),
2275
+ range: this.selectionStore.get('range'),
2276
+ edit: this.selectionStore.get('edit'),
2277
+ };
2278
+ }
2279
+ get element() { return index.getElement(this); }
2280
+ static get watchers() { return {
2281
+ "selectionStore": ["selectionServiceSet"],
2282
+ "dimensionRow": ["createAutoFillService"],
2283
+ "dimensionCol": ["createAutoFillService"],
2284
+ "dataStore": ["columnServiceSet"],
2285
+ "colData": ["columnServiceSet"]
2286
+ }; }
2287
+ };
2288
+ OverlaySelection.style = revogrOverlayStyleCss;
2289
+
2290
+ const RowHeaderRender = s => (__, { rowIndex: i }) => s + i;
2291
+
2292
+ const RevogrRowHeaders = class {
2293
+ constructor(hostRef) {
2294
+ index.registerInstance(this, hostRef);
2295
+ this.scrollViewport = index.createEvent(this, "scrollview", 3);
2296
+ this.elementToScroll = index.createEvent(this, "ref", 3);
2297
+ /**
2298
+ * Prevent rendering until job is done.
2299
+ * Can be used for initial rendering performance improvement.
2300
+ * When several plugins require initial rendering this will prevent double initial rendering.
2301
+ */
2302
+ this.jobsBeforeRender = [];
2303
+ }
2304
+ render() {
2305
+ const dataViews = [];
2306
+ const viewport = new viewport_store.ViewportStore('colPinStart');
2307
+ /** render viewports rows */
2308
+ let totalLength = 1;
2309
+ // todo: this part could be optimized to avoid to often re-render dataPorts can be cached
2310
+ for (let data of this.dataPorts) {
2311
+ const itemCount = data.dataStore.get('items').length;
2312
+ // initiate row data
2313
+ const dataStore = new dimension_helpers.DataStore(data.type, Object.assign({}, data.dataStore.state));
2314
+ // initiate column data
2315
+ const colData = new dimension_helpers.DataStore('colPinStart');
2316
+ const column = Object.assign({ cellTemplate: RowHeaderRender(totalLength) }, this.rowHeaderColumn);
2317
+ colData.updateData([column]);
2318
+ dataViews.push(index.h("revogr-data", Object.assign({}, data, { colType: "rowHeaders", jobsBeforeRender: this.jobsBeforeRender, rowClass: this.rowClass, dataStore: dataStore.store, colData: colData.store, viewportCol: viewport.store, readonly: true, range: false })));
2319
+ totalLength += itemCount;
2320
+ }
2321
+ const colSize = viewport_store.calculateRowHeaderSize(totalLength, this.rowHeaderColumn);
2322
+ viewport.setViewport({
2323
+ realCount: 1,
2324
+ virtualSize: 0,
2325
+ items: [
2326
+ {
2327
+ size: colSize,
2328
+ start: 0,
2329
+ end: colSize,
2330
+ itemIndex: 0,
2331
+ },
2332
+ ],
2333
+ });
2334
+ const viewportScroll = {
2335
+ contentHeight: this.height,
2336
+ contentWidth: 0,
2337
+ style: { minWidth: `${colSize}px` },
2338
+ colType: 'rowHeaders',
2339
+ ref: (el) => this.elementToScroll.emit(el),
2340
+ onScrollviewport: (e) => this.scrollViewport.emit(e.detail),
2341
+ };
2342
+ const viewportHeader = Object.assign(Object.assign({}, this.headerProp), {
2343
+ // groups not present on row headers
2344
+ groups: [], colData: typeof this.rowHeaderColumn === 'object' ? [this.rowHeaderColumn] : [], viewportCol: viewport.store, canResize: false, type: dimension_helpers.ROW_HEADER_TYPE,
2345
+ // parent,
2346
+ slot: viewport_helpers.HEADER_SLOT
2347
+ });
2348
+ return (index.h(index.Host, { class: { [dimension_helpers.ROW_HEADER_TYPE]: true }, key: dimension_helpers.ROW_HEADER_TYPE }, index.h("revogr-viewport-scroll", Object.assign({ key: '7f9783c740a051771d58dca3313900b2fa48b531' }, viewportScroll, { "row-header": true }), index.h("revogr-header", Object.assign({ key: '0aa96a4867349e473ef1a387d09919527e221a6b' }, viewportHeader)), dataViews)));
2349
+ }
2350
+ };
2351
+
2352
+ /**
2353
+ * Autohide scroll for MacOS when scroll is visible only for 1 sec
2354
+ */
2355
+ class AutohideScrollPlugin {
2356
+ constructor(element) {
2357
+ this.element = element;
2358
+ this.autohideScrollTimeout = 0;
2359
+ }
2360
+ /**
2361
+ * When scroll size updates set it up for autohide
2362
+ */
2363
+ setScrollSize(s) {
2364
+ if (!s) {
2365
+ this.element.setAttribute('autohide', 'true');
2366
+ }
2367
+ else {
2368
+ this.element.removeAttribute('autohide');
2369
+ }
2370
+ }
2371
+ /**
2372
+ * On each scroll check if it's time to show
2373
+ */
2374
+ checkScroll({ scrollSize, contentSize, virtualSize, }) {
2375
+ const hasScroll = contentSize > virtualSize;
2376
+ const isHidden = !scrollSize && hasScroll;
2377
+ if (isHidden) {
2378
+ this.element.setAttribute('visible', 'true');
2379
+ this.autohideScrollTimeout = this.show(this.element, this.autohideScrollTimeout);
2380
+ }
2381
+ }
2382
+ show(element, timeout) {
2383
+ clearTimeout(timeout);
2384
+ return Number(setTimeout(() => {
2385
+ element === null || element === void 0 ? void 0 : element.removeAttribute('visible');
2386
+ }, 1000));
2387
+ }
2388
+ clear() {
2389
+ clearTimeout(this.autohideScrollTimeout);
2390
+ }
2391
+ }
2392
+
2393
+ const revogrScrollStyleCss = "revogr-scroll-virtual[autohide]{position:absolute;z-index:100 !important}revogr-scroll-virtual[autohide].vertical{top:0;right:0}revogr-scroll-virtual[autohide].vertical[visible]{min-width:20px !important}revogr-scroll-virtual[autohide].horizontal{bottom:0;left:0}revogr-scroll-virtual[autohide].horizontal[visible]{min-height:20px !important}revogr-scroll-virtual.vertical{overflow-y:auto;overflow-x:hidden;height:100%}revogr-scroll-virtual.vertical>div{width:1px}revogr-scroll-virtual.horizontal{overflow-x:auto;overflow-y:hidden;width:100%}revogr-scroll-virtual.horizontal>div{height:1px}";
2394
+
2395
+ const RevogrScrollVirtual = class {
2396
+ constructor(hostRef) {
2397
+ index.registerInstance(this, hostRef);
2398
+ this.scrollVirtual = index.createEvent(this, "scrollvirtual", 7);
2399
+ /**
2400
+ * Scroll dimension (`X` - `rgCol` or `Y` - `rgRow`)
2401
+ */
2402
+ this.dimension = 'rgRow';
2403
+ this.scrollSize = 0;
2404
+ // 防抖定时器
2405
+ this.scrollSizeUpdateTimer = null;
2406
+ }
2407
+ async setScroll(e) {
2408
+ var _a;
2409
+ if (this.dimension !== e.dimension) {
2410
+ return;
2411
+ }
2412
+ this.localScrollTimer.latestScrollUpdate(e.dimension);
2413
+ (_a = this.localScrollService) === null || _a === void 0 ? void 0 : _a.setScroll(e);
2414
+ if (e.coordinate) {
2415
+ this.autohideScrollPlugin.checkScroll({
2416
+ scrollSize: this.scrollSize,
2417
+ contentSize: this.realSize,
2418
+ virtualSize: this.virtualSize,
2419
+ });
2420
+ }
2421
+ }
2422
+ /**
2423
+ * Update if `delta` exists in case we don't know current position or if it's external change
2424
+ */
2425
+ async changeScroll(e) {
2426
+ if (e.delta) {
2427
+ // 滚动阈值:小于此值认为没有实际滚动空间
2428
+ const SCROLL_THRESHOLD = 10;
2429
+ const clientSize = this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth;
2430
+ const diff = this.realSize - clientSize;
2431
+ // 如果没有滚动空间,不处理滚动
2432
+ if (diff <= SCROLL_THRESHOLD) {
2433
+ e.coordinate = 0;
2434
+ return e;
2435
+ }
2436
+ switch (e.dimension) {
2437
+ case 'rgCol':
2438
+ e.coordinate = this.element.scrollLeft + e.delta;
2439
+ break;
2440
+ case 'rgRow':
2441
+ e.coordinate = this.element.scrollTop + e.delta;
2442
+ break;
2443
+ }
2444
+ this.setScroll(e);
2445
+ }
2446
+ return e;
2447
+ }
2448
+ connectedCallback() {
2449
+ this.autohideScrollPlugin = new AutohideScrollPlugin(this.element);
2450
+ this.localScrollTimer = new throttle.LocalScrollTimer('ontouchstart' in document.documentElement ? 0 : 10);
2451
+ this.localScrollService = new throttle.LocalScrollService({
2452
+ runScroll: e => this.scrollVirtual.emit(e),
2453
+ applyScroll: e => {
2454
+ this.localScrollTimer.setCoordinate(e);
2455
+ const type = e.dimension === 'rgRow' ? 'scrollTop' : 'scrollLeft';
2456
+ // this will trigger on scroll event
2457
+ this.element[type] = e.coordinate;
2458
+ },
2459
+ });
2460
+ }
2461
+ disconnectedCallback() {
2462
+ this.autohideScrollPlugin.clear();
2463
+ if (this.scrollSizeUpdateTimer) {
2464
+ clearTimeout(this.scrollSizeUpdateTimer);
2465
+ }
2466
+ }
2467
+ componentWillLoad() {
2468
+ this.scrollSize = dimension_helpers.getScrollbarSize(document);
2469
+ }
2470
+ componentDidRender() {
2471
+ // 使用防抖来更新滚动条尺寸,避免 resize 过程中的闪烁
2472
+ if (this.scrollSizeUpdateTimer) {
2473
+ clearTimeout(this.scrollSizeUpdateTimer);
2474
+ }
2475
+ this.scrollSizeUpdateTimer = setTimeout(() => {
2476
+ this.scrollSizeUpdateTimer = null;
2477
+ this.updateScrollSize();
2478
+ }, RevogrScrollVirtual.SCROLL_SIZE_UPDATE_DELAY);
2479
+ this.localScrollService.setParams({
2480
+ contentSize: this.realSize,
2481
+ clientSize: this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth,
2482
+ virtualSize: this.clientSize,
2483
+ }, this.dimension);
2484
+ }
2485
+ /**
2486
+ * 更新滚动条尺寸
2487
+ */
2488
+ updateScrollSize() {
2489
+ // 滚动阈值:小于此值认为没有实际滚动空间
2490
+ const SCROLL_THRESHOLD = 10;
2491
+ let scrollSize = 0;
2492
+ if (this.dimension === 'rgRow') {
2493
+ // 使用 realSize(内容实际高度)和 clientHeight(可见区域高度)来判断
2494
+ const diff = this.realSize - this.element.clientHeight;
2495
+ scrollSize = diff > SCROLL_THRESHOLD ? this.scrollSize : 0;
2496
+ this.element.style.minWidth = `${scrollSize}px`;
2497
+ }
2498
+ else {
2499
+ // 使用 realSize(内容实际宽度)和 clientWidth(可见区域宽度)来判断
2500
+ const diff = this.realSize - this.element.clientWidth;
2501
+ scrollSize = diff > SCROLL_THRESHOLD ? this.scrollSize : 0;
2502
+ this.element.style.minHeight = `${scrollSize}px`;
2503
+ }
2504
+ this.autohideScrollPlugin.setScrollSize(scrollSize);
2505
+ }
2506
+ onScroll(e) {
2507
+ if (!(e.target instanceof Element)) {
2508
+ return;
2509
+ }
2510
+ const target = e.target;
2511
+ let type = 'scrollLeft';
2512
+ if (this.dimension === 'rgRow') {
2513
+ type = 'scrollTop';
2514
+ }
2515
+ // 滚动阈值:小于此值认为没有实际滚动空间
2516
+ const SCROLL_THRESHOLD = 10;
2517
+ const clientSize = this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth;
2518
+ const diff = this.realSize - clientSize;
2519
+ // 如果没有滚动空间,不处理滚动事件
2520
+ if (diff <= SCROLL_THRESHOLD) {
2521
+ return;
2522
+ }
2523
+ const setScroll = () => {
2524
+ var _a;
2525
+ (_a = this.localScrollService) === null || _a === void 0 ? void 0 : _a.scroll(target[type] || 0, this.dimension);
2526
+ };
2527
+ // apply after throttling
2528
+ if (this.localScrollTimer.isReady(this.dimension, target[type])) {
2529
+ setScroll();
2530
+ }
2531
+ else {
2532
+ this.localScrollTimer.throttleLastScrollUpdate(this.dimension, target[type] || 0, () => setScroll());
2533
+ }
2534
+ }
2535
+ render() {
2536
+ // 滚动阈值:小于此值认为没有实际滚动空间
2537
+ const SCROLL_THRESHOLD = 10;
2538
+ const clientSize = this.dimension === 'rgRow' ? this.element.clientHeight : this.element.clientWidth;
2539
+ const diff = this.realSize - clientSize;
2540
+ // 如果差值小于阈值,不显示滚动内容(避免闪烁)
2541
+ if (diff <= SCROLL_THRESHOLD) {
2542
+ return (index.h(index.Host, { onScroll: (e) => this.onScroll(e) }, index.h("div", { style: { [this.dimension === 'rgRow' ? 'height' : 'width']: '0px' } })));
2543
+ }
2544
+ const size = throttle.getContentSize(this.realSize, clientSize, this.clientSize);
2545
+ return (index.h(index.Host, { onScroll: (e) => this.onScroll(e) }, index.h("div", { style: {
2546
+ [this.dimension === 'rgRow' ? 'height' : 'width']: `${size}px`,
2547
+ } })));
2548
+ }
2549
+ get element() { return index.getElement(this); }
2550
+ };
2551
+ // 防抖延迟时间
2552
+ RevogrScrollVirtual.SCROLL_SIZE_UPDATE_DELAY = 200;
2553
+ RevogrScrollVirtual.style = revogrScrollStyleCss;
2554
+
2555
+ const revogrTempRangeStyleCss = ".temp-bg-range{display:block !important;position:absolute;pointer-events:none;z-index:9;border:1px solid rgb(255, 94, 0);box-sizing:border-box}.temp-bg-range.Selection{border:1px dashed gray}.temp-bg-range>div{width:1px;height:1px;position:absolute}.temp-bg-range>div.top{top:-1px}.temp-bg-range>div.bottom{bottom:-1px}.temp-bg-range>div.left{left:-1px}.temp-bg-range>div.right{right:-1px}";
2556
+
2557
+ const RevogrFocus = class {
2558
+ constructor(hostRef) {
2559
+ index.registerInstance(this, hostRef);
2560
+ this.onChange = throttle.throttle((e) => this.doChange(e), 300);
2561
+ }
2562
+ doChange(e) {
2563
+ e === null || e === void 0 ? void 0 : e.scrollIntoView({
2564
+ block: 'nearest',
2565
+ inline: 'nearest',
2566
+ });
2567
+ }
2568
+ componentDidRender() {
2569
+ if (this.el) {
2570
+ this.onChange(this.el);
2571
+ }
2572
+ }
2573
+ render() {
2574
+ const data = this.selectionStore.get('tempRange');
2575
+ const type = this.selectionStore.get('tempRangeType');
2576
+ if (!data) {
2577
+ return;
2578
+ }
2579
+ let directionY = 'bottom';
2580
+ let derectionX = 'right';
2581
+ const range = this.getRange();
2582
+ if (!range) {
2583
+ return;
2584
+ }
2585
+ if (data.y < range.y) {
2586
+ directionY = 'top';
2587
+ }
2588
+ if (data.x < range.x) {
2589
+ derectionX = 'left';
2590
+ }
2591
+ const directionClass = `${derectionX} ${directionY}`;
2592
+ const cell = getCell(data, this.dimensionRow.state, this.dimensionCol.state);
2593
+ const styles = styleByCellProps(cell);
2594
+ const props = {
2595
+ class: {
2596
+ [dimension_helpers.TMP_SELECTION_BG_CLASS]: true,
2597
+ [type || '']: true,
2598
+ },
2599
+ style: styles,
2600
+ hidden: false
2601
+ };
2602
+ return (index.h(index.Host, Object.assign({}, props), index.h("div", { class: directionClass, ref: (e) => (this.el = e) })));
2603
+ }
2604
+ getRange() {
2605
+ const range = this.selectionStore.get('range');
2606
+ if (range) {
2607
+ return range;
2608
+ }
2609
+ const focus = this.selectionStore.get('focus');
2610
+ if (!focus) {
2611
+ return null;
2612
+ }
2613
+ return Object.assign(Object.assign({}, focus), { x1: focus.x, y1: focus.y });
2614
+ }
2615
+ };
2616
+ RevogrFocus.style = revogrTempRangeStyleCss;
2617
+
2618
+ exports.revogr_attribution = Attribution;
2619
+ exports.revogr_extra = RevoGridExtra;
2620
+ exports.revogr_focus = RevogrFocus$1;
2621
+ exports.revogr_grouping_overlay = RevogrGroupingOverlay;
2622
+ exports.revogr_header_unified = RevogrHeaderUnifiedComponent;
2623
+ exports.revogr_overlay_selection = OverlaySelection;
2624
+ exports.revogr_row_headers = RevogrRowHeaders;
2625
+ exports.revogr_scroll_virtual = RevogrScrollVirtual;
2626
+ exports.revogr_temp_range = RevogrFocus;
2627
+ //# sourceMappingURL=revogr-attribution.revogr-extra.revogr-focus.revogr-grouping-overlay.revogr-header-unified.revogr-overlay-selection.revogr-row-headers.revogr-scroll-virtual.revogr-temp-range.entry.cjs.js.map
2628
+
2629
+ //# sourceMappingURL=revogr-attribution_9.cjs.entry.js.map