@dxos/plugin-sheet 0.7.5-main.9d26e3a → 0.7.5-main.9d2a38b

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 (191) 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-A374JPWV.mjs → chunk-H23JW3DX.mjs} +139 -381
  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-Q4XS4YWF.mjs → chunk-T3IVPMRX.mjs} +2 -2
  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 -218
  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 +2 -2
  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-TQOJ7DG2.cjs → chunk-E3RXOEL6.cjs} +6 -6
  32. package/dist/lib/node/chunk-E3RXOEL6.cjs.map +7 -0
  33. package/dist/lib/node/{meta.cjs → chunk-FU5K66DS.cjs} +12 -8
  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-FDEQ2PGJ.cjs → chunk-ZPWW4LPY.cjs} +181 -419
  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 -215
  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/thread-VBPS23P2.cjs +32 -0
  55. package/dist/lib/node/thread-VBPS23P2.cjs.map +7 -0
  56. package/dist/lib/node/types/index.cjs +30 -30
  57. package/dist/lib/node/types/index.cjs.map +1 -1
  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-NYYIDVR7.mjs → chunk-NSVUOAI6.mjs} +2 -2
  65. package/dist/lib/node-esm/chunk-NSVUOAI6.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-L5PQHVTX.mjs → chunk-OXD6RBFF.mjs} +139 -381
  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 -218
  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 +2 -2
  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/GridSheet/GridSheet.stories.d.ts.map +1 -1
  105. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  106. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +7 -0
  108. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -0
  109. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts +6 -0
  110. package/dist/types/src/components/SheetToolbar/SheetToolbar.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/SheetToolbar/align.d.ts +28 -0
  112. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -0
  113. package/dist/types/src/components/SheetToolbar/comment.d.ts +23 -0
  114. package/dist/types/src/components/SheetToolbar/comment.d.ts.map +1 -0
  115. package/dist/types/src/components/SheetToolbar/index.d.ts +2 -0
  116. package/dist/types/src/components/SheetToolbar/index.d.ts.map +1 -0
  117. package/dist/types/src/components/SheetToolbar/style.d.ts +26 -0
  118. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -0
  119. package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts +8 -0
  120. package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts.map +1 -0
  121. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +6 -0
  122. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -0
  123. package/dist/types/src/components/index.d.ts +1 -2
  124. package/dist/types/src/components/index.d.ts.map +1 -1
  125. package/dist/types/src/index.d.ts +2 -3
  126. package/dist/types/src/index.d.ts.map +1 -1
  127. package/dist/types/src/meta.d.ts +1 -2
  128. package/dist/types/src/meta.d.ts.map +1 -1
  129. package/dist/types/src/testing/testing.d.ts +1 -1
  130. package/dist/types/src/testing/testing.d.ts.map +1 -1
  131. package/dist/types/src/types/sheet-range-types.d.ts +1 -1
  132. package/dist/types/src/types/sheet-range-types.d.ts.map +1 -1
  133. package/dist/types/src/types/types.d.ts +0 -11
  134. package/dist/types/src/types/types.d.ts.map +1 -1
  135. package/dist/types/tsconfig.tsbuildinfo +1 -1
  136. package/package.json +44 -51
  137. package/src/SheetPlugin.tsx +68 -103
  138. package/src/capabilities/capabilities.ts +14 -0
  139. package/src/capabilities/compute-graph-registry.ts +25 -0
  140. package/src/capabilities/index.ts +14 -0
  141. package/src/capabilities/intent-resolver.ts +29 -0
  142. package/src/capabilities/markdown.ts +22 -0
  143. package/src/capabilities/react-context.tsx +20 -0
  144. package/src/capabilities/react-surface.tsx +30 -0
  145. package/src/capabilities/thread.ts +14 -0
  146. package/src/components/GridSheet/GridSheet.stories.tsx +2 -0
  147. package/src/components/SheetContainer/SheetContainer.stories.tsx +25 -22
  148. package/src/components/SheetContainer/SheetContainer.tsx +3 -8
  149. package/src/components/{Toolbar/Toolbar.stories.tsx → SheetToolbar/SheetToolbar.stories.tsx} +4 -8
  150. package/src/components/SheetToolbar/SheetToolbar.tsx +48 -0
  151. package/src/components/SheetToolbar/align.ts +68 -0
  152. package/src/components/SheetToolbar/comment.ts +56 -0
  153. package/src/components/{Toolbar → SheetToolbar}/index.ts +1 -1
  154. package/src/components/SheetToolbar/style.ts +72 -0
  155. package/src/components/SheetToolbar/useToolbarAction.ts +87 -0
  156. package/src/components/SheetToolbar/useToolbarState.ts +17 -0
  157. package/src/components/index.ts +0 -1
  158. package/src/index.ts +2 -5
  159. package/src/meta.ts +1 -1
  160. package/src/types/sheet-range-types.ts +1 -1
  161. package/src/types/types.ts +0 -26
  162. package/dist/lib/browser/SheetContainer-S4NCLUYL.mjs +0 -290
  163. package/dist/lib/browser/SheetContainer-S4NCLUYL.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-A374JPWV.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-Q4XS4YWF.mjs.map +0 -7
  166. package/dist/lib/browser/chunk-RABELMEQ.mjs.map +0 -7
  167. package/dist/lib/browser/meta.mjs +0 -9
  168. package/dist/lib/browser/meta.mjs.map +0 -7
  169. package/dist/lib/node/SheetContainer-TP4GYXZB.cjs +0 -296
  170. package/dist/lib/node/SheetContainer-TP4GYXZB.cjs.map +0 -7
  171. package/dist/lib/node/chunk-2ZVZI2KJ.cjs.map +0 -7
  172. package/dist/lib/node/chunk-FDEQ2PGJ.cjs.map +0 -7
  173. package/dist/lib/node/chunk-TQOJ7DG2.cjs.map +0 -7
  174. package/dist/lib/node/meta.cjs.map +0 -7
  175. package/dist/lib/node-esm/SheetContainer-YB3JBVPZ.mjs +0 -291
  176. package/dist/lib/node-esm/SheetContainer-YB3JBVPZ.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-BM2Q3FFC.mjs.map +0 -7
  178. package/dist/lib/node-esm/chunk-L5PQHVTX.mjs.map +0 -7
  179. package/dist/lib/node-esm/chunk-NYYIDVR7.mjs.map +0 -7
  180. package/dist/lib/node-esm/meta.mjs +0 -10
  181. package/dist/lib/node-esm/meta.mjs.map +0 -7
  182. package/dist/types/src/components/SheetObjectSettings.d.ts +0 -7
  183. package/dist/types/src/components/SheetObjectSettings.d.ts.map +0 -1
  184. package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -48
  185. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
  186. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +0 -7
  187. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +0 -1
  188. package/dist/types/src/components/Toolbar/index.d.ts +0 -2
  189. package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
  190. package/src/components/SheetObjectSettings.tsx +0 -38
  191. package/src/components/Toolbar/Toolbar.tsx +0 -344
package/src/index.ts CHANGED
@@ -2,9 +2,6 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { SheetPlugin } from './SheetPlugin';
6
-
7
- export * from './types';
5
+ export { SheetCapabilities } from './capabilities';
6
+ export * from './meta';
8
7
  export * from './SheetPlugin';
9
-
10
- export default SheetPlugin;
package/src/meta.ts CHANGED
@@ -6,7 +6,7 @@ import { type PluginMeta } from '@dxos/app-framework';
6
6
 
7
7
  export const SHEET_PLUGIN = 'dxos.org/plugin/sheet';
8
8
 
9
- export default {
9
+ export const meta = {
10
10
  id: SHEET_PLUGIN,
11
11
  name: 'Sheet',
12
12
  description: 'A simple spreadsheet plugin.',
@@ -8,7 +8,7 @@ import { type SheetType } from '../types';
8
8
 
9
9
  export const alignKey = 'alignment';
10
10
  export type AlignKey = typeof alignKey;
11
- export type AlignValue = 'start' | 'center' | 'end' | 'unset';
11
+ export type AlignValue = 'start' | 'center' | 'end';
12
12
 
13
13
  export const commentKey = 'comment';
14
14
  export type CommentKey = typeof commentKey;
@@ -2,38 +2,12 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import type {
6
- IntentResolverProvides,
7
- MetadataRecordsProvides,
8
- SurfaceProvides,
9
- TranslationsProvides,
10
- } from '@dxos/app-framework';
11
5
  import { S } from '@dxos/echo-schema';
12
- import { type MarkdownExtensionProvides } from '@dxos/plugin-markdown';
13
- import { type SchemaProvides } from '@dxos/plugin-space';
14
6
 
15
7
  import { type CellValue, RowColumnMeta, SheetType } from './schema';
16
8
  import { SHEET_PLUGIN } from '../meta';
17
9
  import { SheetModel } from '../model';
18
10
 
19
- // TODO(Zan): Move this to the plugin-space plugin or another common location
20
- // when we implement comments in sheets.
21
- // This is currently duplicated in a few places.
22
- type ThreadProvides<T> = {
23
- thread: {
24
- predicate: (obj: any) => obj is T;
25
- createSort: (obj: T) => (anchorA: string | undefined, anchorB: string | undefined) => number;
26
- };
27
- };
28
-
29
- export type SheetPluginProvides = SurfaceProvides &
30
- IntentResolverProvides &
31
- MarkdownExtensionProvides &
32
- MetadataRecordsProvides &
33
- TranslationsProvides &
34
- SchemaProvides &
35
- ThreadProvides<SheetType>;
36
-
37
11
  export type SheetSize = {
38
12
  rows: number;
39
13
  columns: number;
@@ -1,290 +0,0 @@
1
- import {
2
- GridSheet,
3
- SheetProvider,
4
- completeCellRangeToThreadCursor,
5
- useComputeGraph,
6
- useSheetContext
7
- } from "./chunk-A374JPWV.mjs";
8
- import {
9
- alignKey,
10
- mapFormulaIndicesToRefs,
11
- rangeFromIndex,
12
- rangeToIndex,
13
- styleKey
14
- } from "./chunk-Q4XS4YWF.mjs";
15
- import {
16
- SHEET_PLUGIN
17
- } from "./chunk-RABELMEQ.mjs";
18
-
19
- // packages/plugins/plugin-sheet/src/components/SheetContainer/SheetContainer.tsx
20
- import React3 from "react";
21
- import { StackItem } from "@dxos/react-ui-stack";
22
-
23
- // packages/plugins/plugin-sheet/src/components/FunctionEditor/FunctionEditor.tsx
24
- import React from "react";
25
- import { addressToA1Notation, isFormula, rangeToA1Notation } from "@dxos/compute";
26
- import { Icon } from "@dxos/react-ui";
27
- var FunctionEditor = () => {
28
- const { model, cursor, range } = useSheetContext();
29
- let value;
30
- let formula = false;
31
- if (cursor) {
32
- value = model.getCellValue(cursor);
33
- if (isFormula(value)) {
34
- value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));
35
- formula = true;
36
- } else if (value != null) {
37
- value = String(value);
38
- }
39
- }
40
- return /* @__PURE__ */ React.createElement("div", {
41
- className: "flex shrink-0 justify-between items-center px-4 py-1 text-sm attention-surface border-bs !border-separator"
42
- }, /* @__PURE__ */ React.createElement("div", {
43
- className: "flex gap-4 items-center"
44
- }, /* @__PURE__ */ React.createElement("div", {
45
- className: "flex w-16 items-center font-mono"
46
- }, range && rangeToA1Notation(range) || cursor && addressToA1Notation(cursor)), /* @__PURE__ */ React.createElement("div", {
47
- className: "flex gap-2 items-center"
48
- }, /* @__PURE__ */ React.createElement(Icon, {
49
- icon: "ph--function--regular",
50
- classNames: [
51
- "text-greenText",
52
- formula ? "visible" : "invisible"
53
- ]
54
- }), /* @__PURE__ */ React.createElement("span", {
55
- className: "font-mono"
56
- }, value))));
57
- };
58
-
59
- // packages/plugins/plugin-sheet/src/components/Toolbar/Toolbar.tsx
60
- import { createContext } from "@radix-ui/react-context";
61
- import React2, { useCallback } from "react";
62
- import { createIntent, useIntentDispatcher } from "@dxos/app-framework";
63
- import { inRange } from "@dxos/compute";
64
- import { RefArray } from "@dxos/live-object";
65
- import { ThreadAction } from "@dxos/plugin-thread/types";
66
- import { Icon as Icon2, Toolbar as NaturalToolbar, Tooltip, useTranslation } from "@dxos/react-ui";
67
- import { useAttention } from "@dxos/react-ui-attention";
68
- var buttonStyles = "min-bs-0 p-2";
69
- var tooltipProps = {
70
- side: "bottom"
71
- };
72
- var ToolbarSeparator = () => /* @__PURE__ */ React2.createElement("div", {
73
- role: "separator",
74
- className: "grow"
75
- });
76
- var ToolbarItem = ({ itemType, icon, children, ...props }) => {
77
- const Invoker = itemType === "toggleGroupItem" ? NaturalToolbar.ToggleGroupItem : itemType === "toggle" ? NaturalToolbar.Toggle : NaturalToolbar.Button;
78
- return /* @__PURE__ */ React2.createElement(Tooltip.Root, null, /* @__PURE__ */ React2.createElement(Tooltip.Trigger, {
79
- asChild: true
80
- }, /* @__PURE__ */ React2.createElement(Invoker, {
81
- variant: "ghost",
82
- ...props,
83
- classNames: buttonStyles
84
- }, /* @__PURE__ */ React2.createElement(Icon2, {
85
- icon,
86
- size: 5
87
- }), /* @__PURE__ */ React2.createElement("span", {
88
- className: "sr-only"
89
- }, children))), /* @__PURE__ */ React2.createElement(Tooltip.Portal, null, /* @__PURE__ */ React2.createElement(Tooltip.Content, tooltipProps, children, /* @__PURE__ */ React2.createElement(Tooltip.Arrow, null))));
90
- };
91
- var [ToolbarContextProvider, useToolbarContext] = createContext("Toolbar");
92
- var ToolbarRoot = ({ children, role, classNames }) => {
93
- const { id, model, cursorFallbackRange, cursor } = useSheetContext();
94
- const { hasAttention } = useAttention(id);
95
- const { dispatchPromise: dispatch } = useIntentDispatcher();
96
- const handleAction = useCallback((action) => {
97
- switch (action.key) {
98
- case "alignment":
99
- if (cursorFallbackRange) {
100
- const index = model.sheet.ranges?.findIndex((range) => range.key === action.key && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
101
- const nextRangeEntity = {
102
- range: rangeToIndex(model.sheet, cursorFallbackRange),
103
- key: action.key,
104
- value: action.value
105
- };
106
- if (index < 0) {
107
- model.sheet.ranges?.push(nextRangeEntity);
108
- } else if (model.sheet.ranges[index].value === action.value) {
109
- model.sheet.ranges?.splice(index, 1);
110
- } else {
111
- model.sheet.ranges?.splice(index, 1, nextRangeEntity);
112
- }
113
- }
114
- break;
115
- case "style":
116
- if (action.unset) {
117
- const index = model.sheet.ranges?.findIndex((range) => range.key === action.key && cursorFallbackRange && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from));
118
- if (index >= 0) {
119
- model.sheet.ranges?.splice(index, 1);
120
- }
121
- } else if (cursorFallbackRange) {
122
- model.sheet.ranges?.push({
123
- range: rangeToIndex(model.sheet, cursorFallbackRange),
124
- key: action.key,
125
- value: action.value
126
- });
127
- }
128
- break;
129
- case "comment": {
130
- if (cursorFallbackRange) {
131
- void dispatch(createIntent(ThreadAction.Create, {
132
- cursor: completeCellRangeToThreadCursor(cursorFallbackRange),
133
- name: action.cellContent,
134
- subject: model.sheet
135
- }));
136
- }
137
- }
138
- }
139
- }, [
140
- model.sheet,
141
- cursorFallbackRange,
142
- cursor,
143
- dispatch
144
- ]);
145
- return /* @__PURE__ */ React2.createElement(ToolbarContextProvider, {
146
- onAction: handleAction
147
- }, /* @__PURE__ */ React2.createElement(NaturalToolbar.Root, {
148
- classNames: [
149
- "pli-0.5 attention-surface",
150
- !hasAttention && "opacity-20",
151
- classNames
152
- ]
153
- }, children));
154
- };
155
- var alignmentOptions = [
156
- {
157
- value: "start",
158
- icon: "ph--text-align-left--regular"
159
- },
160
- {
161
- value: "center",
162
- icon: "ph--text-align-center--regular"
163
- },
164
- {
165
- value: "end",
166
- icon: "ph--text-align-right--regular"
167
- }
168
- ];
169
- var Alignment = () => {
170
- const { cursor, model } = useSheetContext();
171
- const { onAction } = useToolbarContext("Alignment");
172
- const { t } = useTranslation(SHEET_PLUGIN);
173
- const value = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor))?.value : void 0;
174
- return /* @__PURE__ */ React2.createElement(NaturalToolbar.ToggleGroup, {
175
- type: "single",
176
- value: (
177
- // TODO(thure): providing `undefined` leaves the last item active which was active rather than showing none.
178
- value ?? "never"
179
- ),
180
- onValueChange: (value2) => onAction?.({
181
- key: alignKey,
182
- value: value2
183
- })
184
- }, alignmentOptions.map(({ value: value2, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
185
- itemType: "toggleGroupItem",
186
- key: value2,
187
- value: value2,
188
- icon,
189
- "data-testid": `grid.toolbar.${alignKey}.${value2}`
190
- }, t("toolbar action label", {
191
- key: t(`range key ${alignKey} label`),
192
- value: t(`range value ${value2} label`)
193
- }))));
194
- };
195
- var styleOptions = [
196
- {
197
- value: "highlight",
198
- icon: "ph--highlighter--regular"
199
- },
200
- {
201
- value: "softwrap",
202
- icon: "ph--paragraph--regular"
203
- }
204
- ];
205
- var Styles = () => {
206
- const { cursorFallbackRange, model } = useSheetContext();
207
- const { onAction } = useToolbarContext("Styles");
208
- const { t } = useTranslation(SHEET_PLUGIN);
209
- const activeValues = cursorFallbackRange ? model.sheet.ranges?.filter(({ range, key }) => key === "style" && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from)).reduce((acc, { value }) => {
210
- acc.add(value);
211
- return acc;
212
- }, /* @__PURE__ */ new Set()) : void 0;
213
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, styleOptions.map(({ value, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
214
- itemType: "toggle",
215
- key: value,
216
- pressed: activeValues?.has(value),
217
- onPressedChange: (nextPressed) => {
218
- onAction?.({
219
- key: "style",
220
- value,
221
- unset: !nextPressed
222
- });
223
- },
224
- icon
225
- }, t("toolbar action label", {
226
- key: t(`range key ${styleKey} label`),
227
- value: t(`range value ${value} label`)
228
- }))));
229
- };
230
- var Actions = () => {
231
- const { onAction } = useToolbarContext("Actions");
232
- const { cursorFallbackRange, cursor, model } = useSheetContext();
233
- const { t } = useTranslation(SHEET_PLUGIN);
234
- const overlapsCommentAnchor = RefArray.allResolvedTargets(model.sheet.threads ?? []).filter((thread) => thread.status !== "resolved").some((thread) => {
235
- if (!cursorFallbackRange) {
236
- return false;
237
- }
238
- return rangeToIndex(model.sheet, cursorFallbackRange) === thread.anchor;
239
- });
240
- const tooltipLabelKey = !cursor ? "no cursor label" : overlapsCommentAnchor ? "selection overlaps existing comment label" : "comment label";
241
- return /* @__PURE__ */ React2.createElement(ToolbarItem, {
242
- itemType: "button",
243
- value: "comment",
244
- icon: "ph--chat-text--regular",
245
- "data-testid": "editor.toolbar.comment",
246
- onClick: () => {
247
- if (!cursorFallbackRange) {
248
- return;
249
- }
250
- return onAction?.({
251
- key: "comment",
252
- value: rangeToIndex(model.sheet, cursorFallbackRange),
253
- cellContent: model.getCellText(cursorFallbackRange.from)
254
- });
255
- },
256
- disabled: !cursorFallbackRange || overlapsCommentAnchor
257
- }, t(tooltipLabelKey));
258
- };
259
- var Toolbar = {
260
- Root: ToolbarRoot,
261
- Separator: ToolbarSeparator,
262
- Alignment,
263
- Styles,
264
- Actions
265
- };
266
-
267
- // packages/plugins/plugin-sheet/src/components/SheetContainer/SheetContainer.tsx
268
- var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
269
- const graph = useComputeGraph(space);
270
- return graph ? /* @__PURE__ */ React3.createElement(SheetProvider, {
271
- sheet,
272
- graph,
273
- ignoreAttention
274
- }, /* @__PURE__ */ React3.createElement(StackItem.Content, {
275
- toolbar: true,
276
- statusbar: true,
277
- ...role === "section" && {
278
- classNames: "aspect-video"
279
- }
280
- }, /* @__PURE__ */ React3.createElement(Toolbar.Root, {
281
- role
282
- }, /* @__PURE__ */ React3.createElement(Toolbar.Styles, null), /* @__PURE__ */ React3.createElement(Toolbar.Alignment, null), /* @__PURE__ */ React3.createElement(Toolbar.Separator, null), /* @__PURE__ */ React3.createElement(Toolbar.Actions, null)), /* @__PURE__ */ React3.createElement(GridSheet, null), /* @__PURE__ */ React3.createElement(FunctionEditor, null))) : null;
283
- };
284
-
285
- // packages/plugins/plugin-sheet/src/components/SheetContainer/index.ts
286
- var SheetContainer_default = SheetContainer;
287
- export {
288
- SheetContainer_default as default
289
- };
290
- //# sourceMappingURL=SheetContainer-S4NCLUYL.mjs.map
@@ -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 { type Space } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { type SheetType } from '../../types';\nimport { useComputeGraph } from '../ComputeGraph';\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider } from '../SheetContext';\nimport { Toolbar } from '../Toolbar';\n\nexport const SheetContainer = ({\n space,\n sheet,\n role,\n ignoreAttention,\n}: {\n space: Space;\n sheet: SheetType;\n role?: string;\n ignoreAttention?: boolean;\n}) => {\n const graph = useComputeGraph(space);\n\n return graph ? (\n <SheetProvider sheet={sheet} graph={graph} ignoreAttention={ignoreAttention}>\n <StackItem.Content toolbar statusbar {...(role === 'section' && { classNames: 'aspect-video' })}>\n <Toolbar.Root role={role}>\n <Toolbar.Styles />\n <Toolbar.Alignment />\n <Toolbar.Separator />\n <Toolbar.Actions />\n </Toolbar.Root>\n <GridSheet />\n <FunctionEditor />\n </StackItem.Content>\n </SheetProvider>\n ) : null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { addressToA1Notation, isFormula, rangeToA1Notation } from '@dxos/compute';\nimport { Icon } from '@dxos/react-ui';\n\nimport { mapFormulaIndicesToRefs } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let formula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (isFormula(value)) {\n value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));\n formula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div className='flex shrink-0 justify-between items-center px-4 py-1 text-sm attention-surface border-bs !border-separator'>\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', formula ? '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 } from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { inRange } from '@dxos/compute';\nimport { RefArray } from '@dxos/live-object';\nimport { ThreadAction } from '@dxos/plugin-thread/types';\nimport {\n Icon,\n type ThemedClassName,\n Toolbar as NaturalToolbar,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n type ToolbarToggleProps as NaturalToolbarToggleProps,\n Tooltip,\n useTranslation,\n} from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\n\nimport { completeCellRangeToThreadCursor } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport {\n alignKey,\n rangeFromIndex,\n rangeToIndex,\n styleKey,\n type AlignKey,\n type AlignValue,\n type CommentKey,\n type CommentValue,\n type StyleKey,\n type StyleValue,\n type SheetType,\n} 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 };\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;\nexport type ToolbarActionAnnotated = ToolbarAction & { unset?: boolean };\n\nexport type ToolbarActionType = ToolbarAction['key'];\n\nexport type ToolbarActionHandler = (action: ToolbarActionAnnotated) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n role?: string;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<{\n onAction: (action: ToolbarActionAnnotated) => void;\n}>('Toolbar');\n\ntype Range = SheetType['ranges'][number];\n\nconst ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {\n const { id, model, cursorFallbackRange, cursor } = useSheetContext();\n const { hasAttention } = useAttention(id);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n // TODO(Zan): Externalize the toolbar action handler. E.g., Toolbar/keys should both fire events.\n const handleAction = useCallback(\n (action: ToolbarActionAnnotated) => {\n switch (action.key) {\n case 'alignment':\n if (cursorFallbackRange) {\n const index =\n model.sheet.ranges?.findIndex(\n (range) =>\n range.key === action.key &&\n inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: action.key,\n value: action.value,\n };\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n } else if (model.sheet.ranges![index].value === action.value) {\n model.sheet.ranges?.splice(index, 1);\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n }\n }\n break;\n case 'style':\n if (action.unset) {\n const index = model.sheet.ranges?.findIndex(\n (range) =>\n range.key === action.key &&\n cursorFallbackRange &&\n inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n );\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n } else if (cursorFallbackRange) {\n model.sheet.ranges?.push({\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key: action.key,\n value: action.value,\n });\n }\n break;\n case 'comment': {\n if (cursorFallbackRange) {\n void dispatch(\n createIntent(ThreadAction.Create, {\n cursor: completeCellRangeToThreadCursor(cursorFallbackRange),\n name: action.cellContent,\n subject: model.sheet,\n }),\n );\n }\n }\n }\n },\n [model.sheet, cursorFallbackRange, cursor, dispatch],\n );\n\n return (\n <ToolbarContextProvider onAction={handleAction}>\n <NaturalToolbar.Root classNames={['pli-0.5 attention-surface', !hasAttention && 'opacity-20', classNames]}>\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 // TODO(thure): Can this O(n) call be memoized?\n const value = cursor\n ? model.sheet.ranges?.findLast(\n ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),\n )?.value\n : undefined;\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n value={\n // TODO(thure): providing `undefined` leaves the last item active which was active rather than showing none.\n value ?? 'never'\n }\n onValueChange={(value: AlignValue) => onAction?.({ key: alignKey, value })}\n >\n {alignmentOptions.map(({ value, icon }) => (\n <ToolbarItem\n itemType='toggleGroupItem'\n key={value}\n value={value}\n icon={icon}\n data-testid={`grid.toolbar.${alignKey}.${value}`}\n >\n {t('toolbar action label', {\n key: t(`range key ${alignKey} label`),\n value: t(`range value ${value} label`),\n })}\n </ToolbarItem>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nconst styleOptions: ButtonProps<StyleValue>[] = [\n { value: 'highlight', icon: 'ph--highlighter--regular' },\n { value: 'softwrap', icon: 'ph--paragraph--regular' },\n];\n\nconst Styles = () => {\n const { cursorFallbackRange, model } = useSheetContext();\n const { onAction } = useToolbarContext('Styles');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const activeValues = cursorFallbackRange\n ? model.sheet.ranges\n ?.filter(\n ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .reduce((acc, { value }) => {\n acc.add(value);\n return acc;\n }, new Set())\n : undefined;\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) => {\n onAction?.({ key: 'style', value, unset: !nextPressed });\n }}\n icon={icon}\n >\n {t('toolbar action label', {\n key: t(`range key ${styleKey} label`),\n value: t(`range value ${value} label`),\n })}\n </ToolbarItem>\n ))}\n </>\n );\n};\n\n//\n// Actions\n//\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { cursorFallbackRange, cursor, model } = useSheetContext();\n const { t } = useTranslation(SHEET_PLUGIN);\n\n // TODO(thure): Can this O(n) call be memoized?\n const overlapsCommentAnchor = RefArray.allResolvedTargets(model.sheet.threads ?? [])\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursorFallbackRange) {\n return false;\n }\n return rangeToIndex(model.sheet, cursorFallbackRange) === thread.anchor;\n });\n\n const tooltipLabelKey = !cursor\n ? 'no cursor label'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment 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 (!cursorFallbackRange) {\n return;\n }\n return onAction?.({\n key: 'comment',\n value: rangeToIndex(model.sheet, cursorFallbackRange),\n cellContent: model.getCellText(cursorFallbackRange.from),\n });\n }}\n disabled={!cursorFallbackRange || 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", "StackItem", "React", "addressToA1Notation", "isFormula", "rangeToA1Notation", "Icon", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "createContext", "React", "useCallback", "createIntent", "useIntentDispatcher", "inRange", "RefArray", "ThreadAction", "Icon", "Toolbar", "NaturalToolbar", "Tooltip", "useTranslation", "useAttention", "buttonStyles", "tooltipProps", "side", "ToolbarSeparator", "React", "div", "role", "className", "ToolbarItem", "itemType", "icon", "children", "props", "Invoker", "NaturalToolbar", "ToggleGroupItem", "Toggle", "Button", "Tooltip", "Root", "Trigger", "asChild", "variant", "classNames", "Icon", "size", "span", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "id", "model", "cursorFallbackRange", "cursor", "useSheetContext", "hasAttention", "useAttention", "dispatchPromise", "dispatch", "useIntentDispatcher", "handleAction", "useCallback", "action", "key", "index", "sheet", "ranges", "findIndex", "range", "inRange", "rangeFromIndex", "from", "nextRangeEntity", "rangeToIndex", "value", "push", "splice", "unset", "createIntent", "ThreadAction", "Create", "completeCellRangeToThreadCursor", "name", "cellContent", "subject", "onAction", "alignmentOptions", "Alignment", "t", "useTranslation", "SHEET_PLUGIN", "findLast", "alignKey", "undefined", "ToggleGroup", "type", "onValueChange", "map", "data-testid", "styleOptions", "Styles", "activeValues", "filter", "reduce", "acc", "add", "Set", "pressed", "has", "onPressedChange", "nextPressed", "styleKey", "Actions", "overlapsCommentAnchor", "RefArray", "allResolvedTargets", "threads", "thread", "status", "some", "anchor", "tooltipLabelKey", "onClick", "getCellText", "disabled", "Toolbar", "Separator", "SheetContainer", "space", "sheet", "role", "ignoreAttention", "graph", "useComputeGraph", "React", "SheetProvider", "StackItem", "Content", "toolbar", "statusbar", "classNames", "Toolbar", "Root", "Styles", "Alignment", "Separator", "Actions", "GridSheet", "FunctionEditor", "SheetContainer"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/ComputeGraph/ComputeGraphContextProvider.tsx", "../../../src/extensions/compute.ts", "../../../src/extensions/editor/extension.ts", "../../../src/components/SheetContext/SheetContext.tsx", "../../../src/components/GridSheet/GridSheet.tsx", "../../../src/components/GridSheet/util.ts", "../../../src/integrations/thread-ranges.ts", "../../../src/components/index.ts", "../../../src/components/RangeList/RangeList.tsx", "../../../src/components/SheetObjectSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { createContext, type PropsWithChildren, useContext } from 'react';\n\nimport { type ComputeGraph, type ComputeGraphRegistry } from '@dxos/compute';\nimport { raise } from '@dxos/debug';\nimport { type Space } from '@dxos/react-client/echo';\nimport { useAsyncState } from '@dxos/react-hooks';\n\nexport type ComputeGraphContextType = {\n registry: ComputeGraphRegistry;\n};\n\n/**\n * The compute graph context manages a ComputeGraph for each space.\n */\nexport const ComputeGraphContext = createContext<ComputeGraphContextType | undefined>(undefined);\n\nexport const ComputeGraphContextProvider = ({ registry, children }: PropsWithChildren<ComputeGraphContextType>) => {\n return <ComputeGraphContext.Provider value={{ registry }}>{children}</ComputeGraphContext.Provider>;\n};\n\nexport const useComputeGraph = (space?: Space): ComputeGraph | undefined => {\n const { registry } = useContext(ComputeGraphContext) ?? raise(new Error('Missing ComputeGraphContext'));\n const [graph] = useAsyncState(async () => {\n if (space) {\n const graph = registry.getOrCreateGraph(space);\n await graph.open();\n return graph;\n }\n }, [space, registry]);\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { syntaxTree } from '@codemirror/language';\nimport {\n type EditorState,\n type Extension,\n type RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n type Transaction,\n} from '@codemirror/state';\nimport { Decoration, EditorView, ViewPlugin, WidgetType } from '@codemirror/view';\n\nimport { type UnsubscribeCallback, debounce } from '@dxos/async';\nimport {\n createSheetName,\n type CellAddress,\n type CellScalarValue,\n type ComputeGraph,\n type ComputeNode,\n} from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { documentId, singleValueFacet } from '@dxos/react-ui-editor';\n\nconst LANGUAGE_TAG = 'dx';\n\n// TODO(burdon): Create marker just for our decorator?\nconst updateAllDecorations = StateEffect.define<void>();\n\nexport const computeGraphFacet = singleValueFacet<ComputeGraph>();\n\nexport type ComputeOptions = {};\n\nexport const compute = (options: ComputeOptions = {}): Extension => {\n let computeNode: ComputeNode | undefined;\n\n const update = (state: EditorState, current?: RangeSet<Decoration>) => {\n const builder = new RangeSetBuilder<Decoration>();\n if (computeNode) {\n computeNode.clear();\n syntaxTree(state).iterate({\n enter: (node) => {\n switch (node.name) {\n case 'FencedCode': {\n const cursor = state.selection.main.head;\n if (state.readOnly || cursor < node.from || cursor > node.to) {\n const info = node.node.getChild('CodeInfo');\n if (info) {\n const type = state.sliceDoc(info.from, info.to);\n const text = node.node.getChild('CodeText');\n if (type === LANGUAGE_TAG && text) {\n const formula = state.sliceDoc(text.from, text.to);\n\n const iter = current?.iter(node.node.from);\n if (iter?.value && iter?.value.spec.formula === formula) {\n // Add existing widget.\n builder.add(node.from, node.to, iter.value);\n } else {\n // TODO(burdon): Create ordered list of cells on each decoration run.\n const cell: CellAddress = { col: node.node.from, row: 0 };\n invariant(computeNode);\n // NOTE: This triggers re-render (below).\n computeNode.setValue(cell, formula);\n const value = computeNode.getValue(cell);\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new ComputeWidget(formula, value),\n formula,\n }),\n );\n }\n }\n }\n }\n\n break;\n }\n }\n },\n });\n }\n\n return builder.finish();\n };\n\n return [\n ViewPlugin.fromClass(\n class {\n // Graph subscription.\n private _subscription?: UnsubscribeCallback;\n constructor(view: EditorView) {\n const id = view.state.facet(documentId);\n const computeGraph = view.state.facet(computeGraphFacet);\n if (id && computeGraph) {\n queueMicrotask(async () => {\n computeNode = computeGraph.getOrCreateNode(createSheetName({ type: '', id }));\n await computeNode.open();\n\n // Trigger re-render if values updated.\n // TODO(burdon): Trigger only if formula value updated (currently triggered during render).\n this._subscription = computeNode.update.on(\n debounce(({ type, ...rest }) => {\n if (type === 'valuesUpdated') {\n view.dispatch({\n effects: updateAllDecorations.of(),\n });\n }\n }, 250),\n );\n });\n }\n }\n\n destroy() {\n this._subscription?.();\n void computeNode?.close();\n computeNode = undefined;\n }\n },\n ),\n\n StateField.define<RangeSet<Decoration>>({\n create: (state) => update(state),\n update: (rangeSet: RangeSet<Decoration>, tr: Transaction) => update(tr.state, rangeSet),\n provide: (field) => EditorView.decorations.from(field),\n }),\n ];\n};\n\n// TODO(burdon): Click to edit.\nclass ComputeWidget extends WidgetType {\n constructor(\n private readonly formula: string,\n private readonly value: CellScalarValue,\n ) {\n super();\n }\n\n override toDOM(_view: EditorView) {\n const div = document.createElement('div');\n div.setAttribute('title', this.formula);\n div.innerText = String(this.value);\n return div;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport {\n type Completion,\n type CompletionContext,\n type CompletionResult,\n acceptCompletion,\n autocompletion,\n completionStatus,\n startCompletion,\n} from '@codemirror/autocomplete';\nimport { HighlightStyle, type Language, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\nimport { type EditorView, ViewPlugin, type ViewUpdate, keymap } from '@codemirror/view';\nimport { type SyntaxNode } from '@lezer/common';\nimport { tags } from '@lezer/highlight';\nimport { spreadsheet } from 'codemirror-lang-spreadsheet';\n\nimport { type FunctionDefinition } from '@dxos/compute';\nimport { RANGE_NOTATION } from '@dxos/compute';\nimport { singleValueFacet } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * https://codemirror.net/examples/styling\n * https://lezer.codemirror.net/docs/ref/#highlight\n * https://github.com/luizzappa/codemirror-lang-spreadsheet/blob/main/src/index.ts#L28 (mapping)\n */\n// TODO(burdon): Define light/dark.\nconst highlightStyles = HighlightStyle.define([\n // Function.\n {\n tag: tags.name,\n class: 'text-accentText',\n },\n // Range.\n {\n tag: tags.tagName,\n class: 'text-pinkText',\n },\n // Values.\n {\n tag: tags.number,\n class: 'text-tealText',\n },\n {\n tag: tags.bool,\n class: 'text-tealText',\n },\n {\n tag: tags.string,\n class: 'text-tealText',\n },\n // Error.\n {\n tag: tags.invalid,\n class: 'text-unAccent',\n },\n]);\n\nconst languageFacet = singleValueFacet<Language>();\n\nexport type SheetExtensionOptions = {\n debug?: boolean;\n functions?: FunctionDefinition[];\n};\n\n/**\n * Spreadsheet formula extension and parser.\n * https://github.com/luizzappa/codemirror-lang-spreadsheet\n * https://github.com/luizzappa/codemirror-app-spreadsheet/blob/master/src/editor.ts\n * https://github.com/codemirror/lang-example\n * https://hyperformula.handsontable.com/guide/key-concepts.html#grammar\n */\nexport const sheetExtension = ({ debug, functions = [] }: SheetExtensionOptions): Extension => {\n const { extension, language } = spreadsheet({ idiom: 'en-US', decimalSeparator: '.' });\n\n const createCompletion = (name: string) => {\n const { section = 'Custom', description, syntax } = functions.find((value) => value.name === name) ?? {};\n\n return {\n section,\n label: name,\n info: () => {\n if (!description && !syntax) {\n return null;\n }\n\n // TODO(burdon): Standardize color styles.\n const root = document.createElement('div');\n root.className = 'flex flex-col gap-2 text-sm';\n\n const title = document.createElement('h2');\n title.innerText = name;\n title.className = 'text-lg font-mono text-accentText';\n root.appendChild(title);\n\n if (description) {\n const info = document.createElement('p');\n info.innerText = description;\n info.className = 'text-subdued';\n root.appendChild(info);\n }\n\n if (syntax) {\n const detail = document.createElement('pre');\n detail.innerText = syntax;\n detail.className = 'whitespace-pre-wrap text-greenText';\n root.appendChild(detail);\n }\n\n return root;\n },\n apply: (view, completion, from, to) => {\n const insertParens = to === view.state.doc.toString().length;\n view.dispatch(\n view.state.update({\n changes: {\n from,\n to,\n insert: completion.label + (insertParens ? '()' : ''),\n },\n selection: {\n anchor: from + completion.label.length + 1,\n },\n }),\n );\n },\n } satisfies Completion;\n };\n\n return [\n extension,\n languageFacet.of(language),\n language.data.of({\n autocomplete: (context: CompletionContext): CompletionResult | null => {\n if (context.state.doc.toString()[0] !== '=') {\n return null;\n }\n const match = context.matchBefore(/\\w*/);\n if (!match || match.from === match.to) {\n return null;\n }\n\n const text = match.text.toUpperCase();\n if (!context.explicit && match.text.length < 2) {\n return null;\n }\n\n return {\n from: match.from,\n options:\n functions?.filter(({ name }) => name.startsWith(text)).map(({ name }) => createCompletion(name)) ?? [],\n };\n },\n }),\n\n syntaxHighlighting(highlightStyles),\n autocompletion({\n aboveCursor: false,\n defaultKeymap: true,\n activateOnTyping: true,\n closeOnBlur: !debug,\n icons: false,\n tooltipClass: () =>\n mx(\n '!-left-[1px] !top-[33px] !-m-0 border !border-t-0 [&>ul]:!min-w-[198px]',\n '[&>ul>li[aria-selected]]:!bg-accentSurface',\n 'border-separator',\n ),\n }),\n keymap.of([\n {\n key: 'Tab',\n run: (view) => {\n return completionStatus(view.state) === 'active' ? acceptCompletion(view) : startCompletion(view);\n },\n },\n ]),\n\n // Parsing.\n // StateField.define({\n // create: (state) => {},\n // update: (value, tr) => {\n // log.info('update');\n // syntaxTree(tr.state).iterate({\n // enter: ({ type, from, to }) => {\n // log.info('node', { type: type.name, from, to });\n // },\n // });\n // },\n // }),\n ];\n};\n\nexport type SelectionRange = { from: number; to: number };\n\nexport interface RangeController {\n setRange(range: string): void;\n}\n\nexport type RangeExtensionOptions = {\n /**\n * Provides controller callback when extension is initialized.\n */\n onInit?: (controller: RangeController) => void;\n /**\n * Called when the active range changes.\n * @param state The current state.\n * @param state.activeRange undefined if no range is active, otherwise a possibly partially defined range.\n */\n onStateChange?: (state: { activeRange: string | undefined }) => void;\n};\n\n/**\n * Tracks the currently active cell within a formula and provides a callback to modify it.\n */\nexport const rangeExtension = ({ onInit, onStateChange }: RangeExtensionOptions): Extension => {\n let view: EditorView;\n let activeRange: SelectionRange | undefined;\n\n // Called externally to provide current range.\n const notifier: RangeController = {\n setRange: (range: string) => {\n if (activeRange) {\n view.dispatch(\n view.state.update({\n changes: { ...activeRange, insert: range.toString() },\n selection: { anchor: activeRange.from + range.length },\n }),\n );\n }\n\n view.focus();\n },\n };\n\n return ViewPlugin.fromClass(\n class {\n constructor(_view: EditorView) {\n view = _view;\n onInit?.(notifier);\n }\n\n update(view: ViewUpdate) {\n const { anchor } = view.state.selection.ranges[0];\n\n // Find first Range or cell at cursor.\n activeRange = undefined;\n const language = view.state.facet(languageFacet);\n const { topNode } = language.parser.parse(view.state.doc.toString());\n visitTree(topNode, ({ type, from, to }) => {\n if (from <= anchor && to >= anchor) {\n switch (type.name) {\n case 'Function':\n // Mark but keep looking.\n activeRange = { from: to, to };\n break;\n\n case 'CloseParen':\n // Mark but keep looking.\n activeRange = { from, to: from };\n break;\n\n case 'RangeToken':\n case 'CellToken':\n activeRange = { from, to };\n return true;\n }\n }\n\n return false;\n });\n\n // Allow start of formula.\n if (!activeRange && view.state.doc.toString()[0] === '=') {\n const str = view.state.doc.sliceString(1);\n if (RANGE_NOTATION.test(str)) {\n activeRange = { from: 1, to: str.length + 1 };\n }\n }\n\n onStateChange?.({\n activeRange: activeRange ? view.state.doc.sliceString(activeRange.from, activeRange.to) : undefined,\n });\n }\n },\n );\n};\n\n/**\n * Lezer parse result visitor.\n */\nconst visitTree = (node: SyntaxNode, callback: (node: SyntaxNode) => boolean): boolean => {\n if (callback(node)) {\n return true;\n }\n\n for (let child = node.firstChild; child !== null; child = child.nextSibling) {\n if (visitTree(child, callback)) {\n return true;\n }\n }\n\n return false;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext, useCallback, useContext, useState } from 'react';\n\nimport { type ComputeGraph, type CellAddress, type CellRange, type CompleteCellRange } from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport {\n Grid,\n type GridContentProps,\n type GridEditing,\n type GridScopedProps,\n useGridContext,\n} from '@dxos/react-ui-grid';\n\nimport { type SheetModel, useSheetModel } from '../../model';\nimport { type SheetType } from '../../types';\n\nexport type SheetContextValue = {\n id: string;\n\n model: SheetModel;\n\n // Cursor state.\n // TODO(burdon): Cursor and range should use indices.\n cursor?: CellAddress;\n setCursor: (cell: CellAddress | undefined) => void;\n range?: CellRange;\n setRange: (range: CellRange | undefined) => void;\n cursorFallbackRange?: CompleteCellRange;\n\n // Editing state (undefined if not editing).\n editing: GridEditing;\n setEditing: (editing: GridEditing) => void;\n\n // Active refs\n activeRefs: GridContentProps['activeRefs'];\n setActiveRefs: (activeRefs: GridContentProps['activeRefs']) => void;\n\n // Events.\n // TODO(burdon): Generalize.\n onInfo?: () => void;\n\n // Flags\n ignoreAttention?: boolean;\n};\n\nconst SheetContext = createContext<SheetContextValue | undefined>(undefined);\n\nexport const useSheetContext = (): SheetContextValue => {\n const context = useContext(SheetContext);\n invariant(context);\n return context;\n};\n\nconst SheetProviderImpl = ({\n model,\n onInfo,\n ignoreAttention,\n children,\n __gridScope,\n}: GridScopedProps<PropsWithChildren<Pick<SheetContextValue, 'onInfo' | 'model' | 'ignoreAttention'>>>) => {\n const { id, editing, setEditing } = useGridContext('SheetProvider', __gridScope);\n\n const [cursor, setCursorInternal] = useState<CellAddress>();\n const [range, setRangeInternal] = useState<CellRange>();\n const [cursorFallbackRange, setCursorFallbackRange] = useState<CompleteCellRange>();\n const [activeRefs, setActiveRefs] = useState<GridContentProps['activeRefs']>('');\n\n const setCursor = useCallback(\n (nextCursor?: CellAddress) => {\n setCursorInternal(nextCursor);\n setCursorFallbackRange(\n range?.to ? (range as CompleteCellRange) : nextCursor ? { from: nextCursor!, to: nextCursor! } : undefined,\n );\n },\n [range],\n );\n const setRange = useCallback(\n (nextRange?: CellRange) => {\n setRangeInternal(nextRange);\n setCursorFallbackRange(\n nextRange?.to ? (nextRange as CompleteCellRange) : cursor ? { from: cursor!, to: cursor! } : undefined,\n );\n },\n [cursor],\n );\n\n return (\n <SheetContext.Provider\n value={{\n id,\n model,\n editing,\n setEditing,\n cursor,\n setCursor,\n range,\n setRange,\n cursorFallbackRange,\n activeRefs,\n setActiveRefs,\n // TODO(burdon): Change to event.\n onInfo,\n ignoreAttention,\n }}\n >\n {children}\n </SheetContext.Provider>\n );\n};\n\nexport type SheetProviderProps = {\n graph: ComputeGraph;\n sheet: SheetType;\n readonly?: boolean;\n ignoreAttention?: boolean;\n} & Pick<SheetContextValue, 'onInfo'>;\n\nexport const SheetProvider = ({\n children,\n graph,\n sheet,\n readonly,\n ignoreAttention,\n onInfo,\n}: PropsWithChildren<SheetProviderProps>) => {\n const model = useSheetModel(graph, sheet, { readonly });\n\n return !model ? null : (\n <Grid.Root id={fullyQualifiedId(sheet)}>\n <SheetProviderImpl model={model} onInfo={onInfo} ignoreAttention={ignoreAttention}>\n {children}\n </SheetProviderImpl>\n </Grid.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n type FocusEvent,\n type KeyboardEvent,\n type WheelEvent,\n type MouseEvent,\n useState,\n} from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { rangeToA1Notation, type CellRange } from '@dxos/compute';\nimport { DropdownMenu, Icon, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n closestCell,\n defaultSizeRow,\n editorKeys,\n Grid,\n GridCellEditor,\n type DxGridElement,\n type DxGridPosition,\n type DxGridCellIndex,\n type EditorKeyHandler,\n type EditorBlurHandler,\n type GridContentProps,\n parseCellIndex,\n} from '@dxos/react-ui-grid';\n\nimport { colLabelCell, rowLabelCell, useSheetModelDxGridProps } from './util';\nimport { rangeExtension, sheetExtension, type RangeController } from '../../extensions';\nimport { useSelectThreadOnCellFocus, useUpdateFocusedCellOnThreadSelection } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { DEFAULT_COLS, DEFAULT_ROWS, SheetAction } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nconst inertPosition: DxGridPosition = { plane: 'grid', col: 0, row: 0 };\n\nconst initialCells = {\n grid: {},\n frozenColsStart: [...Array(64)].reduce((acc, _, i) => {\n acc[`0,${i}`] = rowLabelCell(i);\n return acc;\n }, {}),\n frozenRowsStart: [...Array(12)].reduce((acc, _, i) => {\n acc[`${i},0`] = colLabelCell(i);\n return acc;\n }, {}),\n};\n\nconst frozen = {\n frozenColsStart: 1,\n frozenRowsStart: 1,\n};\n\nconst sheetRowDefault = {\n frozenRowsStart: { size: defaultSizeRow, readonly: true },\n grid: { size: defaultSizeRow, resizeable: true },\n};\nconst sheetColDefault = { frozenColsStart: { size: 48, readonly: true }, grid: { size: 180, resizeable: true } };\n\nexport const GridSheet = () => {\n const { t } = useTranslation(SHEET_PLUGIN);\n const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } =\n useSheetContext();\n // NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us\n // a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const [extraplanarFocus, setExtraplanarFocus] = useState<DxGridPosition | null>(null);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const rangeController = useRef<RangeController>();\n const { hasAttention } = useAttention(id);\n\n const handleFocus = useCallback(\n (event: FocusEvent) => {\n if (!editing) {\n const cell = closestCell(event.target);\n if (cell) {\n if (cell.plane === 'grid') {\n setCursor({ col: cell.col, row: cell.row });\n setExtraplanarFocus(null);\n } else {\n setExtraplanarFocus(cell);\n }\n } else {\n setExtraplanarFocus(null);\n }\n }\n },\n [editing],\n );\n\n // TODO(burdon): Validate formula before closing: hf.validateFormula();\n const handleClose = useCallback<EditorKeyHandler>(\n (_value, event) => {\n if (event) {\n const { key, shift } = event;\n const axis = ['Enter', 'ArrowUp', 'ArrowDown'].includes(key)\n ? 'row'\n : ['Tab', 'ArrowLeft', 'ArrowRight'].includes(key)\n ? 'col'\n : undefined;\n const delta = key.startsWith('Arrow') ? (['ArrowUp', 'ArrowLeft'].includes(key) ? -1 : 1) : shift ? -1 : 1;\n dxGrid?.refocus(axis, delta);\n }\n },\n [model, editing, dxGrid],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n (value) => {\n if (value !== undefined) {\n model.setValue(parseCellIndex(editing!.index), value);\n }\n },\n [model, editing],\n );\n\n const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(\n ({ axis, size, index: numericIndex }) => {\n if (axis === 'row') {\n const rowId = model.sheet.rows[parseInt(numericIndex)];\n model.sheet.rowMeta[rowId] ??= {};\n model.sheet.rowMeta[rowId].size = size;\n } else {\n const columnId = model.sheet.columns[parseInt(numericIndex)];\n model.sheet.columnMeta[columnId] ??= {};\n model.sheet.columnMeta[columnId].size = size;\n }\n },\n [model],\n );\n\n const handleSelect = useCallback<NonNullable<GridContentProps['onSelect']>>(\n ({ minCol, maxCol, minRow, maxRow }) => {\n const range: CellRange = { from: { col: minCol, row: minRow } };\n if (minCol !== maxCol || minRow !== maxRow) {\n range.to = { col: maxCol, row: maxRow };\n }\n if (editing) {\n // Update range selection in formula.\n rangeController.current?.setRange(rangeToA1Notation(range));\n } else {\n // Setting range while editing causes focus to move to null, avoid doing so.\n setRange(range.to ? range : undefined);\n }\n },\n [editing],\n );\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const selectEntireAxis = useCallback(\n (pos: DxGridPosition) => {\n switch (pos.plane) {\n case 'frozenRowsStart':\n return dxGrid?.setSelection({\n start: { col: pos.col, row: 0, plane: 'grid' },\n end: { col: pos.col, row: model.sheet.rows.length - 1, plane: 'grid' },\n });\n case 'frozenColsStart':\n return dxGrid?.setSelection({\n start: { row: pos.row, col: 0, plane: 'grid' },\n end: { row: pos.row, col: model.sheet.columns.length - 1, plane: 'grid' },\n });\n }\n },\n [dxGrid, model.sheet],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell) {\n selectEntireAxis(cell);\n }\n },\n [selectEntireAxis],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'Backspace':\n case 'Delete':\n event.preventDefault();\n return cursorFallbackRange && model.clear(cursorFallbackRange);\n case 'Enter':\n case 'Space':\n if (dxGrid && extraplanarFocus) {\n switch (extraplanarFocus.plane) {\n case 'frozenRowsStart':\n case 'frozenColsStart':\n event.preventDefault();\n return selectEntireAxis(extraplanarFocus);\n }\n }\n }\n if (event.metaKey || event.ctrlKey) {\n switch (event.key) {\n case 'x':\n case 'X':\n event.preventDefault();\n return cursorFallbackRange && model.cut(cursorFallbackRange);\n case 'c':\n case 'C':\n event.preventDefault();\n return cursorFallbackRange && model.copy(cursorFallbackRange);\n case 'v':\n case 'V':\n event.preventDefault();\n return cursor && model.paste(cursor);\n case 'z':\n event.preventDefault();\n return event.shiftKey ? model.redo() : model.undo();\n case 'Z':\n case 'y':\n event.preventDefault();\n return model.redo();\n }\n }\n },\n [cursorFallbackRange, model, cursor, extraplanarFocus, selectEntireAxis],\n );\n\n const contextMenuAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [contextMenuOpen, setContextMenuOpen] = useState<DxGridPosition | null>(null);\n const contextMenuAxis = contextMenuOpen?.plane.startsWith('frozenRows') ? 'col' : 'row';\n\n const handleContextMenu = useCallback((event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell && cell.plane.startsWith('frozen')) {\n event.preventDefault();\n contextMenuAnchorRef.current = event.target as HTMLButtonElement;\n setContextMenuOpen(cell);\n }\n }, []);\n\n const handleAxisMenuAction = useCallback(\n (operation: 'insert-before' | 'insert-after' | 'drop') => {\n switch (operation) {\n case 'insert-before':\n case 'insert-after':\n return dispatch(\n createIntent(SheetAction.InsertAxis, {\n model,\n axis: contextMenuAxis,\n index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),\n }),\n );\n case 'drop':\n return dispatch(\n createIntent(SheetAction.DropAxis, {\n model,\n axis: contextMenuAxis,\n axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],\n }),\n );\n }\n },\n [contextMenuAxis, contextMenuOpen, model, dispatch],\n );\n\n const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);\n\n const extension = useMemo(\n () => [\n editorKeys({ onClose: handleClose, ...(editing?.initialContent && { onNav: handleClose }) }),\n sheetExtension({ functions: model.graph.getFunctions() }),\n rangeExtension({\n onInit: (fn) => (rangeController.current = fn),\n onStateChange: (state) => {\n if (dxGrid) {\n // This can’t dispatch a setState in this component, otherwise the cell editor remounts and loses focus.\n dxGrid.mode = typeof state.activeRange === 'undefined' ? 'edit' : 'edit-select';\n }\n },\n }),\n ],\n [model, handleClose, editing],\n );\n\n const getCellContent = useCallback(\n (index: DxGridCellIndex) => {\n return model.getCellText(parseCellIndex(index));\n },\n [model],\n );\n\n useUpdateFocusedCellOnThreadSelection(dxGrid);\n useSelectThreadOnCellFocus();\n\n return (\n <div role='none' className='relative min-bs-0'>\n <GridCellEditor getCellContent={getCellContent} extension={extension} onBlur={handleBlur} />\n <Grid.Content\n initialCells={initialCells}\n limitColumns={DEFAULT_COLS}\n limitRows={DEFAULT_ROWS}\n columns={columns}\n rows={rows}\n onAxisResize={handleAxisResize}\n onSelect={handleSelect}\n rowDefault={sheetRowDefault}\n columnDefault={sheetColDefault}\n frozen={frozen}\n onFocus={handleFocus}\n onWheelCapture={handleWheel}\n onKeyDown={handleKeyDown}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n overscroll='trap'\n className='[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:border-bs [&_.dx-grid]:absolute [&_.dx-grid]:inset-0 [&_.dx-grid]:border-separator'\n activeRefs={activeRefs}\n ref={setDxGrid}\n />\n <DropdownMenu.Root\n modal={false}\n open={!!contextMenuOpen}\n onOpenChange={(nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)}\n >\n <DropdownMenu.VirtualTrigger virtualRef={contextMenuAnchorRef} />\n <DropdownMenu.Content side={contextMenuAxis === 'col' ? 'bottom' : 'right'} sideOffset={4} collisionPadding={8}>\n <DropdownMenu.Viewport>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-before')}\n data-testid={`grid.${contextMenuAxis}.insert-before`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-left--regular' : 'ph--rows-plus-top--regular'}\n />\n <span>{t(`add ${contextMenuAxis} before label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-after')}\n data-testid={`grid.${contextMenuAxis}.insert-after`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-right--regular' : 'ph--rows-plus-bottom--regular'}\n />\n <span>{t(`add ${contextMenuAxis} after label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('drop')}\n data-testid={`grid.${contextMenuAxis}.drop`}\n >\n <Icon size={5} icon='ph--backspace--regular' />\n <span>{t(`delete ${contextMenuAxis} label`)}</span>\n </DropdownMenu.Item>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { inRange } from '@dxos/compute';\nimport { createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';\nimport { parseValue, cellClassesForFieldType } from '@dxos/react-ui-form';\nimport {\n type GridContentProps,\n type DxGridElement,\n type DxGridAxisMeta,\n type DxGridPlane,\n type DxGridPlaneRange,\n type DxGridPlaneCells,\n type DxGridCellValue,\n colToA1Notation,\n rowToA1Notation,\n commentedClassName,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { parseThreadAnchorAsCellRange } from '../../integrations';\nimport { type SheetModel } from '../../model';\nimport { cellClassNameForRange, rangeFromIndex } from '../../types';\n\nconst createDxGridColumns = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.columns.reduce(\n (acc: DxGridAxisMeta, columnId, numericIndex) => {\n if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {\n acc.grid[numericIndex] = { size: model.sheet.columnMeta[columnId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst createDxGridRows = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.rows.reduce(\n (acc: DxGridAxisMeta, rowId, numericIndex) => {\n if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {\n acc.grid[numericIndex] = { size: model.sheet.rowMeta[rowId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst projectCellProps = (model: SheetModel, col: number, row: number): DxGridCellValue => {\n const address = { col, row };\n const rawValue = model.getValue(address);\n const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));\n const threadRefs = model.sheet.threads\n ?.filter((thread) => {\n const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target!.anchor);\n return thread && range ? inRange(range, address) : false;\n })\n .map((thread) => fullyQualifiedId(thread!))\n .join(' ');\n\n const description = model.getValueDescription(address);\n const type = description?.type;\n const format = description?.format;\n const classNames = ranges?.map(cellClassNameForRange).reverse();\n\n return {\n value: parseValue({ type, format, value: rawValue }),\n className: mx(cellClassesForFieldType({ type, format }), threadRefs && commentedClassName, classNames),\n dataRefs: threadRefs,\n };\n};\nconst gridCellGetter = (model: SheetModel) => {\n // TODO(thure): Actually use the cache.\n const cachedGridCells: DxGridPlaneCells = {};\n return (nextBounds: DxGridPlaneRange): DxGridPlaneCells => {\n [...Array(nextBounds.end.col - nextBounds.start.col)].forEach((_, c0) => {\n return [...Array(nextBounds.end.row - nextBounds.start.row)].forEach((_, r0) => {\n const col = nextBounds.start.col + c0;\n const row = nextBounds.start.row + r0;\n cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);\n });\n });\n return cachedGridCells;\n };\n};\n\nexport const rowLabelCell = (row: number) => ({\n value: rowToA1Notation(row),\n className: 'text-end !pie-1 text-subdued',\n resizeHandle: 'row',\n});\n\nexport const colLabelCell = (col: number) => ({\n value: colToA1Notation(col),\n className: 'text-subdued',\n resizeHandle: 'col',\n});\n\nconst cellGetter = (model: SheetModel) => {\n const getGridCells = gridCellGetter(model);\n return (nextBounds: DxGridPlaneRange, plane: DxGridPlane): DxGridPlaneCells => {\n switch (plane) {\n case 'grid':\n return getGridCells(nextBounds);\n case 'frozenColsStart':\n return [...Array(nextBounds.end.row - nextBounds.start.row)].reduce((acc, _, r0) => {\n const r = nextBounds.start.row + r0;\n acc[`0,${r}`] = rowLabelCell(r);\n return acc;\n }, {});\n case 'frozenRowsStart':\n return [...Array(nextBounds.end.col - nextBounds.start.col)].reduce((acc, _, c0) => {\n const c = nextBounds.start.col + c0;\n acc[`${c},0`] = colLabelCell(c);\n return acc;\n }, {});\n default:\n return {};\n }\n };\n};\n\nexport const useSheetModelDxGridProps = (\n dxGrid: DxGridElement | null,\n model: SheetModel,\n): Pick<GridContentProps, 'columns' | 'rows'> => {\n const [columns, setColumns] = useState<DxGridAxisMeta>(createDxGridColumns(model));\n const [rows, setRows] = useState<DxGridAxisMeta>(createDxGridRows(model));\n\n useEffect(() => {\n const cellsAccessor = createDocAccessor(model.sheet, ['cells']);\n if (dxGrid) {\n dxGrid.getCells = cellGetter(model);\n }\n const handleCellsUpdate = () => {\n dxGrid?.requestUpdate('initialCells');\n };\n cellsAccessor.handle.addListener('change', handleCellsUpdate);\n const unsubscribe = model.graph.update.on(handleCellsUpdate);\n return () => {\n cellsAccessor.handle.removeListener('change', handleCellsUpdate);\n unsubscribe();\n };\n }, [model, dxGrid]);\n\n useEffect(() => {\n const columnMetaAccessor = createDocAccessor(model.sheet, ['columnMeta']);\n const rowMetaAccessor = createDocAccessor(model.sheet, ['rowMeta']);\n const handleColumnMetaUpdate = () => {\n setColumns(createDxGridColumns(model));\n };\n const handleRowMetaUpdate = () => {\n setRows(createDxGridRows(model));\n };\n columnMetaAccessor.handle.addListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.addListener('change', handleRowMetaUpdate);\n return () => {\n columnMetaAccessor.handle.removeListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.removeListener('change', handleRowMetaUpdate);\n };\n }, [model, dxGrid]);\n\n return { columns, rows };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport {\n createIntent,\n createResolver,\n LayoutAction,\n useIntentDispatcher,\n useIntentResolver,\n} from '@dxos/app-framework';\nimport { debounce } from '@dxos/async';\nimport { type CellAddress, type CompleteCellRange, inRange } from '@dxos/compute';\nimport { ThreadAction } from '@dxos/plugin-thread/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { type DxGridElement, type DxGridPosition } from '@dxos/react-ui-grid';\n\nimport { useSheetContext } from '../components';\nimport { SHEET_PLUGIN } from '../meta';\n\nexport const completeCellRangeToThreadCursor = (range: CompleteCellRange): string => {\n return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;\n};\n\nexport const parseThreadAnchorAsCellRange = (cursor: string): CompleteCellRange | null => {\n const coords = cursor.split(',');\n if (coords.length !== 4) {\n return null;\n } else {\n const [fromCol, fromRow, toCol, toRow] = coords;\n return {\n from: { col: parseInt(fromCol), row: parseInt(fromRow) },\n to: { col: parseInt(toCol), row: parseInt(toRow) },\n };\n }\n};\n\nexport const useUpdateFocusedCellOnThreadSelection = (grid: DxGridElement | null) => {\n const { model, setActiveRefs } = useSheetContext();\n const scrollIntoViewResolver = useMemo(\n () =>\n createResolver(\n LayoutAction.ScrollIntoView,\n ({ cursor, ref }) => {\n setActiveRefs(ref);\n // TODO(Zan): Everywhere we refer to the cursor in a thread context should change to `anchor`.\n const range = parseThreadAnchorAsCellRange(cursor!);\n range && grid?.setFocus({ ...range.to, plane: 'grid' }, true);\n },\n {\n disposition: 'hoist',\n filter: (data) => data.id === fullyQualifiedId(model.sheet) && !!data.cursor,\n },\n ),\n [model.sheet, setActiveRefs],\n );\n\n useIntentResolver(SHEET_PLUGIN, scrollIntoViewResolver);\n};\n\nexport const useSelectThreadOnCellFocus = () => {\n const { model, cursor } = useSheetContext();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const threads = useMemo(\n () => model.sheet.threads?.filter((thread): thread is NonNullable<typeof thread> => !!thread) ?? [],\n [\n // TODO(thure): Surely we can find a better dependency for this…\n JSON.stringify(model.sheet.threads),\n ],\n );\n\n const selectClosestThread = useCallback(\n (cellAddress: CellAddress) => {\n if (!cellAddress || !threads) {\n return;\n }\n\n const closestThread = threads?.find((ref) => {\n if (ref.target?.anchor) {\n const range = parseThreadAnchorAsCellRange(ref.target!.anchor);\n return range ? inRange(range, cellAddress) : false;\n } else {\n return false;\n }\n });\n\n if (closestThread) {\n void dispatch(createIntent(ThreadAction.Select, { current: fullyQualifiedId(closestThread) }));\n }\n },\n [dispatch, threads],\n );\n\n const debounced = useMemo(() => {\n return debounce((cellCoords: DxGridPosition) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);\n }, [selectClosestThread]);\n\n useEffect(() => {\n if (!cursor) {\n return;\n }\n debounced(cursor);\n }, [cursor, debounced]);\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './ComputeGraph';\nexport * from './GridSheet';\nexport * from './RangeList';\nexport * from './SheetContext';\nexport * from './SheetObjectSettings';\n\nexport const SheetContainer = lazy(() => import('./SheetContainer'));\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { rangeToA1Notation } from '@dxos/compute';\nimport { S } from '@dxos/echo-schema';\nimport { useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover } from '@dxos/react-ui-theme';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { rangeFromIndex } from '../../types';\nimport { Range, type SheetType } from '../../types';\n\nexport type RangeListProps = {\n sheet: SheetType;\n};\n\nexport const RangeList = ({ sheet }: RangeListProps) => {\n const { t } = useTranslation(SHEET_PLUGIN);\n // TODO(thure): Implement similar to comments, #8121\n const handleSelectRange = (range: Range) => {};\n const handleDeleteRange = useCallback(\n (range: Range) => {\n const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);\n sheet.ranges.splice(index, 1);\n },\n [sheet],\n );\n return (\n <>\n <h2 className='p-2 text-sm font-semibold'>{t('range list heading')}</h2>\n <List.Root<Range> items={sheet.ranges} isItem={S.is(Range)}>\n {({ items: ranges }) =>\n ranges.map((range, i) => (\n <List.Item key={i} item={range} classNames={['p-2', ghostHover]}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleSelectRange(range)}>\n {t('range title', {\n position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),\n key: t(`range key ${range.key} label`),\n value: t(`range value ${range.value} label`),\n })}\n </List.ItemTitle>\n <List.ItemDeleteButton onClick={() => handleDeleteRange(range)} />\n </List.Item>\n ))\n }\n </List.Root>\n </>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { SPACE_PLUGIN } from '@dxos/plugin-space/meta';\nimport { Input, useTranslation } from '@dxos/react-ui';\n\nimport { RangeList } from './RangeList';\nimport { type SheetType } from '../types';\n\nexport type SheetObjectSettingsProps = {\n sheet: SheetType;\n};\n\nexport const SheetObjectSettings = ({ sheet }: SheetObjectSettingsProps) => {\n const { t } = useTranslation(SPACE_PLUGIN);\n\n // TODO(burdon): Standardize forms.\n return (\n <>\n <div role='form' className='flex flex-col w-full p-2 gap-1'>\n <Input.Root>\n <Input.Label>{t('name label')}</Input.Label>\n <Input.TextInput\n placeholder={t('name placeholder')}\n value={sheet.name ?? ''}\n onChange={(event) => {\n sheet.name = event.target.value;\n }}\n />\n </Input.Root>\n </div>\n <RangeList sheet={sheet} />\n </>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["React", "createContext", "useContext", "raise", "useAsyncState", "ComputeGraphContext", "createContext", "undefined", "ComputeGraphContextProvider", "registry", "children", "Provider", "value", "useComputeGraph", "space", "useContext", "raise", "Error", "graph", "useAsyncState", "getOrCreateGraph", "open", "syntaxTree", "RangeSetBuilder", "StateEffect", "StateField", "Decoration", "EditorView", "ViewPlugin", "WidgetType", "debounce", "createSheetName", "invariant", "documentId", "singleValueFacet", "updateAllDecorations", "StateEffect", "define", "computeGraphFacet", "singleValueFacet", "acceptCompletion", "autocompletion", "completionStatus", "startCompletion", "HighlightStyle", "syntaxHighlighting", "ViewPlugin", "keymap", "tags", "spreadsheet", "RANGE_NOTATION", "singleValueFacet", "mx", "highlightStyles", "HighlightStyle", "define", "tag", "tags", "name", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "singleValueFacet", "sheetExtension", "debug", "functions", "extension", "language", "spreadsheet", "idiom", "decimalSeparator", "createCompletion", "section", "description", "syntax", "find", "value", "label", "info", "root", "document", "createElement", "className", "title", "innerText", "appendChild", "detail", "apply", "view", "completion", "from", "to", "insertParens", "state", "doc", "toString", "length", "dispatch", "update", "changes", "insert", "selection", "anchor", "of", "data", "autocomplete", "context", "match", "matchBefore", "text", "toUpperCase", "explicit", "options", "filter", "startsWith", "map", "syntaxHighlighting", "autocompletion", "aboveCursor", "defaultKeymap", "activateOnTyping", "closeOnBlur", "icons", "tooltipClass", "mx", "keymap", "key", "run", "completionStatus", "acceptCompletion", "startCompletion", "rangeExtension", "onInit", "onStateChange", "activeRange", "notifier", "setRange", "range", "focus", "ViewPlugin", "fromClass", "constructor", "_view", "ranges", "undefined", "facet", "topNode", "parser", "parse", "visitTree", "type", "str", "sliceString", "RANGE_NOTATION", "test", "node", "callback", "child", "firstChild", "nextSibling", "React", "createContext", "useCallback", "useContext", "useState", "invariant", "fullyQualifiedId", "Grid", "useGridContext", "SheetContext", "createContext", "undefined", "useSheetContext", "context", "useContext", "invariant", "SheetProviderImpl", "model", "onInfo", "ignoreAttention", "children", "__gridScope", "id", "editing", "setEditing", "useGridContext", "cursor", "setCursorInternal", "useState", "range", "setRangeInternal", "cursorFallbackRange", "setCursorFallbackRange", "activeRefs", "setActiveRefs", "setCursor", "useCallback", "nextCursor", "to", "from", "setRange", "nextRange", "React", "Provider", "value", "SheetProvider", "graph", "sheet", "readonly", "useSheetModel", "Grid", "Root", "fullyQualifiedId", "React", "useCallback", "useMemo", "useRef", "useState", "createIntent", "useIntentDispatcher", "rangeToA1Notation", "DropdownMenu", "Icon", "useTranslation", "useAttention", "closestCell", "defaultSizeRow", "editorKeys", "Grid", "GridCellEditor", "parseCellIndex", "useEffect", "useState", "inRange", "createDocAccessor", "fullyQualifiedId", "parseValue", "cellClassesForFieldType", "colToA1Notation", "rowToA1Notation", "commentedClassName", "mx", "useCallback", "useEffect", "useMemo", "createIntent", "createResolver", "LayoutAction", "useIntentDispatcher", "useIntentResolver", "debounce", "inRange", "ThreadAction", "fullyQualifiedId", "lazy", "React", "useCallback", "rangeToA1Notation", "S", "useTranslation", "List", "ghostHover", "RangeList", "sheet", "t", "useTranslation", "SHEET_PLUGIN", "handleSelectRange", "range", "handleDeleteRange", "useCallback", "index", "ranges", "findIndex", "sheetRange", "splice", "React", "h2", "className", "List", "Root", "items", "isItem", "S", "is", "Range", "map", "i", "Item", "key", "item", "classNames", "ghostHover", "ItemDragHandle", "ItemTitle", "onClick", "position", "rangeToA1Notation", "rangeFromIndex", "value", "ItemDeleteButton", "React", "SPACE_PLUGIN", "Input", "useTranslation", "SheetObjectSettings", "sheet", "t", "useTranslation", "SPACE_PLUGIN", "React", "div", "role", "className", "Input", "Root", "Label", "TextInput", "placeholder", "value", "name", "onChange", "event", "target", "RangeList", "SheetContainer", "lazy", "completeCellRangeToThreadCursor", "range", "from", "col", "row", "to", "parseThreadAnchorAsCellRange", "cursor", "coords", "split", "length", "fromCol", "fromRow", "toCol", "toRow", "parseInt", "useUpdateFocusedCellOnThreadSelection", "grid", "model", "setActiveRefs", "useSheetContext", "scrollIntoViewResolver", "useMemo", "createResolver", "LayoutAction", "ScrollIntoView", "ref", "setFocus", "plane", "disposition", "filter", "data", "id", "fullyQualifiedId", "sheet", "useIntentResolver", "SHEET_PLUGIN", "useSelectThreadOnCellFocus", "dispatchPromise", "dispatch", "useIntentDispatcher", "threads", "thread", "JSON", "stringify", "selectClosestThread", "useCallback", "cellAddress", "closestThread", "find", "target", "anchor", "inRange", "createIntent", "ThreadAction", "Select", "current", "debounced", "debounce", "cellCoords", "requestAnimationFrame", "useEffect", "createDxGridColumns", "model", "sheet", "columns", "reduce", "acc", "columnId", "numericIndex", "columnMeta", "size", "grid", "resizeable", "createDxGridRows", "rows", "rowId", "rowMeta", "projectCellProps", "col", "row", "address", "rawValue", "getValue", "ranges", "filter", "range", "inRange", "rangeFromIndex", "threadRefs", "threads", "thread", "target", "anchor", "parseThreadAnchorAsCellRange", "map", "fullyQualifiedId", "join", "description", "getValueDescription", "type", "format", "classNames", "cellClassNameForRange", "reverse", "value", "parseValue", "className", "mx", "cellClassesForFieldType", "commentedClassName", "dataRefs", "gridCellGetter", "cachedGridCells", "nextBounds", "Array", "end", "start", "forEach", "_", "c0", "r0", "rowLabelCell", "rowToA1Notation", "resizeHandle", "colLabelCell", "colToA1Notation", "cellGetter", "getGridCells", "plane", "r", "c", "useSheetModelDxGridProps", "dxGrid", "setColumns", "useState", "setRows", "useEffect", "cellsAccessor", "createDocAccessor", "getCells", "handleCellsUpdate", "requestUpdate", "handle", "addListener", "unsubscribe", "graph", "update", "on", "removeListener", "columnMetaAccessor", "rowMetaAccessor", "handleColumnMetaUpdate", "handleRowMetaUpdate", "inertPosition", "plane", "col", "row", "initialCells", "grid", "frozenColsStart", "Array", "reduce", "acc", "_", "i", "rowLabelCell", "frozenRowsStart", "colLabelCell", "frozen", "sheetRowDefault", "size", "defaultSizeRow", "readonly", "resizeable", "sheetColDefault", "GridSheet", "t", "useTranslation", "SHEET_PLUGIN", "id", "model", "editing", "setCursor", "setRange", "cursor", "cursorFallbackRange", "activeRefs", "ignoreAttention", "useSheetContext", "dxGrid", "setDxGrid", "useState", "extraplanarFocus", "setExtraplanarFocus", "dispatchPromise", "dispatch", "useIntentDispatcher", "rangeController", "useRef", "hasAttention", "useAttention", "handleFocus", "useCallback", "event", "cell", "closestCell", "target", "handleClose", "_value", "key", "shift", "axis", "includes", "undefined", "delta", "startsWith", "refocus", "handleBlur", "value", "setValue", "parseCellIndex", "index", "handleAxisResize", "numericIndex", "rowId", "sheet", "rows", "parseInt", "rowMeta", "columnId", "columns", "columnMeta", "handleSelect", "minCol", "maxCol", "minRow", "maxRow", "range", "from", "to", "current", "rangeToA1Notation", "handleWheel", "stopPropagation", "selectEntireAxis", "pos", "setSelection", "start", "end", "length", "handleClick", "handleKeyDown", "preventDefault", "clear", "metaKey", "ctrlKey", "cut", "copy", "paste", "shiftKey", "redo", "undo", "contextMenuAnchorRef", "contextMenuOpen", "setContextMenuOpen", "contextMenuAxis", "handleContextMenu", "handleAxisMenuAction", "operation", "createIntent", "SheetAction", "InsertAxis", "DropAxis", "axisIndex", "useSheetModelDxGridProps", "extension", "useMemo", "editorKeys", "onClose", "initialContent", "onNav", "sheetExtension", "functions", "graph", "getFunctions", "rangeExtension", "onInit", "fn", "onStateChange", "state", "mode", "activeRange", "getCellContent", "getCellText", "useUpdateFocusedCellOnThreadSelection", "useSelectThreadOnCellFocus", "React", "div", "role", "className", "GridCellEditor", "onBlur", "Grid", "Content", "limitColumns", "DEFAULT_COLS", "limitRows", "DEFAULT_ROWS", "onAxisResize", "onSelect", "rowDefault", "columnDefault", "onFocus", "onWheelCapture", "onKeyDown", "onContextMenu", "onClick", "overscroll", "ref", "DropdownMenu", "Root", "modal", "open", "onOpenChange", "nextOpen", "VirtualTrigger", "virtualRef", "side", "sideOffset", "collisionPadding", "Viewport", "Item", "data-testid", "Icon", "icon", "span", "Arrow"]
7
- }