@dxos/plugin-sheet 0.6.13 → 0.6.14-main.1366248

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 (330) hide show
  1. package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs +297 -0
  2. package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-BVUN7SHF.mjs +67 -0
  4. package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-G2FUL6PK.mjs +1671 -0
  6. package/dist/lib/browser/chunk-G2FUL6PK.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-RABELMEQ.mjs +15 -0
  8. package/dist/lib/browser/chunk-RABELMEQ.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-D5AGLXJP.mjs → chunk-VMSX6Z4X.mjs} +659 -675
  10. package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +7 -0
  11. package/dist/lib/browser/compute-graph-GGWUX644.mjs +35 -0
  12. package/dist/lib/browser/compute-graph-GGWUX644.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +168 -67
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/meta.mjs +1 -1
  17. package/dist/lib/browser/types.mjs +6 -12
  18. package/dist/lib/node/SheetContainer-PJE74VO4.cjs +300 -0
  19. package/dist/lib/node/SheetContainer-PJE74VO4.cjs.map +7 -0
  20. package/dist/lib/node/chunk-2ZVZI2KJ.cjs +38 -0
  21. package/dist/lib/node/chunk-2ZVZI2KJ.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-DSYKOI4E.cjs → chunk-AWKOWDMI.cjs} +34 -52
  23. package/dist/lib/node/chunk-AWKOWDMI.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-5KKJ4NPP.cjs → chunk-O7XR4R7Y.cjs} +678 -674
  25. package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +7 -0
  26. package/dist/lib/node/chunk-STZ7S7RF.cjs +1656 -0
  27. package/dist/lib/node/chunk-STZ7S7RF.cjs.map +7 -0
  28. package/dist/lib/node/compute-graph-KGWA2QLE.cjs +57 -0
  29. package/dist/lib/node/compute-graph-KGWA2QLE.cjs.map +7 -0
  30. package/dist/lib/node/index.cjs +178 -75
  31. package/dist/lib/node/index.cjs.map +4 -4
  32. package/dist/lib/node/meta.cjs +3 -3
  33. package/dist/lib/node/meta.cjs.map +1 -1
  34. package/dist/lib/node/meta.json +1 -1
  35. package/dist/lib/node/types.cjs +9 -15
  36. package/dist/lib/node/types.cjs.map +2 -2
  37. package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs +298 -0
  38. package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs.map +7 -0
  39. package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs +17 -0
  40. package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs.map +7 -0
  41. package/dist/lib/node-esm/chunk-CR4K75EL.mjs +3220 -0
  42. package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +7 -0
  43. package/dist/lib/node-esm/chunk-UIBWRHW7.mjs +68 -0
  44. package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs +1672 -0
  46. package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs.map +7 -0
  47. package/dist/lib/node-esm/compute-graph-2SCZT7N5.mjs +36 -0
  48. package/dist/lib/node-esm/compute-graph-2SCZT7N5.mjs.map +7 -0
  49. package/dist/lib/node-esm/index.mjs +350 -0
  50. package/dist/lib/node-esm/index.mjs.map +7 -0
  51. package/dist/lib/node-esm/meta.json +1 -0
  52. package/dist/lib/node-esm/meta.mjs +10 -0
  53. package/dist/lib/node-esm/meta.mjs.map +7 -0
  54. package/dist/lib/node-esm/types.mjs +17 -0
  55. package/dist/lib/node-esm/types.mjs.map +7 -0
  56. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  57. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +13 -0
  58. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -0
  59. package/dist/types/src/components/ComputeGraph/index.d.ts +1 -3
  60. package/dist/types/src/components/ComputeGraph/index.d.ts.map +1 -1
  61. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +3 -0
  62. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +1 -0
  63. package/dist/types/src/components/FunctionEditor/index.d.ts +2 -0
  64. package/dist/types/src/components/FunctionEditor/index.d.ts.map +1 -0
  65. package/dist/types/src/components/GridSheet/GridSheet.d.ts +3 -0
  66. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -0
  67. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +6 -0
  68. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -0
  69. package/dist/types/src/components/{CellEditor/CellEditor.stories.d.ts → GridSheet/SheetCellEditor.stories.d.ts} +5 -9
  70. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -0
  71. package/dist/types/src/components/GridSheet/index.d.ts +2 -0
  72. package/dist/types/src/components/GridSheet/index.d.ts.map +1 -0
  73. package/dist/types/src/components/GridSheet/util.d.ts +15 -0
  74. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -0
  75. package/dist/types/src/components/RangeList/RangeList.d.ts +7 -0
  76. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -0
  77. package/dist/types/src/components/RangeList/index.d.ts +2 -0
  78. package/dist/types/src/components/RangeList/index.d.ts.map +1 -0
  79. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +9 -0
  80. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -0
  81. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +6 -0
  82. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/SheetContainer/index.d.ts +3 -0
  84. package/dist/types/src/components/SheetContainer/index.d.ts.map +1 -0
  85. package/dist/types/src/components/SheetContext/SheetContext.d.ts +28 -0
  86. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -0
  87. package/dist/types/src/components/SheetContext/index.d.ts +2 -0
  88. package/dist/types/src/components/SheetContext/index.d.ts.map +1 -0
  89. package/dist/types/src/components/Toolbar/Toolbar.d.ts +36 -9
  90. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  91. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +4 -32
  92. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/index.d.ts +7 -4
  94. package/dist/types/src/components/index.d.ts.map +1 -1
  95. package/dist/types/src/compute-graph/compute-graph-registry.d.ts +34 -0
  96. package/dist/types/src/compute-graph/compute-graph-registry.d.ts.map +1 -0
  97. package/dist/types/src/compute-graph/compute-graph.d.ts +64 -0
  98. package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -0
  99. package/dist/types/src/compute-graph/compute-graph.stories.d.ts +6 -0
  100. package/dist/types/src/compute-graph/compute-graph.stories.d.ts.map +1 -0
  101. package/dist/types/src/compute-graph/compute-graph.test.d.ts +2 -0
  102. package/dist/types/src/compute-graph/compute-graph.test.d.ts.map +1 -0
  103. package/dist/types/src/compute-graph/compute-node.d.ts +26 -0
  104. package/dist/types/src/compute-graph/compute-node.d.ts.map +1 -0
  105. package/dist/types/src/{components/ComputeGraph → compute-graph/functions}/async-function.d.ts +14 -5
  106. package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -0
  107. package/dist/types/src/compute-graph/functions/edge-function.d.ts +21 -0
  108. package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -0
  109. package/dist/types/src/{model/functions.d.ts → compute-graph/functions/function-defs.d.ts} +1 -1
  110. package/dist/types/src/compute-graph/functions/function-defs.d.ts.map +1 -0
  111. package/dist/types/src/compute-graph/functions/index.d.ts +4 -0
  112. package/dist/types/src/compute-graph/functions/index.d.ts.map +1 -0
  113. package/dist/types/src/compute-graph/hyperformula.test.d.ts +2 -0
  114. package/dist/types/src/compute-graph/hyperformula.test.d.ts.map +1 -0
  115. package/dist/types/src/compute-graph/index.d.ts +5 -0
  116. package/dist/types/src/compute-graph/index.d.ts.map +1 -0
  117. package/dist/types/src/compute-graph/testing/index.d.ts +3 -0
  118. package/dist/types/src/compute-graph/testing/index.d.ts.map +1 -0
  119. package/dist/types/src/compute-graph/testing/test-builder.d.ts +15 -0
  120. package/dist/types/src/compute-graph/testing/test-builder.d.ts.map +1 -0
  121. package/dist/types/src/compute-graph/testing/test-plugin.d.ts +36 -0
  122. package/dist/types/src/compute-graph/testing/test-plugin.d.ts.map +1 -0
  123. package/dist/types/src/compute-graph/util.d.ts +2 -0
  124. package/dist/types/src/compute-graph/util.d.ts.map +1 -0
  125. package/dist/types/src/defs/index.d.ts +4 -0
  126. package/dist/types/src/defs/index.d.ts.map +1 -0
  127. package/dist/types/src/defs/sheet-range-types.d.ts +13 -0
  128. package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -0
  129. package/dist/types/src/defs/types.d.ts +28 -0
  130. package/dist/types/src/defs/types.d.ts.map +1 -0
  131. package/dist/types/src/defs/types.test.d.ts.map +1 -0
  132. package/dist/types/src/defs/util.d.ts +39 -0
  133. package/dist/types/src/defs/util.d.ts.map +1 -0
  134. package/dist/types/src/extensions/compute.d.ts +6 -0
  135. package/dist/types/src/extensions/compute.d.ts.map +1 -0
  136. package/dist/types/src/extensions/compute.stories.d.ts +21 -0
  137. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -0
  138. package/dist/types/src/extensions/editor/extension.d.ts +39 -0
  139. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -0
  140. package/dist/types/src/extensions/editor/extension.test.d.ts.map +1 -0
  141. package/dist/types/src/extensions/editor/index.d.ts +2 -0
  142. package/dist/types/src/extensions/editor/index.d.ts.map +1 -0
  143. package/dist/types/src/extensions/index.d.ts +3 -0
  144. package/dist/types/src/extensions/index.d.ts.map +1 -0
  145. package/dist/types/src/index.d.ts +1 -1
  146. package/dist/types/src/index.d.ts.map +1 -1
  147. package/dist/types/src/integrations/index.d.ts +2 -0
  148. package/dist/types/src/integrations/index.d.ts.map +1 -0
  149. package/dist/types/src/integrations/thread-ranges.d.ts +7 -0
  150. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -0
  151. package/dist/types/src/meta.d.ts +4 -9
  152. package/dist/types/src/meta.d.ts.map +1 -1
  153. package/dist/types/src/model/index.d.ts +2 -3
  154. package/dist/types/src/model/index.d.ts.map +1 -1
  155. package/dist/types/src/model/{model.d.ts → sheet-model.d.ts} +22 -69
  156. package/dist/types/src/model/sheet-model.d.ts.map +1 -0
  157. package/dist/types/src/model/sheet-model.test.d.ts +2 -0
  158. package/dist/types/src/model/sheet-model.test.d.ts.map +1 -0
  159. package/dist/types/src/model/useSheetModel.d.ts +8 -0
  160. package/dist/types/src/model/useSheetModel.d.ts.map +1 -0
  161. package/dist/types/src/sanity.test.d.ts +2 -0
  162. package/dist/types/src/sanity.test.d.ts.map +1 -0
  163. package/dist/types/src/serializer.d.ts +4 -0
  164. package/dist/types/src/serializer.d.ts.map +1 -0
  165. package/dist/types/src/testing/index.d.ts +2 -0
  166. package/dist/types/src/testing/index.d.ts.map +1 -0
  167. package/dist/types/src/testing/testing.d.ts +8 -0
  168. package/dist/types/src/testing/testing.d.ts.map +1 -0
  169. package/dist/types/src/translations.d.ts +32 -12
  170. package/dist/types/src/translations.d.ts.map +1 -1
  171. package/dist/types/src/types.d.ts +132 -43
  172. package/dist/types/src/types.d.ts.map +1 -1
  173. package/dist/vendor/hyperformula.mjs +37145 -0
  174. package/package.json +60 -61
  175. package/src/SheetPlugin.tsx +89 -78
  176. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +37 -0
  177. package/src/components/ComputeGraph/index.ts +1 -3
  178. package/src/components/FunctionEditor/FunctionEditor.tsx +45 -0
  179. package/src/components/FunctionEditor/index.ts +5 -0
  180. package/src/components/GridSheet/GridSheet.stories.tsx +46 -0
  181. package/src/components/GridSheet/GridSheet.tsx +358 -0
  182. package/src/components/{CellEditor/CellEditor.stories.tsx → GridSheet/SheetCellEditor.stories.tsx} +18 -15
  183. package/src/components/GridSheet/index.ts +5 -0
  184. package/src/components/GridSheet/util.ts +170 -0
  185. package/src/components/RangeList/RangeList.tsx +53 -0
  186. package/src/components/RangeList/index.ts +5 -0
  187. package/src/components/SheetContainer/SheetContainer.stories.tsx +45 -0
  188. package/src/components/SheetContainer/SheetContainer.tsx +33 -0
  189. package/src/components/SheetContainer/index.ts +7 -0
  190. package/src/components/SheetContext/SheetContext.tsx +127 -0
  191. package/src/components/SheetContext/index.ts +5 -0
  192. package/src/components/Toolbar/Toolbar.stories.tsx +9 -6
  193. package/src/components/Toolbar/Toolbar.tsx +265 -111
  194. package/src/components/index.ts +5 -3
  195. package/src/compute-graph/compute-graph-registry.ts +90 -0
  196. package/src/compute-graph/compute-graph.stories.tsx +97 -0
  197. package/src/compute-graph/compute-graph.test.ts +87 -0
  198. package/src/compute-graph/compute-graph.ts +260 -0
  199. package/src/compute-graph/compute-node.ts +62 -0
  200. package/src/{components/ComputeGraph → compute-graph/functions}/async-function.ts +26 -15
  201. package/src/{components/ComputeGraph → compute-graph/functions}/edge-function.ts +21 -17
  202. package/src/compute-graph/functions/index.ts +7 -0
  203. package/src/compute-graph/hyperformula.test.ts +14 -0
  204. package/src/compute-graph/index.ts +8 -0
  205. package/src/compute-graph/testing/index.ts +6 -0
  206. package/src/compute-graph/testing/test-builder.ts +54 -0
  207. package/src/{components/ComputeGraph/custom.ts → compute-graph/testing/test-plugin.ts} +44 -14
  208. package/src/compute-graph/util.ts +8 -0
  209. package/src/defs/index.ts +7 -0
  210. package/src/defs/sheet-range-types.ts +49 -0
  211. package/src/{model → defs}/types.test.ts +8 -9
  212. package/src/defs/types.ts +86 -0
  213. package/src/defs/util.ts +136 -0
  214. package/src/extensions/compute.stories.tsx +155 -0
  215. package/src/extensions/compute.ts +147 -0
  216. package/src/{components/CellEditor → extensions/editor}/extension.test.ts +4 -6
  217. package/src/{components/CellEditor → extensions/editor}/extension.ts +51 -27
  218. package/src/{components/CellEditor → extensions/editor}/index.ts +0 -1
  219. package/src/extensions/index.ts +6 -0
  220. package/src/index.ts +2 -2
  221. package/src/integrations/index.ts +5 -0
  222. package/src/integrations/thread-ranges.ts +101 -0
  223. package/src/meta.ts +15 -0
  224. package/src/model/index.ts +2 -3
  225. package/src/model/sheet-model.test.ts +59 -0
  226. package/src/model/sheet-model.ts +495 -0
  227. package/src/model/useSheetModel.ts +40 -0
  228. package/src/sanity.test.ts +40 -0
  229. package/src/serializer.ts +27 -0
  230. package/src/{components/Sheet → testing}/index.ts +1 -1
  231. package/src/testing/testing.tsx +68 -0
  232. package/src/translations.ts +24 -4
  233. package/src/types.ts +62 -47
  234. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs +0 -1772
  235. package/dist/lib/browser/SheetContainer-U4H5D34A.mjs.map +0 -7
  236. package/dist/lib/browser/chunk-APHOLYUB.mjs +0 -175
  237. package/dist/lib/browser/chunk-APHOLYUB.mjs.map +0 -7
  238. package/dist/lib/browser/chunk-D5AGLXJP.mjs.map +0 -7
  239. package/dist/lib/browser/chunk-FUAGSXA4.mjs +0 -82
  240. package/dist/lib/browser/chunk-FUAGSXA4.mjs.map +0 -7
  241. package/dist/lib/browser/chunk-JRL5LGCE.mjs +0 -18
  242. package/dist/lib/browser/chunk-JRL5LGCE.mjs.map +0 -7
  243. package/dist/lib/browser/chunk-NU4PBN33.mjs +0 -8
  244. package/dist/lib/browser/chunk-NU4PBN33.mjs.map +0 -7
  245. package/dist/lib/browser/testing.mjs +0 -92
  246. package/dist/lib/browser/testing.mjs.map +0 -7
  247. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs +0 -1765
  248. package/dist/lib/node/SheetContainer-AXQV3ZT5.cjs.map +0 -7
  249. package/dist/lib/node/chunk-5KKJ4NPP.cjs.map +0 -7
  250. package/dist/lib/node/chunk-BJ6ZD7MN.cjs +0 -51
  251. package/dist/lib/node/chunk-BJ6ZD7MN.cjs.map +0 -7
  252. package/dist/lib/node/chunk-CN3RPESU.cjs +0 -202
  253. package/dist/lib/node/chunk-CN3RPESU.cjs.map +0 -7
  254. package/dist/lib/node/chunk-DSYKOI4E.cjs.map +0 -7
  255. package/dist/lib/node/chunk-PYXHNAAK.cjs +0 -40
  256. package/dist/lib/node/chunk-PYXHNAAK.cjs.map +0 -7
  257. package/dist/lib/node/testing.cjs +0 -111
  258. package/dist/lib/node/testing.cjs.map +0 -7
  259. package/dist/types/src/components/CellEditor/CellEditor.d.ts +0 -14
  260. package/dist/types/src/components/CellEditor/CellEditor.d.ts.map +0 -1
  261. package/dist/types/src/components/CellEditor/CellEditor.stories.d.ts.map +0 -1
  262. package/dist/types/src/components/CellEditor/extension.d.ts +0 -19
  263. package/dist/types/src/components/CellEditor/extension.d.ts.map +0 -1
  264. package/dist/types/src/components/CellEditor/extension.test.d.ts.map +0 -1
  265. package/dist/types/src/components/CellEditor/index.d.ts +0 -3
  266. package/dist/types/src/components/CellEditor/index.d.ts.map +0 -1
  267. package/dist/types/src/components/ComputeGraph/async-function.d.ts.map +0 -1
  268. package/dist/types/src/components/ComputeGraph/custom.d.ts +0 -21
  269. package/dist/types/src/components/ComputeGraph/custom.d.ts.map +0 -1
  270. package/dist/types/src/components/ComputeGraph/edge-function.d.ts +0 -20
  271. package/dist/types/src/components/ComputeGraph/edge-function.d.ts.map +0 -1
  272. package/dist/types/src/components/ComputeGraph/graph-context.d.ts +0 -12
  273. package/dist/types/src/components/ComputeGraph/graph-context.d.ts.map +0 -1
  274. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts +0 -2
  275. package/dist/types/src/components/ComputeGraph/graph.browser.test.d.ts.map +0 -1
  276. package/dist/types/src/components/ComputeGraph/graph.d.ts +0 -26
  277. package/dist/types/src/components/ComputeGraph/graph.d.ts.map +0 -1
  278. package/dist/types/src/components/Sheet/Sheet.d.ts +0 -55
  279. package/dist/types/src/components/Sheet/Sheet.d.ts.map +0 -1
  280. package/dist/types/src/components/Sheet/Sheet.stories.d.ts +0 -54
  281. package/dist/types/src/components/Sheet/Sheet.stories.d.ts.map +0 -1
  282. package/dist/types/src/components/Sheet/formatting.d.ts +0 -14
  283. package/dist/types/src/components/Sheet/formatting.d.ts.map +0 -1
  284. package/dist/types/src/components/Sheet/grid.d.ts +0 -52
  285. package/dist/types/src/components/Sheet/grid.d.ts.map +0 -1
  286. package/dist/types/src/components/Sheet/index.d.ts +0 -2
  287. package/dist/types/src/components/Sheet/index.d.ts.map +0 -1
  288. package/dist/types/src/components/Sheet/nav.d.ts +0 -29
  289. package/dist/types/src/components/Sheet/nav.d.ts.map +0 -1
  290. package/dist/types/src/components/Sheet/sheet-context.d.ts +0 -25
  291. package/dist/types/src/components/Sheet/sheet-context.d.ts.map +0 -1
  292. package/dist/types/src/components/Sheet/util.d.ts +0 -18
  293. package/dist/types/src/components/Sheet/util.d.ts.map +0 -1
  294. package/dist/types/src/components/SheetContainer.d.ts +0 -9
  295. package/dist/types/src/components/SheetContainer.d.ts.map +0 -1
  296. package/dist/types/src/components/Toolbar/common.d.ts +0 -20
  297. package/dist/types/src/components/Toolbar/common.d.ts.map +0 -1
  298. package/dist/types/src/model/functions.d.ts.map +0 -1
  299. package/dist/types/src/model/model.browser.test.d.ts +0 -2
  300. package/dist/types/src/model/model.browser.test.d.ts.map +0 -1
  301. package/dist/types/src/model/model.d.ts.map +0 -1
  302. package/dist/types/src/model/types.d.ts +0 -17
  303. package/dist/types/src/model/types.d.ts.map +0 -1
  304. package/dist/types/src/model/types.test.d.ts.map +0 -1
  305. package/dist/types/src/model/util.d.ts +0 -15
  306. package/dist/types/src/model/util.d.ts.map +0 -1
  307. package/dist/types/src/testing.d.ts +0 -9
  308. package/dist/types/src/testing.d.ts.map +0 -1
  309. package/src/components/CellEditor/CellEditor.tsx +0 -113
  310. package/src/components/ComputeGraph/graph-context.tsx +0 -50
  311. package/src/components/ComputeGraph/graph.browser.test.ts +0 -50
  312. package/src/components/ComputeGraph/graph.ts +0 -62
  313. package/src/components/Sheet/Sheet.stories.tsx +0 -287
  314. package/src/components/Sheet/Sheet.tsx +0 -1160
  315. package/src/components/Sheet/formatting.ts +0 -106
  316. package/src/components/Sheet/grid.ts +0 -191
  317. package/src/components/Sheet/nav.ts +0 -157
  318. package/src/components/Sheet/sheet-context.tsx +0 -150
  319. package/src/components/Sheet/util.ts +0 -56
  320. package/src/components/SheetContainer.tsx +0 -34
  321. package/src/components/Toolbar/common.tsx +0 -72
  322. package/src/meta.tsx +0 -18
  323. package/src/model/model.browser.test.ts +0 -100
  324. package/src/model/model.ts +0 -550
  325. package/src/model/types.ts +0 -71
  326. package/src/model/util.ts +0 -36
  327. package/src/testing.ts +0 -50
  328. /package/dist/types/src/{model → defs}/types.test.d.ts +0 -0
  329. /package/dist/types/src/{components/CellEditor → extensions/editor}/extension.test.d.ts +0 -0
  330. /package/src/{model/functions.ts → compute-graph/functions/function-defs.ts} +0 -0
@@ -0,0 +1,1672 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ DEFAULT_COLUMNS,
4
+ DEFAULT_ROWS,
5
+ MAX_COLUMNS,
6
+ MAX_ROWS,
7
+ RANGE_NOTATION,
8
+ ReadonlyException,
9
+ addressFromA1Notation,
10
+ addressFromIndex,
11
+ addressToA1Notation,
12
+ addressToIndex,
13
+ cellClassNameForRange,
14
+ createSheetName,
15
+ inRange,
16
+ initialize,
17
+ insertIndices,
18
+ isFormula,
19
+ rangeFromIndex,
20
+ rangeToA1Notation
21
+ } from "./chunk-CR4K75EL.mjs";
22
+ import {
23
+ Range,
24
+ SheetAction
25
+ } from "./chunk-UIBWRHW7.mjs";
26
+ import {
27
+ SHEET_PLUGIN
28
+ } from "./chunk-BM2Q3FFC.mjs";
29
+
30
+ // packages/plugins/plugin-sheet/src/components/ComputeGraph/ComputeGraphContextProvider.tsx
31
+ import React, { createContext, useContext } from "react";
32
+ import { raise } from "@dxos/debug";
33
+ import { useAsyncState } from "@dxos/react-hooks";
34
+ var ComputeGraphContext = /* @__PURE__ */ createContext(void 0);
35
+ var ComputeGraphContextProvider = ({ registry, children }) => {
36
+ return /* @__PURE__ */ React.createElement(ComputeGraphContext.Provider, {
37
+ value: {
38
+ registry
39
+ }
40
+ }, children);
41
+ };
42
+ var useComputeGraph = (space) => {
43
+ const { registry } = useContext(ComputeGraphContext) ?? raise(new Error("Missing ComputeGraphContext"));
44
+ const [graph] = useAsyncState(async () => {
45
+ if (space) {
46
+ const graph2 = registry.getOrCreateGraph(space);
47
+ await graph2.open();
48
+ return graph2;
49
+ }
50
+ }, [
51
+ space,
52
+ registry
53
+ ]);
54
+ return graph;
55
+ };
56
+
57
+ // packages/plugins/plugin-sheet/src/extensions/compute.ts
58
+ import { syntaxTree } from "@codemirror/language";
59
+ import { RangeSetBuilder, StateEffect, StateField } from "@codemirror/state";
60
+ import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view";
61
+ import { debounce } from "@dxos/async";
62
+ import { invariant } from "@dxos/invariant";
63
+ import { documentId, singleValueFacet } from "@dxos/react-ui-editor";
64
+ var updateAllDecorations = StateEffect.define();
65
+ var computeGraphFacet = singleValueFacet();
66
+
67
+ // packages/plugins/plugin-sheet/src/extensions/editor/extension.ts
68
+ import { acceptCompletion, autocompletion, completionStatus, startCompletion } from "@codemirror/autocomplete";
69
+ import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
70
+ import { ViewPlugin as ViewPlugin2, keymap } from "@codemirror/view";
71
+ import { tags } from "@lezer/highlight";
72
+ import { spreadsheet } from "codemirror-lang-spreadsheet";
73
+ import { singleValueFacet as singleValueFacet2 } from "@dxos/react-ui-editor";
74
+ import { mx } from "@dxos/react-ui-theme";
75
+ var highlightStyles = HighlightStyle.define([
76
+ // Function.
77
+ {
78
+ tag: tags.name,
79
+ class: "text-accentText"
80
+ },
81
+ // Range.
82
+ {
83
+ tag: tags.tagName,
84
+ class: "text-pinkText"
85
+ },
86
+ // Values.
87
+ {
88
+ tag: tags.number,
89
+ class: "text-tealText"
90
+ },
91
+ {
92
+ tag: tags.bool,
93
+ class: "text-tealText"
94
+ },
95
+ {
96
+ tag: tags.string,
97
+ class: "text-tealText"
98
+ },
99
+ // Error.
100
+ {
101
+ tag: tags.invalid,
102
+ class: "text-unAccent"
103
+ }
104
+ ]);
105
+ var languageFacet = singleValueFacet2();
106
+ var sheetExtension = ({ functions = [] }) => {
107
+ const { extension, language } = spreadsheet({
108
+ idiom: "en-US",
109
+ decimalSeparator: "."
110
+ });
111
+ const createCompletion = (name) => {
112
+ const { section = "Custom", description, syntax } = functions.find((value) => value.name === name) ?? {};
113
+ return {
114
+ section,
115
+ label: name,
116
+ info: () => {
117
+ if (!description && !syntax) {
118
+ return null;
119
+ }
120
+ const root = document.createElement("div");
121
+ root.className = "flex flex-col gap-2 text-sm";
122
+ const title = document.createElement("h2");
123
+ title.innerText = name;
124
+ title.className = "text-lg font-mono text-accentText";
125
+ root.appendChild(title);
126
+ if (description) {
127
+ const info = document.createElement("p");
128
+ info.innerText = description;
129
+ info.className = "text-subdued";
130
+ root.appendChild(info);
131
+ }
132
+ if (syntax) {
133
+ const detail = document.createElement("pre");
134
+ detail.innerText = syntax;
135
+ detail.className = "whitespace-pre-wrap text-greenText";
136
+ root.appendChild(detail);
137
+ }
138
+ return root;
139
+ },
140
+ apply: (view, completion, from, to) => {
141
+ const insertParens = to === view.state.doc.toString().length;
142
+ view.dispatch(view.state.update({
143
+ changes: {
144
+ from,
145
+ to,
146
+ insert: completion.label + (insertParens ? "()" : "")
147
+ },
148
+ selection: {
149
+ anchor: from + completion.label.length + 1
150
+ }
151
+ }));
152
+ }
153
+ };
154
+ };
155
+ return [
156
+ extension,
157
+ languageFacet.of(language),
158
+ language.data.of({
159
+ autocomplete: (context) => {
160
+ if (context.state.doc.toString()[0] !== "=") {
161
+ return null;
162
+ }
163
+ const match = context.matchBefore(/\w*/);
164
+ if (!match || match.from === match.to) {
165
+ return null;
166
+ }
167
+ const text = match.text.toUpperCase();
168
+ if (!context.explicit && match.text.length < 2) {
169
+ return null;
170
+ }
171
+ return {
172
+ from: match.from,
173
+ options: functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? []
174
+ };
175
+ }
176
+ }),
177
+ syntaxHighlighting(highlightStyles),
178
+ autocompletion({
179
+ aboveCursor: false,
180
+ defaultKeymap: true,
181
+ activateOnTyping: true,
182
+ // NOTE: Useful for debugging.
183
+ closeOnBlur: false,
184
+ icons: false,
185
+ tooltipClass: () => mx("!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]", "[&>ul>li[aria-selected]]:!bg-accentSurface", "border-separator")
186
+ }),
187
+ keymap.of([
188
+ {
189
+ key: "Tab",
190
+ run: (view) => {
191
+ return completionStatus(view.state) === "active" ? acceptCompletion(view) : startCompletion(view);
192
+ }
193
+ }
194
+ ])
195
+ ];
196
+ };
197
+ var rangeExtension = ({ onInit, onStateChange }) => {
198
+ let view;
199
+ let activeRange;
200
+ const notifier = {
201
+ setRange: (range) => {
202
+ if (activeRange) {
203
+ view.dispatch(view.state.update({
204
+ changes: {
205
+ ...activeRange,
206
+ insert: range.toString()
207
+ },
208
+ selection: {
209
+ anchor: activeRange.from + range.length
210
+ }
211
+ }));
212
+ }
213
+ view.focus();
214
+ }
215
+ };
216
+ return ViewPlugin2.fromClass(class {
217
+ constructor(_view) {
218
+ view = _view;
219
+ onInit?.(notifier);
220
+ }
221
+ update(view2) {
222
+ const { anchor } = view2.state.selection.ranges[0];
223
+ activeRange = void 0;
224
+ const language = view2.state.facet(languageFacet);
225
+ const { topNode } = language.parser.parse(view2.state.doc.toString());
226
+ visitTree(topNode, ({ type, from, to }) => {
227
+ if (from <= anchor && to >= anchor) {
228
+ switch (type.name) {
229
+ case "Function":
230
+ activeRange = {
231
+ from: to,
232
+ to
233
+ };
234
+ break;
235
+ case "CloseParen":
236
+ activeRange = {
237
+ from,
238
+ to: from
239
+ };
240
+ break;
241
+ case "RangeToken":
242
+ case "CellToken":
243
+ activeRange = {
244
+ from,
245
+ to
246
+ };
247
+ return true;
248
+ }
249
+ }
250
+ return false;
251
+ });
252
+ if (!activeRange && view2.state.doc.toString()[0] === "=") {
253
+ const str = view2.state.doc.sliceString(1);
254
+ if (RANGE_NOTATION.test(str)) {
255
+ activeRange = {
256
+ from: 1,
257
+ to: str.length + 1
258
+ };
259
+ }
260
+ }
261
+ onStateChange?.({
262
+ activeRange: activeRange ? view2.state.doc.sliceString(activeRange.from, activeRange.to) : void 0
263
+ });
264
+ }
265
+ });
266
+ };
267
+ var visitTree = (node, callback) => {
268
+ if (callback(node)) {
269
+ return true;
270
+ }
271
+ for (let child = node.firstChild; child !== null; child = child.nextSibling) {
272
+ if (visitTree(child, callback)) {
273
+ return true;
274
+ }
275
+ }
276
+ return false;
277
+ };
278
+
279
+ // packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx
280
+ import React2, { createContext as createContext2, useCallback, useContext as useContext2, useState as useState2 } from "react";
281
+ import { invariant as invariant3 } from "@dxos/invariant";
282
+ import { fullyQualifiedId } from "@dxos/react-client/echo";
283
+ import { Grid, useGridContext } from "@dxos/react-ui-grid";
284
+
285
+ // packages/plugins/plugin-sheet/src/model/sheet-model.ts
286
+ import { Event } from "@dxos/async";
287
+ import { Resource } from "@dxos/context";
288
+ import { getTypename, FormatEnum, TypeEnum } from "@dxos/echo-schema";
289
+ import { invariant as invariant2 } from "@dxos/invariant";
290
+ import { PublicKey } from "@dxos/keys";
291
+ import { log } from "@dxos/log";
292
+ import { DetailedCellError, ExportedCellChange } from "#hyperformula";
293
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/model/sheet-model.ts";
294
+ var typeMap = {
295
+ BOOLEAN: {
296
+ type: TypeEnum.Boolean
297
+ },
298
+ NUMBER_RAW: {
299
+ type: TypeEnum.Number
300
+ },
301
+ NUMBER_PERCENT: {
302
+ type: TypeEnum.Number,
303
+ format: FormatEnum.Percent
304
+ },
305
+ NUMBER_CURRENCY: {
306
+ type: TypeEnum.Number,
307
+ format: FormatEnum.Currency
308
+ },
309
+ NUMBER_DATETIME: {
310
+ type: TypeEnum.String,
311
+ format: FormatEnum.DateTime
312
+ },
313
+ NUMBER_DATE: {
314
+ type: TypeEnum.String,
315
+ format: FormatEnum.Date
316
+ },
317
+ NUMBER_TIME: {
318
+ type: TypeEnum.String,
319
+ format: FormatEnum.Time
320
+ }
321
+ };
322
+ var getTopLeft = (range) => {
323
+ const to = range.to ?? range.from;
324
+ return {
325
+ row: Math.min(range.from.row, to.row),
326
+ col: Math.min(range.from.col, to.col)
327
+ };
328
+ };
329
+ var toSimpleCellAddress = (sheet, cell) => ({
330
+ sheet,
331
+ row: cell.row,
332
+ col: cell.col
333
+ });
334
+ var toModelRange = (sheet, range) => ({
335
+ start: toSimpleCellAddress(sheet, range.from),
336
+ end: toSimpleCellAddress(sheet, range.to ?? range.from)
337
+ });
338
+ var SheetModel = class extends Resource {
339
+ constructor(_graph, _sheet, _options = {}) {
340
+ super();
341
+ this._graph = _graph;
342
+ this._sheet = _sheet;
343
+ this._options = _options;
344
+ this.id = `model-${PublicKey.random().truncate()}`;
345
+ this.update = new Event();
346
+ }
347
+ get graph() {
348
+ return this._graph;
349
+ }
350
+ get sheet() {
351
+ return this._sheet;
352
+ }
353
+ get readonly() {
354
+ return this._options.readonly;
355
+ }
356
+ get bounds() {
357
+ return {
358
+ rows: this._sheet.rows.length,
359
+ columns: this._sheet.columns.length
360
+ };
361
+ }
362
+ /**
363
+ * Initialize sheet and engine.
364
+ */
365
+ async _open() {
366
+ log("initialize", {
367
+ id: this.id
368
+ }, {
369
+ F: __dxlog_file,
370
+ L: 113,
371
+ S: this,
372
+ C: (f, a) => f(...a)
373
+ });
374
+ initialize(this._sheet);
375
+ this._graph.update.on((event) => {
376
+ if (event.type === "functionsUpdated") {
377
+ this.reset();
378
+ }
379
+ });
380
+ this._node = this._graph.getOrCreateNode(createSheetName({
381
+ type: getTypename(this._sheet),
382
+ id: this._sheet.id
383
+ }));
384
+ await this._node.open();
385
+ const unsubscribe = this._node.update.on((event) => this.update.emit(event));
386
+ this._ctx.onDispose(unsubscribe);
387
+ this.reset();
388
+ }
389
+ /**
390
+ * Update engine.
391
+ * NOTE: This resets the undo history.
392
+ * @deprecated
393
+ */
394
+ reset() {
395
+ invariant2(this._node, void 0, {
396
+ F: __dxlog_file,
397
+ L: 139,
398
+ S: this,
399
+ A: [
400
+ "this._node",
401
+ ""
402
+ ]
403
+ });
404
+ this._node.graph.hf.clearSheet(this._node.sheetId);
405
+ Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
406
+ invariant2(this._node, void 0, {
407
+ F: __dxlog_file,
408
+ L: 142,
409
+ S: this,
410
+ A: [
411
+ "this._node",
412
+ ""
413
+ ]
414
+ });
415
+ const { col, row } = addressFromIndex(this._sheet, key);
416
+ if (isFormula(value)) {
417
+ const binding = this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value));
418
+ if (binding) {
419
+ value = this._graph.mapFormulaToNative(binding);
420
+ } else {
421
+ value = "";
422
+ }
423
+ }
424
+ this._node.graph.hf.setCellContents({
425
+ sheet: this._node.sheetId,
426
+ row,
427
+ col
428
+ }, value);
429
+ });
430
+ }
431
+ /**
432
+ * Recalculate formulas.
433
+ * NOTE: This resets the undo history.
434
+ * https://hyperformula.handsontable.com/guide/volatile-functions.html#volatile-actions
435
+ * @deprecated
436
+ */
437
+ // TODO(burdon): Remove.
438
+ recalculate() {
439
+ this._node?.graph.hf.rebuildAndRecalculate();
440
+ }
441
+ insertRows(i, n = 1) {
442
+ const idx = insertIndices(this._sheet.rows, i, n, MAX_ROWS);
443
+ this.reset();
444
+ return idx;
445
+ }
446
+ insertColumns(i, n = 1) {
447
+ const idx = insertIndices(this._sheet.columns, i, n, MAX_COLUMNS);
448
+ this.reset();
449
+ return idx;
450
+ }
451
+ dropRow(rowIndex) {
452
+ const range = {
453
+ from: addressFromIndex(this._sheet, `${this._sheet.columns[0]}@${rowIndex}`),
454
+ to: addressFromIndex(this._sheet, `${this._sheet.columns[this._sheet.columns.length - 1]}@${rowIndex}`)
455
+ };
456
+ const values = this.getCellValues(range).flat();
457
+ const index = this._sheet.rows.indexOf(rowIndex);
458
+ this.clear(range);
459
+ this._sheet.rows.splice(index, 1);
460
+ delete this._sheet.rowMeta[rowIndex];
461
+ this.reset();
462
+ return {
463
+ axis: "row",
464
+ index,
465
+ axisIndex: rowIndex,
466
+ axisMeta: this._sheet.rowMeta[rowIndex],
467
+ values
468
+ };
469
+ }
470
+ dropColumn(colIndex) {
471
+ const range = {
472
+ from: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[0]}`),
473
+ to: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[this._sheet.rows.length - 1]}`)
474
+ };
475
+ const values = this.getCellValues(range).flat();
476
+ const index = this._sheet.columns.indexOf(colIndex);
477
+ this.clear(range);
478
+ this._sheet.columns.splice(index, 1);
479
+ delete this._sheet.columnMeta[colIndex];
480
+ this.reset();
481
+ return {
482
+ axis: "col",
483
+ index,
484
+ axisIndex: colIndex,
485
+ axisMeta: this._sheet.rowMeta[colIndex],
486
+ values
487
+ };
488
+ }
489
+ restoreRow({ index, axisIndex, axisMeta, values }) {
490
+ this._sheet.rows.splice(index, 0, axisIndex);
491
+ values.forEach((value, col) => {
492
+ if (value) {
493
+ this._sheet.cells[`${this._sheet.columns[col]}@${axisIndex}`] = {
494
+ value
495
+ };
496
+ }
497
+ });
498
+ if (axisMeta) {
499
+ this._sheet.rowMeta[axisIndex] = axisMeta;
500
+ }
501
+ this.reset();
502
+ }
503
+ restoreColumn({ index, axisIndex, axisMeta, values }) {
504
+ this._sheet.columns.splice(index, 0, axisIndex);
505
+ values.forEach((value, row) => {
506
+ if (value) {
507
+ this._sheet.cells[`${axisIndex}@${this._sheet.rows[row]}`] = {
508
+ value
509
+ };
510
+ }
511
+ });
512
+ if (axisMeta) {
513
+ this._sheet.columnMeta[axisIndex] = axisMeta;
514
+ }
515
+ this.reset();
516
+ }
517
+ //
518
+ // Undoable actions.
519
+ // TODO(burdon): Group undoable methods; consistently update hf/sheet.
520
+ //
521
+ /**
522
+ * Clear range of values.
523
+ */
524
+ clear(range) {
525
+ invariant2(this._node, void 0, {
526
+ F: __dxlog_file,
527
+ L: 245,
528
+ S: this,
529
+ A: [
530
+ "this._node",
531
+ ""
532
+ ]
533
+ });
534
+ const topLeft = getTopLeft(range);
535
+ const values = this._iterRange(range, () => null);
536
+ this._node.graph.hf.setCellContents(toSimpleCellAddress(this._node.sheetId, topLeft), values);
537
+ this._iterRange(range, (cell) => {
538
+ const idx = addressToIndex(this._sheet, cell);
539
+ delete this._sheet.cells[idx];
540
+ });
541
+ }
542
+ cut(range) {
543
+ invariant2(this._node, void 0, {
544
+ F: __dxlog_file,
545
+ L: 256,
546
+ S: this,
547
+ A: [
548
+ "this._node",
549
+ ""
550
+ ]
551
+ });
552
+ this._node.graph.hf.cut(toModelRange(this._node.sheetId, range));
553
+ this._iterRange(range, (cell) => {
554
+ const idx = addressToIndex(this._sheet, cell);
555
+ delete this._sheet.cells[idx];
556
+ });
557
+ }
558
+ copy(range) {
559
+ invariant2(this._node, void 0, {
560
+ F: __dxlog_file,
561
+ L: 265,
562
+ S: this,
563
+ A: [
564
+ "this._node",
565
+ ""
566
+ ]
567
+ });
568
+ this._node.graph.hf.copy(toModelRange(this._node.sheetId, range));
569
+ }
570
+ paste(cell) {
571
+ invariant2(this._node, void 0, {
572
+ F: __dxlog_file,
573
+ L: 270,
574
+ S: this,
575
+ A: [
576
+ "this._node",
577
+ ""
578
+ ]
579
+ });
580
+ if (!this._node.graph.hf.isClipboardEmpty()) {
581
+ const changes = this._node.graph.hf.paste(toSimpleCellAddress(this._node.sheetId, cell));
582
+ for (const change of changes) {
583
+ if (change instanceof ExportedCellChange) {
584
+ const { address, newValue } = change;
585
+ const idx = addressToIndex(this._sheet, {
586
+ row: address.row,
587
+ col: address.col
588
+ });
589
+ this._sheet.cells[idx] = {
590
+ value: newValue
591
+ };
592
+ }
593
+ }
594
+ }
595
+ }
596
+ // TODO(burdon): Display undo/redo state.
597
+ undo() {
598
+ invariant2(this._node, void 0, {
599
+ F: __dxlog_file,
600
+ L: 285,
601
+ S: this,
602
+ A: [
603
+ "this._node",
604
+ ""
605
+ ]
606
+ });
607
+ if (this._node.graph.hf.isThereSomethingToUndo()) {
608
+ this._node.graph.hf.undo();
609
+ }
610
+ }
611
+ redo() {
612
+ invariant2(this._node, void 0, {
613
+ F: __dxlog_file,
614
+ L: 293,
615
+ S: this,
616
+ A: [
617
+ "this._node",
618
+ ""
619
+ ]
620
+ });
621
+ if (this._node.graph.hf.isThereSomethingToRedo()) {
622
+ this._node.graph.hf.redo();
623
+ }
624
+ }
625
+ /**
626
+ * Get value from sheet.
627
+ */
628
+ getCellValue(cell) {
629
+ const idx = addressToIndex(this._sheet, cell);
630
+ return this._sheet.cells[idx]?.value ?? null;
631
+ }
632
+ /**
633
+ * Get value as a string for editing.
634
+ */
635
+ getCellText(cell) {
636
+ const value = this.getCellValue(cell);
637
+ if (value == null) {
638
+ return void 0;
639
+ }
640
+ if (isFormula(value)) {
641
+ return this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value));
642
+ } else {
643
+ return String(value);
644
+ }
645
+ }
646
+ /**
647
+ * Get array of raw values from sheet.
648
+ */
649
+ getCellValues(range) {
650
+ return this._iterRange(range, (cell) => this.getCellValue(cell));
651
+ }
652
+ /**
653
+ * Gets the regular or computed value from the engine.
654
+ */
655
+ getValue(cell) {
656
+ invariant2(this._node, void 0, {
657
+ F: __dxlog_file,
658
+ L: 336,
659
+ S: this,
660
+ A: [
661
+ "this._node",
662
+ ""
663
+ ]
664
+ });
665
+ const address = toSimpleCellAddress(this._node.sheetId, cell);
666
+ const value = this._node.graph.hf.getCellValue(address);
667
+ if (value instanceof DetailedCellError) {
668
+ log.info("cell error", {
669
+ cell,
670
+ error: value
671
+ }, {
672
+ F: __dxlog_file,
673
+ L: 341,
674
+ S: this,
675
+ C: (f, a) => f(...a)
676
+ });
677
+ return value.toString();
678
+ }
679
+ return value;
680
+ }
681
+ /**
682
+ * Get value type.
683
+ */
684
+ getValueDescription(cell) {
685
+ invariant2(this._node, void 0, {
686
+ F: __dxlog_file,
687
+ L: 352,
688
+ S: this,
689
+ A: [
690
+ "this._node",
691
+ ""
692
+ ]
693
+ });
694
+ const addr = toSimpleCellAddress(this._node.sheetId, cell);
695
+ const type = this._node.graph.hf.getCellValueDetailedType(addr);
696
+ return typeMap[type];
697
+ }
698
+ /**
699
+ * Sets the value, updating the sheet and engine.
700
+ */
701
+ setValue(cell, value) {
702
+ invariant2(this._node, void 0, {
703
+ F: __dxlog_file,
704
+ L: 362,
705
+ S: this,
706
+ A: [
707
+ "this._node",
708
+ ""
709
+ ]
710
+ });
711
+ if (this._options.readonly) {
712
+ throw new ReadonlyException();
713
+ }
714
+ let refresh = false;
715
+ if (cell.row >= this._sheet.rows.length) {
716
+ insertIndices(this._sheet.rows, cell.row, 1, MAX_ROWS);
717
+ refresh = true;
718
+ }
719
+ if (cell.col >= this._sheet.columns.length) {
720
+ insertIndices(this._sheet.columns, cell.col, 1, MAX_COLUMNS);
721
+ refresh = true;
722
+ }
723
+ if (refresh) {
724
+ this.reset();
725
+ }
726
+ this._node.graph.hf.setCellContents({
727
+ sheet: this._node.sheetId,
728
+ row: cell.row,
729
+ col: cell.col
730
+ }, [
731
+ [
732
+ isFormula(value) ? this._graph.mapFormulaToNative(value) : value
733
+ ]
734
+ ]);
735
+ const idx = addressToIndex(this._sheet, cell);
736
+ if (value === void 0 || value === null) {
737
+ delete this._sheet.cells[idx];
738
+ } else {
739
+ if (isFormula(value)) {
740
+ value = this._graph.mapFunctionBindingToId(this.mapFormulaRefsToIndices(value));
741
+ }
742
+ this._sheet.cells[idx] = {
743
+ value
744
+ };
745
+ }
746
+ }
747
+ /**
748
+ * Sets values from a simple map.
749
+ */
750
+ setValues(values) {
751
+ Object.entries(values).forEach(([key, { value }]) => {
752
+ this.setValue(addressFromA1Notation(key), value);
753
+ });
754
+ }
755
+ /**
756
+ * Iterate range.
757
+ */
758
+ _iterRange(range, cb) {
759
+ const to = range.to ?? range.from;
760
+ const rowRange = [
761
+ Math.min(range.from.row, to.row),
762
+ Math.max(range.from.row, to.row)
763
+ ];
764
+ const columnRange = [
765
+ Math.min(range.from.col, to.col),
766
+ Math.max(range.from.col, to.col)
767
+ ];
768
+ const rows = [];
769
+ for (let row = rowRange[0]; row <= rowRange[1]; row++) {
770
+ const rowCells = [];
771
+ for (let column = columnRange[0]; column <= columnRange[1]; column++) {
772
+ const value = cb({
773
+ row,
774
+ col: column
775
+ });
776
+ if (value !== void 0) {
777
+ rowCells.push(value);
778
+ }
779
+ }
780
+ rows.push(rowCells);
781
+ }
782
+ return rows;
783
+ }
784
+ // TODO(burdon): Delete index.
785
+ _deleteIndices(indices, i, n) {
786
+ throw new Error("Not implemented");
787
+ }
788
+ // TODO(burdon): Move. Cannot use fractional without changing. Switch back to using unique IDs?
789
+ _moveIndices(indices, i, j, n) {
790
+ throw new Error("Not implemented");
791
+ }
792
+ //
793
+ // Indices.
794
+ //
795
+ /**
796
+ * Map from A1 notation to indices.
797
+ */
798
+ mapFormulaRefsToIndices(formula) {
799
+ invariant2(isFormula(formula), void 0, {
800
+ F: __dxlog_file,
801
+ L: 451,
802
+ S: this,
803
+ A: [
804
+ "isFormula(formula)",
805
+ ""
806
+ ]
807
+ });
808
+ return formula.replace(/([a-zA-Z]+)([0-9]+)/g, (match) => {
809
+ return addressToIndex(this._sheet, addressFromA1Notation(match));
810
+ });
811
+ }
812
+ /**
813
+ * Map from indices to A1 notation.
814
+ */
815
+ mapFormulaIndicesToRefs(formula) {
816
+ invariant2(isFormula(formula), void 0, {
817
+ F: __dxlog_file,
818
+ L: 461,
819
+ S: this,
820
+ A: [
821
+ "isFormula(formula)",
822
+ ""
823
+ ]
824
+ });
825
+ return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
826
+ return addressToA1Notation(addressFromIndex(this._sheet, idx));
827
+ });
828
+ }
829
+ //
830
+ // Values
831
+ //
832
+ /**
833
+ * https://hyperformula.handsontable.com/guide/date-and-time-handling.html#example
834
+ * https://hyperformula.handsontable.com/api/interfaces/configparams.html#nulldate
835
+ * NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().
836
+ */
837
+ toLocalDate(num) {
838
+ const { year, month, day, hours, minutes, seconds } = this.toDateTime(num);
839
+ return new Date(year, month - 1, day, hours, minutes, seconds);
840
+ }
841
+ toDateTime(num) {
842
+ invariant2(this._node, void 0, {
843
+ F: __dxlog_file,
844
+ L: 482,
845
+ S: this,
846
+ A: [
847
+ "this._node",
848
+ ""
849
+ ]
850
+ });
851
+ return this._node.graph.hf.numberToDateTime(num);
852
+ }
853
+ toDate(num) {
854
+ invariant2(this._node, void 0, {
855
+ F: __dxlog_file,
856
+ L: 487,
857
+ S: this,
858
+ A: [
859
+ "this._node",
860
+ ""
861
+ ]
862
+ });
863
+ return this._node.graph.hf.numberToDate(num);
864
+ }
865
+ toTime(num) {
866
+ invariant2(this._node, void 0, {
867
+ F: __dxlog_file,
868
+ L: 492,
869
+ S: this,
870
+ A: [
871
+ "this._node",
872
+ ""
873
+ ]
874
+ });
875
+ return this._node.graph.hf.numberToTime(num);
876
+ }
877
+ };
878
+
879
+ // packages/plugins/plugin-sheet/src/model/useSheetModel.ts
880
+ import { useEffect, useState } from "react";
881
+ var useSheetModel = (graph, sheet, { readonly } = {}) => {
882
+ const [model, setModel] = useState();
883
+ useEffect(() => {
884
+ if (!graph || !sheet) {
885
+ return;
886
+ }
887
+ let model2;
888
+ const t = setTimeout(async () => {
889
+ model2 = new SheetModel(graph, sheet, {
890
+ readonly
891
+ });
892
+ await model2.open();
893
+ setModel(model2);
894
+ });
895
+ return () => {
896
+ clearTimeout(t);
897
+ void model2?.close();
898
+ };
899
+ }, [
900
+ graph,
901
+ sheet,
902
+ readonly
903
+ ]);
904
+ return model;
905
+ };
906
+
907
+ // packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx
908
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx";
909
+ var SheetContext = /* @__PURE__ */ createContext2(void 0);
910
+ var useSheetContext = () => {
911
+ const context = useContext2(SheetContext);
912
+ invariant3(context, void 0, {
913
+ F: __dxlog_file2,
914
+ L: 52,
915
+ S: void 0,
916
+ A: [
917
+ "context",
918
+ ""
919
+ ]
920
+ });
921
+ return context;
922
+ };
923
+ var SheetProviderImpl = ({ model, onInfo, children, __gridScope }) => {
924
+ const { id, editing, setEditing } = useGridContext("SheetProvider", __gridScope);
925
+ const [cursor, setCursorInternal] = useState2();
926
+ const [range, setRangeInternal] = useState2();
927
+ const [cursorFallbackRange, setCursorFallbackRange] = useState2();
928
+ const [activeRefs, setActiveRefs] = useState2("");
929
+ const setCursor = useCallback((nextCursor) => {
930
+ setCursorInternal(nextCursor);
931
+ setCursorFallbackRange(range?.to ? range : nextCursor ? {
932
+ from: nextCursor,
933
+ to: nextCursor
934
+ } : void 0);
935
+ }, [
936
+ range
937
+ ]);
938
+ const setRange = useCallback((nextRange) => {
939
+ setRangeInternal(nextRange);
940
+ setCursorFallbackRange(nextRange?.to ? nextRange : cursor ? {
941
+ from: cursor,
942
+ to: cursor
943
+ } : void 0);
944
+ }, [
945
+ cursor
946
+ ]);
947
+ return /* @__PURE__ */ React2.createElement(SheetContext.Provider, {
948
+ value: {
949
+ id,
950
+ model,
951
+ editing,
952
+ setEditing,
953
+ cursor,
954
+ setCursor,
955
+ range,
956
+ setRange,
957
+ cursorFallbackRange,
958
+ activeRefs,
959
+ setActiveRefs,
960
+ // TODO(burdon): Change to event.
961
+ onInfo
962
+ }
963
+ }, children);
964
+ };
965
+ var SheetProvider = ({ children, graph, sheet, readonly, onInfo }) => {
966
+ const model = useSheetModel(graph, sheet, {
967
+ readonly
968
+ });
969
+ return !model ? null : /* @__PURE__ */ React2.createElement(Grid.Root, {
970
+ id: fullyQualifiedId(sheet)
971
+ }, /* @__PURE__ */ React2.createElement(SheetProviderImpl, {
972
+ model,
973
+ onInfo
974
+ }, children));
975
+ };
976
+
977
+ // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
978
+ import React4, { useCallback as useCallback4, useMemo as useMemo2, useRef, useState as useState4 } from "react";
979
+ import { useIntentDispatcher as useIntentDispatcher2 } from "@dxos/app-framework";
980
+ import { DropdownMenu, Icon, useTranslation as useTranslation2 } from "@dxos/react-ui";
981
+ import { useAttention } from "@dxos/react-ui-attention";
982
+ import { closestCell, editorKeys, Grid as Grid2, GridCellEditor } from "@dxos/react-ui-grid";
983
+
984
+ // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
985
+ import { useEffect as useEffect3, useState as useState3 } from "react";
986
+ import { createDocAccessor, fullyQualifiedId as fullyQualifiedId3 } from "@dxos/react-client/echo";
987
+ import { parseValue, cellClassesForFieldType } from "@dxos/react-ui-data";
988
+ import { colToA1Notation, rowToA1Notation, commentedClassName } from "@dxos/react-ui-grid";
989
+ import { mx as mx2 } from "@dxos/react-ui-theme";
990
+
991
+ // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
992
+ import { useCallback as useCallback3, useEffect as useEffect2, useMemo } from "react";
993
+ import { LayoutAction, useIntentDispatcher, useIntentResolver } from "@dxos/app-framework";
994
+ import { debounce as debounce2 } from "@dxos/async";
995
+ import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
996
+
997
+ // packages/plugins/plugin-sheet/src/components/index.ts
998
+ import { lazy } from "react";
999
+
1000
+ // packages/plugins/plugin-sheet/src/components/RangeList/RangeList.tsx
1001
+ import React3, { useCallback as useCallback2 } from "react";
1002
+ import { S } from "@dxos/echo-schema";
1003
+ import { useTranslation } from "@dxos/react-ui";
1004
+ import { List } from "@dxos/react-ui-list";
1005
+ import { ghostHover } from "@dxos/react-ui-theme";
1006
+ var RangeList = ({ sheet }) => {
1007
+ const { t } = useTranslation(SHEET_PLUGIN);
1008
+ const handleSelectRange = (range) => {
1009
+ };
1010
+ const handleDeleteRange = useCallback2((range) => {
1011
+ const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);
1012
+ sheet.ranges.splice(index, 1);
1013
+ }, [
1014
+ sheet
1015
+ ]);
1016
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("h2", {
1017
+ className: "p-2 text-sm font-semibold"
1018
+ }, t("range list heading")), /* @__PURE__ */ React3.createElement(List.Root, {
1019
+ items: sheet.ranges,
1020
+ isItem: S.is(Range)
1021
+ }, ({ items: ranges }) => ranges.map((range, i) => /* @__PURE__ */ React3.createElement(List.Item, {
1022
+ key: i,
1023
+ item: range,
1024
+ classNames: [
1025
+ "p-2",
1026
+ ghostHover
1027
+ ]
1028
+ }, /* @__PURE__ */ React3.createElement(List.ItemDragHandle, null), /* @__PURE__ */ React3.createElement(List.ItemTitle, {
1029
+ onClick: () => handleSelectRange(range)
1030
+ }, t("range title", {
1031
+ position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),
1032
+ key: t(`range key ${range.key} label`),
1033
+ value: t(`range value ${range.value} label`)
1034
+ })), /* @__PURE__ */ React3.createElement(List.ItemDeleteButton, {
1035
+ onClick: () => handleDeleteRange(range)
1036
+ })))));
1037
+ };
1038
+
1039
+ // packages/plugins/plugin-sheet/src/components/index.ts
1040
+ var SheetContainer = lazy(() => import("./SheetContainer-R73XEXHU.mjs"));
1041
+
1042
+ // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
1043
+ var completeCellRangeToThreadCursor = (range) => {
1044
+ return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;
1045
+ };
1046
+ var parseThreadAnchorAsCellRange = (cursor) => {
1047
+ const coords = cursor.split(",");
1048
+ if (coords.length !== 4) {
1049
+ return null;
1050
+ } else {
1051
+ const [fromCol, fromRow, toCol, toRow] = coords;
1052
+ return {
1053
+ from: {
1054
+ col: parseInt(fromCol),
1055
+ row: parseInt(fromRow)
1056
+ },
1057
+ to: {
1058
+ col: parseInt(toCol),
1059
+ row: parseInt(toRow)
1060
+ }
1061
+ };
1062
+ }
1063
+ };
1064
+ var useUpdateFocusedCellOnThreadSelection = (grid) => {
1065
+ const { model, setActiveRefs } = useSheetContext();
1066
+ const handleScrollIntoView = useCallback3(({ action, data }) => {
1067
+ switch (action) {
1068
+ case LayoutAction.SCROLL_INTO_VIEW: {
1069
+ if (!data?.id || data?.cursor === void 0 || data?.id !== fullyQualifiedId2(model.sheet)) {
1070
+ return;
1071
+ }
1072
+ setActiveRefs(data.thread);
1073
+ const range = parseThreadAnchorAsCellRange(data.cursor);
1074
+ range && grid?.setFocus({
1075
+ ...range.to,
1076
+ plane: "grid"
1077
+ }, true);
1078
+ }
1079
+ }
1080
+ }, [
1081
+ model.sheet,
1082
+ setActiveRefs
1083
+ ]);
1084
+ useIntentResolver(SHEET_PLUGIN, handleScrollIntoView);
1085
+ };
1086
+ var useSelectThreadOnCellFocus = () => {
1087
+ const { model, cursor } = useSheetContext();
1088
+ const dispatch = useIntentDispatcher();
1089
+ const threads = useMemo(() => model.sheet.threads?.filter((thread) => !!thread) ?? [], [
1090
+ // TODO(thure): Surely we can find a better dependency for this…
1091
+ JSON.stringify(model.sheet.threads)
1092
+ ]);
1093
+ const selectClosestThread = useCallback3((cellAddress) => {
1094
+ if (!cellAddress || !threads) {
1095
+ return;
1096
+ }
1097
+ const closestThread = threads?.find(({ anchor }) => {
1098
+ if (anchor) {
1099
+ const range = parseThreadAnchorAsCellRange(anchor);
1100
+ return range ? inRange(range, cellAddress) : false;
1101
+ } else {
1102
+ return false;
1103
+ }
1104
+ });
1105
+ if (closestThread) {
1106
+ void dispatch([
1107
+ {
1108
+ action: "dxos.org/plugin/thread/action/select",
1109
+ data: {
1110
+ current: fullyQualifiedId2(closestThread)
1111
+ }
1112
+ }
1113
+ ]);
1114
+ }
1115
+ }, [
1116
+ dispatch,
1117
+ threads
1118
+ ]);
1119
+ const debounced = useMemo(() => {
1120
+ return debounce2((cellCoords) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);
1121
+ }, [
1122
+ selectClosestThread
1123
+ ]);
1124
+ useEffect2(() => {
1125
+ if (!cursor) {
1126
+ return;
1127
+ }
1128
+ debounced(cursor);
1129
+ }, [
1130
+ cursor,
1131
+ debounced
1132
+ ]);
1133
+ };
1134
+
1135
+ // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
1136
+ var dxGridCellIndexToSheetCellAddress = (index) => {
1137
+ const [colStr, rowStr] = index.split(",");
1138
+ return {
1139
+ col: parseInt(colStr),
1140
+ row: parseInt(rowStr)
1141
+ };
1142
+ };
1143
+ var createDxGridColumns = (model) => {
1144
+ return model.sheet.columns.reduce((acc, columnId, numericIndex) => {
1145
+ if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {
1146
+ acc.grid[numericIndex] = {
1147
+ size: model.sheet.columnMeta[columnId].size,
1148
+ resizeable: true
1149
+ };
1150
+ }
1151
+ return acc;
1152
+ }, {
1153
+ grid: {}
1154
+ });
1155
+ };
1156
+ var createDxGridRows = (model) => {
1157
+ return model.sheet.rows.reduce((acc, rowId, numericIndex) => {
1158
+ if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {
1159
+ acc.grid[numericIndex] = {
1160
+ size: model.sheet.rowMeta[rowId].size,
1161
+ resizeable: true
1162
+ };
1163
+ }
1164
+ return acc;
1165
+ }, {
1166
+ grid: {}
1167
+ });
1168
+ };
1169
+ var projectCellProps = (model, col, row) => {
1170
+ const address = {
1171
+ col,
1172
+ row
1173
+ };
1174
+ const rawValue = model.getValue(address);
1175
+ const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));
1176
+ const threadRefs = model.sheet.threads?.filter((thread) => {
1177
+ const range = thread?.anchor && parseThreadAnchorAsCellRange(thread.anchor);
1178
+ return thread && range ? inRange(range, address) : false;
1179
+ }).map((thread) => fullyQualifiedId3(thread)).join(" ");
1180
+ const description = model.getValueDescription(address);
1181
+ const type = description?.type;
1182
+ const format = description?.format;
1183
+ const classNames = ranges?.map(cellClassNameForRange).reverse();
1184
+ return {
1185
+ value: parseValue({
1186
+ type,
1187
+ format,
1188
+ value: rawValue
1189
+ }),
1190
+ className: mx2(cellClassesForFieldType({
1191
+ type,
1192
+ format
1193
+ }), threadRefs && commentedClassName, classNames),
1194
+ dataRefs: threadRefs
1195
+ };
1196
+ };
1197
+ var gridCellGetter = (model) => {
1198
+ const cachedGridCells = {};
1199
+ return (nextBounds) => {
1200
+ [
1201
+ ...Array(nextBounds.end.col - nextBounds.start.col)
1202
+ ].forEach((_, c0) => {
1203
+ return [
1204
+ ...Array(nextBounds.end.row - nextBounds.start.row)
1205
+ ].forEach((_2, r0) => {
1206
+ const col = nextBounds.start.col + c0;
1207
+ const row = nextBounds.start.row + r0;
1208
+ cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);
1209
+ });
1210
+ });
1211
+ return cachedGridCells;
1212
+ };
1213
+ };
1214
+ var rowLabelCell = (row) => ({
1215
+ value: rowToA1Notation(row),
1216
+ className: "text-end !pie-1",
1217
+ resizeHandle: "row"
1218
+ });
1219
+ var colLabelCell = (col) => ({
1220
+ value: colToA1Notation(col),
1221
+ resizeHandle: "col"
1222
+ });
1223
+ var cellGetter = (model) => {
1224
+ const getGridCells = gridCellGetter(model);
1225
+ return (nextBounds, plane) => {
1226
+ switch (plane) {
1227
+ case "grid":
1228
+ return getGridCells(nextBounds);
1229
+ case "frozenColsStart":
1230
+ return [
1231
+ ...Array(nextBounds.end.row - nextBounds.start.row)
1232
+ ].reduce((acc, _, r0) => {
1233
+ const r = nextBounds.start.row + r0;
1234
+ acc[`0,${r}`] = rowLabelCell(r);
1235
+ return acc;
1236
+ }, {});
1237
+ case "frozenRowsStart":
1238
+ return [
1239
+ ...Array(nextBounds.end.col - nextBounds.start.col)
1240
+ ].reduce((acc, _, c0) => {
1241
+ const c = nextBounds.start.col + c0;
1242
+ acc[`${c},0`] = colLabelCell(c);
1243
+ return acc;
1244
+ }, {});
1245
+ default:
1246
+ return {};
1247
+ }
1248
+ };
1249
+ };
1250
+ var useSheetModelDxGridProps = (dxGrid, model) => {
1251
+ const [columns, setColumns] = useState3(createDxGridColumns(model));
1252
+ const [rows, setRows] = useState3(createDxGridColumns(model));
1253
+ useEffect3(() => {
1254
+ const cellsAccessor = createDocAccessor(model.sheet, [
1255
+ "cells"
1256
+ ]);
1257
+ if (dxGrid) {
1258
+ dxGrid.getCells = cellGetter(model);
1259
+ }
1260
+ const handleCellsUpdate = () => {
1261
+ dxGrid?.requestUpdate("initialCells");
1262
+ };
1263
+ cellsAccessor.handle.addListener("change", handleCellsUpdate);
1264
+ const unsubscribe = model.graph.update.on(handleCellsUpdate);
1265
+ return () => {
1266
+ cellsAccessor.handle.removeListener("change", handleCellsUpdate);
1267
+ unsubscribe();
1268
+ };
1269
+ }, [
1270
+ model,
1271
+ dxGrid
1272
+ ]);
1273
+ useEffect3(() => {
1274
+ const columnMetaAccessor = createDocAccessor(model.sheet, [
1275
+ "columnMeta"
1276
+ ]);
1277
+ const rowMetaAccessor = createDocAccessor(model.sheet, [
1278
+ "rowMeta"
1279
+ ]);
1280
+ const handleColumnMetaUpdate = () => {
1281
+ setColumns(createDxGridColumns(model));
1282
+ };
1283
+ const handleRowMetaUpdate = () => {
1284
+ setRows(createDxGridRows(model));
1285
+ };
1286
+ columnMetaAccessor.handle.addListener("change", handleColumnMetaUpdate);
1287
+ rowMetaAccessor.handle.addListener("change", handleRowMetaUpdate);
1288
+ return () => {
1289
+ columnMetaAccessor.handle.removeListener("change", handleColumnMetaUpdate);
1290
+ rowMetaAccessor.handle.removeListener("change", handleRowMetaUpdate);
1291
+ };
1292
+ }, [
1293
+ model,
1294
+ dxGrid
1295
+ ]);
1296
+ return {
1297
+ columns,
1298
+ rows
1299
+ };
1300
+ };
1301
+
1302
+ // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
1303
+ var inertPosition = {
1304
+ plane: "grid",
1305
+ col: 0,
1306
+ row: 0
1307
+ };
1308
+ var initialCells = {
1309
+ grid: {},
1310
+ frozenColsStart: [
1311
+ ...Array(64)
1312
+ ].reduce((acc, _, i) => {
1313
+ acc[`0,${i}`] = rowLabelCell(i);
1314
+ return acc;
1315
+ }, {}),
1316
+ frozenRowsStart: [
1317
+ ...Array(12)
1318
+ ].reduce((acc, _, i) => {
1319
+ acc[`${i},0`] = colLabelCell(i);
1320
+ return acc;
1321
+ }, {})
1322
+ };
1323
+ var frozen = {
1324
+ frozenColsStart: 1,
1325
+ frozenRowsStart: 1
1326
+ };
1327
+ var sheetRowDefault = {
1328
+ frozenRowsStart: {
1329
+ size: 32,
1330
+ readonly: true
1331
+ },
1332
+ grid: {
1333
+ size: 32,
1334
+ resizeable: true
1335
+ }
1336
+ };
1337
+ var sheetColDefault = {
1338
+ frozenColsStart: {
1339
+ size: 48,
1340
+ readonly: true
1341
+ },
1342
+ grid: {
1343
+ size: 180,
1344
+ resizeable: true
1345
+ }
1346
+ };
1347
+ var GridSheet = () => {
1348
+ const { t } = useTranslation2(SHEET_PLUGIN);
1349
+ const { id, model, editing, setEditing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs } = useSheetContext();
1350
+ const [dxGrid, setDxGrid] = useState4(null);
1351
+ const [extraplanarFocus, setExtraplanarFocus] = useState4(null);
1352
+ const dispatch = useIntentDispatcher2();
1353
+ const rangeController = useRef();
1354
+ const { hasAttention } = useAttention(id);
1355
+ const handleFocus = useCallback4((event) => {
1356
+ if (!editing) {
1357
+ const cell = closestCell(event.target);
1358
+ if (cell) {
1359
+ if (cell.plane === "grid") {
1360
+ setCursor({
1361
+ col: cell.col,
1362
+ row: cell.row
1363
+ });
1364
+ setExtraplanarFocus(null);
1365
+ } else {
1366
+ setExtraplanarFocus(cell);
1367
+ }
1368
+ } else {
1369
+ setExtraplanarFocus(null);
1370
+ }
1371
+ }
1372
+ }, [
1373
+ editing
1374
+ ]);
1375
+ const handleClose = useCallback4((value, { key, shift }) => {
1376
+ if (value !== void 0) {
1377
+ model.setValue(dxGridCellIndexToSheetCellAddress(editing.index), value);
1378
+ }
1379
+ setEditing(null);
1380
+ const axis = [
1381
+ "Enter",
1382
+ "ArrowUp",
1383
+ "ArrowDown"
1384
+ ].includes(key) ? "row" : [
1385
+ "Tab",
1386
+ "ArrowLeft",
1387
+ "ArrowRight"
1388
+ ].includes(key) ? "col" : void 0;
1389
+ const delta = key.startsWith("Arrow") ? [
1390
+ "ArrowUp",
1391
+ "ArrowLeft"
1392
+ ].includes(key) ? -1 : 1 : shift ? -1 : 1;
1393
+ dxGrid?.refocus(axis, delta);
1394
+ }, [
1395
+ model,
1396
+ editing,
1397
+ dxGrid
1398
+ ]);
1399
+ const handleBlur = useCallback4((value) => {
1400
+ if (value !== void 0) {
1401
+ model.setValue(dxGridCellIndexToSheetCellAddress(editing.index), value);
1402
+ }
1403
+ setEditing(null);
1404
+ }, [
1405
+ model,
1406
+ editing
1407
+ ]);
1408
+ const handleAxisResize = useCallback4(({ axis, size, index: numericIndex }) => {
1409
+ if (axis === "row") {
1410
+ const rowId = model.sheet.rows[parseInt(numericIndex)];
1411
+ model.sheet.rowMeta[rowId] ??= {};
1412
+ model.sheet.rowMeta[rowId].size = size;
1413
+ } else {
1414
+ const columnId = model.sheet.columns[parseInt(numericIndex)];
1415
+ model.sheet.columnMeta[columnId] ??= {};
1416
+ model.sheet.columnMeta[columnId].size = size;
1417
+ }
1418
+ }, [
1419
+ model
1420
+ ]);
1421
+ const handleSelect = useCallback4(({ minCol, maxCol, minRow, maxRow }) => {
1422
+ const range = {
1423
+ from: {
1424
+ col: minCol,
1425
+ row: minRow
1426
+ }
1427
+ };
1428
+ if (minCol !== maxCol || minRow !== maxRow) {
1429
+ range.to = {
1430
+ col: maxCol,
1431
+ row: maxRow
1432
+ };
1433
+ }
1434
+ if (editing) {
1435
+ rangeController.current?.setRange(rangeToA1Notation(range));
1436
+ } else {
1437
+ setRange(range.to ? range : void 0);
1438
+ }
1439
+ }, [
1440
+ editing
1441
+ ]);
1442
+ const handleWheel = useCallback4((event) => {
1443
+ if (!hasAttention) {
1444
+ event.stopPropagation();
1445
+ }
1446
+ }, [
1447
+ hasAttention
1448
+ ]);
1449
+ const selectEntireAxis = useCallback4((pos) => {
1450
+ switch (pos.plane) {
1451
+ case "frozenRowsStart":
1452
+ return dxGrid?.setSelection({
1453
+ start: {
1454
+ col: pos.col,
1455
+ row: 0,
1456
+ plane: "grid"
1457
+ },
1458
+ end: {
1459
+ col: pos.col,
1460
+ row: model.sheet.rows.length - 1,
1461
+ plane: "grid"
1462
+ }
1463
+ });
1464
+ case "frozenColsStart":
1465
+ return dxGrid?.setSelection({
1466
+ start: {
1467
+ row: pos.row,
1468
+ col: 0,
1469
+ plane: "grid"
1470
+ },
1471
+ end: {
1472
+ row: pos.row,
1473
+ col: model.sheet.columns.length - 1,
1474
+ plane: "grid"
1475
+ }
1476
+ });
1477
+ }
1478
+ }, [
1479
+ dxGrid,
1480
+ model.sheet
1481
+ ]);
1482
+ const handleClick = useCallback4((event) => {
1483
+ const cell = closestCell(event.target);
1484
+ if (cell) {
1485
+ selectEntireAxis(cell);
1486
+ }
1487
+ }, [
1488
+ selectEntireAxis
1489
+ ]);
1490
+ const handleKeyDown = useCallback4((event) => {
1491
+ switch (event.key) {
1492
+ case "Backspace":
1493
+ case "Delete":
1494
+ event.preventDefault();
1495
+ return cursorFallbackRange && model.clear(cursorFallbackRange);
1496
+ case "Enter":
1497
+ case "Space":
1498
+ if (dxGrid && extraplanarFocus) {
1499
+ switch (extraplanarFocus.plane) {
1500
+ case "frozenRowsStart":
1501
+ case "frozenColsStart":
1502
+ event.preventDefault();
1503
+ return selectEntireAxis(extraplanarFocus);
1504
+ }
1505
+ }
1506
+ }
1507
+ if (event.metaKey || event.ctrlKey) {
1508
+ switch (event.key) {
1509
+ case "x":
1510
+ case "X":
1511
+ event.preventDefault();
1512
+ return cursorFallbackRange && model.cut(cursorFallbackRange);
1513
+ case "c":
1514
+ case "C":
1515
+ event.preventDefault();
1516
+ return cursorFallbackRange && model.copy(cursorFallbackRange);
1517
+ case "v":
1518
+ case "V":
1519
+ event.preventDefault();
1520
+ return cursor && model.paste(cursor);
1521
+ case "z":
1522
+ event.preventDefault();
1523
+ return event.shiftKey ? model.redo() : model.undo();
1524
+ case "Z":
1525
+ case "y":
1526
+ event.preventDefault();
1527
+ return model.redo();
1528
+ }
1529
+ }
1530
+ }, [
1531
+ cursorFallbackRange,
1532
+ model,
1533
+ cursor,
1534
+ extraplanarFocus,
1535
+ selectEntireAxis
1536
+ ]);
1537
+ const contextMenuAnchorRef = useRef(null);
1538
+ const [contextMenuOpen, setContextMenuOpen] = useState4(null);
1539
+ const contextMenuAxis = contextMenuOpen?.plane.startsWith("frozenRows") ? "col" : "row";
1540
+ const handleContextMenu = useCallback4((event) => {
1541
+ const cell = closestCell(event.target);
1542
+ if (cell && cell.plane.startsWith("frozen")) {
1543
+ event.preventDefault();
1544
+ contextMenuAnchorRef.current = event.target;
1545
+ setContextMenuOpen(cell);
1546
+ }
1547
+ }, []);
1548
+ const handleAxisMenuAction = useCallback4((operation) => {
1549
+ switch (operation) {
1550
+ case "insert-before":
1551
+ case "insert-after":
1552
+ return dispatch({
1553
+ action: SheetAction.INSERT_AXIS,
1554
+ data: {
1555
+ model,
1556
+ axis: contextMenuAxis,
1557
+ index: contextMenuOpen[contextMenuAxis] + (operation === "insert-before" ? 0 : 1)
1558
+ }
1559
+ });
1560
+ break;
1561
+ case "drop":
1562
+ return dispatch({
1563
+ action: SheetAction.DROP_AXIS,
1564
+ data: {
1565
+ model,
1566
+ axis: contextMenuAxis,
1567
+ axisIndex: model.sheet[contextMenuAxis === "row" ? "rows" : "columns"][contextMenuOpen[contextMenuAxis]]
1568
+ }
1569
+ });
1570
+ }
1571
+ }, [
1572
+ contextMenuAxis,
1573
+ contextMenuOpen,
1574
+ model,
1575
+ dispatch
1576
+ ]);
1577
+ const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
1578
+ const extension = useMemo2(() => [
1579
+ editorKeys({
1580
+ onClose: handleClose,
1581
+ ...editing?.initialContent && {
1582
+ onNav: handleClose
1583
+ }
1584
+ }),
1585
+ sheetExtension({
1586
+ functions: model.graph.getFunctions()
1587
+ }),
1588
+ rangeExtension({
1589
+ onInit: (fn) => rangeController.current = fn,
1590
+ onStateChange: (state) => {
1591
+ if (dxGrid) {
1592
+ dxGrid.mode = typeof state.activeRange === "undefined" ? "edit" : "edit-select";
1593
+ }
1594
+ }
1595
+ })
1596
+ ], [
1597
+ model,
1598
+ handleClose,
1599
+ editing
1600
+ ]);
1601
+ const getCellContent = useCallback4((index) => {
1602
+ const cell = dxGridCellIndexToSheetCellAddress(index);
1603
+ return model.getCellText(cell);
1604
+ }, [
1605
+ model
1606
+ ]);
1607
+ useUpdateFocusedCellOnThreadSelection(dxGrid);
1608
+ useSelectThreadOnCellFocus();
1609
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(GridCellEditor, {
1610
+ getCellContent,
1611
+ extension,
1612
+ onBlur: handleBlur
1613
+ }), /* @__PURE__ */ React4.createElement(Grid2.Content, {
1614
+ initialCells,
1615
+ limitColumns: DEFAULT_COLUMNS,
1616
+ limitRows: DEFAULT_ROWS,
1617
+ columns,
1618
+ rows,
1619
+ onAxisResize: handleAxisResize,
1620
+ onSelect: handleSelect,
1621
+ rowDefault: sheetRowDefault,
1622
+ columnDefault: sheetColDefault,
1623
+ frozen,
1624
+ onFocus: handleFocus,
1625
+ onWheelCapture: handleWheel,
1626
+ onKeyDown: handleKeyDown,
1627
+ onContextMenu: handleContextMenu,
1628
+ onClick: handleClick,
1629
+ overscroll: "inline",
1630
+ className: "[--dx-grid-base:var(--surface-bg)]",
1631
+ activeRefs,
1632
+ ref: setDxGrid
1633
+ }), /* @__PURE__ */ React4.createElement(DropdownMenu.Root, {
1634
+ modal: false,
1635
+ open: !!contextMenuOpen,
1636
+ onOpenChange: (nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)
1637
+ }, /* @__PURE__ */ React4.createElement(DropdownMenu.VirtualTrigger, {
1638
+ virtualRef: contextMenuAnchorRef
1639
+ }), /* @__PURE__ */ React4.createElement(DropdownMenu.Content, {
1640
+ side: contextMenuAxis === "col" ? "bottom" : "right",
1641
+ sideOffset: 4,
1642
+ collisionPadding: 8
1643
+ }, /* @__PURE__ */ React4.createElement(DropdownMenu.Viewport, null, /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1644
+ onClick: () => handleAxisMenuAction("insert-before")
1645
+ }, /* @__PURE__ */ React4.createElement(Icon, {
1646
+ size: 5,
1647
+ icon: contextMenuAxis === "col" ? "ph--columns-plus-left--regular" : "ph--rows-plus-top--regular"
1648
+ }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} before label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1649
+ onClick: () => handleAxisMenuAction("insert-after")
1650
+ }, /* @__PURE__ */ React4.createElement(Icon, {
1651
+ size: 5,
1652
+ icon: contextMenuAxis === "col" ? "ph--columns-plus-right--regular" : "ph--rows-plus-bottom--regular"
1653
+ }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} after label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
1654
+ onClick: () => handleAxisMenuAction("drop")
1655
+ }, /* @__PURE__ */ React4.createElement(Icon, {
1656
+ size: 5,
1657
+ icon: "ph--backspace--regular"
1658
+ }), /* @__PURE__ */ React4.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ React4.createElement(DropdownMenu.Arrow, null))));
1659
+ };
1660
+
1661
+ export {
1662
+ ComputeGraphContextProvider,
1663
+ useComputeGraph,
1664
+ completeCellRangeToThreadCursor,
1665
+ computeGraphFacet,
1666
+ useSheetContext,
1667
+ SheetProvider,
1668
+ GridSheet,
1669
+ RangeList,
1670
+ SheetContainer
1671
+ };
1672
+ //# sourceMappingURL=chunk-V5N3Y2O5.mjs.map