@dxos/plugin-sheet 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (215) hide show
  1. package/dist/lib/browser/SheetContainer-J72HS2FI.mjs +397 -0
  2. package/dist/lib/browser/SheetContainer-J72HS2FI.mjs.map +7 -0
  3. package/dist/lib/browser/anchor-sort-LLO7PZKF.mjs +23 -0
  4. package/dist/lib/browser/anchor-sort-LLO7PZKF.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-7VEWYJJN.mjs → chunk-IFLWVS2V.mjs} +5 -5
  6. package/dist/lib/browser/chunk-IFLWVS2V.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-KE3AKN5W.mjs +397 -0
  8. package/dist/lib/browser/chunk-KE3AKN5W.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-S27QJYTN.mjs +1473 -0
  10. package/dist/lib/browser/chunk-S27QJYTN.mjs.map +7 -0
  11. package/dist/lib/browser/compute-graph-registry-RC5L7RE4.mjs +21 -0
  12. package/dist/lib/browser/compute-graph-registry-RC5L7RE4.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +68 -78
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/markdown-D2T2DOVX.mjs +29 -0
  16. package/dist/lib/browser/markdown-D2T2DOVX.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/operation-resolver-YDOW72CN.mjs +79 -0
  19. package/dist/lib/browser/operation-resolver-YDOW72CN.mjs.map +7 -0
  20. package/dist/lib/browser/{react-surface-F3VQPGDV.mjs → react-surface-JIYVFH42.mjs} +17 -19
  21. package/dist/lib/browser/react-surface-JIYVFH42.mjs.map +7 -0
  22. package/dist/lib/browser/types/index.mjs +5 -2
  23. package/dist/lib/node-esm/SheetContainer-OGSSDOZU.mjs +398 -0
  24. package/dist/lib/node-esm/SheetContainer-OGSSDOZU.mjs.map +7 -0
  25. package/dist/lib/node-esm/anchor-sort-OX5I2YOW.mjs +24 -0
  26. package/dist/lib/node-esm/anchor-sort-OX5I2YOW.mjs.map +7 -0
  27. package/dist/lib/node-esm/chunk-6J5L47IB.mjs +398 -0
  28. package/dist/lib/node-esm/chunk-6J5L47IB.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-4QV4AGWK.mjs → chunk-PPOYR7DK.mjs} +5 -5
  30. package/dist/lib/node-esm/chunk-PPOYR7DK.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-Y4V6HVHO.mjs +1474 -0
  32. package/dist/lib/node-esm/chunk-Y4V6HVHO.mjs.map +7 -0
  33. package/dist/lib/node-esm/compute-graph-registry-ZGXVLVGD.mjs +22 -0
  34. package/dist/lib/node-esm/compute-graph-registry-ZGXVLVGD.mjs.map +7 -0
  35. package/dist/lib/node-esm/index.mjs +68 -78
  36. package/dist/lib/node-esm/index.mjs.map +4 -4
  37. package/dist/lib/node-esm/markdown-PTV72DLO.mjs +30 -0
  38. package/dist/lib/node-esm/markdown-PTV72DLO.mjs.map +7 -0
  39. package/dist/lib/node-esm/meta.json +1 -1
  40. package/dist/lib/node-esm/operation-resolver-Q63VQBVA.mjs +80 -0
  41. package/dist/lib/node-esm/operation-resolver-Q63VQBVA.mjs.map +7 -0
  42. package/dist/lib/node-esm/{react-surface-GGX76V2Y.mjs → react-surface-SWRZSZVR.mjs} +17 -19
  43. package/dist/lib/node-esm/react-surface-SWRZSZVR.mjs.map +7 -0
  44. package/dist/lib/node-esm/types/index.mjs +5 -2
  45. package/dist/types/src/SheetPlugin.d.ts +2 -1
  46. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  47. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +5 -0
  48. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +1 -0
  49. package/dist/types/src/capabilities/anchor-sort/index.d.ts +3 -0
  50. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +1 -0
  51. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts +5 -0
  52. package/dist/types/src/capabilities/compute-graph-registry/compute-graph-registry.d.ts.map +1 -0
  53. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts +3 -0
  54. package/dist/types/src/capabilities/compute-graph-registry/index.d.ts.map +1 -0
  55. package/dist/types/src/capabilities/index.d.ts +5 -9
  56. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  57. package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
  58. package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
  60. package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  62. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  64. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  68. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  69. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  70. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +1 -0
  71. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  72. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts +1 -1
  73. package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -1
  74. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  75. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
  76. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +4 -5
  77. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  78. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +3 -1
  79. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  81. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +2 -0
  82. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/SheetToolbar/align.d.ts +12 -19
  84. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -1
  85. package/dist/types/src/components/SheetToolbar/style.d.ts +12 -18
  86. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -1
  87. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +14 -1
  88. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
  89. package/dist/types/src/components/index.d.ts +1 -1
  90. package/dist/types/src/components/index.d.ts.map +1 -1
  91. package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
  92. package/dist/types/src/extensions/editor/sheet-extension.d.ts.map +1 -1
  93. package/dist/types/src/index.d.ts +1 -1
  94. package/dist/types/src/index.d.ts.map +1 -1
  95. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  96. package/dist/types/src/meta.d.ts +2 -2
  97. package/dist/types/src/meta.d.ts.map +1 -1
  98. package/dist/types/src/model/sheet-model.d.ts +2 -2
  99. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  100. package/dist/types/src/serializer.d.ts.map +1 -1
  101. package/dist/types/src/testing/testing.d.ts +14 -14
  102. package/dist/types/src/translations.d.ts +1 -0
  103. package/dist/types/src/translations.d.ts.map +1 -1
  104. package/dist/types/src/types/Sheet.d.ts +40 -34
  105. package/dist/types/src/types/Sheet.d.ts.map +1 -1
  106. package/dist/types/src/types/capabilities.d.ts +6 -0
  107. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  108. package/dist/types/src/types/index.d.ts +1 -0
  109. package/dist/types/src/types/index.d.ts.map +1 -1
  110. package/dist/types/src/types/types.d.ts +91 -65
  111. package/dist/types/src/types/types.d.ts.map +1 -1
  112. package/dist/types/src/types/util.d.ts +2 -1
  113. package/dist/types/src/types/util.d.ts.map +1 -1
  114. package/dist/types/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +75 -68
  116. package/src/SheetPlugin.tsx +40 -62
  117. package/src/capabilities/anchor-sort/anchor-sort.ts +26 -0
  118. package/src/capabilities/anchor-sort/index.ts +7 -0
  119. package/src/capabilities/compute-graph-registry/compute-graph-registry.ts +27 -0
  120. package/src/capabilities/compute-graph-registry/index.ts +7 -0
  121. package/src/capabilities/index.ts +5 -9
  122. package/src/capabilities/markdown/index.ts +7 -0
  123. package/src/capabilities/markdown/markdown.ts +30 -0
  124. package/src/capabilities/operation-resolver/index.ts +7 -0
  125. package/src/capabilities/operation-resolver/operation-resolver.ts +77 -0
  126. package/src/capabilities/react-surface/index.ts +7 -0
  127. package/src/capabilities/react-surface/react-surface.tsx +43 -0
  128. package/src/components/ComputeGraph/compute-graph.stories.tsx +1 -1
  129. package/src/components/FunctionEditor/FunctionEditor.tsx +2 -2
  130. package/src/components/GridSheet/GridSheet.stories.tsx +2 -2
  131. package/src/components/GridSheet/GridSheet.tsx +40 -30
  132. package/src/components/GridSheet/SheetCellEditor.stories.tsx +7 -4
  133. package/src/components/GridSheet/util.ts +11 -5
  134. package/src/components/RangeList/RangeList.tsx +5 -2
  135. package/src/components/SheetContainer/SheetContainer.stories.tsx +44 -21
  136. package/src/components/SheetContainer/SheetContainer.tsx +29 -21
  137. package/src/components/SheetContext/SheetContext.tsx +6 -6
  138. package/src/components/SheetToolbar/SheetToolbar.tsx +36 -22
  139. package/src/components/SheetToolbar/align.ts +41 -16
  140. package/src/components/SheetToolbar/style.ts +45 -15
  141. package/src/components/SheetToolbar/useToolbarState.ts +22 -5
  142. package/src/extensions/compute.stories.tsx +17 -8
  143. package/src/extensions/compute.ts +1 -1
  144. package/src/extensions/editor/sheet-extension.ts +7 -4
  145. package/src/index.ts +1 -1
  146. package/src/integrations/thread-ranges.ts +38 -48
  147. package/src/meta.ts +2 -2
  148. package/src/model/sheet-model.ts +75 -45
  149. package/src/playwright/playwright.config.ts +1 -1
  150. package/src/playwright/sheet.spec.ts +1 -0
  151. package/src/sanity.test.ts +1 -1
  152. package/src/serializer.ts +1 -1
  153. package/src/translations.ts +1 -0
  154. package/src/types/Sheet.ts +23 -29
  155. package/src/{capabilities → types}/capabilities.ts +2 -2
  156. package/src/types/index.ts +1 -0
  157. package/src/types/types.ts +81 -37
  158. package/src/types/util.ts +2 -1
  159. package/dist/lib/browser/SheetContainer-GTINUSNB.mjs +0 -349
  160. package/dist/lib/browser/SheetContainer-GTINUSNB.mjs.map +0 -7
  161. package/dist/lib/browser/anchor-sort-R5CB37J7.mjs +0 -24
  162. package/dist/lib/browser/anchor-sort-R5CB37J7.mjs.map +0 -7
  163. package/dist/lib/browser/chunk-73AV3NH6.mjs +0 -15
  164. package/dist/lib/browser/chunk-73AV3NH6.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-7VEWYJJN.mjs.map +0 -7
  166. package/dist/lib/browser/chunk-DVJ3QW3F.mjs +0 -907
  167. package/dist/lib/browser/chunk-DVJ3QW3F.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-FWFAAGXL.mjs +0 -28
  169. package/dist/lib/browser/chunk-FWFAAGXL.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-LS6D4GG7.mjs +0 -850
  171. package/dist/lib/browser/chunk-LS6D4GG7.mjs.map +0 -7
  172. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs +0 -21
  173. package/dist/lib/browser/compute-graph-registry-AP5RA7W3.mjs.map +0 -7
  174. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs +0 -56
  175. package/dist/lib/browser/intent-resolver-66OAYVQF.mjs.map +0 -7
  176. package/dist/lib/browser/markdown-B6VKYY2S.mjs +0 -26
  177. package/dist/lib/browser/markdown-B6VKYY2S.mjs.map +0 -7
  178. package/dist/lib/browser/react-surface-F3VQPGDV.mjs.map +0 -7
  179. package/dist/lib/node-esm/SheetContainer-PW4KNZME.mjs +0 -350
  180. package/dist/lib/node-esm/SheetContainer-PW4KNZME.mjs.map +0 -7
  181. package/dist/lib/node-esm/anchor-sort-HEND452H.mjs +0 -25
  182. package/dist/lib/node-esm/anchor-sort-HEND452H.mjs.map +0 -7
  183. package/dist/lib/node-esm/chunk-44YTKTMP.mjs +0 -16
  184. package/dist/lib/node-esm/chunk-44YTKTMP.mjs.map +0 -7
  185. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs +0 -908
  186. package/dist/lib/node-esm/chunk-4H2EHVWE.mjs.map +0 -7
  187. package/dist/lib/node-esm/chunk-4QV4AGWK.mjs.map +0 -7
  188. package/dist/lib/node-esm/chunk-HILDMVPL.mjs +0 -29
  189. package/dist/lib/node-esm/chunk-HILDMVPL.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-LYUIM3QG.mjs +0 -851
  191. package/dist/lib/node-esm/chunk-LYUIM3QG.mjs.map +0 -7
  192. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs +0 -22
  193. package/dist/lib/node-esm/compute-graph-registry-UMQ5UYCL.mjs.map +0 -7
  194. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs +0 -57
  195. package/dist/lib/node-esm/intent-resolver-VNKIMQQT.mjs.map +0 -7
  196. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs +0 -27
  197. package/dist/lib/node-esm/markdown-VKY7HXU2.mjs.map +0 -7
  198. package/dist/lib/node-esm/react-surface-GGX76V2Y.mjs.map +0 -7
  199. package/dist/types/src/capabilities/anchor-sort.d.ts +0 -6
  200. package/dist/types/src/capabilities/anchor-sort.d.ts.map +0 -1
  201. package/dist/types/src/capabilities/capabilities.d.ts +0 -5
  202. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  203. package/dist/types/src/capabilities/compute-graph-registry.d.ts +0 -4
  204. package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +0 -1
  205. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  206. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  207. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  208. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  209. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  210. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  211. package/src/capabilities/anchor-sort.ts +0 -22
  212. package/src/capabilities/compute-graph-registry.ts +0 -23
  213. package/src/capabilities/intent-resolver.ts +0 -38
  214. package/src/capabilities/markdown.ts +0 -23
  215. package/src/capabilities/react-surface.tsx +0 -40
@@ -16,6 +16,7 @@ test.describe('plugin-sheet', () => {
16
16
  test.beforeEach(async ({ browser }) => {
17
17
  const setup = await setupPage(browser, {
18
18
  url: storybookUrl('plugins-plugin-sheet-sheetcontainer--spec', 9005),
19
+ viewportSize: { width: 1280, height: 720 },
19
20
  });
20
21
  page = setup.page;
21
22
  sheet = new SheetManager(page);
@@ -22,7 +22,7 @@ import { Function } from '@dxos/functions';
22
22
  describe('test', () => {
23
23
  test('test', async () => {
24
24
  const client = new Client();
25
- client.addTypes([Function.Function]);
25
+ await client.addTypes([Function.Function]);
26
26
  await client.initialize();
27
27
  await client.halo.createIdentity();
28
28
 
package/src/serializer.ts CHANGED
@@ -3,8 +3,8 @@
3
3
  //
4
4
 
5
5
  import { Obj } from '@dxos/echo';
6
+ import { getObjectCore } from '@dxos/echo-db';
6
7
  import { type TypedObjectSerializer } from '@dxos/plugin-space/types';
7
- import { getObjectCore } from '@dxos/react-client/echo';
8
8
 
9
9
  import { Sheet } from './types';
10
10
 
@@ -18,6 +18,7 @@ export const translations = [
18
18
  'object name placeholder': 'New sheet',
19
19
  'rename object label': 'Rename sheet',
20
20
  'delete object label': 'Delete sheet',
21
+ 'object deleted label': 'Sheet deleted',
21
22
  },
22
23
  [meta.id]: {
23
24
  'plugin name': 'Sheets',
@@ -6,7 +6,7 @@ import * as Schema from 'effect/Schema';
6
6
 
7
7
  import { addressFromA1Notation, isFormula } from '@dxos/compute';
8
8
  import { Obj, Type } from '@dxos/echo';
9
- import { FormAnnotation } from '@dxos/echo/internal';
9
+ import { FormInputAnnotation } from '@dxos/echo/internal';
10
10
 
11
11
  import { addressToIndex, initialize, mapFormulaRefsToIndices } from './util';
12
12
 
@@ -44,33 +44,24 @@ export const Sheet = Schema.Struct({
44
44
  name: Schema.optional(Schema.String),
45
45
 
46
46
  // Sparse map of cells referenced by index.
47
- cells: Schema.Record({ key: Schema.String, value: Schema.mutable(CellValue) }).pipe(
48
- Schema.mutable,
49
- FormAnnotation.set(false),
50
- ),
47
+ cells: Schema.Record({ key: Schema.String, value: CellValue }).pipe(FormInputAnnotation.set(false)),
51
48
 
52
49
  // Ordered row indices.
53
- rows: Schema.Array(Schema.String).pipe(Schema.mutable, FormAnnotation.set(false)),
50
+ rows: Schema.Array(Schema.String).pipe(FormInputAnnotation.set(false)),
54
51
 
55
52
  // Ordered column indices.
56
- columns: Schema.Array(Schema.String).pipe(Schema.mutable, FormAnnotation.set(false)),
53
+ columns: Schema.Array(Schema.String).pipe(FormInputAnnotation.set(false)),
57
54
 
58
55
  // Row metadata referenced by index.
59
- rowMeta: Schema.Record({ key: Schema.String, value: Schema.mutable(RowColumnMeta) }).pipe(
60
- Schema.mutable,
61
- FormAnnotation.set(false),
62
- ),
56
+ rowMeta: Schema.Record({ key: Schema.String, value: RowColumnMeta }).pipe(FormInputAnnotation.set(false)),
63
57
 
64
58
  // Column metadata referenced by index.
65
- columnMeta: Schema.Record({ key: Schema.String, value: Schema.mutable(RowColumnMeta) }).pipe(
66
- Schema.mutable,
67
- FormAnnotation.set(false),
68
- ),
59
+ columnMeta: Schema.Record({ key: Schema.String, value: RowColumnMeta }).pipe(FormInputAnnotation.set(false)),
69
60
 
70
61
  // Cell formatting referenced by indexed range.
71
- ranges: Schema.Array(Range).pipe(Schema.mutable, FormAnnotation.set(false)),
62
+ ranges: Schema.Array(Range).pipe(FormInputAnnotation.set(false)),
72
63
  }).pipe(
73
- Type.Obj({
64
+ Type.object({
74
65
  typename: 'dxos.org/type/Sheet',
75
66
  version: '0.1.0',
76
67
  }),
@@ -86,18 +77,21 @@ export type SheetProps = {
86
77
  export const make = ({ name, cells = {}, ...size }: SheetProps = {}) => {
87
78
  const sheet = Obj.make(Sheet, { name, cells: {}, rows: [], columns: [], rowMeta: {}, columnMeta: {}, ranges: [] });
88
79
 
89
- initialize(sheet, size);
90
-
91
- if (cells) {
92
- Object.entries(cells).forEach(([key, { value }]) => {
93
- const idx = addressToIndex(sheet, addressFromA1Notation(key));
94
- if (isFormula(value)) {
95
- value = mapFormulaRefsToIndices(sheet, value);
96
- }
97
-
98
- sheet.cells[idx] = { value };
99
- });
100
- }
80
+ // Initialize and set cells within Obj.change to satisfy change context requirements.
81
+ Obj.change(sheet, (s) => {
82
+ initialize(s, size);
83
+
84
+ if (cells) {
85
+ Object.entries(cells).forEach(([key, { value }]) => {
86
+ const idx = addressToIndex(s, addressFromA1Notation(key));
87
+ if (isFormula(value)) {
88
+ value = mapFormulaRefsToIndices(s, value);
89
+ }
90
+
91
+ s.cells[idx] = { value };
92
+ });
93
+ }
94
+ });
101
95
 
102
96
  return sheet;
103
97
  };
@@ -2,13 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { defineCapability } from '@dxos/app-framework';
5
+ import { Capability } from '@dxos/app-framework';
6
6
  import { type ComputeGraphRegistry } from '@dxos/compute';
7
7
 
8
8
  import { meta } from '../meta';
9
9
 
10
10
  export namespace SheetCapabilities {
11
- export const ComputeGraphRegistry = defineCapability<ComputeGraphRegistry>(
11
+ export const ComputeGraphRegistry = Capability.make<ComputeGraphRegistry>(
12
12
  `${meta.id}/capability/compute-graph-registry`,
13
13
  );
14
14
  }
@@ -2,6 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ export * from './capabilities';
5
6
  export * as Sheet from './Sheet';
6
7
  export * from './sheet-range-types';
7
8
  export * from './types';
@@ -4,39 +4,21 @@
4
4
 
5
5
  import * as Schema from 'effect/Schema';
6
6
 
7
+ import { Capability } from '@dxos/app-framework';
8
+ import { Operation } from '@dxos/operation';
9
+ import { SpaceSchema } from '@dxos/react-client/echo';
10
+ import { Collection } from '@dxos/schema';
11
+
7
12
  import { meta } from '../meta';
8
- import { SheetModel } from '../model';
9
13
 
10
14
  import * as Sheet from './Sheet';
11
15
 
12
- export namespace SheetAction {
13
- const SHEET_ACTION = `${meta.id}/action`;
14
-
15
- export class Create extends Schema.TaggedClass<Create>()(`${SHEET_ACTION}/create`, {
16
- input: Schema.Struct({
17
- name: Schema.optional(Schema.String),
18
- }),
19
- output: Schema.Struct({
20
- object: Sheet.Sheet,
21
- }),
22
- }) {}
23
-
24
- // TODO(wittjosiah): Factor out. This is `DxGridAxis` from `@dxos/react-ui-grid`.
25
- const Axis = Schema.Union(Schema.Literal('row'), Schema.Literal('col'));
26
-
27
- export class InsertAxis extends Schema.TaggedClass<InsertAxis>()(`${SHEET_ACTION}/axis-insert`, {
28
- input: Schema.Struct({
29
- // TODO(wittjosiah): Schema.instanceOf(SheetModel) throws when running tests.
30
- model: Schema.Any.pipe(Schema.filter((model) => model instanceof SheetModel)) as Schema.Schema<SheetModel>,
31
- axis: Axis,
32
- index: Schema.Number,
33
- count: Schema.optional(Schema.Number),
34
- }),
35
- output: Schema.Void,
36
- }) {}
16
+ // TODO(wittjosiah): Factor out. This is `DxGridAxis` from `@dxos/react-ui-grid`.
17
+ const ActionAxis = Schema.Union(Schema.Literal('row'), Schema.Literal('col'));
37
18
 
19
+ export namespace SheetAction {
38
20
  export const RestoreAxis = Schema.Struct({
39
- axis: Axis,
21
+ axis: ActionAxis,
40
22
  axisIndex: Schema.String,
41
23
  index: Schema.Number,
42
24
  axisMeta: Sheet.RowColumnMeta,
@@ -44,15 +26,77 @@ export namespace SheetAction {
44
26
  });
45
27
 
46
28
  export type RestoreAxis = Schema.Schema.Type<typeof RestoreAxis>;
29
+ }
30
+
31
+ const SHEET_OPERATION = `${meta.id}/operation`;
32
+
33
+ // TODO(wittjosiah): Factor out. This is `DxGridAxis` from `@dxos/react-ui-grid`.
34
+ const Axis = Schema.Union(Schema.Literal('row'), Schema.Literal('col'));
35
+
36
+ export namespace SheetOperation {
37
+ export const OnCreateSpace = Operation.make({
38
+ meta: { key: `${SHEET_OPERATION}/on-create-space`, name: 'On Create Space' },
39
+ services: [Capability.Service],
40
+ schema: {
41
+ input: Schema.Struct({
42
+ space: SpaceSchema,
43
+ rootCollection: Collection.Collection,
44
+ isDefault: Schema.optional(Schema.Boolean),
45
+ }),
46
+ output: Schema.Void,
47
+ },
48
+ });
47
49
 
48
- export class DropAxis extends Schema.TaggedClass<DropAxis>()(`${SHEET_ACTION}/axis-drop`, {
49
- input: Schema.Struct({
50
- // TODO(wittjosiah): Schema.instanceOf(SheetModel) throws when running tests.
51
- model: Schema.Any.pipe(Schema.filter((model) => model instanceof SheetModel)) as Schema.Schema<SheetModel>,
52
- axis: Axis,
53
- axisIndex: Schema.String,
54
- deletionData: Schema.optional(RestoreAxis),
55
- }),
56
- output: Schema.Void,
57
- }) {}
50
+ export const InsertAxis = Operation.make({
51
+ meta: { key: `${SHEET_OPERATION}/axis-insert`, name: 'Insert Axis' },
52
+ schema: {
53
+ input: Schema.Struct({
54
+ model: Schema.Any,
55
+ axis: Axis,
56
+ index: Schema.Number,
57
+ count: Schema.optional(Schema.Number),
58
+ }),
59
+ output: Schema.Void,
60
+ },
61
+ });
62
+
63
+ export const DropAxisOutput = Schema.Struct({
64
+ axis: Axis.annotations({ description: 'The axis type (row or col).' }),
65
+ axisIndex: Schema.String.annotations({ description: 'The dropped axis index.' }),
66
+ index: Schema.Number.annotations({ description: 'The position the axis was at.' }),
67
+ axisMeta: Schema.Any.annotations({ description: 'The row/column metadata.' }),
68
+ values: Schema.Array(Schema.Any).annotations({ description: 'The cell values that were dropped.' }),
69
+ });
70
+
71
+ export type DropAxisOutput = Schema.Schema.Type<typeof DropAxisOutput>;
72
+
73
+ export const DropAxis = Operation.make({
74
+ meta: { key: `${SHEET_OPERATION}/axis-drop`, name: 'Drop Axis' },
75
+ schema: {
76
+ input: Schema.Struct({
77
+ model: Schema.Any,
78
+ axis: Axis,
79
+ axisIndex: Schema.String,
80
+ }),
81
+ output: DropAxisOutput,
82
+ },
83
+ });
84
+
85
+ /**
86
+ * Restore a dropped axis (inverse of DropAxis).
87
+ */
88
+ export const RestoreAxis = Operation.make({
89
+ meta: { key: `${SHEET_OPERATION}/restore-axis`, name: 'Restore Axis' },
90
+ schema: {
91
+ input: Schema.Struct({
92
+ model: Schema.Any.annotations({ description: 'The sheet model.' }),
93
+ axis: Axis.annotations({ description: 'The axis type (row or col).' }),
94
+ axisIndex: Schema.String.annotations({ description: 'The axis index to restore.' }),
95
+ index: Schema.Number.annotations({ description: 'The position to restore at.' }),
96
+ axisMeta: Schema.Any.annotations({ description: 'The row/column metadata.' }),
97
+ values: Schema.Array(Schema.Any).annotations({ description: 'The cell values to restore.' }),
98
+ }),
99
+ output: Schema.Void,
100
+ },
101
+ });
58
102
  }
package/src/types/util.ts CHANGED
@@ -11,6 +11,7 @@ import {
11
11
  isFormula,
12
12
  } from '@dxos/compute';
13
13
  import { randomBytes } from '@dxos/crypto';
14
+ import { type Obj } from '@dxos/echo';
14
15
  import { invariant } from '@dxos/invariant';
15
16
 
16
17
  import { type Sheet } from '../types';
@@ -55,7 +56,7 @@ export const insertIndices = (indices: string[], i: number, n: number, max: numb
55
56
  };
56
57
 
57
58
  export const initialize = (
58
- sheet: Sheet.Sheet,
59
+ sheet: Obj.Mutable<Sheet.Sheet>,
59
60
  { rows = DEFAULT_ROWS, columns = DEFAULT_COLS }: Partial<Sheet.SheetSize> = {},
60
61
  ) => {
61
62
  if (!sheet.rows.length) {
@@ -1,349 +0,0 @@
1
- import {
2
- GridSheet,
3
- SheetProvider,
4
- useComputeGraph,
5
- useSheetContext
6
- } from "./chunk-LS6D4GG7.mjs";
7
- import {
8
- alignKey,
9
- mapFormulaIndicesToRefs,
10
- rangeFromIndex,
11
- rangeToIndex
12
- } from "./chunk-DVJ3QW3F.mjs";
13
- import "./chunk-7VEWYJJN.mjs";
14
- import {
15
- meta
16
- } from "./chunk-FWFAAGXL.mjs";
17
-
18
- // src/components/SheetContainer/SheetContainer.tsx
19
- import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
20
- import React3 from "react";
21
- import { fullyQualifiedId } from "@dxos/react-client/echo";
22
- import { StackItem } from "@dxos/react-ui-stack";
23
-
24
- // src/components/FunctionEditor/FunctionEditor.tsx
25
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
26
- import React from "react";
27
- import { addressToA1Notation, isFormula, rangeToA1Notation } from "@dxos/compute";
28
- import { Icon } from "@dxos/react-ui";
29
- var FunctionEditor = () => {
30
- var _effect = _useSignals();
31
- try {
32
- const { model, cursor, range } = useSheetContext();
33
- let value;
34
- let formula = false;
35
- if (cursor) {
36
- value = model.getCellValue(cursor);
37
- if (isFormula(value)) {
38
- value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));
39
- formula = true;
40
- } else if (value != null) {
41
- value = String(value);
42
- }
43
- }
44
- return /* @__PURE__ */ React.createElement("div", {
45
- className: "flex shrink-0 justify-between items-center px-4 py-1 text-sm bg-toolbarSurface border-bs !border-subduedSeparator"
46
- }, /* @__PURE__ */ React.createElement("div", {
47
- className: "flex gap-4 items-center"
48
- }, /* @__PURE__ */ React.createElement("div", {
49
- className: "flex w-16 items-center font-mono"
50
- }, range && rangeToA1Notation(range) || cursor && addressToA1Notation(cursor)), /* @__PURE__ */ React.createElement("div", {
51
- className: "flex gap-2 items-center"
52
- }, /* @__PURE__ */ React.createElement(Icon, {
53
- icon: "ph--function--regular",
54
- classNames: [
55
- "text-greenText",
56
- formula ? "visible" : "invisible"
57
- ]
58
- }), /* @__PURE__ */ React.createElement("span", {
59
- className: "font-mono"
60
- }, value))));
61
- } finally {
62
- _effect.f();
63
- }
64
- };
65
-
66
- // src/components/SheetToolbar/SheetToolbar.tsx
67
- import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
68
- import { Rx } from "@effect-rx/rx-react";
69
- import React2, { useMemo as useMemo2 } from "react";
70
- import { useAppGraph } from "@dxos/app-framework";
71
- import { MenuProvider, ToolbarMenu, createGapSeparator, rxFromSignal, useMenuActions } from "@dxos/react-ui-menu";
72
-
73
- // src/components/SheetToolbar/align.ts
74
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
75
- import { useEffect } from "react";
76
- import { inRange } from "@dxos/compute";
77
- import { createMenuAction, createMenuItemGroup } from "@dxos/react-ui-menu";
78
- var aligns = {
79
- start: "ph--text-align-left--regular",
80
- center: "ph--text-align-center--regular",
81
- end: "ph--text-align-right--regular"
82
- };
83
- var useAlignState = (state) => {
84
- var _effect = _useSignals2();
85
- try {
86
- const { cursor, model } = useSheetContext();
87
- useEffect(() => {
88
- state[alignKey] = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor))?.value : void 0;
89
- }, [
90
- cursor,
91
- model.sheet
92
- ]);
93
- } finally {
94
- _effect.f();
95
- }
96
- };
97
- var createAlignGroupAction = (value) => createMenuItemGroup("align", {
98
- label: [
99
- "align label",
100
- {
101
- ns: meta.id
102
- }
103
- ],
104
- variant: "toggleGroup",
105
- selectCardinality: "single",
106
- value: `${alignKey}--${value}`
107
- });
108
- var createAlignActions = (model, state, cursorFallbackRange) => Object.entries(aligns).map(([alignValue, icon]) => {
109
- return createMenuAction(`${alignKey}--${alignValue}`, () => {
110
- if (!cursorFallbackRange) {
111
- return;
112
- }
113
- const index = model.sheet.ranges?.findIndex((range) => range.key === alignKey && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
114
- const nextRangeEntity = {
115
- range: rangeToIndex(model.sheet, cursorFallbackRange),
116
- key: alignKey,
117
- value: alignValue
118
- };
119
- if (index < 0) {
120
- model.sheet.ranges?.push(nextRangeEntity);
121
- state[alignKey] = nextRangeEntity.value;
122
- } else if (model.sheet.ranges[index].value === nextRangeEntity.value) {
123
- model.sheet.ranges?.splice(index, 1);
124
- state[alignKey] = void 0;
125
- } else {
126
- model.sheet.ranges?.splice(index, 1, nextRangeEntity);
127
- state[alignKey] = nextRangeEntity.value;
128
- }
129
- }, {
130
- key: alignKey,
131
- value: alignValue,
132
- checked: state[alignKey] === alignValue,
133
- label: [
134
- `range value ${alignValue} label`,
135
- {
136
- ns: meta.id
137
- }
138
- ],
139
- icon,
140
- testId: `grid.toolbar.${alignKey}.${alignValue}`
141
- });
142
- });
143
- var createAlign = (model, state, cursorFallbackRange) => {
144
- const alignGroup = createAlignGroupAction(state[alignKey]);
145
- const alignActions = createAlignActions(model, state, cursorFallbackRange);
146
- return {
147
- nodes: [
148
- alignGroup,
149
- ...alignActions
150
- ],
151
- edges: [
152
- {
153
- source: "root",
154
- target: "align"
155
- },
156
- ...alignActions.map(({ id }) => ({
157
- source: alignGroup.id,
158
- target: id
159
- }))
160
- ]
161
- };
162
- };
163
-
164
- // src/components/SheetToolbar/style.ts
165
- import { useEffect as useEffect2 } from "react";
166
- import { inRange as inRange2 } from "@dxos/compute";
167
- import { createMenuAction as createMenuAction2, createMenuItemGroup as createMenuItemGroup2 } from "@dxos/react-ui-menu";
168
- var styles = {
169
- highlight: "ph--highlighter--regular",
170
- softwrap: "ph--paragraph--regular"
171
- };
172
- var useStyleState = (state) => {
173
- const { cursorFallbackRange, model } = useSheetContext();
174
- useEffect2(() => {
175
- state.highlight = false;
176
- state.softwrap = false;
177
- if (cursorFallbackRange && model.sheet.ranges) {
178
- model.sheet.ranges.filter(({ range, key }) => key === "style" && inRange2(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).forEach(({ value }) => {
179
- state[value] = true;
180
- });
181
- }
182
- }, [
183
- cursorFallbackRange,
184
- model.sheet
185
- ]);
186
- };
187
- var createStyleGroup = (state) => {
188
- return createMenuItemGroup2("style", {
189
- variant: "toggleGroup",
190
- selectCardinality: "multiple",
191
- value: Object.keys(styles).filter((key) => !!state[key]).map((styleValue) => `style--${styleValue}`)
192
- });
193
- };
194
- var createStyleActions = (model, state, cursorFallbackRange) => Object.entries(styles).map(([styleValue, icon]) => {
195
- return createMenuAction2(`style--${styleValue}`, () => {
196
- if (!cursorFallbackRange) {
197
- return;
198
- }
199
- const index = model.sheet.ranges?.findIndex((range) => range.key === "style" && inRange2(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
200
- const nextRangeEntity = {
201
- range: rangeToIndex(model.sheet, cursorFallbackRange),
202
- key: "style",
203
- value: styleValue
204
- };
205
- if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && inRange2(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).some(({ value: rangeValue }) => rangeValue === styleValue)) {
206
- if (index >= 0) {
207
- model.sheet.ranges?.splice(index, 1);
208
- }
209
- state[nextRangeEntity.value] = false;
210
- } else {
211
- model.sheet.ranges?.push(nextRangeEntity);
212
- state[nextRangeEntity.value] = true;
213
- }
214
- }, {
215
- key: "style",
216
- value: styleValue,
217
- icon,
218
- label: [
219
- `range value ${styleValue} label`,
220
- {
221
- ns: meta.id
222
- }
223
- ],
224
- checked: !!state[styleValue]
225
- });
226
- });
227
- var createStyle = (model, state, cursorFallbackRange) => {
228
- const styleGroupAction = createStyleGroup(state);
229
- const styleActions = createStyleActions(model, state, cursorFallbackRange);
230
- return {
231
- nodes: [
232
- styleGroupAction,
233
- ...styleActions
234
- ],
235
- edges: [
236
- {
237
- source: "root",
238
- target: "style"
239
- },
240
- ...styleActions.map(({ id }) => ({
241
- source: styleGroupAction.id,
242
- target: id
243
- }))
244
- ]
245
- };
246
- };
247
-
248
- // src/components/SheetToolbar/useToolbarState.ts
249
- import { useMemo } from "react";
250
- import { live } from "@dxos/live-object";
251
- var useToolbarState = (initialState = {}) => {
252
- return useMemo(() => live(initialState), []);
253
- };
254
-
255
- // src/components/SheetToolbar/SheetToolbar.tsx
256
- var createToolbarActions = (model, state, cursorFallbackRange, customActions) => {
257
- return Rx.make((get) => {
258
- const align = get(rxFromSignal(() => createAlign(model, state, cursorFallbackRange)));
259
- const style = get(rxFromSignal(() => createStyle(model, state, cursorFallbackRange)));
260
- const gap = createGapSeparator();
261
- const graph = {
262
- nodes: [
263
- ...align.nodes,
264
- ...style.nodes,
265
- ...gap.nodes
266
- ],
267
- edges: [
268
- ...align.edges,
269
- ...style.edges,
270
- ...gap.edges
271
- ]
272
- };
273
- if (customActions) {
274
- const custom = get(customActions);
275
- graph.nodes.push(...custom.nodes);
276
- graph.edges.push(...custom.edges);
277
- }
278
- return graph;
279
- });
280
- };
281
- var SheetToolbar = ({ id }) => {
282
- var _effect = _useSignals3();
283
- try {
284
- const { model, cursorFallbackRange } = useSheetContext();
285
- const state = useToolbarState({});
286
- useAlignState(state);
287
- useStyleState(state);
288
- const { graph } = useAppGraph();
289
- const customActions = useMemo2(() => {
290
- return Rx.make((get) => {
291
- const actions = get(graph.actions(id));
292
- const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
293
- return {
294
- nodes,
295
- edges: nodes.map((node) => ({
296
- source: "root",
297
- target: node.id
298
- }))
299
- };
300
- });
301
- }, [
302
- graph
303
- ]);
304
- const actionsCreator = useMemo2(() => createToolbarActions(model, state, cursorFallbackRange, customActions), [
305
- model,
306
- state,
307
- cursorFallbackRange,
308
- customActions
309
- ]);
310
- const menu = useMenuActions(actionsCreator);
311
- return /* @__PURE__ */ React2.createElement(MenuProvider, {
312
- ...menu,
313
- attendableId: id
314
- }, /* @__PURE__ */ React2.createElement(ToolbarMenu, null));
315
- } finally {
316
- _effect.f();
317
- }
318
- };
319
-
320
- // src/components/SheetContainer/SheetContainer.tsx
321
- var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
322
- var _effect = _useSignals4();
323
- try {
324
- const graph = useComputeGraph(space);
325
- return graph ? /* @__PURE__ */ React3.createElement(SheetProvider, {
326
- sheet,
327
- graph,
328
- ignoreAttention
329
- }, /* @__PURE__ */ React3.createElement(StackItem.Content, {
330
- toolbar: true,
331
- statusbar: true,
332
- classNames: [
333
- role === "section" && "aspect-video",
334
- role === "story" && "bs-full"
335
- ]
336
- }, /* @__PURE__ */ React3.createElement(SheetToolbar, {
337
- id: fullyQualifiedId(sheet)
338
- }), /* @__PURE__ */ React3.createElement(GridSheet, null), /* @__PURE__ */ React3.createElement(FunctionEditor, null))) : null;
339
- } finally {
340
- _effect.f();
341
- }
342
- };
343
-
344
- // src/components/SheetContainer/index.ts
345
- var SheetContainer_default = SheetContainer;
346
- export {
347
- SheetContainer_default as default
348
- };
349
- //# sourceMappingURL=SheetContainer-GTINUSNB.mjs.map