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