apex-grid 1.0.1 → 2.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 (453) hide show
  1. package/LICENSE +76 -5
  2. package/README.md +520 -10
  3. package/components/cell.d.ts +74 -0
  4. package/components/cell.js +376 -0
  5. package/components/cell.js.map +1 -0
  6. package/{dist/src/components → components}/filter-row.d.ts +13 -12
  7. package/components/filter-row.js +396 -0
  8. package/components/filter-row.js.map +1 -0
  9. package/components/grid.d.ts +1173 -0
  10. package/components/grid.js +620 -0
  11. package/components/grid.js.map +1 -0
  12. package/components/header-row.d.ts +43 -0
  13. package/components/header-row.js +205 -0
  14. package/components/header-row.js.map +1 -0
  15. package/{dist/src/components → components}/header.d.ts +11 -5
  16. package/components/header.js +263 -0
  17. package/components/header.js.map +1 -0
  18. package/components/paginator.d.ts +56 -0
  19. package/components/paginator.js +148 -0
  20. package/components/paginator.js.map +1 -0
  21. package/components/row.d.ts +43 -0
  22. package/components/row.js +239 -0
  23. package/components/row.js.map +1 -0
  24. package/components/toolbar.d.ts +60 -0
  25. package/components/toolbar.js +275 -0
  26. package/components/toolbar.js.map +1 -0
  27. package/{dist/src/components → components}/virtualizer.d.ts +2 -3
  28. package/{dist/src/components → components}/virtualizer.js +3 -3
  29. package/components/virtualizer.js.map +1 -0
  30. package/controllers/data-operation.d.ts +31 -0
  31. package/controllers/data-operation.js +53 -0
  32. package/controllers/data-operation.js.map +1 -0
  33. package/controllers/dom.d.ts +55 -0
  34. package/controllers/dom.js +221 -0
  35. package/controllers/dom.js.map +1 -0
  36. package/controllers/editing.d.ts +130 -0
  37. package/controllers/editing.js +197 -0
  38. package/controllers/editing.js.map +1 -0
  39. package/controllers/expansion.d.ts +68 -0
  40. package/controllers/expansion.js +126 -0
  41. package/controllers/expansion.js.map +1 -0
  42. package/{dist/src/controllers → controllers}/filter.d.ts +2 -3
  43. package/controllers/filter.js +105 -0
  44. package/controllers/filter.js.map +1 -0
  45. package/{dist/src/controllers → controllers}/navigation.d.ts +18 -8
  46. package/{dist/src/controllers → controllers}/navigation.js +31 -20
  47. package/controllers/navigation.js.map +1 -0
  48. package/controllers/pagination.d.ts +102 -0
  49. package/controllers/pagination.js +106 -0
  50. package/controllers/pagination.js.map +1 -0
  51. package/controllers/reorder.d.ts +78 -0
  52. package/controllers/reorder.js +124 -0
  53. package/controllers/reorder.js.map +1 -0
  54. package/{dist/src/controllers → controllers}/resize.d.ts +2 -3
  55. package/controllers/resize.js +52 -0
  56. package/controllers/resize.js.map +1 -0
  57. package/controllers/selection.d.ts +109 -0
  58. package/controllers/selection.js +168 -0
  59. package/controllers/selection.js.map +1 -0
  60. package/{dist/src/controllers → controllers}/sort.d.ts +1 -2
  61. package/controllers/sort.js +122 -0
  62. package/controllers/sort.js.map +1 -0
  63. package/controllers/state.d.ts +56 -0
  64. package/controllers/state.js +74 -0
  65. package/controllers/state.js.map +1 -0
  66. package/controllers/tree.d.ts +87 -0
  67. package/controllers/tree.js +0 -0
  68. package/controllers/tree.js.map +1 -0
  69. package/custom-elements.json +6901 -1554
  70. package/{dist/src/define.d.ts → define.d.ts} +0 -1
  71. package/define.js.map +1 -0
  72. package/docs/assets/hierarchy.js +1 -0
  73. package/docs/assets/highlight.css +127 -0
  74. package/docs/assets/icons.js +18 -0
  75. package/docs/assets/icons.svg +1 -0
  76. package/docs/assets/main.js +60 -0
  77. package/docs/assets/navigation.js +1 -0
  78. package/docs/assets/search.js +1 -0
  79. package/docs/assets/style.css +1633 -0
  80. package/docs/classes/ApexGrid.html +371 -0
  81. package/docs/functions/setup.html +22 -0
  82. package/docs/hierarchy.html +1 -0
  83. package/docs/index.html +504 -0
  84. package/docs/interfaces/ApexCellValueChangedEvent.html +11 -0
  85. package/docs/interfaces/ApexCellValueChangingEvent.html +13 -0
  86. package/docs/interfaces/ApexColumnMovedEvent.html +8 -0
  87. package/docs/interfaces/ApexColumnMovingEvent.html +11 -0
  88. package/docs/interfaces/ApexColumnPinnedEvent.html +6 -0
  89. package/docs/interfaces/ApexColumnPinningEvent.html +8 -0
  90. package/docs/interfaces/ApexDetailContext.html +8 -0
  91. package/docs/interfaces/ApexFilteredEvent.html +6 -0
  92. package/docs/interfaces/ApexFilteringEvent.html +12 -0
  93. package/docs/interfaces/ApexGridEventMap.html +68 -0
  94. package/docs/interfaces/ApexHeaderContext.html +6 -0
  95. package/docs/interfaces/ApexPageChangedEvent.html +10 -0
  96. package/docs/interfaces/ApexPageChangingEvent.html +10 -0
  97. package/docs/interfaces/ApexQuickFilterChangedEvent.html +4 -0
  98. package/docs/interfaces/ApexQuickFilterChangingEvent.html +6 -0
  99. package/docs/interfaces/ApexRowEditEndedEvent.html +6 -0
  100. package/docs/interfaces/ApexRowEditStartedEvent.html +4 -0
  101. package/docs/interfaces/ApexRowExpandedEvent.html +8 -0
  102. package/docs/interfaces/ApexRowExpandingEvent.html +11 -0
  103. package/docs/interfaces/ApexRowSelectedEvent.html +8 -0
  104. package/docs/interfaces/ApexRowSelectingEvent.html +11 -0
  105. package/docs/interfaces/ApexTreeRowExpandedEvent.html +8 -0
  106. package/docs/interfaces/ApexTreeRowExpandingEvent.html +10 -0
  107. package/docs/interfaces/BaseApexCellContext.html +16 -0
  108. package/docs/interfaces/BaseApexEditorContext.html +19 -0
  109. package/docs/interfaces/BaseColumnConfiguration.html +83 -0
  110. package/docs/interfaces/BaseColumnSortConfiguration.html +6 -0
  111. package/docs/interfaces/BaseFilterExpression.html +15 -0
  112. package/docs/interfaces/BaseSortExpression.html +12 -0
  113. package/docs/interfaces/CSVExportOptions.html +22 -0
  114. package/docs/interfaces/ColumnFilterConfiguration.html +4 -0
  115. package/docs/interfaces/DataPipelineConfiguration.html +15 -0
  116. package/docs/interfaces/ExportOptions.html +15 -0
  117. package/docs/interfaces/GridEditingConfiguration.html +10 -0
  118. package/docs/interfaces/GridExpansionConfiguration.html +15 -0
  119. package/docs/interfaces/GridSelectionConfiguration.html +11 -0
  120. package/docs/interfaces/GridSortConfiguration.html +6 -0
  121. package/docs/interfaces/GridTreeConfiguration.html +33 -0
  122. package/docs/interfaces/PaginationConfiguration.html +18 -0
  123. package/docs/interfaces/PaginationState.html +10 -0
  124. package/docs/interfaces/XLSXExportOptions.html +17 -0
  125. package/docs/media/package.json +83 -0
  126. package/docs/media/publish.yml +111 -0
  127. package/docs/modules.html +1 -0
  128. package/docs/types/ApexCellContext.html +2 -0
  129. package/docs/types/ApexEditorContext.html +2 -0
  130. package/docs/types/BasePropertyType.html +2 -0
  131. package/docs/types/BaseSortComparer.html +2 -0
  132. package/docs/types/ColumnConfiguration.html +2 -0
  133. package/docs/types/ColumnDropPosition.html +2 -0
  134. package/docs/types/ColumnSortConfiguration.html +2 -0
  135. package/docs/types/DataPipelineHook.html +2 -0
  136. package/docs/types/DataPipelineParams.html +8 -0
  137. package/docs/types/DataType.html +30 -0
  138. package/docs/types/EditMode.html +6 -0
  139. package/docs/types/EditTrigger.html +4 -0
  140. package/docs/types/ExportCellValue.html +5 -0
  141. package/docs/types/ExportSource.html +8 -0
  142. package/docs/types/FilterCriteria.html +6 -0
  143. package/docs/types/FilterExpression.html +2 -0
  144. package/docs/types/Keys.html +2 -0
  145. package/docs/types/PaginationMode.html +6 -0
  146. package/docs/types/PinPosition.html +5 -0
  147. package/docs/types/PropertyType.html +2 -0
  148. package/docs/types/SelectionMode.html +7 -0
  149. package/docs/types/SortComparer.html +2 -0
  150. package/docs/types/SortExpression.html +2 -0
  151. package/docs/types/SortState.html +2 -0
  152. package/docs/types/SortingDirection.html +3 -0
  153. package/index.d.ts +11 -0
  154. package/{dist/src/index.js → index.js} +1 -0
  155. package/index.js.map +1 -0
  156. package/internal/column-types.d.ts +94 -0
  157. package/internal/column-types.js +268 -0
  158. package/internal/column-types.js.map +1 -0
  159. package/{dist/src/internal → internal}/constants.d.ts +0 -1
  160. package/internal/constants.js.map +1 -0
  161. package/internal/export.d.ts +106 -0
  162. package/internal/export.js +122 -0
  163. package/internal/export.js.map +1 -0
  164. package/internal/flip.d.ts +80 -0
  165. package/internal/flip.js +52 -0
  166. package/internal/flip.js.map +1 -0
  167. package/internal/icons.d.ts +24 -0
  168. package/internal/icons.js +134 -0
  169. package/internal/icons.js.map +1 -0
  170. package/{dist/src/internal → internal}/is-defined.d.ts +0 -1
  171. package/internal/is-defined.js.map +1 -0
  172. package/{dist/src/internal → internal}/mixins/event-emitter.d.ts +0 -1
  173. package/internal/mixins/event-emitter.js.map +1 -0
  174. package/{dist/src/internal → internal}/normalize-case.d.ts +0 -1
  175. package/internal/normalize-case.js.map +1 -0
  176. package/{dist/src/internal → internal}/part-map.d.ts +0 -1
  177. package/{dist/src/internal → internal}/part-map.js +1 -1
  178. package/internal/part-map.js.map +1 -0
  179. package/{dist/src/internal → internal}/register.d.ts +3 -4
  180. package/internal/register.js +9 -0
  181. package/internal/register.js.map +1 -0
  182. package/{dist/src/internal → internal}/tags.d.ts +2 -1
  183. package/{dist/src/internal → internal}/tags.js +2 -0
  184. package/internal/tags.js.map +1 -0
  185. package/internal/theming.d.ts +34 -0
  186. package/internal/theming.js +123 -0
  187. package/internal/theming.js.map +1 -0
  188. package/internal/types.d.ts +619 -0
  189. package/internal/types.js.map +1 -0
  190. package/internal/utils.d.ts +29 -0
  191. package/internal/utils.js +75 -0
  192. package/internal/utils.js.map +1 -0
  193. package/{dist/src/internal → internal}/watch.d.ts +0 -1
  194. package/{dist/src/internal → internal}/watch.js +2 -2
  195. package/internal/watch.js.map +1 -0
  196. package/internal/xlsx.d.ts +22 -0
  197. package/internal/xlsx.js +228 -0
  198. package/internal/xlsx.js.map +1 -0
  199. package/{dist/src/operations → operations}/base.d.ts +0 -1
  200. package/operations/base.js.map +1 -0
  201. package/{dist/src/operations → operations}/filter/operands/boolean.d.ts +0 -1
  202. package/{dist/src/operations → operations}/filter/operands/boolean.js +5 -5
  203. package/operations/filter/operands/boolean.js.map +1 -0
  204. package/{dist/src/operations → operations}/filter/operands/number.d.ts +0 -1
  205. package/{dist/src/operations → operations}/filter/operands/number.js +2 -2
  206. package/operations/filter/operands/number.js.map +1 -0
  207. package/{dist/src/operations → operations}/filter/operands/string.d.ts +0 -1
  208. package/{dist/src/operations → operations}/filter/operands/string.js +2 -2
  209. package/operations/filter/operands/string.js.map +1 -0
  210. package/{dist/src/operations → operations}/filter/state.d.ts +1 -2
  211. package/{dist/src/operations → operations}/filter/state.js +3 -4
  212. package/operations/filter/state.js.map +1 -0
  213. package/{dist/src/operations → operations}/filter/tree.d.ts +1 -2
  214. package/{dist/src/operations → operations}/filter/tree.js +5 -6
  215. package/operations/filter/tree.js.map +1 -0
  216. package/{dist/src/operations → operations}/filter/types.d.ts +0 -1
  217. package/operations/filter/types.js.map +1 -0
  218. package/{dist/src/operations → operations}/filter.d.ts +0 -1
  219. package/{dist/src/operations → operations}/filter.js +4 -7
  220. package/operations/filter.js.map +1 -0
  221. package/operations/pagination.d.ts +19 -0
  222. package/operations/pagination.js +12 -0
  223. package/operations/pagination.js.map +1 -0
  224. package/operations/quick-filter.d.ts +21 -0
  225. package/operations/quick-filter.js +26 -0
  226. package/operations/quick-filter.js.map +1 -0
  227. package/{dist/src/operations → operations}/sort/types.d.ts +0 -1
  228. package/operations/sort/types.js.map +1 -0
  229. package/{dist/src/operations → operations}/sort.d.ts +0 -1
  230. package/{dist/src/operations → operations}/sort.js +5 -5
  231. package/operations/sort.js.map +1 -0
  232. package/package.json +25 -83
  233. package/setup.d.ts +58 -0
  234. package/setup.js +29 -0
  235. package/setup.js.map +1 -0
  236. package/{dist/src/styles/body-row/body-row-styles.css.d.ts → styles/_common.css.d.ts} +0 -1
  237. package/styles/_common.css.js +3 -0
  238. package/styles/_common.css.js.map +1 -0
  239. package/{dist/src/styles/body-cell/body-cell-styles.css.d.ts → styles/body-cell/body-cell.css.d.ts} +0 -1
  240. package/styles/body-cell/body-cell.css.js +3 -0
  241. package/styles/body-cell/body-cell.css.js.map +1 -0
  242. package/{dist/src/styles/filter-row/filter-row-styles.css.d.ts → styles/body-row/body-row.css.d.ts} +0 -1
  243. package/styles/body-row/body-row.css.js +3 -0
  244. package/styles/body-row/body-row.css.js.map +1 -0
  245. package/{dist/src/styles/grid/themes/light/grid.fluent-styles.css.d.ts → styles/filter-row/filter-row.css.d.ts} +0 -1
  246. package/styles/filter-row/filter-row.css.js +3 -0
  247. package/styles/filter-row/filter-row.css.js.map +1 -0
  248. package/styles/grid/_grid.base.css.d.ts +1 -0
  249. package/styles/grid/_grid.base.css.js +3 -0
  250. package/styles/grid/_grid.base.css.js.map +1 -0
  251. package/styles/grid/themes/light/grid.bootstrap.css.d.ts +1 -0
  252. package/styles/grid/themes/light/grid.bootstrap.css.js +3 -0
  253. package/styles/grid/themes/light/grid.bootstrap.css.js.map +1 -0
  254. package/styles/grid/themes/light/grid.fluent.css.d.ts +1 -0
  255. package/styles/grid/themes/light/grid.fluent.css.js +3 -0
  256. package/styles/grid/themes/light/grid.fluent.css.js.map +1 -0
  257. package/styles/grid/themes/light/grid.indigo.css.d.ts +1 -0
  258. package/styles/grid/themes/light/grid.indigo.css.js +3 -0
  259. package/styles/grid/themes/light/grid.indigo.css.js.map +1 -0
  260. package/styles/grid/themes/light/grid.material.css.d.ts +1 -0
  261. package/styles/grid/themes/light/grid.material.css.js +3 -0
  262. package/styles/grid/themes/light/grid.material.css.js.map +1 -0
  263. package/styles/header-cell/header-cell.css.d.ts +1 -0
  264. package/styles/header-cell/header-cell.css.js +3 -0
  265. package/styles/header-cell/header-cell.css.js.map +1 -0
  266. package/styles/header-row/header-row.base.css.d.ts +1 -0
  267. package/styles/header-row/header-row.base.css.js +3 -0
  268. package/styles/header-row/header-row.base.css.js.map +1 -0
  269. package/styles/paginator/paginator.css.d.ts +1 -0
  270. package/styles/paginator/paginator.css.js +3 -0
  271. package/styles/paginator/paginator.css.js.map +1 -0
  272. package/styles/toolbar/toolbar.css.d.ts +1 -0
  273. package/styles/toolbar/toolbar.css.js +3 -0
  274. package/styles/toolbar/toolbar.css.js.map +1 -0
  275. package/styles.css +17 -0
  276. package/dist/bundle.js +0 -2194
  277. package/dist/docs/assets/highlight.css +0 -43
  278. package/dist/docs/assets/main.js +0 -58
  279. package/dist/docs/assets/search.js +0 -1
  280. package/dist/docs/assets/style.css +0 -1365
  281. package/dist/docs/classes/ApexGrid.html +0 -327
  282. package/dist/docs/index.html +0 -82
  283. package/dist/docs/interfaces/ApexFilteredEvent.html +0 -104
  284. package/dist/docs/interfaces/ApexFilteringEvent.html +0 -116
  285. package/dist/docs/interfaces/ApexGridEventMap.html +0 -127
  286. package/dist/docs/interfaces/ApexHeaderContext.html +0 -104
  287. package/dist/docs/interfaces/BaseApexCellContext.html +0 -120
  288. package/dist/docs/interfaces/BaseColumnConfiguration.html +0 -196
  289. package/dist/docs/interfaces/BaseColumnSortConfiguration.html +0 -106
  290. package/dist/docs/interfaces/BaseFilterExpression.html +0 -132
  291. package/dist/docs/interfaces/BaseSortExpression.html +0 -124
  292. package/dist/docs/interfaces/ColumnFilterConfiguration.html +0 -92
  293. package/dist/docs/interfaces/DataPipelineConfiguration.html +0 -104
  294. package/dist/docs/interfaces/GridSortConfiguration.html +0 -99
  295. package/dist/docs/modules.html +0 -102
  296. package/dist/docs/types/ApexCellContext.html +0 -74
  297. package/dist/docs/types/BasePropertyType.html +0 -74
  298. package/dist/docs/types/BaseSortComparer.html +0 -89
  299. package/dist/docs/types/ColumnConfiguration.html +0 -74
  300. package/dist/docs/types/ColumnSortConfiguration.html +0 -74
  301. package/dist/docs/types/DataPipelineHook.html +0 -85
  302. package/dist/docs/types/DataPipelineParams.html +0 -87
  303. package/dist/docs/types/DataType.html +0 -67
  304. package/dist/docs/types/FilterCriteria.html +0 -71
  305. package/dist/docs/types/FilterExpression.html +0 -74
  306. package/dist/docs/types/Keys.html +0 -72
  307. package/dist/docs/types/PropertyType.html +0 -74
  308. package/dist/docs/types/SortComparer.html +0 -74
  309. package/dist/docs/types/SortExpression.html +0 -74
  310. package/dist/docs/types/SortState.html +0 -72
  311. package/dist/docs/types/SortingDirection.html +0 -69
  312. package/dist/src/components/cell.d.ts +0 -36
  313. package/dist/src/components/cell.d.ts.map +0 -1
  314. package/dist/src/components/cell.js +0 -55
  315. package/dist/src/components/cell.js.map +0 -1
  316. package/dist/src/components/filter-row.d.ts.map +0 -1
  317. package/dist/src/components/filter-row.js +0 -316
  318. package/dist/src/components/filter-row.js.map +0 -1
  319. package/dist/src/components/grid.d.ts +0 -226
  320. package/dist/src/components/grid.d.ts.map +0 -1
  321. package/dist/src/components/grid.js +0 -309
  322. package/dist/src/components/grid.js.map +0 -1
  323. package/dist/src/components/header-row.d.ts +0 -24
  324. package/dist/src/components/header-row.d.ts.map +0 -1
  325. package/dist/src/components/header-row.js +0 -78
  326. package/dist/src/components/header-row.js.map +0 -1
  327. package/dist/src/components/header.d.ts.map +0 -1
  328. package/dist/src/components/header.js +0 -144
  329. package/dist/src/components/header.js.map +0 -1
  330. package/dist/src/components/row.d.ts +0 -25
  331. package/dist/src/components/row.d.ts.map +0 -1
  332. package/dist/src/components/row.js +0 -68
  333. package/dist/src/components/row.js.map +0 -1
  334. package/dist/src/components/virtualizer.d.ts.map +0 -1
  335. package/dist/src/components/virtualizer.js.map +0 -1
  336. package/dist/src/controllers/data-operation.d.ts +0 -18
  337. package/dist/src/controllers/data-operation.d.ts.map +0 -1
  338. package/dist/src/controllers/data-operation.js +0 -37
  339. package/dist/src/controllers/data-operation.js.map +0 -1
  340. package/dist/src/controllers/dom.d.ts +0 -20
  341. package/dist/src/controllers/dom.d.ts.map +0 -1
  342. package/dist/src/controllers/dom.js +0 -60
  343. package/dist/src/controllers/dom.js.map +0 -1
  344. package/dist/src/controllers/filter.d.ts.map +0 -1
  345. package/dist/src/controllers/filter.js +0 -119
  346. package/dist/src/controllers/filter.js.map +0 -1
  347. package/dist/src/controllers/navigation.d.ts.map +0 -1
  348. package/dist/src/controllers/navigation.js.map +0 -1
  349. package/dist/src/controllers/resize.d.ts.map +0 -1
  350. package/dist/src/controllers/resize.js +0 -70
  351. package/dist/src/controllers/resize.js.map +0 -1
  352. package/dist/src/controllers/sort.d.ts.map +0 -1
  353. package/dist/src/controllers/sort.js +0 -94
  354. package/dist/src/controllers/sort.js.map +0 -1
  355. package/dist/src/controllers/state.d.ts +0 -25
  356. package/dist/src/controllers/state.d.ts.map +0 -1
  357. package/dist/src/controllers/state.js +0 -40
  358. package/dist/src/controllers/state.js.map +0 -1
  359. package/dist/src/define.d.ts.map +0 -1
  360. package/dist/src/define.js.map +0 -1
  361. package/dist/src/index.d.ts +0 -9
  362. package/dist/src/index.d.ts.map +0 -1
  363. package/dist/src/index.js.map +0 -1
  364. package/dist/src/internal/constants.d.ts.map +0 -1
  365. package/dist/src/internal/constants.js.map +0 -1
  366. package/dist/src/internal/icon-registry.d.ts +0 -2
  367. package/dist/src/internal/icon-registry.d.ts.map +0 -1
  368. package/dist/src/internal/icon-registry.js +0 -29
  369. package/dist/src/internal/icon-registry.js.map +0 -1
  370. package/dist/src/internal/is-defined.d.ts.map +0 -1
  371. package/dist/src/internal/is-defined.js.map +0 -1
  372. package/dist/src/internal/mixins/event-emitter.d.ts.map +0 -1
  373. package/dist/src/internal/mixins/event-emitter.js.map +0 -1
  374. package/dist/src/internal/normalize-case.d.ts.map +0 -1
  375. package/dist/src/internal/normalize-case.js.map +0 -1
  376. package/dist/src/internal/part-map.d.ts.map +0 -1
  377. package/dist/src/internal/part-map.js.map +0 -1
  378. package/dist/src/internal/register.d.ts.map +0 -1
  379. package/dist/src/internal/register.js +0 -9
  380. package/dist/src/internal/register.js.map +0 -1
  381. package/dist/src/internal/tags.d.ts.map +0 -1
  382. package/dist/src/internal/tags.js.map +0 -1
  383. package/dist/src/internal/types.d.ts +0 -199
  384. package/dist/src/internal/types.d.ts.map +0 -1
  385. package/dist/src/internal/types.js.map +0 -1
  386. package/dist/src/internal/utils.d.ts +0 -7
  387. package/dist/src/internal/utils.d.ts.map +0 -1
  388. package/dist/src/internal/utils.js +0 -37
  389. package/dist/src/internal/utils.js.map +0 -1
  390. package/dist/src/internal/watch.d.ts.map +0 -1
  391. package/dist/src/internal/watch.js.map +0 -1
  392. package/dist/src/operations/base.d.ts.map +0 -1
  393. package/dist/src/operations/base.js.map +0 -1
  394. package/dist/src/operations/filter/operands/boolean.d.ts.map +0 -1
  395. package/dist/src/operations/filter/operands/boolean.js.map +0 -1
  396. package/dist/src/operations/filter/operands/number.d.ts.map +0 -1
  397. package/dist/src/operations/filter/operands/number.js.map +0 -1
  398. package/dist/src/operations/filter/operands/string.d.ts.map +0 -1
  399. package/dist/src/operations/filter/operands/string.js.map +0 -1
  400. package/dist/src/operations/filter/state.d.ts.map +0 -1
  401. package/dist/src/operations/filter/state.js.map +0 -1
  402. package/dist/src/operations/filter/tree.d.ts.map +0 -1
  403. package/dist/src/operations/filter/tree.js.map +0 -1
  404. package/dist/src/operations/filter/types.d.ts.map +0 -1
  405. package/dist/src/operations/filter/types.js.map +0 -1
  406. package/dist/src/operations/filter.d.ts.map +0 -1
  407. package/dist/src/operations/filter.js.map +0 -1
  408. package/dist/src/operations/sort/types.d.ts.map +0 -1
  409. package/dist/src/operations/sort/types.js.map +0 -1
  410. package/dist/src/operations/sort.d.ts.map +0 -1
  411. package/dist/src/operations/sort.js.map +0 -1
  412. package/dist/src/styles/body-cell/body-cell-styles.css.d.ts.map +0 -1
  413. package/dist/src/styles/body-cell/body-cell-styles.css.js +0 -71
  414. package/dist/src/styles/body-cell/body-cell-styles.css.js.map +0 -1
  415. package/dist/src/styles/body-row/body-row-styles.css.d.ts.map +0 -1
  416. package/dist/src/styles/body-row/body-row-styles.css.js +0 -38
  417. package/dist/src/styles/body-row/body-row-styles.css.js.map +0 -1
  418. package/dist/src/styles/filter-row/filter-row-styles.css.d.ts.map +0 -1
  419. package/dist/src/styles/filter-row/filter-row-styles.css.js +0 -96
  420. package/dist/src/styles/filter-row/filter-row-styles.css.js.map +0 -1
  421. package/dist/src/styles/grid/themes/light/grid.bootstrap-styles.css.d.ts +0 -2
  422. package/dist/src/styles/grid/themes/light/grid.bootstrap-styles.css.d.ts.map +0 -1
  423. package/dist/src/styles/grid/themes/light/grid.bootstrap-styles.css.js +0 -83
  424. package/dist/src/styles/grid/themes/light/grid.bootstrap-styles.css.js.map +0 -1
  425. package/dist/src/styles/grid/themes/light/grid.fluent-styles.css.d.ts.map +0 -1
  426. package/dist/src/styles/grid/themes/light/grid.fluent-styles.css.js +0 -83
  427. package/dist/src/styles/grid/themes/light/grid.fluent-styles.css.js.map +0 -1
  428. package/dist/src/styles/grid/themes/light/grid.indigo-styles.css.d.ts +0 -2
  429. package/dist/src/styles/grid/themes/light/grid.indigo-styles.css.d.ts.map +0 -1
  430. package/dist/src/styles/grid/themes/light/grid.indigo-styles.css.js +0 -83
  431. package/dist/src/styles/grid/themes/light/grid.indigo-styles.css.js.map +0 -1
  432. package/dist/src/styles/grid/themes/light/grid.material-styles.css.d.ts +0 -2
  433. package/dist/src/styles/grid/themes/light/grid.material-styles.css.d.ts.map +0 -1
  434. package/dist/src/styles/grid/themes/light/grid.material-styles.css.js +0 -83
  435. package/dist/src/styles/grid/themes/light/grid.material-styles.css.js.map +0 -1
  436. package/dist/src/styles/header-cell/header-cell-styles.css.d.ts +0 -2
  437. package/dist/src/styles/header-cell/header-cell-styles.css.d.ts.map +0 -1
  438. package/dist/src/styles/header-cell/header-cell-styles.css.js +0 -141
  439. package/dist/src/styles/header-cell/header-cell-styles.css.js.map +0 -1
  440. package/dist/src/styles/header-row/header-row.base-styles.css.d.ts +0 -2
  441. package/dist/src/styles/header-row/header-row.base-styles.css.d.ts.map +0 -1
  442. package/dist/src/styles/header-row/header-row.base-styles.css.js +0 -35
  443. package/dist/src/styles/header-row/header-row.base-styles.css.js.map +0 -1
  444. /package/{dist/src/define.js → define.js} +0 -0
  445. /package/{dist/docs → docs}/.nojekyll +0 -0
  446. /package/{dist/src/internal → internal}/constants.js +0 -0
  447. /package/{dist/src/internal → internal}/is-defined.js +0 -0
  448. /package/{dist/src/internal → internal}/mixins/event-emitter.js +0 -0
  449. /package/{dist/src/internal → internal}/normalize-case.js +0 -0
  450. /package/{dist/src/internal → internal}/types.js +0 -0
  451. /package/{dist/src/operations → operations}/base.js +0 -0
  452. /package/{dist/src/operations → operations}/filter/types.js +0 -0
  453. /package/{dist/src/operations → operations}/sort/types.js +0 -0
@@ -4,13 +4,13 @@ import { GRID_BODY } from '../internal/tags.js';
4
4
  export default class ApexVirtualizer extends LitVirtualizer {
5
5
  constructor() {
6
6
  super(...arguments);
7
- this.scroller = true;
7
+ this.scroller = false;
8
8
  }
9
- static get is() {
9
+ static get tagName() {
10
10
  return GRID_BODY;
11
11
  }
12
12
  static register() {
13
- registerComponent(this);
13
+ registerComponent(ApexVirtualizer);
14
14
  }
15
15
  async connectedCallback() {
16
16
  await super.layoutComplete;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualizer.js","sourceRoot":"","sources":["../../src/components/virtualizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,cAAc;IAA3D;;QAckB,aAAQ,GAAG,KAAK,CAAC;IAQnC,CAAC;IArBQ,MAAM,KAAK,OAAO;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IASe,KAAK,CAAC,iBAAiB;QACrC,MAAM,KAAK,CAAC,cAAc,CAAC;QAE3B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["import { LitVirtualizer } from '@lit-labs/virtualizer/LitVirtualizer.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_BODY } from '../internal/tags.js';\n\nexport default class ApexVirtualizer extends LitVirtualizer {\n public static get tagName() {\n return GRID_BODY;\n }\n\n public static register(): void {\n registerComponent(ApexVirtualizer);\n }\n\n // The virtualizer used to own vertical scrolling, which made it a scroll container\n // and broke `position: sticky` for body cells in pinned columns (cells would anchor\n // to the virtualizer instead of the horizontally-scrolling grid host). With\n // `scroller = false` the grid host owns both axes, so headers and pinned body cells\n // share a single sticky containing block.\n public override scroller = false;\n\n public override async connectedCallback() {\n await super.layoutComplete;\n\n super.connectedCallback();\n this.setAttribute('tabindex', '0');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ApexVirtualizer.tagName]: ApexVirtualizer;\n }\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { ReactiveController } from 'lit';
2
+ import type { GridHost } from '../internal/types.js';
3
+ import FilterDataOperation from '../operations/filter.js';
4
+ import QuickFilterDataOperation from '../operations/quick-filter.js';
5
+ import SortDataOperation from '../operations/sort.js';
6
+ import type { StateController } from './state.js';
7
+ export declare class DataOperationsController<T extends object> implements ReactiveController {
8
+ protected host: GridHost<T>;
9
+ protected sorting: SortDataOperation<T>;
10
+ protected filtering: FilterDataOperation<T>;
11
+ protected quickFiltering: QuickFilterDataOperation<T>;
12
+ constructor(host: GridHost<T>);
13
+ hostConnected(): void;
14
+ protected get hasCustomSort(): boolean;
15
+ protected get hasCustomFilter(): boolean;
16
+ protected get hasCustomQuickFilter(): boolean;
17
+ protected get customFilter(): import("../index.js").DataPipelineHook<T>;
18
+ protected get customSort(): import("../index.js").DataPipelineHook<T>;
19
+ protected get customQuickFilter(): import("../index.js").DataPipelineHook<T>;
20
+ /**
21
+ * Applies the quick-filter (global search), column-filter, and sort steps of the
22
+ * data pipeline.
23
+ *
24
+ * @remarks
25
+ * The returned dataset is the full post-filter, post-sort view. Pagination is
26
+ * intentionally not applied here so callers can derive `totalItems` and the
27
+ * paginator's `pageCount` from a stable value. The grid slices the page for
28
+ * the virtualizer at render time.
29
+ */
30
+ apply(data: T[], state: StateController<T>): Promise<T[]>;
31
+ }
@@ -0,0 +1,53 @@
1
+ import { isDefined } from '../internal/is-defined.js';
2
+ import FilterDataOperation from '../operations/filter.js';
3
+ import QuickFilterDataOperation from '../operations/quick-filter.js';
4
+ import SortDataOperation from '../operations/sort.js';
5
+ export class DataOperationsController {
6
+ constructor(host) {
7
+ this.host = host;
8
+ this.sorting = new SortDataOperation();
9
+ this.filtering = new FilterDataOperation();
10
+ this.quickFiltering = new QuickFilterDataOperation();
11
+ this.host.addController(this);
12
+ }
13
+ hostConnected() { }
14
+ get hasCustomSort() {
15
+ return isDefined(this.host.dataPipelineConfiguration?.sort);
16
+ }
17
+ get hasCustomFilter() {
18
+ return isDefined(this.host.dataPipelineConfiguration?.filter);
19
+ }
20
+ get hasCustomQuickFilter() {
21
+ return isDefined(this.host.dataPipelineConfiguration?.quickFilter);
22
+ }
23
+ get customFilter() {
24
+ return this.host.dataPipelineConfiguration.filter;
25
+ }
26
+ get customSort() {
27
+ return this.host.dataPipelineConfiguration.sort;
28
+ }
29
+ get customQuickFilter() {
30
+ return this.host.dataPipelineConfiguration.quickFilter;
31
+ }
32
+ async apply(data, state) {
33
+ const { filtering, sorting } = state;
34
+ let transformed;
35
+ const quickFilterTerm = (this.host.quickFilter ?? '').trim();
36
+ transformed = this.hasCustomQuickFilter
37
+ ? await this.customQuickFilter({ data, grid: this.host, type: 'quickFilter' })
38
+ : quickFilterTerm
39
+ ? this.quickFiltering.apply(data, quickFilterTerm, this.host.columns)
40
+ : data;
41
+ transformed = this.hasCustomFilter
42
+ ? await this.customFilter({ data: transformed, grid: this.host, type: 'filter' })
43
+ : this.filtering.apply(transformed, filtering.state);
44
+ transformed = this.hasCustomSort
45
+ ? await this.customSort({ data: transformed, grid: this.host, type: 'sort' })
46
+ : this.sorting.apply(transformed, sorting.state);
47
+ if (state.tree.enabled) {
48
+ transformed = state.tree.process(transformed);
49
+ }
50
+ return transformed;
51
+ }
52
+ }
53
+ //# sourceMappingURL=data-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-operation.js","sourceRoot":"","sources":["../../src/controllers/data-operation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReactiveController } from 'lit';\nimport { isDefined } from '../internal/is-defined.js';\nimport type { GridHost } from '../internal/types.js';\nimport FilterDataOperation from '../operations/filter.js';\nimport QuickFilterDataOperation from '../operations/quick-filter.js';\nimport SortDataOperation from '../operations/sort.js';\nimport type { StateController } from './state.js';\n\nexport class DataOperationsController<T extends object> implements ReactiveController {\n protected sorting = new SortDataOperation<T>();\n protected filtering = new FilterDataOperation<T>();\n protected quickFiltering = new QuickFilterDataOperation<T>();\n\n constructor(protected host: GridHost<T>) {\n this.host.addController(this);\n }\n\n public hostConnected() {}\n\n protected get hasCustomSort() {\n return isDefined(this.host.dataPipelineConfiguration?.sort);\n }\n\n protected get hasCustomFilter() {\n return isDefined(this.host.dataPipelineConfiguration?.filter);\n }\n\n protected get hasCustomQuickFilter() {\n return isDefined(this.host.dataPipelineConfiguration?.quickFilter);\n }\n\n protected get customFilter() {\n return this.host.dataPipelineConfiguration!.filter!;\n }\n\n protected get customSort() {\n return this.host.dataPipelineConfiguration!.sort!;\n }\n\n protected get customQuickFilter() {\n return this.host.dataPipelineConfiguration!.quickFilter!;\n }\n\n /**\n * Applies the quick-filter (global search), column-filter, and sort steps of the\n * data pipeline.\n *\n * @remarks\n * The returned dataset is the full post-filter, post-sort view. Pagination is\n * intentionally not applied here so callers can derive `totalItems` and the\n * paginator's `pageCount` from a stable value. The grid slices the page for\n * the virtualizer at render time.\n */\n public async apply(data: T[], state: StateController<T>) {\n const { filtering, sorting } = state;\n let transformed: T[];\n\n const quickFilterTerm = (this.host.quickFilter ?? '').trim();\n transformed = this.hasCustomQuickFilter\n ? await this.customQuickFilter({ data, grid: this.host, type: 'quickFilter' })\n : quickFilterTerm\n ? this.quickFiltering.apply(data, quickFilterTerm, this.host.columns)\n : data;\n\n transformed = this.hasCustomFilter\n ? await this.customFilter({ data: transformed, grid: this.host, type: 'filter' })\n : this.filtering.apply(transformed, filtering.state);\n\n transformed = this.hasCustomSort\n ? await this.customSort({ data: transformed, grid: this.host, type: 'sort' })\n : this.sorting.apply(transformed, sorting.state);\n\n // Tree mode flattens the post-sort rows according to the current\n // expansion set. Disabled is a no-op pass-through, so flat tables keep\n // their existing behaviour untouched.\n if (state.tree.enabled) {\n transformed = state.tree.process(transformed);\n }\n\n return transformed;\n }\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import type { RenderItemFunction } from '@lit-labs/virtualizer/virtualize.js';
2
+ import { type ReactiveController } from 'lit';
3
+ import { type StyleInfo } from 'lit/directives/style-map.js';
4
+ import type { ColumnConfiguration, GridHost } from '../internal/types.js';
5
+ import type { StateController } from './state.js';
6
+ export declare class GridDOMController<T extends object> implements ReactiveController {
7
+ #private;
8
+ protected host: GridHost<T>;
9
+ protected state: StateController<T>;
10
+ constructor(host: GridHost<T>, state: StateController<T>);
11
+ get container(): import("../components/virtualizer.js").default;
12
+ /**
13
+ * Visual render order: `'start'`-pinned columns first, then unpinned, then
14
+ * `'end'`-pinned. The user-supplied `columns` array is never mutated.
15
+ */
16
+ get displayColumns(): Array<ColumnConfiguration<T>>;
17
+ columnSizes: StyleInfo;
18
+ /**
19
+ * The resolved inline-start (for `'start'` pin) or inline-end (for `'end'` pin)
20
+ * pixel offset per pinned column key. Populated after layout by
21
+ * {@link recomputePinOffsets}.
22
+ */
23
+ pinOffsets: Map<keyof T, number>;
24
+ rowRenderer: RenderItemFunction<T>;
25
+ hostConnected(): Promise<void>;
26
+ hostUpdate(): void;
27
+ hostUpdated(): void;
28
+ hostDisconnected(): void;
29
+ /**
30
+ * Writes the grid host's `clientWidth` into `--apex-host-width`. Used by the
31
+ * toolbar and paginator to clamp their width to the visible viewport so
32
+ * horizontal scrolling doesn't drag them off-screen.
33
+ */
34
+ recomputeHostWidth(): void;
35
+ setScrollOffset(): void;
36
+ protected setGridColumnSizes(): void;
37
+ getActiveRowStyles(index: number): StyleInfo;
38
+ /**
39
+ * Measures the rendered widths of pinned header cells and writes cumulative
40
+ * inline-start / inline-end pixel offsets into {@link pinOffsets}. Called after
41
+ * each grid update and whenever a header cell is resized.
42
+ */
43
+ recomputePinOffsets(): void;
44
+ protected observeHeaderCells(): void;
45
+ /**
46
+ * Writes the cumulative height of the sticky top rows into CSS custom
47
+ * properties used by the header/filter rows for their `inset-block-start`
48
+ * offsets. The toolbar is always at `top: 0`; the header sits below it
49
+ * (`--apex-row-top-header`) and the filter sits below the header
50
+ * (`--apex-row-top-filter`). Writes are skipped when the values haven't
51
+ * changed so the ResizeObserver feedback loop terminates.
52
+ */
53
+ recomputeStickyRowOffsets(): void;
54
+ protected observeStickyRows(): void;
55
+ }
@@ -0,0 +1,221 @@
1
+ import { html } from 'lit';
2
+ import { styleMap } from 'lit/directives/style-map.js';
3
+ import { applyColumnWidths, getDisplayColumns } from '../internal/utils.js';
4
+ export class GridDOMController {
5
+ constructor(host, state) {
6
+ this.host = host;
7
+ this.state = state;
8
+ this.#initialSize = () => {
9
+ setTimeout(() => {
10
+ this.setScrollOffset();
11
+ this.recomputePinOffsets();
12
+ this.recomputeStickyRowOffsets();
13
+ });
14
+ };
15
+ this.#resizeObserver = null;
16
+ this.#observedHeaders = new Set();
17
+ this.#stickyRowObserver = null;
18
+ this.#observedStickyRows = new Set();
19
+ this.columnSizes = {};
20
+ this.pinOffsets = new Map();
21
+ this.rowRenderer = (data, index) => {
22
+ const editingCell = this.state.editing.activeCell;
23
+ const editingKey = editingCell?.rowIndex === index ? editingCell.columnKey : null;
24
+ const hasFilter = this.host.columns.some((column) => column.filter);
25
+ const ariaRowOffset = hasFilter ? 2 : 1;
26
+ return html `
27
+ <apex-grid-row
28
+ part="row"
29
+ style=${styleMap({ ...this.columnSizes, ...this.getActiveRowStyles(index) })}
30
+ .index=${index}
31
+ .activeNode=${this.state.active}
32
+ .data=${data}
33
+ .columns=${this.displayColumns}
34
+ .pinOffsets=${this.pinOffsets}
35
+ .editingKey=${editingKey}
36
+ .ariaRowOffset=${ariaRowOffset}
37
+ >
38
+ </apex-grid-row>
39
+ `;
40
+ };
41
+ this.#lastHeaderTop = -1;
42
+ this.#lastFilterTop = -1;
43
+ this.#lastHostWidth = -1;
44
+ this.#hostWidthObserver = null;
45
+ this.host.addController(this);
46
+ }
47
+ #initialSize;
48
+ #resizeObserver;
49
+ #observedHeaders;
50
+ #stickyRowObserver;
51
+ #observedStickyRows;
52
+ get container() {
53
+ return this.host.scrollContainer;
54
+ }
55
+ get displayColumns() {
56
+ return getDisplayColumns(this.host.columns);
57
+ }
58
+ async hostConnected() {
59
+ this.setGridColumnSizes();
60
+ await this.host.updateComplete;
61
+ this.#initialSize();
62
+ if (typeof ResizeObserver !== 'undefined' && !this.#hostWidthObserver) {
63
+ this.#hostWidthObserver = new ResizeObserver(() => {
64
+ requestAnimationFrame(() => this.recomputeHostWidth());
65
+ });
66
+ this.#hostWidthObserver.observe(this.host);
67
+ }
68
+ this.recomputeHostWidth();
69
+ }
70
+ hostUpdate() {
71
+ this.setScrollOffset();
72
+ this.setGridColumnSizes();
73
+ }
74
+ hostUpdated() {
75
+ this.recomputePinOffsets();
76
+ this.observeHeaderCells();
77
+ this.recomputeStickyRowOffsets();
78
+ this.observeStickyRows();
79
+ }
80
+ hostDisconnected() {
81
+ this.#resizeObserver?.disconnect();
82
+ this.#resizeObserver = null;
83
+ this.#observedHeaders.clear();
84
+ this.#stickyRowObserver?.disconnect();
85
+ this.#stickyRowObserver = null;
86
+ this.#observedStickyRows.clear();
87
+ this.#hostWidthObserver?.disconnect();
88
+ this.#hostWidthObserver = null;
89
+ }
90
+ recomputeHostWidth() {
91
+ const host = this.host;
92
+ const width = host.clientWidth;
93
+ if (width === this.#lastHostWidth)
94
+ return;
95
+ host.style.setProperty('--apex-host-width', `${width}px`);
96
+ this.#lastHostWidth = width;
97
+ }
98
+ setScrollOffset() {
99
+ this.host.style.setProperty('--scrollbar-offset', '0px');
100
+ }
101
+ setGridColumnSizes() {
102
+ this.columnSizes = applyColumnWidths(this.displayColumns, {
103
+ showSelectionColumn: this.state.selection.showCheckboxColumn,
104
+ showExpansionColumn: this.state.expansion.showToggleColumn,
105
+ });
106
+ }
107
+ getActiveRowStyles(index) {
108
+ const { row } = this.state.active;
109
+ return row === index ? { 'z-index': '3' } : {};
110
+ }
111
+ recomputePinOffsets() {
112
+ const headerRow = this.host.headerRow;
113
+ if (!headerRow?.headers)
114
+ return;
115
+ const next = new Map();
116
+ const headersByKey = new Map();
117
+ for (const header of headerRow.headers) {
118
+ headersByKey.set(header.column.key, header.getBoundingClientRect());
119
+ }
120
+ let leftAccum = 0;
121
+ for (const column of this.displayColumns) {
122
+ if (column.hidden)
123
+ continue;
124
+ if (column.pinned !== 'start')
125
+ break;
126
+ next.set(column.key, leftAccum);
127
+ const rect = headersByKey.get(column.key);
128
+ leftAccum += rect?.width ?? 0;
129
+ }
130
+ let rightAccum = 0;
131
+ for (let i = this.displayColumns.length - 1; i >= 0; i--) {
132
+ const column = this.displayColumns[i];
133
+ if (column.hidden)
134
+ continue;
135
+ if (column.pinned !== 'end')
136
+ break;
137
+ next.set(column.key, rightAccum);
138
+ const rect = headersByKey.get(column.key);
139
+ rightAccum += rect?.width ?? 0;
140
+ }
141
+ if (!offsetsEqual(this.pinOffsets, next)) {
142
+ this.pinOffsets = next;
143
+ this.host.requestUpdate();
144
+ }
145
+ }
146
+ observeHeaderCells() {
147
+ const headerRow = this.host.headerRow;
148
+ if (!headerRow?.headers)
149
+ return;
150
+ if (!this.#resizeObserver) {
151
+ this.#resizeObserver = new ResizeObserver(() => {
152
+ requestAnimationFrame(() => this.recomputePinOffsets());
153
+ });
154
+ }
155
+ const next = new Set(headerRow.headers);
156
+ for (const element of this.#observedHeaders) {
157
+ if (!next.has(element))
158
+ this.#resizeObserver.unobserve(element);
159
+ }
160
+ for (const element of next) {
161
+ if (!this.#observedHeaders.has(element))
162
+ this.#resizeObserver.observe(element);
163
+ }
164
+ this.#observedHeaders = next;
165
+ }
166
+ #lastHeaderTop;
167
+ #lastFilterTop;
168
+ #lastHostWidth;
169
+ #hostWidthObserver;
170
+ recomputeStickyRowOffsets() {
171
+ const root = this.host.shadowRoot;
172
+ if (!root)
173
+ return;
174
+ const toolbar = root.querySelector('apex-grid-toolbar');
175
+ const header = root.querySelector('apex-grid-header-row');
176
+ const toolbarH = toolbar?.offsetHeight ?? 0;
177
+ const headerH = header?.offsetHeight ?? 0;
178
+ const headerTop = toolbarH;
179
+ const filterTop = toolbarH + headerH;
180
+ if (headerTop !== this.#lastHeaderTop) {
181
+ this.host.style.setProperty('--apex-row-top-header', `${headerTop}px`);
182
+ this.#lastHeaderTop = headerTop;
183
+ }
184
+ if (filterTop !== this.#lastFilterTop) {
185
+ this.host.style.setProperty('--apex-row-top-filter', `${filterTop}px`);
186
+ this.#lastFilterTop = filterTop;
187
+ }
188
+ }
189
+ observeStickyRows() {
190
+ const root = this.host.shadowRoot;
191
+ if (!root)
192
+ return;
193
+ const toolbar = root.querySelector('apex-grid-toolbar');
194
+ const header = root.querySelector('apex-grid-header-row');
195
+ if (!this.#stickyRowObserver) {
196
+ this.#stickyRowObserver = new ResizeObserver(() => {
197
+ requestAnimationFrame(() => this.recomputeStickyRowOffsets());
198
+ });
199
+ }
200
+ const next = new Set([toolbar, header].filter((el) => !!el));
201
+ for (const element of this.#observedStickyRows) {
202
+ if (!next.has(element))
203
+ this.#stickyRowObserver.unobserve(element);
204
+ }
205
+ for (const element of next) {
206
+ if (!this.#observedStickyRows.has(element))
207
+ this.#stickyRowObserver.observe(element);
208
+ }
209
+ this.#observedStickyRows = next;
210
+ }
211
+ }
212
+ function offsetsEqual(a, b) {
213
+ if (a.size !== b.size)
214
+ return false;
215
+ for (const [key, value] of a) {
216
+ if (b.get(key) !== value)
217
+ return false;
218
+ }
219
+ return true;
220
+ }
221
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/controllers/dom.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RenderItemFunction } from '@lit-labs/virtualizer/virtualize.js';\nimport { html, type ReactiveController } from 'lit';\nimport { type StyleInfo, styleMap } from 'lit/directives/style-map.js';\nimport type { ColumnConfiguration, GridHost, Keys } from '../internal/types.js';\nimport { applyColumnWidths, getDisplayColumns } from '../internal/utils.js';\nimport type { StateController } from './state.js';\n\nexport class GridDOMController<T extends object> implements ReactiveController {\n constructor(\n protected host: GridHost<T>,\n protected state: StateController<T>\n ) {\n this.host.addController(this);\n }\n\n #initialSize = () => {\n setTimeout(() => {\n this.setScrollOffset();\n this.recomputePinOffsets();\n this.recomputeStickyRowOffsets();\n });\n };\n\n #resizeObserver: ResizeObserver | null = null;\n #observedHeaders = new Set<Element>();\n #stickyRowObserver: ResizeObserver | null = null;\n #observedStickyRows = new Set<Element>();\n\n public get container() {\n // @ts-expect-error: protected member access\n return this.host.scrollContainer;\n }\n\n /**\n * Visual render order: `'start'`-pinned columns first, then unpinned, then\n * `'end'`-pinned. The user-supplied `columns` array is never mutated.\n */\n public get displayColumns(): Array<ColumnConfiguration<T>> {\n return getDisplayColumns(this.host.columns);\n }\n\n public columnSizes: StyleInfo = {};\n\n /**\n * The resolved inline-start (for `'start'` pin) or inline-end (for `'end'` pin)\n * pixel offset per pinned column key. Populated after layout by\n * {@link recomputePinOffsets}.\n */\n public pinOffsets = new Map<Keys<T>, number>();\n\n public rowRenderer: RenderItemFunction<T> = (data: T, index: number) => {\n const editingCell = this.state.editing.activeCell;\n const editingKey = editingCell?.rowIndex === index ? editingCell.columnKey : null;\n // aria-rowindex offset: header row is always row 1; filter row (when\n // any column has a filter configured) sits at row 2; body rows start\n // immediately after.\n const hasFilter = this.host.columns.some((column) => column.filter);\n const ariaRowOffset = hasFilter ? 2 : 1;\n return html`\n <apex-grid-row\n part=\"row\"\n style=${styleMap({ ...this.columnSizes, ...this.getActiveRowStyles(index) })}\n .index=${index}\n .activeNode=${this.state.active}\n .data=${data}\n .columns=${this.displayColumns}\n .pinOffsets=${this.pinOffsets}\n .editingKey=${editingKey}\n .ariaRowOffset=${ariaRowOffset}\n >\n </apex-grid-row>\n `;\n };\n\n public async hostConnected() {\n this.setGridColumnSizes();\n // Wait for the initial paint of the virtualizer and recalculate the scrollbar offset\n // for the next one\n await this.host.updateComplete;\n this.#initialSize();\n if (typeof ResizeObserver !== 'undefined' && !this.#hostWidthObserver) {\n this.#hostWidthObserver = new ResizeObserver(() => {\n requestAnimationFrame(() => this.recomputeHostWidth());\n });\n this.#hostWidthObserver.observe(this.host as HTMLElement);\n }\n this.recomputeHostWidth();\n }\n\n public hostUpdate(): void {\n this.setScrollOffset();\n this.setGridColumnSizes();\n }\n\n public hostUpdated(): void {\n this.recomputePinOffsets();\n this.observeHeaderCells();\n this.recomputeStickyRowOffsets();\n this.observeStickyRows();\n }\n\n public hostDisconnected(): void {\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = null;\n this.#observedHeaders.clear();\n this.#stickyRowObserver?.disconnect();\n this.#stickyRowObserver = null;\n this.#observedStickyRows.clear();\n this.#hostWidthObserver?.disconnect();\n this.#hostWidthObserver = null;\n }\n\n /**\n * Writes the grid host's `clientWidth` into `--apex-host-width`. Used by the\n * toolbar and paginator to clamp their width to the visible viewport so\n * horizontal scrolling doesn't drag them off-screen.\n */\n public recomputeHostWidth(): void {\n const host = this.host as HTMLElement;\n const width = host.clientWidth;\n if (width === this.#lastHostWidth) return;\n host.style.setProperty('--apex-host-width', `${width}px`);\n this.#lastHostWidth = width;\n }\n\n public setScrollOffset() {\n // The grid host now owns vertical scrolling, so the historic per-row\n // padding-inline-end compensation is no longer needed. Keep the CSS var\n // set to `0` for forward compatibility with consumer themes that read it.\n this.host.style.setProperty('--scrollbar-offset', '0px');\n }\n\n protected setGridColumnSizes() {\n this.columnSizes = applyColumnWidths(this.displayColumns, {\n showSelectionColumn: this.state.selection.showCheckboxColumn,\n showExpansionColumn: this.state.expansion.showToggleColumn,\n });\n }\n\n public getActiveRowStyles(index: number): StyleInfo {\n const { row } = this.state.active;\n return row === index ? { 'z-index': '3' } : {};\n }\n\n /**\n * Measures the rendered widths of pinned header cells and writes cumulative\n * inline-start / inline-end pixel offsets into {@link pinOffsets}. Called after\n * each grid update and whenever a header cell is resized.\n */\n public recomputePinOffsets(): void {\n // @ts-expect-error - protected member access\n const headerRow = this.host.headerRow as\n | {\n headers?: Array<{\n column: ColumnConfiguration<T>;\n getBoundingClientRect: () => DOMRect;\n }>;\n }\n | undefined;\n if (!headerRow?.headers) return;\n\n const next = new Map<Keys<T>, number>();\n const headersByKey = new Map<Keys<T>, DOMRect>();\n for (const header of headerRow.headers) {\n headersByKey.set(header.column.key as Keys<T>, header.getBoundingClientRect());\n }\n\n let leftAccum = 0;\n for (const column of this.displayColumns) {\n if (column.hidden) continue;\n if (column.pinned !== 'start') break;\n next.set(column.key as Keys<T>, leftAccum);\n const rect = headersByKey.get(column.key as Keys<T>);\n leftAccum += rect?.width ?? 0;\n }\n\n let rightAccum = 0;\n for (let i = this.displayColumns.length - 1; i >= 0; i--) {\n const column = this.displayColumns[i];\n if (column.hidden) continue;\n if (column.pinned !== 'end') break;\n next.set(column.key as Keys<T>, rightAccum);\n const rect = headersByKey.get(column.key as Keys<T>);\n rightAccum += rect?.width ?? 0;\n }\n\n if (!offsetsEqual(this.pinOffsets, next)) {\n this.pinOffsets = next;\n this.host.requestUpdate();\n }\n }\n\n protected observeHeaderCells(): void {\n // @ts-expect-error - protected member access\n const headerRow = this.host.headerRow as { headers?: Array<Element> } | undefined;\n if (!headerRow?.headers) return;\n\n if (!this.#resizeObserver) {\n this.#resizeObserver = new ResizeObserver(() => {\n // Defer to a new frame so any layout writes can't synchronously feed back\n // into this observer (which makes the browser raise the benign\n // \"ResizeObserver loop completed\" warning).\n requestAnimationFrame(() => this.recomputePinOffsets());\n });\n }\n\n const next = new Set<Element>(headerRow.headers);\n for (const element of this.#observedHeaders) {\n if (!next.has(element)) this.#resizeObserver.unobserve(element);\n }\n for (const element of next) {\n if (!this.#observedHeaders.has(element)) this.#resizeObserver.observe(element);\n }\n this.#observedHeaders = next;\n }\n\n #lastHeaderTop = -1;\n #lastFilterTop = -1;\n #lastHostWidth = -1;\n #hostWidthObserver: ResizeObserver | null = null;\n\n /**\n * Writes the cumulative height of the sticky top rows into CSS custom\n * properties used by the header/filter rows for their `inset-block-start`\n * offsets. The toolbar is always at `top: 0`; the header sits below it\n * (`--apex-row-top-header`) and the filter sits below the header\n * (`--apex-row-top-filter`). Writes are skipped when the values haven't\n * changed so the ResizeObserver feedback loop terminates.\n */\n public recomputeStickyRowOffsets(): void {\n const root = (this.host as HTMLElement).shadowRoot;\n if (!root) return;\n const toolbar = root.querySelector('apex-grid-toolbar') as HTMLElement | null;\n const header = root.querySelector('apex-grid-header-row') as HTMLElement | null;\n\n const toolbarH = toolbar?.offsetHeight ?? 0;\n const headerH = header?.offsetHeight ?? 0;\n const headerTop = toolbarH;\n const filterTop = toolbarH + headerH;\n\n if (headerTop !== this.#lastHeaderTop) {\n this.host.style.setProperty('--apex-row-top-header', `${headerTop}px`);\n this.#lastHeaderTop = headerTop;\n }\n if (filterTop !== this.#lastFilterTop) {\n this.host.style.setProperty('--apex-row-top-filter', `${filterTop}px`);\n this.#lastFilterTop = filterTop;\n }\n }\n\n protected observeStickyRows(): void {\n const root = (this.host as HTMLElement).shadowRoot;\n if (!root) return;\n const toolbar = root.querySelector('apex-grid-toolbar') as HTMLElement | null;\n const header = root.querySelector('apex-grid-header-row') as HTMLElement | null;\n\n if (!this.#stickyRowObserver) {\n this.#stickyRowObserver = new ResizeObserver(() => {\n requestAnimationFrame(() => this.recomputeStickyRowOffsets());\n });\n }\n\n const next = new Set<Element>([toolbar, header].filter((el): el is HTMLElement => !!el));\n for (const element of this.#observedStickyRows) {\n if (!next.has(element)) this.#stickyRowObserver.unobserve(element);\n }\n for (const element of next) {\n if (!this.#observedStickyRows.has(element)) this.#stickyRowObserver.observe(element);\n }\n this.#observedStickyRows = next;\n }\n}\n\nfunction offsetsEqual<K>(a: Map<K, number>, b: Map<K, number>): boolean {\n if (a.size !== b.size) return false;\n for (const [key, value] of a) {\n if (b.get(key) !== value) return false;\n }\n return true;\n}\n"]}
@@ -0,0 +1,130 @@
1
+ import type { ReactiveController } from 'lit';
2
+ import type { ColumnConfiguration, EditMode, EditTrigger, GridHost, Keys } from '../internal/types.js';
3
+ /**
4
+ * The default editing configuration used when the grid has none set.
5
+ */
6
+ export declare const DEFAULT_EDITING_CONFIG: Readonly<{
7
+ enabled: false;
8
+ mode: EditMode;
9
+ trigger: EditTrigger;
10
+ }>;
11
+ interface ActiveCell<T> {
12
+ rowIndex: number;
13
+ columnKey: Keys<T>;
14
+ /**
15
+ * Live reference to the underlying record (preserved through the pipeline so
16
+ * the source array can be mutated on commit).
17
+ */
18
+ data: T;
19
+ }
20
+ /**
21
+ * Reactive controller backing inline cell + row editing.
22
+ *
23
+ * @remarks
24
+ * Holds the currently active cell / row, pending values for row-mode edits,
25
+ * and is responsible for emitting the cancellable `cellValueChanging` event
26
+ * and follow-up `cellValueChanged` event. The actual data mutation writes
27
+ * through to {@link ApexGrid.data} so changes survive pipeline runs and
28
+ * propagate to consumers that own the source array.
29
+ */
30
+ export declare class EditingController<T extends object> implements ReactiveController {
31
+ protected host: GridHost<T>;
32
+ /** The cell currently in edit mode, or `null`. */
33
+ activeCell: ActiveCell<T> | null;
34
+ /** The row currently in edit mode (row mode only), or `null`. */
35
+ activeRow: {
36
+ rowIndex: number;
37
+ data: T;
38
+ } | null;
39
+ /**
40
+ * Pending values keyed by column for the currently editing row. Populated in
41
+ * row mode as the user edits individual cells; flushed on
42
+ * {@link commitRow}.
43
+ */
44
+ pending: Map<Keys<T>, unknown>;
45
+ constructor(host: GridHost<T>);
46
+ hostConnected(): void;
47
+ /**
48
+ * Whether editing is enabled at the grid level.
49
+ */
50
+ get enabled(): boolean;
51
+ /**
52
+ * The resolved edit mode (`'cell'` if unset).
53
+ */
54
+ get mode(): EditMode;
55
+ /**
56
+ * The resolved edit trigger (`'doubleClick'` if unset).
57
+ */
58
+ get trigger(): EditTrigger;
59
+ /**
60
+ * Whether the given column can be edited.
61
+ */
62
+ isEditable(column: ColumnConfiguration<T>): boolean;
63
+ /**
64
+ * Whether the cell `(rowIndex, columnKey)` is currently in edit mode.
65
+ */
66
+ isCellEditing(rowIndex: number, columnKey: Keys<T>): boolean;
67
+ /**
68
+ * Whether the given row is currently in edit mode (row mode).
69
+ */
70
+ isRowEditing(rowIndex: number): boolean;
71
+ /**
72
+ * Begins editing the cell at `(rowIndex, columnKey)`. Auto-commits any cell
73
+ * already in edit mode (in cell mode); in row mode it switches the active
74
+ * cell within the same row and rejects cross-row moves.
75
+ *
76
+ * @returns `true` if edit started, `false` if rejected (column not editable
77
+ * or row-mode constraint violated).
78
+ */
79
+ editCell(rowIndex: number, columnKey: Keys<T>): Promise<boolean>;
80
+ /**
81
+ * Begins editing the given row in row mode. Emits `rowEditStarted` on
82
+ * success. No-op in cell mode.
83
+ */
84
+ editRow(rowIndex: number): Promise<boolean>;
85
+ /**
86
+ * Commits a candidate value for the currently editing cell. In cell mode the
87
+ * value is written through to {@link ApexGrid.data}; in row mode it is staged
88
+ * in {@link pending} until {@link commitRow} is called.
89
+ *
90
+ * @param value - The candidate value.
91
+ * @returns `true` if accepted (or staged), `false` if rejected by
92
+ * `cellValueChanging.preventDefault()`.
93
+ */
94
+ commitCell(value?: unknown): Promise<boolean>;
95
+ /**
96
+ * Writes `value` directly to the cell at `(rowIndex, columnKey)` without
97
+ * entering edit mode. Used by interactive display widgets (e.g. the boolean
98
+ * checkbox) that handle their own input. Goes through the same
99
+ * `cellValueChanging` / `cellValueChanged` event path as a normal commit.
100
+ *
101
+ * @returns `true` if the value was applied, `false` if rejected by
102
+ * `cellValueChanging.preventDefault()` or the column is not editable.
103
+ */
104
+ commitImmediate(rowIndex: number, columnKey: Keys<T>, value: unknown): Promise<boolean>;
105
+ /**
106
+ * Discards the current cell edit without writing. In row mode the row edit
107
+ * stays open.
108
+ */
109
+ cancelCell(): void;
110
+ /**
111
+ * Commits all pending edits for the currently editing row. Emits
112
+ * `cellValueChanging` for every changed cell and `rowEditEnded` at the end.
113
+ *
114
+ * @returns `true` if the row was applied, `false` if any cell change was
115
+ * cancelled (the row remains in edit mode in that case).
116
+ */
117
+ commitRow(): Promise<boolean>;
118
+ /**
119
+ * Discards every pending edit for the active row and exits row edit mode.
120
+ * Emits `rowEditEnded` with `committed: false`.
121
+ */
122
+ cancelRow(): void;
123
+ /**
124
+ * Returns the current pending or committed value for `(rowIndex, columnKey)`.
125
+ * Cells in row mode read this so unstaged-but-pending values are reflected
126
+ * during the edit.
127
+ */
128
+ getValue(rowIndex: number, columnKey: Keys<T>): unknown;
129
+ }
130
+ export {};