@dxos/plugin-sheet 0.7.4 → 0.7.5-labs.5f04cf6

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 (320) hide show
  1. package/dist/lib/browser/SheetContainer-CM4CO3DC.mjs +370 -0
  2. package/dist/lib/browser/SheetContainer-CM4CO3DC.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-FOO6NGBM.mjs +229 -0
  4. package/dist/lib/browser/chunk-FOO6NGBM.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-H23JW3DX.mjs +800 -0
  6. package/dist/lib/browser/chunk-H23JW3DX.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-RABELMEQ.mjs → chunk-K6EUYKWT.mjs} +3 -3
  8. package/dist/lib/browser/chunk-K6EUYKWT.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-PW25VUP6.mjs +15 -0
  10. package/dist/lib/browser/chunk-PW25VUP6.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-T3IVPMRX.mjs +900 -0
  12. package/dist/lib/browser/chunk-T3IVPMRX.mjs.map +7 -0
  13. package/dist/lib/browser/compute-graph-registry-XH6B2SWG.mjs +27 -0
  14. package/dist/lib/browser/compute-graph-registry-XH6B2SWG.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +86 -324
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/intent-resolver-Q7DTHAM5.mjs +47 -0
  18. package/dist/lib/browser/intent-resolver-Q7DTHAM5.mjs.map +7 -0
  19. package/dist/lib/browser/markdown-IKG5FNCA.mjs +26 -0
  20. package/dist/lib/browser/markdown-IKG5FNCA.mjs.map +7 -0
  21. package/dist/lib/browser/meta.json +1 -1
  22. package/dist/lib/browser/react-context-JG43577H.mjs +28 -0
  23. package/dist/lib/browser/react-context-JG43577H.mjs.map +7 -0
  24. package/dist/lib/browser/react-surface-URRC3AFC.mjs +43 -0
  25. package/dist/lib/browser/react-surface-URRC3AFC.mjs.map +7 -0
  26. package/dist/lib/browser/thread-YX6KBQNQ.mjs +17 -0
  27. package/dist/lib/browser/thread-YX6KBQNQ.mjs.map +7 -0
  28. package/dist/lib/browser/types/index.mjs +62 -0
  29. package/dist/lib/node/SheetContainer-TJ3JQLWM.cjs +364 -0
  30. package/dist/lib/node/SheetContainer-TJ3JQLWM.cjs.map +7 -0
  31. package/dist/lib/node/chunk-E3RXOEL6.cjs +935 -0
  32. package/dist/lib/node/chunk-E3RXOEL6.cjs.map +7 -0
  33. package/dist/lib/node/{types.cjs → chunk-FU5K66DS.cjs} +12 -16
  34. package/dist/lib/node/chunk-FU5K66DS.cjs.map +7 -0
  35. package/dist/lib/node/{chunk-2ZVZI2KJ.cjs → chunk-NLDXUFDG.cjs} +7 -7
  36. package/dist/lib/node/chunk-NLDXUFDG.cjs.map +7 -0
  37. package/dist/lib/node/chunk-P4KSGZSS.cjs +251 -0
  38. package/dist/lib/node/chunk-P4KSGZSS.cjs.map +7 -0
  39. package/dist/lib/node/chunk-ZPWW4LPY.cjs +807 -0
  40. package/dist/lib/node/chunk-ZPWW4LPY.cjs.map +7 -0
  41. package/dist/lib/node/compute-graph-registry-ORGTIE5M.cjs +53 -0
  42. package/dist/lib/node/compute-graph-registry-ORGTIE5M.cjs.map +7 -0
  43. package/dist/lib/node/index.cjs +87 -318
  44. package/dist/lib/node/index.cjs.map +4 -4
  45. package/dist/lib/node/intent-resolver-ZUDJJUFG.cjs +60 -0
  46. package/dist/lib/node/intent-resolver-ZUDJJUFG.cjs.map +7 -0
  47. package/dist/lib/node/markdown-EUUL3Q36.cjs +40 -0
  48. package/dist/lib/node/markdown-EUUL3Q36.cjs.map +7 -0
  49. package/dist/lib/node/meta.json +1 -1
  50. package/dist/lib/node/react-context-OOH5QFE2.cjs +50 -0
  51. package/dist/lib/node/react-context-OOH5QFE2.cjs.map +7 -0
  52. package/dist/lib/node/react-surface-IQN5JKSS.cjs +64 -0
  53. package/dist/lib/node/react-surface-IQN5JKSS.cjs.map +7 -0
  54. package/dist/lib/node/{meta.cjs → thread-VBPS23P2.cjs} +12 -10
  55. package/dist/lib/node/thread-VBPS23P2.cjs.map +7 -0
  56. package/dist/lib/node/types/index.cjs +84 -0
  57. package/dist/lib/node/types/index.cjs.map +7 -0
  58. package/dist/lib/node-esm/SheetContainer-QEEFORIC.mjs +371 -0
  59. package/dist/lib/node-esm/SheetContainer-QEEFORIC.mjs.map +7 -0
  60. package/dist/lib/node-esm/{chunk-BM2Q3FFC.mjs → chunk-FMOVRTS4.mjs} +3 -3
  61. package/dist/lib/node-esm/chunk-FMOVRTS4.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-KCXK5UM6.mjs +16 -0
  63. package/dist/lib/node-esm/chunk-KCXK5UM6.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-NSVUOAI6.mjs +901 -0
  65. package/dist/lib/node-esm/chunk-NSVUOAI6.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-OXD6RBFF.mjs +801 -0
  67. package/dist/lib/node-esm/chunk-OXD6RBFF.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-PTOI45NK.mjs +231 -0
  69. package/dist/lib/node-esm/chunk-PTOI45NK.mjs.map +7 -0
  70. package/dist/lib/node-esm/compute-graph-registry-JH2FRHLD.mjs +28 -0
  71. package/dist/lib/node-esm/compute-graph-registry-JH2FRHLD.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +86 -324
  73. package/dist/lib/node-esm/index.mjs.map +4 -4
  74. package/dist/lib/node-esm/intent-resolver-IF64RN7B.mjs +48 -0
  75. package/dist/lib/node-esm/intent-resolver-IF64RN7B.mjs.map +7 -0
  76. package/dist/lib/node-esm/markdown-D2ZMN7LR.mjs +27 -0
  77. package/dist/lib/node-esm/markdown-D2ZMN7LR.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/react-context-CJVSLO74.mjs +29 -0
  80. package/dist/lib/node-esm/react-context-CJVSLO74.mjs.map +7 -0
  81. package/dist/lib/node-esm/react-surface-XJIX5G3I.mjs +44 -0
  82. package/dist/lib/node-esm/react-surface-XJIX5G3I.mjs.map +7 -0
  83. package/dist/lib/node-esm/thread-HSJD3SR6.mjs +18 -0
  84. package/dist/lib/node-esm/thread-HSJD3SR6.mjs.map +7 -0
  85. package/dist/lib/node-esm/types/index.mjs +63 -0
  86. package/dist/types/src/SheetPlugin.d.ts +1 -3
  87. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/capabilities.d.ts +5 -0
  89. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/compute-graph-registry.d.ts +4 -0
  91. package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/index.d.ts +17 -0
  93. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  95. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/markdown.d.ts +6 -0
  97. package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/react-context.d.ts +8 -0
  99. package/dist/types/src/capabilities/react-context.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  101. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/thread.d.ts +6 -0
  103. package/dist/types/src/capabilities/thread.d.ts.map +1 -0
  104. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +1 -1
  105. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -1
  106. package/dist/types/src/components/ComputeGraph/compute-graph.stories.d.ts.map +1 -0
  107. package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +1 -1
  108. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  109. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  112. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
  113. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  114. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/SheetContext/SheetContext.d.ts +1 -2
  116. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -1
  117. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +7 -0
  118. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -0
  119. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +6 -0
  120. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -0
  121. package/dist/types/src/components/SheetToolbar/align.d.ts +28 -0
  122. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -0
  123. package/dist/types/src/components/SheetToolbar/comment.d.ts +23 -0
  124. package/dist/types/src/components/SheetToolbar/comment.d.ts.map +1 -0
  125. package/dist/types/src/components/SheetToolbar/index.d.ts +2 -0
  126. package/dist/types/src/components/SheetToolbar/index.d.ts.map +1 -0
  127. package/dist/types/src/components/SheetToolbar/style.d.ts +26 -0
  128. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -0
  129. package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts +8 -0
  130. package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts.map +1 -0
  131. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +6 -0
  132. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -0
  133. package/dist/types/src/components/index.d.ts +0 -1
  134. package/dist/types/src/components/index.d.ts.map +1 -1
  135. package/dist/types/src/extensions/compute.d.ts +1 -1
  136. package/dist/types/src/extensions/compute.d.ts.map +1 -1
  137. package/dist/types/src/extensions/editor/extension.d.ts +1 -1
  138. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -1
  139. package/dist/types/src/index.d.ts +2 -3
  140. package/dist/types/src/index.d.ts.map +1 -1
  141. package/dist/types/src/integrations/thread-ranges.d.ts +1 -1
  142. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  143. package/dist/types/src/meta.d.ts +1 -2
  144. package/dist/types/src/meta.d.ts.map +1 -1
  145. package/dist/types/src/model/sheet-model.d.ts +6 -8
  146. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  147. package/dist/types/src/model/testing.d.ts +1 -1
  148. package/dist/types/src/model/testing.d.ts.map +1 -1
  149. package/dist/types/src/model/useSheetModel.d.ts +1 -1
  150. package/dist/types/src/model/useSheetModel.d.ts.map +1 -1
  151. package/dist/types/src/testing/testing.d.ts +1 -1
  152. package/dist/types/src/testing/testing.d.ts.map +1 -1
  153. package/dist/types/src/{defs → types}/index.d.ts +1 -0
  154. package/dist/types/src/types/index.d.ts.map +1 -0
  155. package/dist/types/src/types/schema.d.ts +105 -0
  156. package/dist/types/src/types/schema.d.ts.map +1 -0
  157. package/dist/types/src/{defs → types}/sheet-range-types.d.ts +1 -1
  158. package/dist/types/src/types/sheet-range-types.d.ts.map +1 -0
  159. package/dist/types/src/types/types.d.ts +71 -0
  160. package/dist/types/src/types/types.d.ts.map +1 -0
  161. package/dist/types/src/{defs → types}/util.d.ts +5 -1
  162. package/dist/types/src/types/util.d.ts.map +1 -0
  163. package/dist/types/tsconfig.tsbuildinfo +1 -0
  164. package/package.json +47 -61
  165. package/src/SheetPlugin.tsx +70 -176
  166. package/src/capabilities/capabilities.ts +14 -0
  167. package/src/capabilities/compute-graph-registry.ts +25 -0
  168. package/src/capabilities/index.ts +14 -0
  169. package/src/capabilities/intent-resolver.ts +29 -0
  170. package/src/capabilities/markdown.ts +22 -0
  171. package/src/capabilities/react-context.tsx +20 -0
  172. package/src/capabilities/react-surface.tsx +30 -0
  173. package/src/capabilities/thread.ts +14 -0
  174. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +1 -2
  175. package/src/{compute-graph → components/ComputeGraph}/compute-graph.stories.tsx +6 -7
  176. package/src/components/FunctionEditor/FunctionEditor.tsx +2 -1
  177. package/src/components/GridSheet/GridSheet.stories.tsx +2 -0
  178. package/src/components/GridSheet/GridSheet.tsx +15 -18
  179. package/src/components/GridSheet/SheetCellEditor.stories.tsx +6 -7
  180. package/src/components/GridSheet/util.ts +3 -2
  181. package/src/components/RangeList/RangeList.tsx +2 -1
  182. package/src/components/SheetContainer/SheetContainer.stories.tsx +25 -23
  183. package/src/components/SheetContainer/SheetContainer.tsx +3 -8
  184. package/src/components/SheetContext/SheetContext.tsx +1 -2
  185. package/src/components/{Toolbar/Toolbar.stories.tsx → SheetToolbar/SheetToolbar.stories.tsx} +4 -8
  186. package/src/components/SheetToolbar/SheetToolbar.tsx +48 -0
  187. package/src/components/SheetToolbar/align.ts +68 -0
  188. package/src/components/SheetToolbar/comment.ts +56 -0
  189. package/src/components/{Toolbar → SheetToolbar}/index.ts +1 -1
  190. package/src/components/SheetToolbar/style.ts +72 -0
  191. package/src/components/SheetToolbar/useToolbarAction.ts +87 -0
  192. package/src/components/SheetToolbar/useToolbarState.ts +17 -0
  193. package/src/components/index.ts +0 -1
  194. package/src/extensions/compute.ts +7 -4
  195. package/src/extensions/editor/extension.test.ts +2 -1
  196. package/src/extensions/editor/extension.ts +2 -3
  197. package/src/index.ts +2 -7
  198. package/src/integrations/thread-ranges.ts +28 -24
  199. package/src/meta.ts +1 -1
  200. package/src/model/sheet-model.test.ts +4 -10
  201. package/src/model/sheet-model.ts +30 -22
  202. package/src/model/testing.ts +3 -2
  203. package/src/model/useSheetModel.ts +2 -1
  204. package/src/sanity.test.ts +1 -1
  205. package/src/testing/testing.tsx +2 -3
  206. package/src/{defs → types}/index.ts +1 -0
  207. package/src/types/schema.ts +56 -0
  208. package/src/{defs → types}/sheet-range-types.ts +1 -1
  209. package/src/types/types.ts +67 -0
  210. package/src/{defs → types}/util.ts +13 -13
  211. package/dist/lib/browser/SheetContainer-KCLT6PEO.mjs +0 -296
  212. package/dist/lib/browser/SheetContainer-KCLT6PEO.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-E5WQ7U7G.mjs +0 -1675
  214. package/dist/lib/browser/chunk-E5WQ7U7G.mjs.map +0 -7
  215. package/dist/lib/browser/chunk-F3HE6D3J.mjs +0 -3269
  216. package/dist/lib/browser/chunk-F3HE6D3J.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-JXFPOYNA.mjs +0 -67
  218. package/dist/lib/browser/chunk-JXFPOYNA.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-RABELMEQ.mjs.map +0 -7
  220. package/dist/lib/browser/compute-graph-SNUS7HOH.mjs +0 -35
  221. package/dist/lib/browser/meta.mjs +0 -9
  222. package/dist/lib/browser/types.mjs +0 -16
  223. package/dist/lib/browser/types.mjs.map +0 -7
  224. package/dist/lib/node/SheetContainer-VVVRYTQG.cjs +0 -298
  225. package/dist/lib/node/SheetContainer-VVVRYTQG.cjs.map +0 -7
  226. package/dist/lib/node/chunk-2ZVZI2KJ.cjs.map +0 -7
  227. package/dist/lib/node/chunk-45YW2DX2.cjs +0 -1656
  228. package/dist/lib/node/chunk-45YW2DX2.cjs.map +0 -7
  229. package/dist/lib/node/chunk-KSEEI5VC.cjs +0 -3323
  230. package/dist/lib/node/chunk-KSEEI5VC.cjs.map +0 -7
  231. package/dist/lib/node/chunk-OWH2EUHZ.cjs +0 -90
  232. package/dist/lib/node/chunk-OWH2EUHZ.cjs.map +0 -7
  233. package/dist/lib/node/compute-graph-WILPHO4A.cjs +0 -57
  234. package/dist/lib/node/compute-graph-WILPHO4A.cjs.map +0 -7
  235. package/dist/lib/node/meta.cjs.map +0 -7
  236. package/dist/lib/node/types.cjs.map +0 -7
  237. package/dist/lib/node-esm/SheetContainer-LSBE6Q4X.mjs +0 -297
  238. package/dist/lib/node-esm/SheetContainer-LSBE6Q4X.mjs.map +0 -7
  239. package/dist/lib/node-esm/chunk-6JF2AHKO.mjs +0 -3270
  240. package/dist/lib/node-esm/chunk-6JF2AHKO.mjs.map +0 -7
  241. package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-BVS2IQRO.mjs +0 -68
  243. package/dist/lib/node-esm/chunk-BVS2IQRO.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-NYDNXI7L.mjs +0 -1676
  245. package/dist/lib/node-esm/chunk-NYDNXI7L.mjs.map +0 -7
  246. package/dist/lib/node-esm/compute-graph-S6CVN7RS.mjs +0 -36
  247. package/dist/lib/node-esm/compute-graph-S6CVN7RS.mjs.map +0 -7
  248. package/dist/lib/node-esm/meta.mjs +0 -10
  249. package/dist/lib/node-esm/meta.mjs.map +0 -7
  250. package/dist/lib/node-esm/types.mjs +0 -17
  251. package/dist/lib/node-esm/types.mjs.map +0 -7
  252. package/dist/types/src/components/SheetObjectSettings.d.ts +0 -7
  253. package/dist/types/src/components/SheetObjectSettings.d.ts.map +0 -1
  254. package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -48
  255. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
  256. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +0 -7
  257. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +0 -1
  258. package/dist/types/src/components/Toolbar/index.d.ts +0 -2
  259. package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
  260. package/dist/types/src/compute-graph/compute-graph-registry.d.ts +0 -34
  261. package/dist/types/src/compute-graph/compute-graph-registry.d.ts.map +0 -1
  262. package/dist/types/src/compute-graph/compute-graph.d.ts +0 -64
  263. package/dist/types/src/compute-graph/compute-graph.d.ts.map +0 -1
  264. package/dist/types/src/compute-graph/compute-graph.stories.d.ts.map +0 -1
  265. package/dist/types/src/compute-graph/compute-graph.test.d.ts +0 -2
  266. package/dist/types/src/compute-graph/compute-graph.test.d.ts.map +0 -1
  267. package/dist/types/src/compute-graph/compute-node.d.ts +0 -26
  268. package/dist/types/src/compute-graph/compute-node.d.ts.map +0 -1
  269. package/dist/types/src/compute-graph/functions/async-function.d.ts +0 -66
  270. package/dist/types/src/compute-graph/functions/async-function.d.ts.map +0 -1
  271. package/dist/types/src/compute-graph/functions/edge-function.d.ts +0 -21
  272. package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +0 -1
  273. package/dist/types/src/compute-graph/functions/function-defs.d.ts +0 -11
  274. package/dist/types/src/compute-graph/functions/function-defs.d.ts.map +0 -1
  275. package/dist/types/src/compute-graph/functions/index.d.ts +0 -4
  276. package/dist/types/src/compute-graph/functions/index.d.ts.map +0 -1
  277. package/dist/types/src/compute-graph/hyperformula.test.d.ts +0 -2
  278. package/dist/types/src/compute-graph/hyperformula.test.d.ts.map +0 -1
  279. package/dist/types/src/compute-graph/index.d.ts +0 -5
  280. package/dist/types/src/compute-graph/index.d.ts.map +0 -1
  281. package/dist/types/src/compute-graph/testing/index.d.ts +0 -3
  282. package/dist/types/src/compute-graph/testing/index.d.ts.map +0 -1
  283. package/dist/types/src/compute-graph/testing/test-builder.d.ts +0 -15
  284. package/dist/types/src/compute-graph/testing/test-builder.d.ts.map +0 -1
  285. package/dist/types/src/compute-graph/testing/test-plugin.d.ts +0 -36
  286. package/dist/types/src/compute-graph/testing/test-plugin.d.ts.map +0 -1
  287. package/dist/types/src/compute-graph/util.d.ts +0 -2
  288. package/dist/types/src/compute-graph/util.d.ts.map +0 -1
  289. package/dist/types/src/defs/index.d.ts.map +0 -1
  290. package/dist/types/src/defs/sheet-range-types.d.ts.map +0 -1
  291. package/dist/types/src/defs/types.d.ts +0 -26
  292. package/dist/types/src/defs/types.d.ts.map +0 -1
  293. package/dist/types/src/defs/types.test.d.ts +0 -2
  294. package/dist/types/src/defs/types.test.d.ts.map +0 -1
  295. package/dist/types/src/defs/util.d.ts.map +0 -1
  296. package/dist/types/src/types.d.ts +0 -182
  297. package/dist/types/src/types.d.ts.map +0 -1
  298. package/dist/vendor/hyperformula.mjs +0 -37145
  299. package/src/components/SheetObjectSettings.tsx +0 -38
  300. package/src/components/Toolbar/Toolbar.tsx +0 -346
  301. package/src/compute-graph/compute-graph-registry.ts +0 -90
  302. package/src/compute-graph/compute-graph.test.ts +0 -87
  303. package/src/compute-graph/compute-graph.ts +0 -260
  304. package/src/compute-graph/compute-node.ts +0 -62
  305. package/src/compute-graph/functions/async-function.ts +0 -179
  306. package/src/compute-graph/functions/edge-function.ts +0 -102
  307. package/src/compute-graph/functions/function-defs.ts +0 -2427
  308. package/src/compute-graph/functions/index.ts +0 -7
  309. package/src/compute-graph/hyperformula.test.ts +0 -14
  310. package/src/compute-graph/index.ts +0 -8
  311. package/src/compute-graph/testing/index.ts +0 -6
  312. package/src/compute-graph/testing/test-builder.ts +0 -54
  313. package/src/compute-graph/testing/test-plugin.ts +0 -100
  314. package/src/compute-graph/util.ts +0 -8
  315. package/src/defs/types.test.ts +0 -91
  316. package/src/defs/types.ts +0 -88
  317. package/src/types.ts +0 -125
  318. /package/dist/lib/browser/{compute-graph-SNUS7HOH.mjs.map → types/index.mjs.map} +0 -0
  319. /package/dist/lib/{browser/meta.mjs.map → node-esm/types/index.mjs.map} +0 -0
  320. /package/dist/types/src/{compute-graph → components/ComputeGraph}/compute-graph.stories.d.ts +0 -0
@@ -1,1675 +0,0 @@
1
- import {
2
- DEFAULT_COLUMNS,
3
- DEFAULT_ROWS,
4
- MAX_COLUMNS,
5
- MAX_ROWS,
6
- RANGE_NOTATION,
7
- ReadonlyException,
8
- addressFromA1Notation,
9
- addressFromIndex,
10
- addressToA1Notation,
11
- addressToIndex,
12
- cellClassNameForRange,
13
- createSheetName,
14
- inRange,
15
- initialize,
16
- insertIndices,
17
- isFormula,
18
- mapFormulaIndicesToRefs,
19
- mapFormulaRefsToIndices,
20
- rangeFromIndex,
21
- rangeToA1Notation
22
- } from "./chunk-F3HE6D3J.mjs";
23
- import {
24
- Range,
25
- SheetAction
26
- } from "./chunk-JXFPOYNA.mjs";
27
- import {
28
- SHEET_PLUGIN
29
- } from "./chunk-RABELMEQ.mjs";
30
-
31
- // packages/plugins/plugin-sheet/src/components/ComputeGraph/ComputeGraphContextProvider.tsx
32
- import React, { createContext, useContext } from "react";
33
- import { raise } from "@dxos/debug";
34
- import { useAsyncState } from "@dxos/react-hooks";
35
- var ComputeGraphContext = /* @__PURE__ */ createContext(void 0);
36
- var ComputeGraphContextProvider = ({ registry, children }) => {
37
- return /* @__PURE__ */ React.createElement(ComputeGraphContext.Provider, {
38
- value: {
39
- registry
40
- }
41
- }, children);
42
- };
43
- var useComputeGraph = (space) => {
44
- const { registry } = useContext(ComputeGraphContext) ?? raise(new Error("Missing ComputeGraphContext"));
45
- const [graph] = useAsyncState(async () => {
46
- if (space) {
47
- const graph2 = registry.getOrCreateGraph(space);
48
- await graph2.open();
49
- return graph2;
50
- }
51
- }, [
52
- space,
53
- registry
54
- ]);
55
- return graph;
56
- };
57
-
58
- // packages/plugins/plugin-sheet/src/extensions/compute.ts
59
- import { syntaxTree } from "@codemirror/language";
60
- import { RangeSetBuilder, StateEffect, StateField } from "@codemirror/state";
61
- import { Decoration, EditorView, ViewPlugin, WidgetType } from "@codemirror/view";
62
- import { debounce } from "@dxos/async";
63
- import { invariant } from "@dxos/invariant";
64
- import { documentId, singleValueFacet } from "@dxos/react-ui-editor";
65
- var updateAllDecorations = StateEffect.define();
66
- var computeGraphFacet = singleValueFacet();
67
-
68
- // packages/plugins/plugin-sheet/src/extensions/editor/extension.ts
69
- import { acceptCompletion, autocompletion, completionStatus, startCompletion } from "@codemirror/autocomplete";
70
- import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
71
- import { ViewPlugin as ViewPlugin2, keymap } from "@codemirror/view";
72
- import { tags } from "@lezer/highlight";
73
- import { spreadsheet } from "codemirror-lang-spreadsheet";
74
- import { singleValueFacet as singleValueFacet2 } from "@dxos/react-ui-editor";
75
- import { mx } from "@dxos/react-ui-theme";
76
- var highlightStyles = HighlightStyle.define([
77
- // Function.
78
- {
79
- tag: tags.name,
80
- class: "text-accentText"
81
- },
82
- // Range.
83
- {
84
- tag: tags.tagName,
85
- class: "text-pinkText"
86
- },
87
- // Values.
88
- {
89
- tag: tags.number,
90
- class: "text-tealText"
91
- },
92
- {
93
- tag: tags.bool,
94
- class: "text-tealText"
95
- },
96
- {
97
- tag: tags.string,
98
- class: "text-tealText"
99
- },
100
- // Error.
101
- {
102
- tag: tags.invalid,
103
- class: "text-unAccent"
104
- }
105
- ]);
106
- var languageFacet = singleValueFacet2();
107
- var sheetExtension = ({ debug, functions = [] }) => {
108
- const { extension, language } = spreadsheet({
109
- idiom: "en-US",
110
- decimalSeparator: "."
111
- });
112
- const createCompletion = (name) => {
113
- const { section = "Custom", description, syntax } = functions.find((value) => value.name === name) ?? {};
114
- return {
115
- section,
116
- label: name,
117
- info: () => {
118
- if (!description && !syntax) {
119
- return null;
120
- }
121
- const root = document.createElement("div");
122
- root.className = "flex flex-col gap-2 text-sm";
123
- const title = document.createElement("h2");
124
- title.innerText = name;
125
- title.className = "text-lg font-mono text-accentText";
126
- root.appendChild(title);
127
- if (description) {
128
- const info = document.createElement("p");
129
- info.innerText = description;
130
- info.className = "text-subdued";
131
- root.appendChild(info);
132
- }
133
- if (syntax) {
134
- const detail = document.createElement("pre");
135
- detail.innerText = syntax;
136
- detail.className = "whitespace-pre-wrap text-greenText";
137
- root.appendChild(detail);
138
- }
139
- return root;
140
- },
141
- apply: (view, completion, from, to) => {
142
- const insertParens = to === view.state.doc.toString().length;
143
- view.dispatch(view.state.update({
144
- changes: {
145
- from,
146
- to,
147
- insert: completion.label + (insertParens ? "()" : "")
148
- },
149
- selection: {
150
- anchor: from + completion.label.length + 1
151
- }
152
- }));
153
- }
154
- };
155
- };
156
- return [
157
- extension,
158
- languageFacet.of(language),
159
- language.data.of({
160
- autocomplete: (context) => {
161
- if (context.state.doc.toString()[0] !== "=") {
162
- return null;
163
- }
164
- const match = context.matchBefore(/\w*/);
165
- if (!match || match.from === match.to) {
166
- return null;
167
- }
168
- const text = match.text.toUpperCase();
169
- if (!context.explicit && match.text.length < 2) {
170
- return null;
171
- }
172
- return {
173
- from: match.from,
174
- options: functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? []
175
- };
176
- }
177
- }),
178
- syntaxHighlighting(highlightStyles),
179
- autocompletion({
180
- aboveCursor: false,
181
- defaultKeymap: true,
182
- activateOnTyping: true,
183
- closeOnBlur: !debug,
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: 115,
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: 141,
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: 144,
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(mapFormulaIndicesToRefs(this._sheet, 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: 247,
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: 258,
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: 267,
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: 272,
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: 287,
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: 295,
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(mapFormulaIndicesToRefs(this._sheet, 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: 338,
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: 343,
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: 354,
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: 364,
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(mapFormulaRefsToIndices(this._sheet, 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
- * Map from indices to A1 notation.
794
- */
795
- mapFormulaIndicesToRefs(formula) {
796
- invariant2(isFormula(formula), void 0, {
797
- F: __dxlog_file,
798
- L: 449,
799
- S: this,
800
- A: [
801
- "isFormula(formula)",
802
- ""
803
- ]
804
- });
805
- return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
806
- return addressToA1Notation(addressFromIndex(this._sheet, idx));
807
- });
808
- }
809
- //
810
- // Values
811
- //
812
- /**
813
- * https://hyperformula.handsontable.com/guide/date-and-time-handling.html#example
814
- * https://hyperformula.handsontable.com/api/interfaces/configparams.html#nulldate
815
- * NOTE: TODAY() is number of FULL days since nullDate. It will typically be -1 days from NOW().
816
- */
817
- toLocalDate(num) {
818
- const { year, month, day, hours, minutes, seconds } = this.toDateTime(num);
819
- return new Date(year, month - 1, day, hours, minutes, seconds);
820
- }
821
- toDateTime(num) {
822
- invariant2(this._node, void 0, {
823
- F: __dxlog_file,
824
- L: 470,
825
- S: this,
826
- A: [
827
- "this._node",
828
- ""
829
- ]
830
- });
831
- return this._node.graph.hf.numberToDateTime(num);
832
- }
833
- toDate(num) {
834
- invariant2(this._node, void 0, {
835
- F: __dxlog_file,
836
- L: 475,
837
- S: this,
838
- A: [
839
- "this._node",
840
- ""
841
- ]
842
- });
843
- return this._node.graph.hf.numberToDate(num);
844
- }
845
- toTime(num) {
846
- invariant2(this._node, void 0, {
847
- F: __dxlog_file,
848
- L: 480,
849
- S: this,
850
- A: [
851
- "this._node",
852
- ""
853
- ]
854
- });
855
- return this._node.graph.hf.numberToTime(num);
856
- }
857
- };
858
-
859
- // packages/plugins/plugin-sheet/src/model/useSheetModel.ts
860
- import { useEffect, useState } from "react";
861
- var useSheetModel = (graph, sheet, { readonly } = {}) => {
862
- const [model, setModel] = useState();
863
- useEffect(() => {
864
- if (!graph || !sheet) {
865
- return;
866
- }
867
- let model2;
868
- const t = setTimeout(async () => {
869
- model2 = new SheetModel(graph, sheet, {
870
- readonly
871
- });
872
- await model2.open();
873
- setModel(model2);
874
- });
875
- return () => {
876
- clearTimeout(t);
877
- void model2?.close();
878
- };
879
- }, [
880
- graph,
881
- sheet,
882
- readonly
883
- ]);
884
- return model;
885
- };
886
-
887
- // packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx
888
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx";
889
- var SheetContext = /* @__PURE__ */ createContext2(void 0);
890
- var useSheetContext = () => {
891
- const context = useContext2(SheetContext);
892
- invariant3(context, void 0, {
893
- F: __dxlog_file2,
894
- L: 55,
895
- S: void 0,
896
- A: [
897
- "context",
898
- ""
899
- ]
900
- });
901
- return context;
902
- };
903
- var SheetProviderImpl = ({ model, onInfo, ignoreAttention, children, __gridScope }) => {
904
- const { id, editing, setEditing } = useGridContext("SheetProvider", __gridScope);
905
- const [cursor, setCursorInternal] = useState2();
906
- const [range, setRangeInternal] = useState2();
907
- const [cursorFallbackRange, setCursorFallbackRange] = useState2();
908
- const [activeRefs, setActiveRefs] = useState2("");
909
- const setCursor = useCallback((nextCursor) => {
910
- setCursorInternal(nextCursor);
911
- setCursorFallbackRange(range?.to ? range : nextCursor ? {
912
- from: nextCursor,
913
- to: nextCursor
914
- } : void 0);
915
- }, [
916
- range
917
- ]);
918
- const setRange = useCallback((nextRange) => {
919
- setRangeInternal(nextRange);
920
- setCursorFallbackRange(nextRange?.to ? nextRange : cursor ? {
921
- from: cursor,
922
- to: cursor
923
- } : void 0);
924
- }, [
925
- cursor
926
- ]);
927
- return /* @__PURE__ */ React2.createElement(SheetContext.Provider, {
928
- value: {
929
- id,
930
- model,
931
- editing,
932
- setEditing,
933
- cursor,
934
- setCursor,
935
- range,
936
- setRange,
937
- cursorFallbackRange,
938
- activeRefs,
939
- setActiveRefs,
940
- // TODO(burdon): Change to event.
941
- onInfo,
942
- ignoreAttention
943
- }
944
- }, children);
945
- };
946
- var SheetProvider = ({ children, graph, sheet, readonly, ignoreAttention, onInfo }) => {
947
- const model = useSheetModel(graph, sheet, {
948
- readonly
949
- });
950
- return !model ? null : /* @__PURE__ */ React2.createElement(Grid.Root, {
951
- id: fullyQualifiedId(sheet)
952
- }, /* @__PURE__ */ React2.createElement(SheetProviderImpl, {
953
- model,
954
- onInfo,
955
- ignoreAttention
956
- }, children));
957
- };
958
-
959
- // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
960
- import React5, { useCallback as useCallback4, useMemo as useMemo2, useRef, useState as useState4 } from "react";
961
- import { useIntentDispatcher as useIntentDispatcher2 } from "@dxos/app-framework";
962
- import { DropdownMenu, Icon, useTranslation as useTranslation3 } from "@dxos/react-ui";
963
- import { useAttention } from "@dxos/react-ui-attention";
964
- import { closestCell, defaultSizeRow, editorKeys, Grid as Grid2, GridCellEditor, parseCellIndex } from "@dxos/react-ui-grid";
965
-
966
- // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
967
- import { useEffect as useEffect3, useState as useState3 } from "react";
968
- import { createDocAccessor, fullyQualifiedId as fullyQualifiedId3 } from "@dxos/react-client/echo";
969
- import { parseValue, cellClassesForFieldType } from "@dxos/react-ui-form";
970
- import { colToA1Notation, rowToA1Notation, commentedClassName } from "@dxos/react-ui-grid";
971
- import { mx as mx2 } from "@dxos/react-ui-theme";
972
-
973
- // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
974
- import { useCallback as useCallback3, useEffect as useEffect2, useMemo } from "react";
975
- import { LayoutAction, useIntentDispatcher, useIntentResolver } from "@dxos/app-framework";
976
- import { debounce as debounce2 } from "@dxos/async";
977
- import { fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
978
-
979
- // packages/plugins/plugin-sheet/src/components/index.ts
980
- import { lazy } from "react";
981
-
982
- // packages/plugins/plugin-sheet/src/components/RangeList/RangeList.tsx
983
- import React3, { useCallback as useCallback2 } from "react";
984
- import { S } from "@dxos/echo-schema";
985
- import { useTranslation } from "@dxos/react-ui";
986
- import { List } from "@dxos/react-ui-list";
987
- import { ghostHover } from "@dxos/react-ui-theme";
988
- var RangeList = ({ sheet }) => {
989
- const { t } = useTranslation(SHEET_PLUGIN);
990
- const handleSelectRange = (range) => {
991
- };
992
- const handleDeleteRange = useCallback2((range) => {
993
- const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);
994
- sheet.ranges.splice(index, 1);
995
- }, [
996
- sheet
997
- ]);
998
- return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement("h2", {
999
- className: "p-2 text-sm font-semibold"
1000
- }, t("range list heading")), /* @__PURE__ */ React3.createElement(List.Root, {
1001
- items: sheet.ranges,
1002
- isItem: S.is(Range)
1003
- }, ({ items: ranges }) => ranges.map((range, i) => /* @__PURE__ */ React3.createElement(List.Item, {
1004
- key: i,
1005
- item: range,
1006
- classNames: [
1007
- "p-2",
1008
- ghostHover
1009
- ]
1010
- }, /* @__PURE__ */ React3.createElement(List.ItemDragHandle, null), /* @__PURE__ */ React3.createElement(List.ItemTitle, {
1011
- onClick: () => handleSelectRange(range)
1012
- }, t("range title", {
1013
- position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),
1014
- key: t(`range key ${range.key} label`),
1015
- value: t(`range value ${range.value} label`)
1016
- })), /* @__PURE__ */ React3.createElement(List.ItemDeleteButton, {
1017
- onClick: () => handleDeleteRange(range)
1018
- })))));
1019
- };
1020
-
1021
- // packages/plugins/plugin-sheet/src/components/SheetObjectSettings.tsx
1022
- import React4 from "react";
1023
- import { SPACE_PLUGIN } from "@dxos/plugin-space/meta";
1024
- import { Input, useTranslation as useTranslation2 } from "@dxos/react-ui";
1025
- var SheetObjectSettings = ({ sheet }) => {
1026
- const { t } = useTranslation2(SPACE_PLUGIN);
1027
- return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement("div", {
1028
- role: "form",
1029
- className: "flex flex-col w-full p-2 gap-1"
1030
- }, /* @__PURE__ */ React4.createElement(Input.Root, null, /* @__PURE__ */ React4.createElement(Input.Label, null, t("name label")), /* @__PURE__ */ React4.createElement(Input.TextInput, {
1031
- placeholder: t("name placeholder"),
1032
- value: sheet.name ?? "",
1033
- onChange: (event) => {
1034
- sheet.name = event.target.value;
1035
- }
1036
- }))), /* @__PURE__ */ React4.createElement(RangeList, {
1037
- sheet
1038
- }));
1039
- };
1040
-
1041
- // packages/plugins/plugin-sheet/src/components/index.ts
1042
- var SheetContainer = lazy(() => import("./SheetContainer-KCLT6PEO.mjs"));
1043
-
1044
- // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
1045
- var completeCellRangeToThreadCursor = (range) => {
1046
- return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;
1047
- };
1048
- var parseThreadAnchorAsCellRange = (cursor) => {
1049
- const coords = cursor.split(",");
1050
- if (coords.length !== 4) {
1051
- return null;
1052
- } else {
1053
- const [fromCol, fromRow, toCol, toRow] = coords;
1054
- return {
1055
- from: {
1056
- col: parseInt(fromCol),
1057
- row: parseInt(fromRow)
1058
- },
1059
- to: {
1060
- col: parseInt(toCol),
1061
- row: parseInt(toRow)
1062
- }
1063
- };
1064
- }
1065
- };
1066
- var useUpdateFocusedCellOnThreadSelection = (grid) => {
1067
- const { model, setActiveRefs } = useSheetContext();
1068
- const handleScrollIntoView = useCallback3(({ action, data }) => {
1069
- switch (action) {
1070
- case LayoutAction.SCROLL_INTO_VIEW: {
1071
- if (!data?.id || data?.cursor === void 0 || data?.id !== fullyQualifiedId2(model.sheet)) {
1072
- return;
1073
- }
1074
- setActiveRefs(data.thread);
1075
- const range = parseThreadAnchorAsCellRange(data.cursor);
1076
- range && grid?.setFocus({
1077
- ...range.to,
1078
- plane: "grid"
1079
- }, true);
1080
- return {
1081
- data: true
1082
- };
1083
- }
1084
- }
1085
- }, [
1086
- model.sheet,
1087
- setActiveRefs
1088
- ]);
1089
- useIntentResolver(SHEET_PLUGIN, handleScrollIntoView);
1090
- };
1091
- var useSelectThreadOnCellFocus = () => {
1092
- const { model, cursor } = useSheetContext();
1093
- const dispatch = useIntentDispatcher();
1094
- const threads = useMemo(() => model.sheet.threads?.filter((thread) => !!thread) ?? [], [
1095
- // TODO(thure): Surely we can find a better dependency for this…
1096
- JSON.stringify(model.sheet.threads)
1097
- ]);
1098
- const selectClosestThread = useCallback3((cellAddress) => {
1099
- if (!cellAddress || !threads) {
1100
- return;
1101
- }
1102
- const closestThread = threads?.find(({ anchor }) => {
1103
- if (anchor) {
1104
- const range = parseThreadAnchorAsCellRange(anchor);
1105
- return range ? inRange(range, cellAddress) : false;
1106
- } else {
1107
- return false;
1108
- }
1109
- });
1110
- if (closestThread) {
1111
- void dispatch([
1112
- {
1113
- action: "dxos.org/plugin/thread/action/select",
1114
- data: {
1115
- current: fullyQualifiedId2(closestThread)
1116
- }
1117
- }
1118
- ]);
1119
- }
1120
- }, [
1121
- dispatch,
1122
- threads
1123
- ]);
1124
- const debounced = useMemo(() => {
1125
- return debounce2((cellCoords) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);
1126
- }, [
1127
- selectClosestThread
1128
- ]);
1129
- useEffect2(() => {
1130
- if (!cursor) {
1131
- return;
1132
- }
1133
- debounced(cursor);
1134
- }, [
1135
- cursor,
1136
- debounced
1137
- ]);
1138
- };
1139
-
1140
- // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
1141
- var createDxGridColumns = (model) => {
1142
- return model.sheet.columns.reduce((acc, columnId, numericIndex) => {
1143
- if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {
1144
- acc.grid[numericIndex] = {
1145
- size: model.sheet.columnMeta[columnId].size,
1146
- resizeable: true
1147
- };
1148
- }
1149
- return acc;
1150
- }, {
1151
- grid: {}
1152
- });
1153
- };
1154
- var createDxGridRows = (model) => {
1155
- return model.sheet.rows.reduce((acc, rowId, numericIndex) => {
1156
- if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {
1157
- acc.grid[numericIndex] = {
1158
- size: model.sheet.rowMeta[rowId].size,
1159
- resizeable: true
1160
- };
1161
- }
1162
- return acc;
1163
- }, {
1164
- grid: {}
1165
- });
1166
- };
1167
- var projectCellProps = (model, col, row) => {
1168
- const address = {
1169
- col,
1170
- row
1171
- };
1172
- const rawValue = model.getValue(address);
1173
- const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));
1174
- const threadRefs = model.sheet.threads?.filter((thread) => {
1175
- const range = thread?.anchor && parseThreadAnchorAsCellRange(thread.anchor);
1176
- return thread && range ? inRange(range, address) : false;
1177
- }).map((thread) => fullyQualifiedId3(thread)).join(" ");
1178
- const description = model.getValueDescription(address);
1179
- const type = description?.type;
1180
- const format = description?.format;
1181
- const classNames = ranges?.map(cellClassNameForRange).reverse();
1182
- return {
1183
- value: parseValue({
1184
- type,
1185
- format,
1186
- value: rawValue
1187
- }),
1188
- className: mx2(cellClassesForFieldType({
1189
- type,
1190
- format
1191
- }), threadRefs && commentedClassName, classNames),
1192
- dataRefs: threadRefs
1193
- };
1194
- };
1195
- var gridCellGetter = (model) => {
1196
- const cachedGridCells = {};
1197
- return (nextBounds) => {
1198
- [
1199
- ...Array(nextBounds.end.col - nextBounds.start.col)
1200
- ].forEach((_, c0) => {
1201
- return [
1202
- ...Array(nextBounds.end.row - nextBounds.start.row)
1203
- ].forEach((_2, r0) => {
1204
- const col = nextBounds.start.col + c0;
1205
- const row = nextBounds.start.row + r0;
1206
- cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);
1207
- });
1208
- });
1209
- return cachedGridCells;
1210
- };
1211
- };
1212
- var rowLabelCell = (row) => ({
1213
- value: rowToA1Notation(row),
1214
- className: "text-end !pie-1 text-subdued",
1215
- resizeHandle: "row"
1216
- });
1217
- var colLabelCell = (col) => ({
1218
- value: colToA1Notation(col),
1219
- className: "text-subdued",
1220
- resizeHandle: "col"
1221
- });
1222
- var cellGetter = (model) => {
1223
- const getGridCells = gridCellGetter(model);
1224
- return (nextBounds, plane) => {
1225
- switch (plane) {
1226
- case "grid":
1227
- return getGridCells(nextBounds);
1228
- case "frozenColsStart":
1229
- return [
1230
- ...Array(nextBounds.end.row - nextBounds.start.row)
1231
- ].reduce((acc, _, r0) => {
1232
- const r = nextBounds.start.row + r0;
1233
- acc[`0,${r}`] = rowLabelCell(r);
1234
- return acc;
1235
- }, {});
1236
- case "frozenRowsStart":
1237
- return [
1238
- ...Array(nextBounds.end.col - nextBounds.start.col)
1239
- ].reduce((acc, _, c0) => {
1240
- const c = nextBounds.start.col + c0;
1241
- acc[`${c},0`] = colLabelCell(c);
1242
- return acc;
1243
- }, {});
1244
- default:
1245
- return {};
1246
- }
1247
- };
1248
- };
1249
- var useSheetModelDxGridProps = (dxGrid, model) => {
1250
- const [columns, setColumns] = useState3(createDxGridColumns(model));
1251
- const [rows, setRows] = useState3(createDxGridRows(model));
1252
- useEffect3(() => {
1253
- const cellsAccessor = createDocAccessor(model.sheet, [
1254
- "cells"
1255
- ]);
1256
- if (dxGrid) {
1257
- dxGrid.getCells = cellGetter(model);
1258
- }
1259
- const handleCellsUpdate = () => {
1260
- dxGrid?.requestUpdate("initialCells");
1261
- };
1262
- cellsAccessor.handle.addListener("change", handleCellsUpdate);
1263
- const unsubscribe = model.graph.update.on(handleCellsUpdate);
1264
- return () => {
1265
- cellsAccessor.handle.removeListener("change", handleCellsUpdate);
1266
- unsubscribe();
1267
- };
1268
- }, [
1269
- model,
1270
- dxGrid
1271
- ]);
1272
- useEffect3(() => {
1273
- const columnMetaAccessor = createDocAccessor(model.sheet, [
1274
- "columnMeta"
1275
- ]);
1276
- const rowMetaAccessor = createDocAccessor(model.sheet, [
1277
- "rowMeta"
1278
- ]);
1279
- const handleColumnMetaUpdate = () => {
1280
- setColumns(createDxGridColumns(model));
1281
- };
1282
- const handleRowMetaUpdate = () => {
1283
- setRows(createDxGridRows(model));
1284
- };
1285
- columnMetaAccessor.handle.addListener("change", handleColumnMetaUpdate);
1286
- rowMetaAccessor.handle.addListener("change", handleRowMetaUpdate);
1287
- return () => {
1288
- columnMetaAccessor.handle.removeListener("change", handleColumnMetaUpdate);
1289
- rowMetaAccessor.handle.removeListener("change", handleRowMetaUpdate);
1290
- };
1291
- }, [
1292
- model,
1293
- dxGrid
1294
- ]);
1295
- return {
1296
- columns,
1297
- rows
1298
- };
1299
- };
1300
-
1301
- // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
1302
- var inertPosition = {
1303
- plane: "grid",
1304
- col: 0,
1305
- row: 0
1306
- };
1307
- var initialCells = {
1308
- grid: {},
1309
- frozenColsStart: [
1310
- ...Array(64)
1311
- ].reduce((acc, _, i) => {
1312
- acc[`0,${i}`] = rowLabelCell(i);
1313
- return acc;
1314
- }, {}),
1315
- frozenRowsStart: [
1316
- ...Array(12)
1317
- ].reduce((acc, _, i) => {
1318
- acc[`${i},0`] = colLabelCell(i);
1319
- return acc;
1320
- }, {})
1321
- };
1322
- var frozen = {
1323
- frozenColsStart: 1,
1324
- frozenRowsStart: 1
1325
- };
1326
- var sheetRowDefault = {
1327
- frozenRowsStart: {
1328
- size: defaultSizeRow,
1329
- readonly: true
1330
- },
1331
- grid: {
1332
- size: defaultSizeRow,
1333
- resizeable: true
1334
- }
1335
- };
1336
- var sheetColDefault = {
1337
- frozenColsStart: {
1338
- size: 48,
1339
- readonly: true
1340
- },
1341
- grid: {
1342
- size: 180,
1343
- resizeable: true
1344
- }
1345
- };
1346
- var GridSheet = () => {
1347
- const { t } = useTranslation3(SHEET_PLUGIN);
1348
- const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } = useSheetContext();
1349
- const [dxGrid, setDxGrid] = useState4(null);
1350
- const [extraplanarFocus, setExtraplanarFocus] = useState4(null);
1351
- const dispatch = useIntentDispatcher2();
1352
- const rangeController = useRef();
1353
- const { hasAttention } = useAttention(id);
1354
- const handleFocus = useCallback4((event) => {
1355
- if (!editing) {
1356
- const cell = closestCell(event.target);
1357
- if (cell) {
1358
- if (cell.plane === "grid") {
1359
- setCursor({
1360
- col: cell.col,
1361
- row: cell.row
1362
- });
1363
- setExtraplanarFocus(null);
1364
- } else {
1365
- setExtraplanarFocus(cell);
1366
- }
1367
- } else {
1368
- setExtraplanarFocus(null);
1369
- }
1370
- }
1371
- }, [
1372
- editing
1373
- ]);
1374
- const handleClose = useCallback4((_value, event) => {
1375
- if (event) {
1376
- const { key, shift } = event;
1377
- const axis = [
1378
- "Enter",
1379
- "ArrowUp",
1380
- "ArrowDown"
1381
- ].includes(key) ? "row" : [
1382
- "Tab",
1383
- "ArrowLeft",
1384
- "ArrowRight"
1385
- ].includes(key) ? "col" : void 0;
1386
- const delta = key.startsWith("Arrow") ? [
1387
- "ArrowUp",
1388
- "ArrowLeft"
1389
- ].includes(key) ? -1 : 1 : shift ? -1 : 1;
1390
- dxGrid?.refocus(axis, delta);
1391
- }
1392
- }, [
1393
- model,
1394
- editing,
1395
- dxGrid
1396
- ]);
1397
- const handleBlur = useCallback4((value) => {
1398
- if (value !== void 0) {
1399
- model.setValue(parseCellIndex(editing.index), value);
1400
- }
1401
- }, [
1402
- model,
1403
- editing
1404
- ]);
1405
- const handleAxisResize = useCallback4(({ axis, size, index: numericIndex }) => {
1406
- if (axis === "row") {
1407
- const rowId = model.sheet.rows[parseInt(numericIndex)];
1408
- model.sheet.rowMeta[rowId] ??= {};
1409
- model.sheet.rowMeta[rowId].size = size;
1410
- } else {
1411
- const columnId = model.sheet.columns[parseInt(numericIndex)];
1412
- model.sheet.columnMeta[columnId] ??= {};
1413
- model.sheet.columnMeta[columnId].size = size;
1414
- }
1415
- }, [
1416
- model
1417
- ]);
1418
- const handleSelect = useCallback4(({ minCol, maxCol, minRow, maxRow }) => {
1419
- const range = {
1420
- from: {
1421
- col: minCol,
1422
- row: minRow
1423
- }
1424
- };
1425
- if (minCol !== maxCol || minRow !== maxRow) {
1426
- range.to = {
1427
- col: maxCol,
1428
- row: maxRow
1429
- };
1430
- }
1431
- if (editing) {
1432
- rangeController.current?.setRange(rangeToA1Notation(range));
1433
- } else {
1434
- setRange(range.to ? range : void 0);
1435
- }
1436
- }, [
1437
- editing
1438
- ]);
1439
- const handleWheel = useCallback4((event) => {
1440
- if (!ignoreAttention && !hasAttention) {
1441
- event.stopPropagation();
1442
- }
1443
- }, [
1444
- hasAttention,
1445
- ignoreAttention
1446
- ]);
1447
- const selectEntireAxis = useCallback4((pos) => {
1448
- switch (pos.plane) {
1449
- case "frozenRowsStart":
1450
- return dxGrid?.setSelection({
1451
- start: {
1452
- col: pos.col,
1453
- row: 0,
1454
- plane: "grid"
1455
- },
1456
- end: {
1457
- col: pos.col,
1458
- row: model.sheet.rows.length - 1,
1459
- plane: "grid"
1460
- }
1461
- });
1462
- case "frozenColsStart":
1463
- return dxGrid?.setSelection({
1464
- start: {
1465
- row: pos.row,
1466
- col: 0,
1467
- plane: "grid"
1468
- },
1469
- end: {
1470
- row: pos.row,
1471
- col: model.sheet.columns.length - 1,
1472
- plane: "grid"
1473
- }
1474
- });
1475
- }
1476
- }, [
1477
- dxGrid,
1478
- model.sheet
1479
- ]);
1480
- const handleClick = useCallback4((event) => {
1481
- const cell = closestCell(event.target);
1482
- if (cell) {
1483
- selectEntireAxis(cell);
1484
- }
1485
- }, [
1486
- selectEntireAxis
1487
- ]);
1488
- const handleKeyDown = useCallback4((event) => {
1489
- switch (event.key) {
1490
- case "Backspace":
1491
- case "Delete":
1492
- event.preventDefault();
1493
- return cursorFallbackRange && model.clear(cursorFallbackRange);
1494
- case "Enter":
1495
- case "Space":
1496
- if (dxGrid && extraplanarFocus) {
1497
- switch (extraplanarFocus.plane) {
1498
- case "frozenRowsStart":
1499
- case "frozenColsStart":
1500
- event.preventDefault();
1501
- return selectEntireAxis(extraplanarFocus);
1502
- }
1503
- }
1504
- }
1505
- if (event.metaKey || event.ctrlKey) {
1506
- switch (event.key) {
1507
- case "x":
1508
- case "X":
1509
- event.preventDefault();
1510
- return cursorFallbackRange && model.cut(cursorFallbackRange);
1511
- case "c":
1512
- case "C":
1513
- event.preventDefault();
1514
- return cursorFallbackRange && model.copy(cursorFallbackRange);
1515
- case "v":
1516
- case "V":
1517
- event.preventDefault();
1518
- return cursor && model.paste(cursor);
1519
- case "z":
1520
- event.preventDefault();
1521
- return event.shiftKey ? model.redo() : model.undo();
1522
- case "Z":
1523
- case "y":
1524
- event.preventDefault();
1525
- return model.redo();
1526
- }
1527
- }
1528
- }, [
1529
- cursorFallbackRange,
1530
- model,
1531
- cursor,
1532
- extraplanarFocus,
1533
- selectEntireAxis
1534
- ]);
1535
- const contextMenuAnchorRef = useRef(null);
1536
- const [contextMenuOpen, setContextMenuOpen] = useState4(null);
1537
- const contextMenuAxis = contextMenuOpen?.plane.startsWith("frozenRows") ? "col" : "row";
1538
- const handleContextMenu = useCallback4((event) => {
1539
- const cell = closestCell(event.target);
1540
- if (cell && cell.plane.startsWith("frozen")) {
1541
- event.preventDefault();
1542
- contextMenuAnchorRef.current = event.target;
1543
- setContextMenuOpen(cell);
1544
- }
1545
- }, []);
1546
- const handleAxisMenuAction = useCallback4((operation) => {
1547
- switch (operation) {
1548
- case "insert-before":
1549
- case "insert-after":
1550
- return dispatch({
1551
- action: SheetAction.INSERT_AXIS,
1552
- data: {
1553
- model,
1554
- axis: contextMenuAxis,
1555
- index: contextMenuOpen[contextMenuAxis] + (operation === "insert-before" ? 0 : 1)
1556
- }
1557
- });
1558
- break;
1559
- case "drop":
1560
- return dispatch({
1561
- action: SheetAction.DROP_AXIS,
1562
- data: {
1563
- model,
1564
- axis: contextMenuAxis,
1565
- axisIndex: model.sheet[contextMenuAxis === "row" ? "rows" : "columns"][contextMenuOpen[contextMenuAxis]]
1566
- }
1567
- });
1568
- }
1569
- }, [
1570
- contextMenuAxis,
1571
- contextMenuOpen,
1572
- model,
1573
- dispatch
1574
- ]);
1575
- const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
1576
- const extension = useMemo2(() => [
1577
- editorKeys({
1578
- onClose: handleClose,
1579
- ...editing?.initialContent && {
1580
- onNav: handleClose
1581
- }
1582
- }),
1583
- sheetExtension({
1584
- functions: model.graph.getFunctions()
1585
- }),
1586
- rangeExtension({
1587
- onInit: (fn) => rangeController.current = fn,
1588
- onStateChange: (state) => {
1589
- if (dxGrid) {
1590
- dxGrid.mode = typeof state.activeRange === "undefined" ? "edit" : "edit-select";
1591
- }
1592
- }
1593
- })
1594
- ], [
1595
- model,
1596
- handleClose,
1597
- editing
1598
- ]);
1599
- const getCellContent = useCallback4((index) => {
1600
- return model.getCellText(parseCellIndex(index));
1601
- }, [
1602
- model
1603
- ]);
1604
- useUpdateFocusedCellOnThreadSelection(dxGrid);
1605
- useSelectThreadOnCellFocus();
1606
- return /* @__PURE__ */ React5.createElement("div", {
1607
- role: "none",
1608
- className: "relative min-bs-0"
1609
- }, /* @__PURE__ */ React5.createElement(GridCellEditor, {
1610
- getCellContent,
1611
- extension,
1612
- onBlur: handleBlur
1613
- }), /* @__PURE__ */ React5.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: "trap",
1630
- className: "[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:border-bs [&_.dx-grid]:absolute [&_.dx-grid]:inset-0 [&_.dx-grid]:border-separator",
1631
- activeRefs,
1632
- ref: setDxGrid
1633
- }), /* @__PURE__ */ React5.createElement(DropdownMenu.Root, {
1634
- modal: false,
1635
- open: !!contextMenuOpen,
1636
- onOpenChange: (nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)
1637
- }, /* @__PURE__ */ React5.createElement(DropdownMenu.VirtualTrigger, {
1638
- virtualRef: contextMenuAnchorRef
1639
- }), /* @__PURE__ */ React5.createElement(DropdownMenu.Content, {
1640
- side: contextMenuAxis === "col" ? "bottom" : "right",
1641
- sideOffset: 4,
1642
- collisionPadding: 8
1643
- }, /* @__PURE__ */ React5.createElement(DropdownMenu.Viewport, null, /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
1644
- onClick: () => handleAxisMenuAction("insert-before"),
1645
- "data-testid": `grid.${contextMenuAxis}.insert-before`
1646
- }, /* @__PURE__ */ React5.createElement(Icon, {
1647
- size: 5,
1648
- icon: contextMenuAxis === "col" ? "ph--columns-plus-left--regular" : "ph--rows-plus-top--regular"
1649
- }), /* @__PURE__ */ React5.createElement("span", null, t(`add ${contextMenuAxis} before label`))), /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
1650
- onClick: () => handleAxisMenuAction("insert-after"),
1651
- "data-testid": `grid.${contextMenuAxis}.insert-after`
1652
- }, /* @__PURE__ */ React5.createElement(Icon, {
1653
- size: 5,
1654
- icon: contextMenuAxis === "col" ? "ph--columns-plus-right--regular" : "ph--rows-plus-bottom--regular"
1655
- }), /* @__PURE__ */ React5.createElement("span", null, t(`add ${contextMenuAxis} after label`))), /* @__PURE__ */ React5.createElement(DropdownMenu.Item, {
1656
- onClick: () => handleAxisMenuAction("drop"),
1657
- "data-testid": `grid.${contextMenuAxis}.drop`
1658
- }, /* @__PURE__ */ React5.createElement(Icon, {
1659
- size: 5,
1660
- icon: "ph--backspace--regular"
1661
- }), /* @__PURE__ */ React5.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ React5.createElement(DropdownMenu.Arrow, null))));
1662
- };
1663
-
1664
- export {
1665
- ComputeGraphContextProvider,
1666
- useComputeGraph,
1667
- completeCellRangeToThreadCursor,
1668
- computeGraphFacet,
1669
- useSheetContext,
1670
- SheetProvider,
1671
- GridSheet,
1672
- SheetObjectSettings,
1673
- SheetContainer
1674
- };
1675
- //# sourceMappingURL=chunk-E5WQ7U7G.mjs.map