@dxos/plugin-sheet 0.6.14-main.7bd9c89 → 0.6.14-staging.54a8bab

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 (231) hide show
  1. package/dist/lib/browser/{SheetContainer-AKWROARP.mjs → SheetContainer-JZEKRM4Z.mjs} +83 -76
  2. package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-BWN5DZWZ.mjs → chunk-BVUN7SHF.mjs} +6 -13
  4. package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-FGMFOW6U.mjs → chunk-G2FUL6PK.mjs} +791 -690
  6. package/dist/lib/browser/chunk-G2FUL6PK.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-D3QTX46O.mjs → chunk-RABELMEQ.mjs} +3 -2
  8. package/dist/lib/browser/{chunk-D3QTX46O.mjs.map → chunk-RABELMEQ.mjs.map} +3 -3
  9. package/dist/lib/browser/{chunk-GSV5QNLD.mjs → chunk-VMSX6Z4X.mjs} +297 -44
  10. package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +7 -0
  11. package/dist/lib/browser/{graph-M4IQ76QX.mjs → compute-graph-GGWUX644.mjs} +4 -2
  12. package/dist/lib/browser/index.mjs +91 -21
  13. package/dist/lib/browser/index.mjs.map +4 -4
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/browser/meta.mjs +1 -1
  16. package/dist/lib/browser/types.mjs +2 -2
  17. package/dist/lib/node/{SheetContainer-N5IQGEFL.cjs → SheetContainer-PJE74VO4.cjs} +81 -81
  18. package/dist/lib/node/SheetContainer-PJE74VO4.cjs.map +7 -0
  19. package/dist/lib/node/{chunk-QIFIGEKV.cjs → chunk-2ZVZI2KJ.cjs} +6 -5
  20. package/dist/lib/node/{chunk-QIFIGEKV.cjs.map → chunk-2ZVZI2KJ.cjs.map} +3 -3
  21. package/dist/lib/node/{chunk-NZARD7UP.cjs → chunk-AWKOWDMI.cjs} +10 -17
  22. package/dist/lib/node/chunk-AWKOWDMI.cjs.map +7 -0
  23. package/dist/lib/node/{chunk-5XPK2V4A.cjs → chunk-O7XR4R7Y.cjs} +306 -42
  24. package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-53BMSUIK.cjs → chunk-STZ7S7RF.cjs} +755 -668
  26. package/dist/lib/node/chunk-STZ7S7RF.cjs.map +7 -0
  27. package/dist/lib/node/{graph-Q3N2X26H.cjs → compute-graph-KGWA2QLE.cjs} +21 -19
  28. package/dist/lib/node/compute-graph-KGWA2QLE.cjs.map +7 -0
  29. package/dist/lib/node/index.cjs +109 -42
  30. package/dist/lib/node/index.cjs.map +4 -4
  31. package/dist/lib/node/meta.cjs +3 -3
  32. package/dist/lib/node/meta.cjs.map +1 -1
  33. package/dist/lib/node/meta.json +1 -1
  34. package/dist/lib/node/types.cjs +7 -7
  35. package/dist/lib/node/types.cjs.map +1 -1
  36. package/dist/lib/node-esm/{SheetContainer-46PBMF2E.mjs → SheetContainer-R73XEXHU.mjs} +83 -76
  37. package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs.map +7 -0
  38. package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs → chunk-BM2Q3FFC.mjs} +3 -2
  39. package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs.map → chunk-BM2Q3FFC.mjs.map} +3 -3
  40. package/dist/lib/node-esm/{chunk-5WPZCXNS.mjs → chunk-CR4K75EL.mjs} +296 -44
  41. package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +7 -0
  42. package/dist/lib/node-esm/{chunk-WFDTY3IC.mjs → chunk-UIBWRHW7.mjs} +6 -13
  43. package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +7 -0
  44. package/dist/lib/node-esm/{chunk-T3PRH7QS.mjs → chunk-V5N3Y2O5.mjs} +791 -690
  45. package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs.map +7 -0
  46. package/dist/lib/node-esm/{graph-SMPUMOV2.mjs → compute-graph-2SCZT7N5.mjs} +4 -2
  47. package/dist/lib/node-esm/index.mjs +91 -21
  48. package/dist/lib/node-esm/index.mjs.map +4 -4
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/meta.mjs +1 -1
  51. package/dist/lib/node-esm/types.mjs +2 -2
  52. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  53. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +3 -1
  54. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  56. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  57. package/dist/types/src/components/GridSheet/util.d.ts +1 -2
  58. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  59. package/dist/types/src/components/RangeList/RangeList.d.ts +7 -0
  60. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -0
  61. package/dist/types/src/components/RangeList/index.d.ts +2 -0
  62. package/dist/types/src/components/RangeList/index.d.ts.map +1 -0
  63. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +6 -3
  64. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  65. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  66. package/dist/types/src/components/SheetContext/SheetContext.d.ts +7 -5
  67. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -1
  68. package/dist/types/src/components/Toolbar/Toolbar.d.ts +6 -3
  69. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  70. package/dist/types/src/components/index.d.ts +5 -2
  71. package/dist/types/src/components/index.d.ts.map +1 -1
  72. package/dist/types/src/compute-graph/compute-graph-registry.d.ts.map +1 -0
  73. package/dist/types/src/{graph → compute-graph}/compute-graph.d.ts +3 -3
  74. package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -0
  75. package/dist/types/src/compute-graph/compute-graph.stories.d.ts.map +1 -0
  76. package/dist/types/src/compute-graph/compute-graph.test.d.ts.map +1 -0
  77. package/dist/types/src/compute-graph/compute-node.d.ts.map +1 -0
  78. package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -0
  79. package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -0
  80. package/dist/types/src/compute-graph/functions/function-defs.d.ts.map +1 -0
  81. package/dist/types/src/compute-graph/functions/index.d.ts.map +1 -0
  82. package/dist/types/src/compute-graph/hyperformula.test.d.ts.map +1 -0
  83. package/dist/types/src/compute-graph/index.d.ts.map +1 -0
  84. package/dist/types/src/compute-graph/testing/index.d.ts.map +1 -0
  85. package/dist/types/src/compute-graph/testing/test-builder.d.ts.map +1 -0
  86. package/dist/types/src/compute-graph/testing/test-plugin.d.ts.map +1 -0
  87. package/dist/types/src/compute-graph/util.d.ts.map +1 -0
  88. package/dist/types/src/defs/index.d.ts +1 -1
  89. package/dist/types/src/defs/index.d.ts.map +1 -1
  90. package/dist/types/src/defs/sheet-range-types.d.ts +2 -2
  91. package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -1
  92. package/dist/types/src/defs/types.d.ts +6 -0
  93. package/dist/types/src/defs/types.d.ts.map +1 -1
  94. package/dist/types/src/defs/util.d.ts +3 -7
  95. package/dist/types/src/defs/util.d.ts.map +1 -1
  96. package/dist/types/src/extensions/compute.d.ts +1 -1
  97. package/dist/types/src/extensions/compute.d.ts.map +1 -1
  98. package/dist/types/src/extensions/editor/extension.d.ts +23 -3
  99. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -1
  100. package/dist/types/src/index.d.ts +1 -1
  101. package/dist/types/src/index.d.ts.map +1 -1
  102. package/dist/types/src/integrations/index.d.ts +2 -0
  103. package/dist/types/src/integrations/index.d.ts.map +1 -0
  104. package/dist/types/src/integrations/thread-ranges.d.ts +7 -0
  105. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -0
  106. package/dist/types/src/meta.d.ts +1 -0
  107. package/dist/types/src/meta.d.ts.map +1 -1
  108. package/dist/types/src/model/index.d.ts +1 -1
  109. package/dist/types/src/model/index.d.ts.map +1 -1
  110. package/dist/types/src/model/sheet-model.d.ts +13 -6
  111. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  112. package/dist/types/src/{hooks → model}/useSheetModel.d.ts +1 -1
  113. package/dist/types/src/model/useSheetModel.d.ts.map +1 -0
  114. package/dist/types/src/serializer.d.ts +4 -0
  115. package/dist/types/src/serializer.d.ts.map +1 -0
  116. package/dist/types/src/testing/testing.d.ts +1 -1
  117. package/dist/types/src/testing/testing.d.ts.map +1 -1
  118. package/dist/types/src/translations.d.ts +18 -3
  119. package/dist/types/src/translations.d.ts.map +1 -1
  120. package/dist/types/src/types.d.ts +37 -33
  121. package/dist/types/src/types.d.ts.map +1 -1
  122. package/package.json +43 -50
  123. package/src/SheetPlugin.tsx +45 -12
  124. package/src/components/ComputeGraph/ComputeGraphContextProvider.tsx +19 -2
  125. package/src/components/FunctionEditor/FunctionEditor.tsx +5 -5
  126. package/src/components/GridSheet/GridSheet.stories.tsx +3 -1
  127. package/src/components/GridSheet/GridSheet.tsx +181 -24
  128. package/src/components/GridSheet/SheetCellEditor.stories.tsx +1 -1
  129. package/src/components/GridSheet/util.ts +34 -18
  130. package/src/components/RangeList/RangeList.tsx +53 -0
  131. package/src/components/RangeList/index.ts +5 -0
  132. package/src/components/SheetContainer/SheetContainer.stories.tsx +5 -3
  133. package/src/components/SheetContainer/SheetContainer.tsx +10 -4
  134. package/src/components/SheetContext/SheetContext.tsx +43 -20
  135. package/src/components/Toolbar/Toolbar.tsx +98 -74
  136. package/src/components/index.ts +1 -0
  137. package/src/{graph → compute-graph}/compute-graph.stories.tsx +2 -1
  138. package/src/{graph → compute-graph}/compute-graph.ts +27 -9
  139. package/src/{graph → compute-graph}/compute-node.ts +2 -3
  140. package/src/{graph → compute-graph}/functions/async-function.ts +1 -0
  141. package/src/{graph → compute-graph}/functions/edge-function.ts +5 -3
  142. package/src/defs/index.ts +1 -1
  143. package/src/defs/sheet-range-types.ts +9 -6
  144. package/src/defs/types.ts +6 -1
  145. package/src/defs/util.ts +4 -19
  146. package/src/extensions/compute.stories.tsx +2 -2
  147. package/src/extensions/compute.ts +2 -2
  148. package/src/extensions/editor/extension.test.ts +1 -1
  149. package/src/extensions/editor/extension.ts +48 -23
  150. package/src/index.ts +2 -2
  151. package/src/integrations/index.ts +5 -0
  152. package/src/integrations/thread-ranges.ts +101 -0
  153. package/src/meta.ts +1 -0
  154. package/src/model/index.ts +1 -1
  155. package/src/model/sheet-model.test.ts +6 -4
  156. package/src/model/sheet-model.ts +103 -26
  157. package/src/{hooks → model}/useSheetModel.ts +1 -1
  158. package/src/serializer.ts +27 -0
  159. package/src/testing/testing.tsx +1 -1
  160. package/src/translations.ts +18 -3
  161. package/src/types.ts +24 -2
  162. package/dist/lib/browser/SheetContainer-AKWROARP.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-BWN5DZWZ.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-FGMFOW6U.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-GSV5QNLD.mjs.map +0 -7
  166. package/dist/lib/node/SheetContainer-N5IQGEFL.cjs.map +0 -7
  167. package/dist/lib/node/chunk-53BMSUIK.cjs.map +0 -7
  168. package/dist/lib/node/chunk-5XPK2V4A.cjs.map +0 -7
  169. package/dist/lib/node/chunk-NZARD7UP.cjs.map +0 -7
  170. package/dist/lib/node/graph-Q3N2X26H.cjs.map +0 -7
  171. package/dist/lib/node-esm/SheetContainer-46PBMF2E.mjs.map +0 -7
  172. package/dist/lib/node-esm/chunk-5WPZCXNS.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-T3PRH7QS.mjs.map +0 -7
  174. package/dist/lib/node-esm/chunk-WFDTY3IC.mjs.map +0 -7
  175. package/dist/types/src/graph/compute-graph-registry.d.ts.map +0 -1
  176. package/dist/types/src/graph/compute-graph.d.ts.map +0 -1
  177. package/dist/types/src/graph/compute-graph.stories.d.ts.map +0 -1
  178. package/dist/types/src/graph/compute-graph.test.d.ts.map +0 -1
  179. package/dist/types/src/graph/compute-node.d.ts.map +0 -1
  180. package/dist/types/src/graph/functions/async-function.d.ts.map +0 -1
  181. package/dist/types/src/graph/functions/edge-function.d.ts.map +0 -1
  182. package/dist/types/src/graph/functions/function-defs.d.ts.map +0 -1
  183. package/dist/types/src/graph/functions/index.d.ts.map +0 -1
  184. package/dist/types/src/graph/hyperformula.test.d.ts.map +0 -1
  185. package/dist/types/src/graph/index.d.ts.map +0 -1
  186. package/dist/types/src/graph/testing/index.d.ts.map +0 -1
  187. package/dist/types/src/graph/testing/test-builder.d.ts.map +0 -1
  188. package/dist/types/src/graph/testing/test-plugin.d.ts.map +0 -1
  189. package/dist/types/src/graph/util.d.ts.map +0 -1
  190. package/dist/types/src/hooks/hooks.stories.d.ts +0 -6
  191. package/dist/types/src/hooks/hooks.stories.d.ts.map +0 -1
  192. package/dist/types/src/hooks/index.d.ts +0 -4
  193. package/dist/types/src/hooks/index.d.ts.map +0 -1
  194. package/dist/types/src/hooks/threads.d.ts +0 -8
  195. package/dist/types/src/hooks/threads.d.ts.map +0 -1
  196. package/dist/types/src/hooks/useComputeGraph.d.ts +0 -7
  197. package/dist/types/src/hooks/useComputeGraph.d.ts.map +0 -1
  198. package/dist/types/src/hooks/useSheetModel.d.ts.map +0 -1
  199. package/dist/types/src/model/decorations.d.ts +0 -26
  200. package/dist/types/src/model/decorations.d.ts.map +0 -1
  201. package/src/hooks/hooks.stories.tsx +0 -53
  202. package/src/hooks/index.ts +0 -7
  203. package/src/hooks/threads.ts +0 -147
  204. package/src/hooks/useComputeGraph.ts +0 -28
  205. package/src/model/decorations.ts +0 -66
  206. /package/dist/lib/browser/{graph-M4IQ76QX.mjs.map → compute-graph-GGWUX644.mjs.map} +0 -0
  207. /package/dist/lib/node-esm/{graph-SMPUMOV2.mjs.map → compute-graph-2SCZT7N5.mjs.map} +0 -0
  208. /package/dist/types/src/{graph → compute-graph}/compute-graph-registry.d.ts +0 -0
  209. /package/dist/types/src/{graph → compute-graph}/compute-graph.stories.d.ts +0 -0
  210. /package/dist/types/src/{graph → compute-graph}/compute-graph.test.d.ts +0 -0
  211. /package/dist/types/src/{graph → compute-graph}/compute-node.d.ts +0 -0
  212. /package/dist/types/src/{graph → compute-graph}/functions/async-function.d.ts +0 -0
  213. /package/dist/types/src/{graph → compute-graph}/functions/edge-function.d.ts +0 -0
  214. /package/dist/types/src/{graph → compute-graph}/functions/function-defs.d.ts +0 -0
  215. /package/dist/types/src/{graph → compute-graph}/functions/index.d.ts +0 -0
  216. /package/dist/types/src/{graph → compute-graph}/hyperformula.test.d.ts +0 -0
  217. /package/dist/types/src/{graph → compute-graph}/index.d.ts +0 -0
  218. /package/dist/types/src/{graph → compute-graph}/testing/index.d.ts +0 -0
  219. /package/dist/types/src/{graph → compute-graph}/testing/test-builder.d.ts +0 -0
  220. /package/dist/types/src/{graph → compute-graph}/testing/test-plugin.d.ts +0 -0
  221. /package/dist/types/src/{graph → compute-graph}/util.d.ts +0 -0
  222. /package/src/{graph → compute-graph}/compute-graph-registry.ts +0 -0
  223. /package/src/{graph → compute-graph}/compute-graph.test.ts +0 -0
  224. /package/src/{graph → compute-graph}/functions/function-defs.ts +0 -0
  225. /package/src/{graph → compute-graph}/functions/index.ts +0 -0
  226. /package/src/{graph → compute-graph}/hyperformula.test.ts +0 -0
  227. /package/src/{graph → compute-graph}/index.ts +0 -0
  228. /package/src/{graph → compute-graph}/testing/index.ts +0 -0
  229. /package/src/{graph → compute-graph}/testing/test-builder.ts +0 -0
  230. /package/src/{graph → compute-graph}/testing/test-plugin.ts +0 -0
  231. /package/src/{graph → compute-graph}/util.ts +0 -0
@@ -8,34 +8,41 @@ import { type SimpleDate, type SimpleDateTime } from 'hyperformula/typings/DateT
8
8
 
9
9
  import { Event } from '@dxos/async';
10
10
  import { Resource } from '@dxos/context';
11
- import { getTypename } from '@dxos/echo-schema';
11
+ import { getTypename, FormatEnum, TypeEnum } from '@dxos/echo-schema';
12
12
  import { invariant } from '@dxos/invariant';
13
13
  import { PublicKey } from '@dxos/keys';
14
14
  import { log } from '@dxos/log';
15
- import { FieldValueType } from '@dxos/schema';
16
15
 
17
16
  import { DetailedCellError, ExportedCellChange } from '#hyperformula';
17
+ import { type ComputeGraph, type ComputeNode, type ComputeNodeEvent, createSheetName } from '../compute-graph';
18
18
  import {
19
19
  addressFromA1Notation,
20
+ addressFromIndex,
20
21
  addressToA1Notation,
22
+ addressToIndex,
23
+ initialize,
24
+ insertIndices,
25
+ isFormula,
21
26
  type CellAddress,
22
27
  type CellRange,
28
+ ReadonlyException,
23
29
  MAX_COLUMNS,
24
30
  MAX_ROWS,
25
31
  } from '../defs';
26
- import { addressFromIndex, addressToIndex, initialize, insertIndices, ReadonlyException } from '../defs';
27
- import { type ComputeNode, type ComputeGraph, createSheetName, type ComputeNodeEvent } from '../graph';
28
- import { type CellScalarValue, type CellValue, type SheetType } from '../types';
32
+ import { type CellScalarValue, type CellValue, type SheetType, type RestoreAxis } from '../types';
29
33
 
30
34
  // Map sheet types to system types.
31
- const typeMap: Record<string, FieldValueType> = {
32
- BOOLEAN: FieldValueType.Boolean,
33
- NUMBER_RAW: FieldValueType.Number,
34
- NUMBER_PERCENT: FieldValueType.Percent,
35
- NUMBER_CURRENCY: FieldValueType.Currency,
36
- NUMBER_DATETIME: FieldValueType.DateTime,
37
- NUMBER_DATE: FieldValueType.Date,
38
- NUMBER_TIME: FieldValueType.Time,
35
+ // https://hyperformula.handsontable.com/guide/types-of-values.html
36
+ // - https://github.com/handsontable/hyperformula/blob/master/src/Cell.ts (CellValueType)
37
+ // - https://github.com/handsontable/hyperformula/blob/master/src/interpreter/InterpreterValue.ts (NumberType)
38
+ const typeMap: Record<string, { type: TypeEnum; format?: FormatEnum }> = {
39
+ BOOLEAN: { type: TypeEnum.Boolean },
40
+ NUMBER_RAW: { type: TypeEnum.Number },
41
+ NUMBER_PERCENT: { type: TypeEnum.Number, format: FormatEnum.Percent },
42
+ NUMBER_CURRENCY: { type: TypeEnum.Number, format: FormatEnum.Currency },
43
+ NUMBER_DATETIME: { type: TypeEnum.String, format: FormatEnum.DateTime },
44
+ NUMBER_DATE: { type: TypeEnum.String, format: FormatEnum.Date },
45
+ NUMBER_TIME: { type: TypeEnum.String, format: FormatEnum.Time },
39
46
  };
40
47
 
41
48
  const getTopLeft = (range: CellRange): CellAddress => {
@@ -106,6 +113,12 @@ export class SheetModel extends Resource {
106
113
  log('initialize', { id: this.id });
107
114
  initialize(this._sheet);
108
115
 
116
+ this._graph.update.on((event) => {
117
+ if (event.type === 'functionsUpdated') {
118
+ this.reset();
119
+ }
120
+ });
121
+
109
122
  // TODO(burdon): SheetModel should extend ComputeNode and be constructed via the graph.
110
123
  this._node = this._graph.getOrCreateNode(createSheetName({ type: getTypename(this._sheet)!, id: this._sheet.id }));
111
124
  await this._node.open();
@@ -128,10 +141,15 @@ export class SheetModel extends Resource {
128
141
  Object.entries(this._sheet.cells).forEach(([key, { value }]) => {
129
142
  invariant(this._node);
130
143
  const { col, row } = addressFromIndex(this._sheet, key);
131
- if (typeof value === 'string' && value.charAt(0) === '=') {
132
- value = this._graph.mapFormulaToNative(
133
- this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value)),
134
- );
144
+ if (isFormula(value)) {
145
+ const binding = this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value));
146
+ if (binding) {
147
+ value = this._graph.mapFormulaToNative(binding);
148
+ } else {
149
+ // If binding is not found, render the cell as empty.
150
+ // This prevents the cell from momentarily rendering an error while the binding is being loaded.
151
+ value = '';
152
+ }
135
153
  }
136
154
 
137
155
  this._node.graph.hf.setCellContents({ sheet: this._node.sheetId, row, col }, value);
@@ -150,12 +168,68 @@ export class SheetModel extends Resource {
150
168
  }
151
169
 
152
170
  insertRows(i: number, n = 1) {
153
- insertIndices(this._sheet.rows, i, n, MAX_ROWS);
171
+ const idx = insertIndices(this._sheet.rows, i, n, MAX_ROWS);
154
172
  this.reset();
173
+ return idx;
155
174
  }
156
175
 
157
176
  insertColumns(i: number, n = 1) {
158
- insertIndices(this._sheet.columns, i, n, MAX_COLUMNS);
177
+ const idx = insertIndices(this._sheet.columns, i, n, MAX_COLUMNS);
178
+ this.reset();
179
+ return idx;
180
+ }
181
+
182
+ dropRow(rowIndex: string): RestoreAxis {
183
+ const range = {
184
+ from: addressFromIndex(this._sheet, `${this._sheet.columns[0]}@${rowIndex}`),
185
+ to: addressFromIndex(this._sheet, `${this._sheet.columns[this._sheet.columns.length - 1]}@${rowIndex}`),
186
+ };
187
+ const values = this.getCellValues(range).flat();
188
+ const index = this._sheet.rows.indexOf(rowIndex);
189
+ this.clear(range);
190
+ this._sheet.rows.splice(index, 1);
191
+ delete this._sheet.rowMeta[rowIndex];
192
+ this.reset();
193
+ return { axis: 'row', index, axisIndex: rowIndex, axisMeta: this._sheet.rowMeta[rowIndex], values };
194
+ }
195
+
196
+ dropColumn(colIndex: string): RestoreAxis {
197
+ const range = {
198
+ from: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[0]}`),
199
+ to: addressFromIndex(this._sheet, `${colIndex}@${this._sheet.rows[this._sheet.rows.length - 1]}`),
200
+ };
201
+ const values = this.getCellValues(range).flat();
202
+ const index = this._sheet.columns.indexOf(colIndex);
203
+ this.clear(range);
204
+ this._sheet.columns.splice(index, 1);
205
+ delete this._sheet.columnMeta[colIndex];
206
+ this.reset();
207
+ return { axis: 'col', index, axisIndex: colIndex, axisMeta: this._sheet.rowMeta[colIndex], values };
208
+ }
209
+
210
+ restoreRow({ index, axisIndex, axisMeta, values }: RestoreAxis) {
211
+ this._sheet.rows.splice(index, 0, axisIndex);
212
+ values.forEach((value, col) => {
213
+ if (value) {
214
+ this._sheet.cells[`${this._sheet.columns[col]}@${axisIndex}`] = { value };
215
+ }
216
+ });
217
+ if (axisMeta) {
218
+ this._sheet.rowMeta[axisIndex] = axisMeta;
219
+ }
220
+ this.reset();
221
+ }
222
+
223
+ restoreColumn({ index, axisIndex, axisMeta, values }: RestoreAxis) {
224
+ this._sheet.columns.splice(index, 0, axisIndex);
225
+ values.forEach((value, row) => {
226
+ if (value) {
227
+ this._sheet.cells[`${axisIndex}@${this._sheet.rows[row]}`] = { value };
228
+ }
229
+ });
230
+ if (axisMeta) {
231
+ this._sheet.columnMeta[axisIndex] = axisMeta;
232
+ }
159
233
  this.reset();
160
234
  }
161
235
 
@@ -240,7 +314,7 @@ export class SheetModel extends Resource {
240
314
  return undefined;
241
315
  }
242
316
 
243
- if (typeof value === 'string' && value.charAt(0) === '=') {
317
+ if (isFormula(value)) {
244
318
  return this._graph.mapFunctionBindingFromId(this.mapFormulaIndicesToRefs(value));
245
319
  } else {
246
320
  return String(value);
@@ -260,8 +334,11 @@ export class SheetModel extends Resource {
260
334
  getValue(cell: CellAddress): CellScalarValue {
261
335
  // Applies rounding and post-processing.
262
336
  invariant(this._node);
263
- const value = this._node.graph.hf.getCellValue(toSimpleCellAddress(this._node.sheetId, cell));
337
+ const address = toSimpleCellAddress(this._node.sheetId, cell);
338
+ const value = this._node.graph.hf.getCellValue(address);
264
339
  if (value instanceof DetailedCellError) {
340
+ // TODO(wittjosiah): Error details should be shown in cell `title`.
341
+ log.info('cell error', { cell, error: value });
265
342
  return value.toString();
266
343
  }
267
344
 
@@ -271,7 +348,7 @@ export class SheetModel extends Resource {
271
348
  /**
272
349
  * Get value type.
273
350
  */
274
- getValueType(cell: CellAddress): FieldValueType {
351
+ getValueDescription(cell: CellAddress): { type: TypeEnum; format?: FormatEnum } | undefined {
275
352
  invariant(this._node);
276
353
  const addr = toSimpleCellAddress(this._node.sheetId, cell);
277
354
  const type = this._node.graph.hf.getCellValueDetailedType(addr);
@@ -305,7 +382,7 @@ export class SheetModel extends Resource {
305
382
 
306
383
  // Insert into engine.
307
384
  this._node.graph.hf.setCellContents({ sheet: this._node.sheetId, row: cell.row, col: cell.col }, [
308
- [typeof value === 'string' && value.charAt(0) === '=' ? this._graph.mapFormulaToNative(value) : value],
385
+ [isFormula(value) ? this._graph.mapFormulaToNative(value) : value],
309
386
  ]);
310
387
 
311
388
  // Insert into sheet.
@@ -313,7 +390,7 @@ export class SheetModel extends Resource {
313
390
  if (value === undefined || value === null) {
314
391
  delete this._sheet.cells[idx];
315
392
  } else {
316
- if (typeof value === 'string' && value.charAt(0) === '=') {
393
+ if (isFormula(value)) {
317
394
  value = this._graph.mapFunctionBindingToId(this.mapFormulaRefsToIndices(value));
318
395
  }
319
396
 
@@ -371,7 +448,7 @@ export class SheetModel extends Resource {
371
448
  * Map from A1 notation to indices.
372
449
  */
373
450
  mapFormulaRefsToIndices(formula: string): string {
374
- invariant(formula.charAt(0) === '=');
451
+ invariant(isFormula(formula));
375
452
  return formula.replace(/([a-zA-Z]+)([0-9]+)/g, (match) => {
376
453
  return addressToIndex(this._sheet, addressFromA1Notation(match));
377
454
  });
@@ -381,7 +458,7 @@ export class SheetModel extends Resource {
381
458
  * Map from indices to A1 notation.
382
459
  */
383
460
  mapFormulaIndicesToRefs(formula: string): string {
384
- invariant(formula.charAt(0) === '=');
461
+ invariant(isFormula(formula));
385
462
  return formula.replace(/([a-zA-Z0-9]+)@([a-zA-Z0-9]+)/g, (idx) => {
386
463
  return addressToA1Notation(addressFromIndex(this._sheet, idx));
387
464
  });
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { useEffect, useState } from 'react';
6
6
 
7
- import { type ComputeGraph } from '../graph';
7
+ import { type ComputeGraph } from '../compute-graph';
8
8
  import { SheetModel } from '../model';
9
9
  import { type SheetType } from '../types';
10
10
 
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type TypedObjectSerializer } from '@dxos/plugin-space/types';
6
+ import { create, getObjectCore } from '@dxos/react-client/echo';
7
+
8
+ import { SheetType } from './types';
9
+
10
+ export const serializer: TypedObjectSerializer<SheetType> = {
11
+ serialize: async ({ object }): Promise<string> => {
12
+ const { threads: _threads, ...sheet } = object;
13
+ return JSON.stringify(sheet, null, 2);
14
+ },
15
+
16
+ deserialize: async ({ content, newId }) => {
17
+ const { id, ...parsed } = JSON.parse(content);
18
+ const sheet = create(SheetType, parsed);
19
+
20
+ if (!newId) {
21
+ const core = getObjectCore(sheet);
22
+ core.id = id;
23
+ }
24
+
25
+ return sheet;
26
+ },
27
+ };
@@ -9,8 +9,8 @@ import { type Space } from '@dxos/react-client/echo';
9
9
  import { useAsyncState } from '@dxos/react-hooks';
10
10
 
11
11
  import { ComputeGraphContextProvider } from '../components';
12
+ import { type ComputeGraph, type ComputeGraphOptions, ComputeGraphRegistry } from '../compute-graph';
12
13
  import { createSheet } from '../defs';
13
- import { type ComputeGraph, type ComputeGraphOptions, ComputeGraphRegistry } from '../graph';
14
14
  import { type CellValue, type CreateSheetOptions } from '../types';
15
15
 
16
16
  const testSheetName = 'test';
@@ -13,14 +13,29 @@ export default [
13
13
  'create sheet label': 'Create sheet',
14
14
  'create sheet section label': 'Create sheet',
15
15
  'cell placeholder': 'Cell value...',
16
- 'toolbar left label': 'Align left',
17
- 'toolbar left center': 'Align center',
18
- 'toolbar left right': 'Align right',
16
+ 'range key alignment label': 'Align',
17
+ 'range key style label': 'Style',
18
+ 'range value start label': 'Align left',
19
+ 'range value center label': 'Align center',
20
+ 'range value end label': 'Align right',
21
+ 'range value softwrap label': 'Wrap text',
22
+ 'range value highlight label': 'Highlight',
23
+ 'toolbar action label': '{{value}}',
19
24
  'selection overlaps existing comment label': 'Selected cell already has a comment',
20
25
  'comment label': 'Add comment',
21
26
  'comment ranges not supported label': 'Commenting on ranges is not yet supported',
22
27
  'no cursor label': 'Select a cell to comment',
23
28
  'open comment for sheet cell': 'View comments for cell',
29
+ 'add col before label': 'Add column before',
30
+ 'add col after label': 'Add column after',
31
+ 'delete col label': 'Delete column',
32
+ 'add row before label': 'Add row before',
33
+ 'add row after label': 'Add row after',
34
+ 'delete row label': 'Delete row',
35
+ 'range list heading': 'Ranges',
36
+ 'range title': '{{position}} — {{value}}',
37
+ 'col dropped label': 'Deleted a column',
38
+ 'row dropped label': 'Deleted a row',
24
39
  },
25
40
  },
26
41
  },
package/src/types.ts CHANGED
@@ -8,6 +8,7 @@ import type {
8
8
  MetadataRecordsProvides,
9
9
  SurfaceProvides,
10
10
  TranslationsProvides,
11
+ IntentData,
11
12
  } from '@dxos/app-framework';
12
13
  import { ref, S, TypedObject } from '@dxos/echo-schema';
13
14
  import { type SchemaProvides } from '@dxos/plugin-client';
@@ -15,13 +16,32 @@ import { type MarkdownExtensionProvides } from '@dxos/plugin-markdown';
15
16
  import { type SpaceInitProvides } from '@dxos/plugin-space';
16
17
  import { ThreadType } from '@dxos/plugin-space/types';
17
18
  import { type StackProvides } from '@dxos/plugin-stack';
19
+ import { type DxGridAxis } from '@dxos/react-ui-grid';
18
20
 
19
21
  import { SHEET_PLUGIN } from './meta';
22
+ import { type SheetModel } from './model';
20
23
 
21
24
  const SHEET_ACTION = `${SHEET_PLUGIN}/action`;
22
25
 
23
26
  export enum SheetAction {
24
27
  CREATE = `${SHEET_ACTION}/create`,
28
+ INSERT_AXIS = `${SHEET_ACTION}/axis-insert`,
29
+ DROP_AXIS = `${SHEET_ACTION}/axis-drop`,
30
+ }
31
+
32
+ export type RestoreAxis = {
33
+ axis: DxGridAxis;
34
+ axisIndex: string;
35
+ index: number;
36
+ axisMeta?: S.Schema.Type<typeof RowColumnMeta>;
37
+ values: CellScalarValue[];
38
+ };
39
+
40
+ export namespace SheetAction {
41
+ export type Create = IntentData<{ sheet: SheetType }>;
42
+ export type InsertAxis = IntentData<{ model: SheetModel; axis: DxGridAxis; index: number; count?: number }>;
43
+ export type DropAxis = IntentData<{ model: SheetModel; axis: DxGridAxis; axisIndex: string }>;
44
+ export type DropAxisRestore = IntentData<RestoreAxis & { model: SheetModel }>;
25
45
  }
26
46
 
27
47
  // TODO(Zan): Move this to the plugin-space plugin or another common location
@@ -58,18 +78,20 @@ export type CellValue = S.Schema.Type<typeof CellValue>;
58
78
 
59
79
  // TODO(burdon): IMPORTANT: Reconcile with Field definition.
60
80
  export const Range = S.Struct({
61
- range: S.Struct({ from: S.Struct({ col: S.Number, row: S.Number }), to: S.Struct({ col: S.Number, row: S.Number }) }),
81
+ range: S.String,
62
82
  key: S.String,
63
83
  value: S.String,
64
84
  });
65
85
 
86
+ export type Range = S.Schema.Type<typeof Range>;
87
+
66
88
  // TODO(burdon): Visibility, locked, frozen, etc.
67
89
  export const RowColumnMeta = S.Struct({
68
90
  size: S.optional(S.Number),
69
91
  });
70
92
 
71
93
  // TODO(burdon): Index to all updates when rows/columns are inserted/deleted.
72
- export class SheetType extends TypedObject({ typename: 'dxos.org/type/SheetType', version: '0.1.0' })({
94
+ export class SheetType extends TypedObject({ typename: 'dxos.org/type/Sheet', version: '0.1.0' })({
73
95
  name: S.optional(S.String),
74
96
 
75
97
  // Sparse map of cells referenced by index.
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/SheetContainer/SheetContainer.tsx", "../../../src/components/FunctionEditor/FunctionEditor.tsx", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/SheetContainer/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider, type SheetProviderProps } from '../SheetContext';\nimport { Toolbar } from '../Toolbar';\n\nexport const SheetContainer = ({ graph, sheet, role }: SheetProviderProps & { role?: string }) => {\n return (\n <SheetProvider sheet={sheet} graph={graph}>\n <Toolbar.Root role={role}>\n <Toolbar.Styles />\n <Toolbar.Alignment />\n <Toolbar.Separator />\n <Toolbar.Actions />\n </Toolbar.Root>\n <div role='none' className='border-bs border-separator grid cols-1 rows-[1fr_min-content] min-bs-0'>\n <GridSheet />\n <FunctionEditor />\n </div>\n </SheetProvider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Icon } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { addressToA1Notation, rangeToA1Notation } from '../../defs';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let isFormula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (typeof value === 'string' && value.charAt(0) === '=') {\n value = model.graph.mapFunctionBindingFromId(model.mapFormulaIndicesToRefs(value));\n isFormula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div\n className={mx(\n 'flex shrink-0 justify-between items-center px-4 py-1 text-sm border-bs !border-separator attention-surface',\n )}\n >\n <div className='flex gap-4 items-center'>\n <div className='flex w-16 items-center font-mono'>\n {(range && rangeToA1Notation(range)) || (cursor && addressToA1Notation(cursor))}\n </div>\n <div className='flex gap-2 items-center'>\n <Icon icon='ph--function--regular' classNames={['text-greenText', isFormula ? 'visible' : 'invisible']} />\n <span className='font-mono'>{value}</span>\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useCallback, useMemo } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport {\n Icon,\n Toolbar as NaturalToolbar,\n useTranslation,\n Tooltip,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleProps as NaturalToolbarToggleProps,\n type ThemedClassName,\n} from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { nonNullable } from '@dxos/util';\n\nimport {\n addressToIndex,\n type AlignKey,\n type AlignValue,\n type CommentKey,\n type CommentValue,\n inRange,\n type StyleKey,\n type StyleValue,\n} from '../../defs';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type SheetType } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\n//\n// Buttons\n//\n\nconst buttonStyles = 'min-bs-0 p-2';\nconst tooltipProps = { side: 'bottom' as const, classNames: 'z-10' };\n\nconst ToolbarSeparator = () => <div role='separator' className='grow' />;\n\n//\n// ToolbarItem\n//\n\ntype ToolbarItemProps =\n | (NaturalToolbarButtonProps & { itemType: 'button'; icon: string })\n | (NaturalToolbarToggleGroupItemProps & { itemType: 'toggleGroupItem'; icon: string })\n | (NaturalToolbarToggleProps & { itemType: 'toggle'; icon: string });\n\nexport const ToolbarItem = ({ itemType, icon, children, ...props }: ToolbarItemProps) => {\n const Invoker =\n itemType === 'toggleGroupItem'\n ? NaturalToolbar.ToggleGroupItem\n : itemType === 'toggle'\n ? NaturalToolbar.Toggle\n : NaturalToolbar.Button;\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n {/* TODO(thure): type the props spread better. */}\n <Invoker variant='ghost' {...(props as any)} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </Invoker>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\n//\n// Root\n//\n\ntype AlignAction = { key: AlignKey; value: AlignValue };\ntype CommentAction = { key: CommentKey; value: CommentValue; cellContent?: string };\ntype StyleAction = { key: StyleKey; value: StyleValue };\n\nexport type ToolbarAction = StyleAction | AlignAction | CommentAction;\n\nexport type ToolbarActionType = ToolbarAction['key'];\n\nexport type ToolbarActionHandler = (action: ToolbarAction) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n role?: string;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<{ onAction: (action: ToolbarAction) => void }>(\n 'Toolbar',\n);\n\n// TODO(Zan): Factor out, copied this from MarkdownPlugin.\nconst sectionToolbarLayout =\n 'bs-[--rail-action] bg-[--sticky-bg] sticky block-start-0 __-block-start-px transition-opacity';\n\ntype Range = SheetType['ranges'][number];\n\nconst ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {\n const { id, model, range, cursor } = useSheetContext();\n const { hasAttention } = useAttention(id);\n const dispatch = useIntentDispatcher();\n\n // TODO(Zan): Centralise the toolbar action handler. Current implementation in stories.\n const handleAction = useCallback(\n (action: ToolbarAction) => {\n switch (action.key) {\n case 'align':\n if (cursor) {\n const index = model.sheet.ranges?.findIndex(\n (range) => range.key === action.key && inRange(range.range, cursor),\n );\n const nextRange = range ? { from: range.from, to: range.to ?? range.from } : { from: cursor, to: cursor };\n const nextRangeEntity = {\n range: nextRange as Range['range'],\n key: action.key,\n value: action.value,\n };\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n }\n }\n break;\n case 'style':\n if (action.value === 'unset') {\n const index = model.sheet.ranges?.findIndex((range) => range.key === action.key);\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n } else if (range || cursor) {\n const nextRange = range ? { from: range.from, to: range.to ?? range.from } : { from: cursor, to: cursor };\n model.sheet.ranges?.push({\n range: nextRange as Range['range'],\n key: action.key,\n value: action.value,\n });\n }\n break;\n case 'comment': {\n // TODO(Zan): We shouldn't hardcode the action ID.\n void dispatch({\n action: 'dxos.org/plugin/thread/action/create',\n data: {\n cursor: action.value,\n name: action.cellContent,\n subject: model.sheet,\n },\n });\n }\n }\n },\n [model.sheet, range, cursor, dispatch],\n );\n\n return (\n <ToolbarContextProvider onAction={handleAction}>\n <NaturalToolbar.Root\n classNames={[\n ...(role === 'section'\n ? ['z-[2] group-focus-within/section:visible', !hasAttention && 'invisible', sectionToolbarLayout]\n : ['attention-surface']),\n classNames,\n ]}\n >\n {children}\n </NaturalToolbar.Root>\n </ToolbarContextProvider>\n );\n};\n\n// TODO(burdon): Generalize.\n// TODO(burdon): Detect and display current state.\ntype ButtonProps<T> = {\n value: T;\n icon: string;\n disabled?: (state: Range) => boolean;\n};\n\n//\n// Alignment\n//\n\nconst alignmentOptions: ButtonProps<AlignValue>[] = [\n { value: 'start', icon: 'ph--text-align-left--regular' },\n { value: 'center', icon: 'ph--text-align-center--regular' },\n { value: 'end', icon: 'ph--text-align-right--regular' },\n];\n\nconst Alignment = () => {\n const { cursor, model } = useSheetContext();\n const { onAction } = useToolbarContext('Alignment');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n const value = useMemo(\n () =>\n cursor\n ? model.sheet.ranges?.find(({ range, key }) => key === 'alignment' && inRange(range, cursor))?.value\n : undefined,\n [cursor, model.sheet.ranges],\n );\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n value={value}\n onValueChange={(value: AlignValue) => onAction?.({ key: 'align', value })}\n >\n {alignmentOptions.map(({ value, icon }) => (\n <ToolbarItem itemType='toggleGroupItem' key={value} value={value} icon={icon}>\n {t(`toolbar ${value} label`)}\n </ToolbarItem>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nconst styleOptions: ButtonProps<StyleValue>[] = [{ value: 'highlight', icon: 'ph--highlighter--regular' }];\n\nconst Styles = () => {\n const { cursor, model } = useSheetContext();\n const { onAction } = useToolbarContext('Styles');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n const activeValues = useMemo(\n () =>\n cursor\n ? model.sheet.ranges\n ?.filter(({ range, key }) => key === 'style' && inRange(range, cursor))\n .reduce((acc, { value }) => {\n acc.add(value);\n return acc;\n }, new Set())\n : undefined,\n [cursor, model.sheet.ranges],\n );\n\n return (\n <>\n {styleOptions.map(({ value, icon }) => (\n <ToolbarItem\n itemType='toggle'\n key={value}\n pressed={activeValues?.has(value)}\n onPressedChange={(nextPressed: boolean) => onAction?.({ key: 'style', value: nextPressed ? value : 'unset' })}\n icon={icon}\n >\n {t(`toolbar ${value} label`)}\n </ToolbarItem>\n ))}\n </>\n );\n};\n\n//\n// Actions\n//\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { cursor, range, model } = useSheetContext();\n const { t } = useTranslation(SHEET_PLUGIN);\n\n const overlapsCommentAnchor = (model.sheet.threads ?? [])\n .filter(nonNullable)\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursor) {\n return false;\n }\n return addressToIndex(model.sheet, cursor) === thread.anchor;\n });\n\n const hasCursor = !!cursor;\n const cursorOnly = hasCursor && !range && !overlapsCommentAnchor;\n\n const tooltipLabelKey = !hasCursor\n ? 'no cursor label'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment label'\n : range\n ? 'comment ranges not supported label'\n : 'comment label';\n\n return (\n <ToolbarItem\n itemType='button'\n value='comment'\n icon='ph--chat-text--regular'\n data-testid='editor.toolbar.comment'\n onClick={() => {\n if (!cursor) {\n return;\n }\n return onAction?.({\n key: 'comment',\n value: addressToIndex(model.sheet, cursor),\n cellContent: model.getCellText(cursor),\n });\n }}\n disabled={!cursorOnly || overlapsCommentAnchor}\n >\n {t(tooltipLabelKey)}\n </ToolbarItem>\n );\n};\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Separator: ToolbarSeparator,\n Alignment,\n Styles,\n Actions,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { SheetContainer } from './SheetContainer';\n\nexport default SheetContainer;\n"],
5
- "mappings": "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",
6
- "names": ["React", "React", "Icon", "mx", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "isFormula", "getCellValue", "charAt", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "String", "div", "className", "mx", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "createContext", "React", "useCallback", "useMemo", "useIntentDispatcher", "Icon", "Toolbar", "NaturalToolbar", "useTranslation", "Tooltip", "useAttention", "nonNullable", "buttonStyles", "tooltipProps", "side", "classNames", "ToolbarSeparator", "React", "div", "role", "className", "ToolbarItem", "itemType", "icon", "children", "props", "Invoker", "NaturalToolbar", "ToggleGroupItem", "Toggle", "Button", "Tooltip", "Root", "Trigger", "asChild", "variant", "Icon", "size", "span", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "sectionToolbarLayout", "ToolbarRoot", "id", "model", "range", "cursor", "useSheetContext", "hasAttention", "useAttention", "dispatch", "useIntentDispatcher", "handleAction", "useCallback", "action", "key", "index", "sheet", "ranges", "findIndex", "inRange", "nextRange", "from", "to", "nextRangeEntity", "value", "push", "splice", "data", "name", "cellContent", "subject", "onAction", "alignmentOptions", "Alignment", "t", "useTranslation", "SHEET_PLUGIN", "useMemo", "find", "undefined", "ToggleGroup", "type", "onValueChange", "map", "styleOptions", "Styles", "activeValues", "filter", "reduce", "acc", "add", "Set", "pressed", "has", "onPressedChange", "nextPressed", "Actions", "overlapsCommentAnchor", "threads", "nonNullable", "thread", "status", "some", "addressToIndex", "anchor", "hasCursor", "cursorOnly", "tooltipLabelKey", "data-testid", "onClick", "getCellText", "disabled", "Toolbar", "Separator", "SheetContainer", "graph", "sheet", "role", "React", "SheetProvider", "Toolbar", "Root", "Styles", "Alignment", "Separator", "Actions", "div", "className", "GridSheet", "FunctionEditor", "SheetContainer"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { ref, S, TypedObject } from '@dxos/echo-schema';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport { type MarkdownExtensionProvides } from '@dxos/plugin-markdown';\nimport { type SpaceInitProvides } from '@dxos/plugin-space';\nimport { ThreadType } from '@dxos/plugin-space/types';\nimport { type StackProvides } from '@dxos/plugin-stack';\n\nimport { SHEET_PLUGIN } from './meta';\n\nconst SHEET_ACTION = `${SHEET_PLUGIN}/action`;\n\nexport enum SheetAction {\n CREATE = `${SHEET_ACTION}/create`,\n}\n\n// TODO(Zan): Move this to the plugin-space plugin or another common location\n// when we implement comments in sheets.\n// This is currently duplicated in a few places.\ntype ThreadProvides<T> = {\n thread: {\n predicate: (obj: any) => obj is T;\n createSort: (obj: T) => (anchorA: string | undefined, anchorB: string | undefined) => number;\n };\n};\n\nexport type SheetPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MarkdownExtensionProvides &\n MetadataRecordsProvides &\n TranslationsProvides &\n SchemaProvides &\n SpaceInitProvides &\n StackProvides &\n ThreadProvides<SheetType>;\n\nexport type CellScalarValue = number | string | boolean | null;\n\nexport const CellValue = S.Struct({\n // TODO(burdon): How to store dates (datetime, date, time), percentages, etc.\n // Consider import/export; natural access for other plugins. Special handling for currency (precision).\n // TODO(burdon): Automerge (long string) or short string or number.\n value: S.Any,\n});\n\nexport type CellValue = S.Schema.Type<typeof CellValue>;\n\n// TODO(burdon): IMPORTANT: Reconcile with Field definition.\nexport const Range = S.Struct({\n range: S.Struct({ from: S.Struct({ col: S.Number, row: S.Number }), to: S.Struct({ col: S.Number, row: S.Number }) }),\n key: S.String,\n value: S.String,\n});\n\n// TODO(burdon): Visibility, locked, frozen, etc.\nexport const RowColumnMeta = S.Struct({\n size: S.optional(S.Number),\n});\n\n// TODO(burdon): Index to all updates when rows/columns are inserted/deleted.\nexport class SheetType extends TypedObject({ typename: 'dxos.org/type/SheetType', version: '0.1.0' })({\n name: S.optional(S.String),\n\n // Sparse map of cells referenced by index.\n cells: S.mutable(S.Record({ key: S.String, value: S.mutable(CellValue) })),\n\n // Ordered row indices.\n rows: S.mutable(S.Array(S.String)),\n\n // Ordered column indices.\n columns: S.mutable(S.Array(S.String)),\n\n // Row metadata referenced by index.\n rowMeta: S.mutable(S.Record({ key: S.String, value: S.mutable(RowColumnMeta) })),\n\n // Column metadata referenced by index.\n columnMeta: S.mutable(S.Record({ key: S.String, value: S.mutable(RowColumnMeta) })),\n\n // Cell formatting referenced by indexed range.\n ranges: S.mutable(S.Array(Range)),\n\n // Threads associated with the sheet\n threads: S.optional(S.mutable(S.Array(ref(ThreadType)))),\n}) {}\n\nexport type SheetSize = {\n rows: number;\n columns: number;\n};\n\nexport type CreateSheetOptions = {\n name?: string;\n cells?: Record<string, CellValue>;\n} & Partial<SheetSize>;\n"],
5
- "mappings": ";;;;;AAWA,SAASA,KAAKC,GAAGC,mBAAmB;AAIpC,SAASC,kBAAkB;AAK3B,IAAMC,eAAe,GAAGC,YAAAA;;UAEZC,cAAAA;wCACD,GAAGF,YAAAA,SAAqB,IAAA;GADvBE,gBAAAA,cAAAA,CAAAA,EAAAA;AA2BL,IAAMC,YAAYC,EAAEC,OAAO;;;;EAIhCC,OAAOF,EAAEG;AACX,CAAA;AAKO,IAAMC,QAAQJ,EAAEC,OAAO;EAC5BI,OAAOL,EAAEC,OAAO;IAAEK,MAAMN,EAAEC,OAAO;MAAEM,KAAKP,EAAEQ;MAAQC,KAAKT,EAAEQ;IAAO,CAAA;IAAIE,IAAIV,EAAEC,OAAO;MAAEM,KAAKP,EAAEQ;MAAQC,KAAKT,EAAEQ;IAAO,CAAA;EAAG,CAAA;EACnHG,KAAKX,EAAEY;EACPV,OAAOF,EAAEY;AACX,CAAA;AAGO,IAAMC,gBAAgBb,EAAEC,OAAO;EACpCa,MAAMd,EAAEe,SAASf,EAAEQ,MAAM;AAC3B,CAAA;AAGO,IAAMQ,YAAN,cAAwBC,YAAY;EAAEC,UAAU;EAA2BC,SAAS;AAAQ,CAAA,EAAG;EACpGC,MAAMpB,EAAEe,SAASf,EAAEY,MAAM;;EAGzBS,OAAOrB,EAAEsB,QAAQtB,EAAEuB,OAAO;IAAEZ,KAAKX,EAAEY;IAAQV,OAAOF,EAAEsB,QAAQvB,SAAAA;EAAW,CAAA,CAAA;;EAGvEyB,MAAMxB,EAAEsB,QAAQtB,EAAEyB,MAAMzB,EAAEY,MAAM,CAAA;;EAGhCc,SAAS1B,EAAEsB,QAAQtB,EAAEyB,MAAMzB,EAAEY,MAAM,CAAA;;EAGnCe,SAAS3B,EAAEsB,QAAQtB,EAAEuB,OAAO;IAAEZ,KAAKX,EAAEY;IAAQV,OAAOF,EAAEsB,QAAQT,aAAAA;EAAe,CAAA,CAAA;;EAG7Ee,YAAY5B,EAAEsB,QAAQtB,EAAEuB,OAAO;IAAEZ,KAAKX,EAAEY;IAAQV,OAAOF,EAAEsB,QAAQT,aAAAA;EAAe,CAAA,CAAA;;EAGhFgB,QAAQ7B,EAAEsB,QAAQtB,EAAEyB,MAAMrB,KAAAA,CAAAA;;EAG1B0B,SAAS9B,EAAEe,SAASf,EAAEsB,QAAQtB,EAAEyB,MAAMM,IAAIC,UAAAA,CAAAA,CAAAA,CAAAA;AAC5C,CAAA,EAAA;AAAI;",
6
- "names": ["ref", "S", "TypedObject", "ThreadType", "SHEET_ACTION", "SHEET_PLUGIN", "SheetAction", "CellValue", "S", "Struct", "value", "Any", "Range", "range", "from", "col", "Number", "row", "to", "key", "String", "RowColumnMeta", "size", "optional", "SheetType", "TypedObject", "typename", "version", "name", "cells", "mutable", "Record", "rows", "Array", "columns", "rowMeta", "columnMeta", "ranges", "threads", "ref", "ThreadType"]
7
- }