@polygrid/core 1.0.0 → 1.0.2

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 (274) hide show
  1. package/package.json +39 -12
  2. package/postcss.config.cjs +3 -0
  3. package/src/api/index.ts +15 -0
  4. package/src/api/set-columns.ts +8 -0
  5. package/src/api/set-data.ts +8 -0
  6. package/src/api/set-grid-id.ts +7 -0
  7. package/src/engine/const/pg-css-class.ts +24 -0
  8. package/src/engine/core/grid-dom.ts +26 -0
  9. package/src/engine/core/grid.ts +77 -0
  10. package/src/engine/core/interfaces/grid-options.ts +8 -0
  11. package/src/engine/core/methods/add-dom-listener.ts +14 -0
  12. package/src/engine/core/methods/consume-options.ts +32 -0
  13. package/src/engine/core/methods/index.ts +2 -0
  14. package/src/engine/core/methods/normalize-rows.ts +5 -0
  15. package/src/engine/debug.config.ts +3 -0
  16. package/src/engine/rx-lite/core/observable.ts +29 -0
  17. package/src/engine/rx-lite/core/subject.ts +21 -0
  18. package/src/engine/rx-lite/interfaces/observable-like.ts +6 -0
  19. package/src/engine/rx-lite/interfaces/pipe-fn.ts +18 -0
  20. package/src/engine/rx-lite/operators/combine-latest-any.ts +51 -0
  21. package/src/engine/rx-lite/operators/combine-latest.ts +30 -0
  22. package/src/engine/rx-lite/operators/distinct-until-array-changed.ts +22 -0
  23. package/src/engine/rx-lite/operators/distinct-until-changed.ts +20 -0
  24. package/src/engine/rx-lite/operators/filter.ts +11 -0
  25. package/src/engine/rx-lite/operators/map.ts +9 -0
  26. package/src/engine/rx-lite/operators/select-keyed.ts +31 -0
  27. package/src/engine/rx-lite/operators/select.ts +26 -0
  28. package/src/engine/rx-lite/operators/skip.ts +18 -0
  29. package/src/engine/rx-lite/operators/takeuntil.ts +18 -0
  30. package/src/engine/rx-lite/types/operator.ts +3 -0
  31. package/src/engine/services/column/column.ts +30 -0
  32. package/src/engine/services/column/index.ts +1 -0
  33. package/src/engine/services/column/interfaces/column.ts +6 -0
  34. package/src/engine/services/column/methods/index.ts +2 -0
  35. package/src/engine/services/column/methods/resolve-column-widths.ts +46 -0
  36. package/src/engine/services/column/methods/set-columns.ts +28 -0
  37. package/{types/engine/services/column/types/column-width-state.d.ts → src/engine/services/column/types/column-width-state.ts} +1 -2
  38. package/src/engine/services/data/data.ts +27 -0
  39. package/src/engine/services/data/index.ts +1 -0
  40. package/src/engine/services/data/methods/index.ts +1 -0
  41. package/src/engine/services/data/methods/set-rows.ts +18 -0
  42. package/src/engine/services/layout/index.ts +1 -0
  43. package/src/engine/services/layout/layout.ts +100 -0
  44. package/src/engine/services/layout/methods/add-scroll-event-listeners.ts +38 -0
  45. package/src/engine/services/layout/methods/adjust-viewport.ts +66 -0
  46. package/src/engine/services/layout/methods/apply-column-widths.ts +17 -0
  47. package/src/engine/services/layout/methods/compute-column-widths.ts +23 -0
  48. package/src/engine/services/layout/methods/compute-total-row-height.ts +16 -0
  49. package/src/engine/services/layout/methods/index.ts +12 -0
  50. package/src/engine/services/layout/methods/initialize-layout-pipeline.ts +39 -0
  51. package/src/engine/services/layout/methods/resize-body.ts +15 -0
  52. package/src/engine/services/layout/methods/resize-v-scrollbar.ts +15 -0
  53. package/src/engine/services/layout/methods/set-cell-width.ts +21 -0
  54. package/src/engine/services/layout/methods/set-grid-id.ts +14 -0
  55. package/src/engine/services/layout/methods/set-up-resize-observer.ts +25 -0
  56. package/src/engine/services/layout/methods/update-column-widths.ts +28 -0
  57. package/src/engine/services/renderer/index.ts +1 -0
  58. package/src/engine/services/renderer/methods/index.ts +1 -0
  59. package/src/engine/services/renderer/methods/re-render-cells.ts +31 -0
  60. package/src/engine/services/renderer/parts/body/body.ts +34 -0
  61. package/src/engine/services/renderer/parts/body/cell.ts +12 -0
  62. package/src/engine/services/renderer/parts/body/row.ts +26 -0
  63. package/src/engine/services/renderer/parts/footer/footer-cells.ts +15 -0
  64. package/src/engine/services/renderer/parts/footer/footer.ts +24 -0
  65. package/src/engine/services/renderer/parts/grid/grid.ts +21 -0
  66. package/src/engine/services/renderer/parts/header/header-cells.ts +15 -0
  67. package/src/engine/services/renderer/parts/header/header.ts +24 -0
  68. package/src/engine/services/renderer/parts/root/root.ts +22 -0
  69. package/src/engine/services/renderer/parts/scrollbars/h-scrollbar.ts +21 -0
  70. package/src/engine/services/renderer/parts/scrollbars/v-scrollbar-bottom-corner.ts +8 -0
  71. package/src/engine/services/renderer/parts/scrollbars/v-scrollbar-spacer-bottom.ts +8 -0
  72. package/src/engine/services/renderer/parts/scrollbars/v-scrollbar-spacer-top.ts +8 -0
  73. package/src/engine/services/renderer/parts/scrollbars/v-scrollbar.ts +34 -0
  74. package/src/engine/services/renderer/parts/viewport/viewport.ts +32 -0
  75. package/src/engine/services/renderer/renderer.ts +23 -0
  76. package/src/engine/services/row/index.ts +1 -0
  77. package/src/engine/services/row/interfaces/row.ts +4 -0
  78. package/src/engine/services/row/methods/index.ts +0 -0
  79. package/src/engine/services/row/row.ts +10 -0
  80. package/src/engine/services/services.ts +26 -0
  81. package/src/engine/store/interfaces/grid-state.ts +20 -0
  82. package/src/engine/store/methods/create-initial-state.ts +20 -0
  83. package/src/engine/store/methods/create-tracked-proxy.ts +60 -0
  84. package/src/engine/store/methods/debug.ts +29 -0
  85. package/src/engine/store/store.ts +85 -0
  86. package/src/engine/store/types/state-key.ts +3 -0
  87. package/src/engine/store/types/store-mutation.ts +5 -0
  88. package/src/index.ts +1 -0
  89. package/src/styles/body.css +13 -0
  90. package/src/styles/cell.css +15 -0
  91. package/src/styles/footer.css +30 -0
  92. package/src/styles/grid.css +5 -0
  93. package/src/styles/header.css +25 -0
  94. package/src/styles/index.css +9 -0
  95. package/src/styles/root.css +12 -0
  96. package/src/styles/row.css +12 -0
  97. package/src/styles/scrollbar.css +50 -0
  98. package/src/styles/viewport.css +6 -0
  99. package/src/styles.d.ts +1 -0
  100. package/tsconfig.json +23 -0
  101. package/polygrid.css +0 -1
  102. package/polygrid.es.js +0 -658
  103. package/polygrid.umd.js +0 -1
  104. package/types/api/index.d.ts +0 -9
  105. package/types/api/index.d.ts.map +0 -1
  106. package/types/api/set-columns.d.ts +0 -4
  107. package/types/api/set-columns.d.ts.map +0 -1
  108. package/types/api/set-data.d.ts +0 -3
  109. package/types/api/set-data.d.ts.map +0 -1
  110. package/types/api/set-grid-id.d.ts +0 -3
  111. package/types/api/set-grid-id.d.ts.map +0 -1
  112. package/types/engine/const/pg-css-class.d.ts +0 -25
  113. package/types/engine/const/pg-css-class.d.ts.map +0 -1
  114. package/types/engine/core/grid-dom.d.ts +0 -23
  115. package/types/engine/core/grid-dom.d.ts.map +0 -1
  116. package/types/engine/core/grid.d.ts +0 -19
  117. package/types/engine/core/grid.d.ts.map +0 -1
  118. package/types/engine/core/interfaces/grid-options.d.ts +0 -8
  119. package/types/engine/core/interfaces/grid-options.d.ts.map +0 -1
  120. package/types/engine/core/methods/add-dom-listener.d.ts +0 -3
  121. package/types/engine/core/methods/add-dom-listener.d.ts.map +0 -1
  122. package/types/engine/core/methods/consume-options.d.ts +0 -4
  123. package/types/engine/core/methods/consume-options.d.ts.map +0 -1
  124. package/types/engine/core/methods/index.d.ts +0 -3
  125. package/types/engine/core/methods/index.d.ts.map +0 -1
  126. package/types/engine/core/methods/normalize-rows.d.ts +0 -3
  127. package/types/engine/core/methods/normalize-rows.d.ts.map +0 -1
  128. package/types/engine/debug.config.d.ts +0 -4
  129. package/types/engine/debug.config.d.ts.map +0 -1
  130. package/types/engine/rx-lite/core/observable.d.ts +0 -9
  131. package/types/engine/rx-lite/core/observable.d.ts.map +0 -1
  132. package/types/engine/rx-lite/core/subject.d.ts +0 -9
  133. package/types/engine/rx-lite/core/subject.d.ts.map +0 -1
  134. package/types/engine/rx-lite/interfaces/observable-like.d.ts +0 -6
  135. package/types/engine/rx-lite/interfaces/observable-like.d.ts.map +0 -1
  136. package/types/engine/rx-lite/interfaces/pipe-fn.d.ts +0 -9
  137. package/types/engine/rx-lite/interfaces/pipe-fn.d.ts.map +0 -1
  138. package/types/engine/rx-lite/operators/combine-latest-any.d.ts +0 -7
  139. package/types/engine/rx-lite/operators/combine-latest-any.d.ts.map +0 -1
  140. package/types/engine/rx-lite/operators/combine-latest.d.ts +0 -7
  141. package/types/engine/rx-lite/operators/combine-latest.d.ts.map +0 -1
  142. package/types/engine/rx-lite/operators/distinct-until-array-changed.d.ts +0 -4
  143. package/types/engine/rx-lite/operators/distinct-until-array-changed.d.ts.map +0 -1
  144. package/types/engine/rx-lite/operators/distinct-until-changed.d.ts +0 -3
  145. package/types/engine/rx-lite/operators/distinct-until-changed.d.ts.map +0 -1
  146. package/types/engine/rx-lite/operators/filter.d.ts +0 -3
  147. package/types/engine/rx-lite/operators/filter.d.ts.map +0 -1
  148. package/types/engine/rx-lite/operators/map.d.ts +0 -3
  149. package/types/engine/rx-lite/operators/map.d.ts.map +0 -1
  150. package/types/engine/rx-lite/operators/select-keyed.d.ts +0 -5
  151. package/types/engine/rx-lite/operators/select-keyed.d.ts.map +0 -1
  152. package/types/engine/rx-lite/operators/select.d.ts +0 -5
  153. package/types/engine/rx-lite/operators/select.d.ts.map +0 -1
  154. package/types/engine/rx-lite/operators/skip.d.ts +0 -3
  155. package/types/engine/rx-lite/operators/skip.d.ts.map +0 -1
  156. package/types/engine/rx-lite/operators/takeuntil.d.ts +0 -4
  157. package/types/engine/rx-lite/operators/takeuntil.d.ts.map +0 -1
  158. package/types/engine/rx-lite/types/operator.d.ts +0 -3
  159. package/types/engine/rx-lite/types/operator.d.ts.map +0 -1
  160. package/types/engine/services/column/column.d.ts +0 -18
  161. package/types/engine/services/column/column.d.ts.map +0 -1
  162. package/types/engine/services/column/index.d.ts +0 -2
  163. package/types/engine/services/column/index.d.ts.map +0 -1
  164. package/types/engine/services/column/interfaces/column.d.ts +0 -7
  165. package/types/engine/services/column/interfaces/column.d.ts.map +0 -1
  166. package/types/engine/services/column/methods/index.d.ts +0 -3
  167. package/types/engine/services/column/methods/index.d.ts.map +0 -1
  168. package/types/engine/services/column/methods/resolve-column-widths.d.ts +0 -3
  169. package/types/engine/services/column/methods/resolve-column-widths.d.ts.map +0 -1
  170. package/types/engine/services/column/methods/set-columns.d.ts +0 -4
  171. package/types/engine/services/column/methods/set-columns.d.ts.map +0 -1
  172. package/types/engine/services/column/types/column-width-state.d.ts.map +0 -1
  173. package/types/engine/services/data/data.d.ts +0 -15
  174. package/types/engine/services/data/data.d.ts.map +0 -1
  175. package/types/engine/services/data/index.d.ts +0 -2
  176. package/types/engine/services/data/index.d.ts.map +0 -1
  177. package/types/engine/services/data/methods/index.d.ts +0 -2
  178. package/types/engine/services/data/methods/index.d.ts.map +0 -1
  179. package/types/engine/services/data/methods/set-rows.d.ts +0 -4
  180. package/types/engine/services/data/methods/set-rows.d.ts.map +0 -1
  181. package/types/engine/services/layout/index.d.ts +0 -2
  182. package/types/engine/services/layout/index.d.ts.map +0 -1
  183. package/types/engine/services/layout/layout.d.ts +0 -34
  184. package/types/engine/services/layout/layout.d.ts.map +0 -1
  185. package/types/engine/services/layout/methods/add-scroll-event-listeners.d.ts +0 -3
  186. package/types/engine/services/layout/methods/add-scroll-event-listeners.d.ts.map +0 -1
  187. package/types/engine/services/layout/methods/adjust-viewport.d.ts +0 -4
  188. package/types/engine/services/layout/methods/adjust-viewport.d.ts.map +0 -1
  189. package/types/engine/services/layout/methods/apply-column-widths.d.ts +0 -4
  190. package/types/engine/services/layout/methods/apply-column-widths.d.ts.map +0 -1
  191. package/types/engine/services/layout/methods/compute-column-widths.d.ts +0 -4
  192. package/types/engine/services/layout/methods/compute-column-widths.d.ts.map +0 -1
  193. package/types/engine/services/layout/methods/compute-total-row-height.d.ts +0 -4
  194. package/types/engine/services/layout/methods/compute-total-row-height.d.ts.map +0 -1
  195. package/types/engine/services/layout/methods/index.d.ts +0 -13
  196. package/types/engine/services/layout/methods/index.d.ts.map +0 -1
  197. package/types/engine/services/layout/methods/initialize-layout-pipeline.d.ts +0 -4
  198. package/types/engine/services/layout/methods/initialize-layout-pipeline.d.ts.map +0 -1
  199. package/types/engine/services/layout/methods/resize-body.d.ts +0 -4
  200. package/types/engine/services/layout/methods/resize-body.d.ts.map +0 -1
  201. package/types/engine/services/layout/methods/resize-v-scrollbar.d.ts +0 -4
  202. package/types/engine/services/layout/methods/resize-v-scrollbar.d.ts.map +0 -1
  203. package/types/engine/services/layout/methods/set-cell-width.d.ts +0 -2
  204. package/types/engine/services/layout/methods/set-cell-width.d.ts.map +0 -1
  205. package/types/engine/services/layout/methods/set-grid-id.d.ts +0 -4
  206. package/types/engine/services/layout/methods/set-grid-id.d.ts.map +0 -1
  207. package/types/engine/services/layout/methods/set-up-resize-observer.d.ts +0 -4
  208. package/types/engine/services/layout/methods/set-up-resize-observer.d.ts.map +0 -1
  209. package/types/engine/services/layout/methods/update-column-widths.d.ts +0 -4
  210. package/types/engine/services/layout/methods/update-column-widths.d.ts.map +0 -1
  211. package/types/engine/services/renderer/index.d.ts +0 -2
  212. package/types/engine/services/renderer/index.d.ts.map +0 -1
  213. package/types/engine/services/renderer/methods/index.d.ts +0 -2
  214. package/types/engine/services/renderer/methods/index.d.ts.map +0 -1
  215. package/types/engine/services/renderer/methods/re-render-cells.d.ts +0 -4
  216. package/types/engine/services/renderer/methods/re-render-cells.d.ts.map +0 -1
  217. package/types/engine/services/renderer/parts/body/body.d.ts +0 -4
  218. package/types/engine/services/renderer/parts/body/body.d.ts.map +0 -1
  219. package/types/engine/services/renderer/parts/body/cell.d.ts +0 -3
  220. package/types/engine/services/renderer/parts/body/cell.d.ts.map +0 -1
  221. package/types/engine/services/renderer/parts/body/row.d.ts +0 -4
  222. package/types/engine/services/renderer/parts/body/row.d.ts.map +0 -1
  223. package/types/engine/services/renderer/parts/footer/footer-cells.d.ts +0 -3
  224. package/types/engine/services/renderer/parts/footer/footer-cells.d.ts.map +0 -1
  225. package/types/engine/services/renderer/parts/footer/footer.d.ts +0 -4
  226. package/types/engine/services/renderer/parts/footer/footer.d.ts.map +0 -1
  227. package/types/engine/services/renderer/parts/grid/grid.d.ts +0 -4
  228. package/types/engine/services/renderer/parts/grid/grid.d.ts.map +0 -1
  229. package/types/engine/services/renderer/parts/header/header-cells.d.ts +0 -3
  230. package/types/engine/services/renderer/parts/header/header-cells.d.ts.map +0 -1
  231. package/types/engine/services/renderer/parts/header/header.d.ts +0 -4
  232. package/types/engine/services/renderer/parts/header/header.d.ts.map +0 -1
  233. package/types/engine/services/renderer/parts/root/root.d.ts +0 -4
  234. package/types/engine/services/renderer/parts/root/root.d.ts.map +0 -1
  235. package/types/engine/services/renderer/parts/scrollbars/h-scrollbar.d.ts +0 -3
  236. package/types/engine/services/renderer/parts/scrollbars/h-scrollbar.d.ts.map +0 -1
  237. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar-bottom-corner.d.ts +0 -2
  238. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar-bottom-corner.d.ts.map +0 -1
  239. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar-spacer-bottom.d.ts +0 -2
  240. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar-spacer-bottom.d.ts.map +0 -1
  241. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar-spacer-top.d.ts +0 -2
  242. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar-spacer-top.d.ts.map +0 -1
  243. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar.d.ts +0 -3
  244. package/types/engine/services/renderer/parts/scrollbars/v-scrollbar.d.ts.map +0 -1
  245. package/types/engine/services/renderer/parts/viewport/viewport.d.ts +0 -4
  246. package/types/engine/services/renderer/parts/viewport/viewport.d.ts.map +0 -1
  247. package/types/engine/services/renderer/renderer.d.ts +0 -15
  248. package/types/engine/services/renderer/renderer.d.ts.map +0 -1
  249. package/types/engine/services/row/index.d.ts +0 -2
  250. package/types/engine/services/row/index.d.ts.map +0 -1
  251. package/types/engine/services/row/interfaces/row.d.ts +0 -5
  252. package/types/engine/services/row/interfaces/row.d.ts.map +0 -1
  253. package/types/engine/services/row/methods/index.d.ts +0 -2
  254. package/types/engine/services/row/methods/index.d.ts.map +0 -1
  255. package/types/engine/services/row/row.d.ts +0 -7
  256. package/types/engine/services/row/row.d.ts.map +0 -1
  257. package/types/engine/services/services.d.ts +0 -16
  258. package/types/engine/services/services.d.ts.map +0 -1
  259. package/types/engine/store/interfaces/grid-state.d.ts +0 -20
  260. package/types/engine/store/interfaces/grid-state.d.ts.map +0 -1
  261. package/types/engine/store/methods/create-initial-state.d.ts +0 -3
  262. package/types/engine/store/methods/create-initial-state.d.ts.map +0 -1
  263. package/types/engine/store/methods/create-tracked-proxy.d.ts +0 -3
  264. package/types/engine/store/methods/create-tracked-proxy.d.ts.map +0 -1
  265. package/types/engine/store/methods/debug.d.ts +0 -4
  266. package/types/engine/store/methods/debug.d.ts.map +0 -1
  267. package/types/engine/store/store.d.ts +0 -22
  268. package/types/engine/store/store.d.ts.map +0 -1
  269. package/types/engine/store/types/state-key.d.ts +0 -3
  270. package/types/engine/store/types/state-key.d.ts.map +0 -1
  271. package/types/engine/store/types/store-mutation.d.ts +0 -6
  272. package/types/engine/store/types/store-mutation.d.ts.map +0 -1
  273. package/types/index.d.ts +0 -4
  274. package/types/index.d.ts.map +0 -1
@@ -0,0 +1,31 @@
1
+ import type { GridDOM } from "../../../core/grid-dom";
2
+ import { renderRows } from "../parts/body/row";
3
+ import { renderFooterCells } from "../parts/footer/footer-cells";
4
+ import { renderHeaderCells } from "../parts/header/header-cells";
5
+ import type { PolyGridStore } from "../../../store/store";
6
+
7
+ export function reRenderCells(gridDom: GridDOM, store: PolyGridStore) {
8
+ // rerender header, body, footer cells
9
+ // header
10
+ const header = gridDom.header;
11
+ header.replaceChildren();
12
+ renderHeaderCells(header, store);
13
+ // body
14
+ const body = gridDom.body;
15
+ body.replaceChildren();
16
+ const rows = store.getState().rows;
17
+ const columns = store.getState().columns;
18
+ const rowHeight = store.getState().rowHeight;
19
+ const bodyRows = renderRows(rows, columns, rowHeight);
20
+ const fragment = document.createDocumentFragment();
21
+ for (const row of bodyRows) {
22
+ fragment.appendChild(row);
23
+ }
24
+ body.appendChild(fragment);
25
+ const lastRow = gridDom.body.querySelector(".pg-row:last-child");
26
+ lastRow?.classList.toggle("last-row", !store.getState().showVScrollbar);
27
+ // footer
28
+ const footer = gridDom.footer;
29
+ footer.replaceChildren();
30
+ renderFooterCells(footer, store);
31
+ }
@@ -0,0 +1,34 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { GridDOM } from "../../../../core/grid-dom";
3
+ import type { PolyGridStore } from "../../../../store/store";
4
+ import { renderRows } from "./row";
5
+
6
+ export function renderBody(
7
+ store: PolyGridStore,
8
+ gridDom: GridDOM
9
+ ): HTMLDivElement {
10
+ // viewport
11
+ const bodyViewportEl = document.createElement("div");
12
+ bodyViewportEl.className = PG_CSS_CLASS.bodyViewport;
13
+ // row container
14
+ const bodyEl = document.createElement("div");
15
+ bodyEl.className = PG_CSS_CLASS.body;
16
+ bodyEl.innerHTML = "";
17
+ // render the rows
18
+ const rows = store.getState().rows;
19
+ const columns = store.getState().columns;
20
+ const rowHeight = store.getState().rowHeight;
21
+ const bodyRows = renderRows(rows, columns, rowHeight);
22
+ // append the rows to the body
23
+ const fragment = document.createDocumentFragment();
24
+ for (const row of bodyRows) {
25
+ fragment.appendChild(row);
26
+ }
27
+ bodyEl.appendChild(fragment);
28
+
29
+ bodyViewportEl.appendChild(bodyEl);
30
+
31
+ gridDom.body = bodyEl;
32
+
33
+ return bodyViewportEl;
34
+ }
@@ -0,0 +1,12 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { PolyGridColumn } from "../../../../services/column/interfaces/column";
3
+
4
+ export function renderCell(row: any, col: PolyGridColumn) {
5
+ const cell = document.createElement("div");
6
+ cell.classList.add(PG_CSS_CLASS.cell);
7
+
8
+ const value = row[col.field];
9
+ cell.textContent = value != null ? String(value) : "";
10
+
11
+ return cell;
12
+ }
@@ -0,0 +1,26 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { PolyGridColumn } from "../../../../services/column/interfaces/column";
3
+ import type { PolyGridRow } from "../../../../services/row/interfaces/row";
4
+ import { renderCell } from "./cell";
5
+
6
+ export function renderRows(
7
+ rows: PolyGridRow[],
8
+ columns: PolyGridColumn[],
9
+ rowHeight: number
10
+ ): HTMLDivElement[] {
11
+ const rowEls: HTMLDivElement[] = [];
12
+ const cols = columns.filter((col) => col.visible ?? true);
13
+
14
+ rows.forEach((row) => {
15
+ const rowEl = document.createElement("div");
16
+ rowEl.classList.add(PG_CSS_CLASS.row);
17
+ rowEl.style.height = rowHeight + "px";
18
+ cols.forEach((col) => {
19
+ const cell = renderCell(row.data, col);
20
+ rowEl.appendChild(cell);
21
+ });
22
+ rowEls.push(rowEl);
23
+ });
24
+
25
+ return rowEls;
26
+ }
@@ -0,0 +1,15 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { PolyGridStore } from "../../../../store/store";
3
+
4
+ export function renderFooterCells(footer: HTMLElement, store: PolyGridStore) {
5
+ const columns = store.getState().columns.filter((col) => col.visible ?? true);
6
+
7
+ footer.innerHTML = "";
8
+
9
+ columns.forEach((col, i) => {
10
+ const cell = document.createElement("div");
11
+ cell.className = PG_CSS_CLASS.footerCell;
12
+ cell.textContent = col.header;
13
+ footer.appendChild(cell);
14
+ });
15
+ }
@@ -0,0 +1,24 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { GridDOM } from "../../../../core/grid-dom";
3
+ import type { PolyGridStore } from "../../../../store/store";
4
+ import { renderFooterCells } from "./footer-cells";
5
+
6
+ export function renderFooter(
7
+ store: PolyGridStore,
8
+ gridDom: GridDOM
9
+ ): HTMLDivElement {
10
+ // viewport
11
+ const footerViewportEl = document.createElement("div");
12
+ footerViewportEl.className = PG_CSS_CLASS.footerViewport;
13
+ // cell container
14
+ const footerEl = document.createElement("div");
15
+ footerEl.className = PG_CSS_CLASS.footer;
16
+ // cells
17
+ renderFooterCells(footerEl, store);
18
+
19
+ footerViewportEl.appendChild(footerEl);
20
+
21
+ gridDom.footer = footerEl;
22
+
23
+ return footerViewportEl;
24
+ }
@@ -0,0 +1,21 @@
1
+ import { renderViewport } from "../viewport/viewport";
2
+ import { renderVScrollbar } from "../scrollbars/v-scrollbar";
3
+ import type { PolyGridStore } from "../../../../store/store";
4
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
5
+ import type { GridDOM } from "../../../../core/grid-dom";
6
+
7
+ export function renderGrid(store: PolyGridStore, gridDom: GridDOM) {
8
+ const grid = document.createElement("div");
9
+ grid.className = PG_CSS_CLASS.grid;
10
+
11
+ const viewport = renderViewport(store, gridDom);
12
+ const vScrollbar = renderVScrollbar(gridDom);
13
+
14
+ grid.appendChild(viewport);
15
+ grid.appendChild(vScrollbar);
16
+
17
+ gridDom.viewport = viewport;
18
+ gridDom.vScrollbar = vScrollbar;
19
+
20
+ return grid;
21
+ }
@@ -0,0 +1,15 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { PolyGridStore } from "../../../../store/store";
3
+
4
+ export function renderHeaderCells(header: HTMLElement, store: PolyGridStore) {
5
+ const columns = store.getState().columns.filter((col) => col.visible ?? true);
6
+
7
+ header.innerHTML = "";
8
+
9
+ columns.forEach((col, i) => {
10
+ const cell = document.createElement("div");
11
+ cell.className = PG_CSS_CLASS.headerCell;
12
+ cell.textContent = col.header;
13
+ header.appendChild(cell);
14
+ });
15
+ }
@@ -0,0 +1,24 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { GridDOM } from "../../../../core/grid-dom";
3
+ import type { PolyGridStore } from "../../../../store/store";
4
+ import { renderHeaderCells } from "./header-cells";
5
+
6
+ export function renderHeader(
7
+ store: PolyGridStore,
8
+ gridDom: GridDOM
9
+ ): HTMLDivElement {
10
+ // viewport
11
+ const headerViewportEl = document.createElement("div");
12
+ headerViewportEl.className = PG_CSS_CLASS.headerViewport;
13
+ // cell container
14
+ const headerEl = document.createElement("div");
15
+ headerEl.className = PG_CSS_CLASS.header;
16
+ // cells
17
+ renderHeaderCells(headerEl, store);
18
+
19
+ headerViewportEl.appendChild(headerEl);
20
+
21
+ gridDom.header = headerEl;
22
+
23
+ return headerViewportEl;
24
+ }
@@ -0,0 +1,22 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { GridDOM } from "../../../../core/grid-dom";
3
+ import type { PolyGridStore } from "../../../../store/store";
4
+ import { renderGrid } from "../grid/grid";
5
+
6
+ export function renderRoot(
7
+ store: PolyGridStore,
8
+ host: HTMLElement,
9
+ gridDom: GridDOM
10
+ ) {
11
+ const root = document.createElement("div");
12
+ root.className = PG_CSS_CLASS.root;
13
+ root.id = store.getState().id;
14
+
15
+ const grid = renderGrid(store, gridDom);
16
+
17
+ root.appendChild(grid);
18
+ host.appendChild(root);
19
+
20
+ gridDom.root = root;
21
+ gridDom.grid = grid;
22
+ }
@@ -0,0 +1,21 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { GridDOM } from "../../../../core/grid-dom";
3
+
4
+ export function renderHScrollbar(gridDom: GridDOM): HTMLDivElement {
5
+ const hScrollEl = document.createElement("div");
6
+ hScrollEl.className = PG_CSS_CLASS.hScroll;
7
+
8
+ const hScrollInnerEl = document.createElement("div");
9
+ hScrollInnerEl.className = PG_CSS_CLASS.hScrollInner;
10
+
11
+ const hScrollTrack = document.createElement("div");
12
+ hScrollTrack.className = PG_CSS_CLASS.hScrollTrack;
13
+
14
+ hScrollEl.appendChild(hScrollInnerEl);
15
+ hScrollInnerEl.appendChild(hScrollTrack);
16
+
17
+ gridDom.hScrollInner = hScrollInnerEl;
18
+ gridDom.hScrollTrack = hScrollTrack;
19
+
20
+ return hScrollEl;
21
+ }
@@ -0,0 +1,8 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+
3
+ export function renderVScrollbarBottomCorner(): HTMLDivElement {
4
+ const vScrollbarBottomCorner = document.createElement("div");
5
+ vScrollbarBottomCorner.className = PG_CSS_CLASS.vScrollBottomCorner;
6
+
7
+ return vScrollbarBottomCorner;
8
+ }
@@ -0,0 +1,8 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+
3
+ export function renderVScrollbarSpacerBottom(): HTMLDivElement {
4
+ const vScrollbarSpacer = document.createElement("div");
5
+ vScrollbarSpacer.className = PG_CSS_CLASS.vScrollSpacerBottom;
6
+
7
+ return vScrollbarSpacer;
8
+ }
@@ -0,0 +1,8 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+
3
+ export function renderVScrollbarSpacerTop(): HTMLDivElement {
4
+ const vScrollbarSpacer = document.createElement("div");
5
+ vScrollbarSpacer.className = PG_CSS_CLASS.vScrollSpacerTop;
6
+
7
+ return vScrollbarSpacer;
8
+ }
@@ -0,0 +1,34 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { GridDOM } from "../../../../core/grid-dom";
3
+ import { renderVScrollbarBottomCorner } from "./v-scrollbar-bottom-corner";
4
+ import { renderVScrollbarSpacerBottom } from "./v-scrollbar-spacer-bottom";
5
+ import { renderVScrollbarSpacerTop } from "./v-scrollbar-spacer-top";
6
+
7
+ export function renderVScrollbar(gridDom: GridDOM): HTMLDivElement {
8
+ const vScrollEl = document.createElement("div");
9
+ vScrollEl.className = PG_CSS_CLASS.vScroll;
10
+
11
+ const vScrollInnerEl = document.createElement("div");
12
+ vScrollInnerEl.className = PG_CSS_CLASS.vScrollInner;
13
+
14
+ const vScrollTrackEl = document.createElement("div");
15
+ vScrollTrackEl.className = PG_CSS_CLASS.vScrollTrack;
16
+
17
+ const spacerTop = renderVScrollbarSpacerTop();
18
+ const spacerBottom = renderVScrollbarSpacerBottom();
19
+ const bottomCorner = renderVScrollbarBottomCorner();
20
+
21
+ vScrollEl.appendChild(spacerTop);
22
+ vScrollEl.appendChild(vScrollInnerEl);
23
+ vScrollEl.appendChild(spacerBottom);
24
+ vScrollEl.appendChild(bottomCorner);
25
+ vScrollInnerEl.appendChild(vScrollTrackEl);
26
+
27
+ gridDom.vScrollInner = vScrollInnerEl;
28
+ gridDom.vScrollSpacerTop = spacerTop;
29
+ gridDom.vScrollSpacerBottom = spacerBottom;
30
+ gridDom.vScrollBottomCorner = bottomCorner;
31
+ gridDom.vScrollTrack = vScrollTrackEl;
32
+
33
+ return vScrollEl;
34
+ }
@@ -0,0 +1,32 @@
1
+ import { PG_CSS_CLASS } from "../../../../const/pg-css-class";
2
+ import type { GridDOM } from "../../../../core/grid-dom";
3
+ import type { PolyGridStore } from "../../../../store/store";
4
+ import { renderBody } from "../body/body";
5
+ import { renderFooter } from "../footer/footer";
6
+ import { renderHeader } from "../header/header";
7
+ import { renderHScrollbar } from "../scrollbars/h-scrollbar";
8
+
9
+ export function renderViewport(
10
+ store: PolyGridStore,
11
+ gridDom: GridDOM
12
+ ): HTMLDivElement {
13
+ const viewport = document.createElement("div");
14
+ viewport.className = PG_CSS_CLASS.viewport;
15
+
16
+ const headerVp = renderHeader(store, gridDom);
17
+ const bodyVp = renderBody(store, gridDom);
18
+ const footerVp = renderFooter(store, gridDom);
19
+ const hScrollbar = renderHScrollbar(gridDom);
20
+
21
+ viewport.appendChild(headerVp);
22
+ viewport.appendChild(bodyVp);
23
+ viewport.appendChild(footerVp);
24
+ viewport.appendChild(hScrollbar);
25
+
26
+ gridDom.headerViewport = headerVp;
27
+ gridDom.bodyViewport = bodyVp;
28
+ gridDom.footerViewport = footerVp;
29
+ gridDom.hScrollbar = hScrollbar;
30
+
31
+ return viewport;
32
+ }
@@ -0,0 +1,23 @@
1
+ import type { PolyGrid } from "../../core/grid";
2
+ import type { GridDOM } from "../../core/grid-dom";
3
+ import type { ObservableLike } from "../../rx-lite/interfaces/observable-like";
4
+ import type { PolyGridStore } from "../../store/store";
5
+ import * as methods from "./methods/index";
6
+
7
+ export class RendererService {
8
+ store: PolyGridStore;
9
+ destroy$: ObservableLike<void>;
10
+ gridDom: GridDOM;
11
+ grid: PolyGrid;
12
+
13
+ constructor(grid: PolyGrid) {
14
+ this.store = grid._store;
15
+ this.destroy$ = grid._destroy$;
16
+ this.gridDom = grid._gridDom;
17
+ this.grid = grid;
18
+ }
19
+
20
+ reRenderCells = methods.reRenderCells;
21
+
22
+ initApiSubscriptions() {}
23
+ }
@@ -0,0 +1 @@
1
+ export * from "./row";
@@ -0,0 +1,4 @@
1
+ export interface PolyGridRow {
2
+ index: number;
3
+ data: any;
4
+ }
File without changes
@@ -0,0 +1,10 @@
1
+ import type { PolyGrid } from "../../core/grid";
2
+ import type { PolyGridStore } from "../../store/store";
3
+
4
+ export class RowService {
5
+ store: PolyGridStore;
6
+
7
+ constructor(grid: PolyGrid) {
8
+ this.store = grid._store;
9
+ }
10
+ }
@@ -0,0 +1,26 @@
1
+ import { LayoutService } from "./layout";
2
+ import { ColumnService } from "./column";
3
+ import { RowService } from "./row";
4
+ import { DataService } from "./data";
5
+ import type { PolyGrid } from "../core/grid";
6
+ import { RendererService } from "./renderer";
7
+
8
+ export class PolyGridServices {
9
+ private grid: PolyGrid;
10
+
11
+ layout: LayoutService;
12
+ column: ColumnService;
13
+ row: RowService;
14
+ data: DataService;
15
+ renderer: RendererService;
16
+
17
+ constructor(grid: PolyGrid) {
18
+ this.grid = grid;
19
+
20
+ this.layout = new LayoutService(this.grid);
21
+ this.column = new ColumnService(this.grid);
22
+ this.row = new RowService(this.grid);
23
+ this.data = new DataService(this.grid);
24
+ this.renderer = new RendererService(this.grid);
25
+ }
26
+ }
@@ -0,0 +1,20 @@
1
+ import type { PolyGridColumn } from "../../services/column/interfaces/column";
2
+ import type { ColumnWidthState } from "../../services/column/types/column-width-state";
3
+ import type { PolyGridRow } from "../../services/row/interfaces/row";
4
+
5
+ export interface PolyGridState {
6
+ id: string;
7
+ columns: PolyGridColumn[];
8
+ rows: PolyGridRow[];
9
+ rowHeight: number;
10
+ resolvedColumnWidths: number[];
11
+ columnWidthState: ColumnWidthState;
12
+ totalColumnWidth: number;
13
+ totalRowHeight: number;
14
+ viewportWidth: number;
15
+ viewportHeight: number;
16
+ rawViewportWidth: number;
17
+ rawViewportHeight: number;
18
+ showHScrollbar: boolean;
19
+ showVScrollbar: boolean;
20
+ }
@@ -0,0 +1,20 @@
1
+ import type { PolyGridState } from "../interfaces/grid-state";
2
+
3
+ export function createInitialState(): PolyGridState {
4
+ return {
5
+ id: "",
6
+ columns: [],
7
+ rows: [],
8
+ rowHeight: 20,
9
+ resolvedColumnWidths: [],
10
+ columnWidthState: "NOT_SET",
11
+ totalColumnWidth: 0,
12
+ totalRowHeight: 0,
13
+ viewportWidth: 0,
14
+ viewportHeight: 0,
15
+ rawViewportWidth: 0,
16
+ rawViewportHeight: 0,
17
+ showHScrollbar: false,
18
+ showVScrollbar: false,
19
+ };
20
+ }
@@ -0,0 +1,60 @@
1
+ import type { StoreMutation } from "../types/store-mutation";
2
+
3
+ export function createTrackedProxy(
4
+ target: any,
5
+ rootPrev: any,
6
+ path: string[] = [],
7
+ mutations: StoreMutation[]
8
+ ): any {
9
+ return new Proxy(target, {
10
+ get(origTarget, prop, receiver) {
11
+ const value = Reflect.get(origTarget, prop, receiver);
12
+
13
+ if (value && typeof value === "object") {
14
+ const childPath = path.concat(String(prop));
15
+ return createTrackedProxy(value, rootPrev, childPath, mutations);
16
+ }
17
+
18
+ return value;
19
+ },
20
+
21
+ set(origTarget, prop, value, receiver) {
22
+ const propKey = String(prop);
23
+ const fullPath = path.concat(propKey);
24
+
25
+ const prettyPath = formatPath(fullPath);
26
+ const prevValue = getAtPath(rootPrev, fullPath);
27
+ const success = Reflect.set(origTarget, prop, value, receiver);
28
+
29
+ mutations.push({ path: prettyPath, from: prevValue, to: value });
30
+
31
+ return success;
32
+ },
33
+ });
34
+ }
35
+
36
+ function getAtPath(obj: any, path: string[]): any {
37
+ let current = obj;
38
+ for (const key of path) {
39
+ if (current == null) return undefined;
40
+ current = current[key];
41
+ }
42
+ return current;
43
+ }
44
+
45
+ function formatPath(path: string[]): string {
46
+ return (
47
+ path
48
+ .map((segment) => {
49
+ // numeric → array index
50
+ if (/^\d+$/.test(segment)) {
51
+ return `[${segment}]`;
52
+ }
53
+ // normal object key
54
+ return segment;
55
+ })
56
+ .join(".")
57
+ // fix cases like "columns.[3]" → "columns[3]"
58
+ .replace(/\.\[/g, "[")
59
+ );
60
+ }
@@ -0,0 +1,29 @@
1
+ import { DEBUG_SHOW_FULL_STATE_DIFF } from "../../debug.config";
2
+ import type { PolyGridState } from "../interfaces/grid-state";
3
+ import type { StoreMutation } from "../types/store-mutation";
4
+
5
+ export function LogMutations(
6
+ mutations: StoreMutation[],
7
+ prev: PolyGridState,
8
+ next: PolyGridState
9
+ ) {
10
+ console.groupCollapsed(
11
+ "%cPolyGridStore mutations",
12
+ "color:#FF9800;font-weight:bold;"
13
+ );
14
+ for (const m of mutations) {
15
+ console.log(`Path: ${m.path}`);
16
+ console.log("From:", m.from);
17
+ console.log("To:", m.to);
18
+ }
19
+ console.groupEnd();
20
+ if (DEBUG_SHOW_FULL_STATE_DIFF) {
21
+ console.groupCollapsed(
22
+ "%cPolyGridStore state diff",
23
+ "color:#4CAF50;font-weight:bold;"
24
+ );
25
+ console.log("Prev:", prev);
26
+ console.log("Next:", next);
27
+ console.groupEnd();
28
+ }
29
+ }
@@ -0,0 +1,85 @@
1
+ import { DEBUG } from "../debug.config";
2
+ import type { PolyGridState } from "./interfaces/grid-state";
3
+ import type { ObservableLike } from "../rx-lite/interfaces/observable-like";
4
+ import type { StoreMutation } from "./types/store-mutation";
5
+ import { createInitialState } from "./methods/create-initial-state";
6
+ import { createTrackedProxy } from "./methods/create-tracked-proxy";
7
+ import { LogMutations } from "./methods/debug";
8
+ import { createSelect } from "../rx-lite/operators/select";
9
+ import { createCombineLatest } from "../rx-lite/operators/combine-latest";
10
+ import { createCombineLatestAny } from "../rx-lite/operators/combine-latest-any";
11
+ import { createSelectKeyed } from "../rx-lite/operators/select-keyed";
12
+
13
+ export type Subscriber = (
14
+ state: PolyGridState,
15
+ changedKeys: (keyof PolyGridState)[]
16
+ ) => void;
17
+
18
+ export class PolyGridStore {
19
+ private state: PolyGridState;
20
+ private subscribers = new Set<Subscriber>();
21
+
22
+ constructor() {
23
+ this.state = createInitialState();
24
+ }
25
+
26
+ getState() {
27
+ return this.state;
28
+ }
29
+
30
+ getSubscribers() {
31
+ return this.subscribers;
32
+ }
33
+
34
+ update(mutator: (draft: PolyGridState) => void): void {
35
+ const prev = this.state;
36
+ const next = { ...this.state };
37
+
38
+ const mutations: StoreMutation[] = [];
39
+ const proxy = createTrackedProxy(next, prev, [], mutations);
40
+
41
+ mutator(proxy);
42
+
43
+ if (DEBUG && mutations.length > 0) LogMutations(mutations, prev, next);
44
+
45
+ // extract changed top-level keys
46
+ const changedKeys = mutations.map((m) => m.path as keyof PolyGridState);
47
+
48
+ this.state = next;
49
+ this.emit(changedKeys);
50
+ }
51
+
52
+ subscribe(fn: Subscriber): () => void {
53
+ this.subscribers.add(fn);
54
+ return () => this.subscribers.delete(fn);
55
+ }
56
+
57
+ select<T>(selector: (state: PolyGridState) => T): ObservableLike<T> {
58
+ return createSelect(this, selector);
59
+ }
60
+
61
+ selectKeyed<T>(
62
+ key: keyof PolyGridState,
63
+ selector: (state: PolyGridState) => T
64
+ ): ObservableLike<T> {
65
+ return createSelectKeyed(this, key, selector);
66
+ }
67
+
68
+ combineLatest<T extends any[]>(selectors: {
69
+ [K in keyof T]: (state: PolyGridState) => T[K];
70
+ }): ObservableLike<T> {
71
+ return createCombineLatest(this, selectors);
72
+ }
73
+
74
+ combineLatestAny<T extends any[]>(sources: {
75
+ [K in keyof T]: ((state: PolyGridState) => T[K]) | ObservableLike<T[K]>;
76
+ }): ObservableLike<T> {
77
+ return createCombineLatestAny(this, sources);
78
+ }
79
+
80
+ private emit(changedKeys: (keyof PolyGridState)[]) {
81
+ for (const fn of this.subscribers) {
82
+ fn(this.state, changedKeys);
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,3 @@
1
+ import type { PolyGridState } from "../interfaces/grid-state";
2
+
3
+ export type StateKey = keyof PolyGridState;
@@ -0,0 +1,5 @@
1
+ export type StoreMutation = {
2
+ path: string;
3
+ from: any;
4
+ to: any;
5
+ };
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export type { PolyGridColumn } from "./engine/services/column/interfaces/column";