@dxos/plugin-sheet 0.8.1 → 0.8.2-main.10c050d

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 (188) hide show
  1. package/dist/lib/browser/SheetContainer-GXPG3ZDN.mjs +351 -0
  2. package/dist/lib/browser/SheetContainer-GXPG3ZDN.mjs.map +7 -0
  3. package/dist/lib/browser/anchor-sort-CUTFYIT4.mjs +24 -0
  4. package/dist/lib/browser/anchor-sort-CUTFYIT4.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-ZOKEQL2K.mjs → chunk-5FLX3UGU.mjs} +55 -63
  6. package/dist/lib/browser/chunk-5FLX3UGU.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-AYMJXZFS.mjs +847 -0
  8. package/dist/lib/browser/chunk-AYMJXZFS.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-AT5ZK6JD.mjs → chunk-FJRLDX7Z.mjs} +1 -1
  10. package/dist/lib/browser/chunk-FJRLDX7Z.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-EMSCNWEK.mjs → chunk-IR42IS3F.mjs} +2 -2
  12. package/dist/lib/{node-esm/chunk-76T5X4VP.mjs.map → browser/chunk-IR42IS3F.mjs.map} +1 -1
  13. package/dist/lib/browser/{compute-graph-registry-WEJLJJ6T.mjs → compute-graph-registry-IXGGJJBU.mjs} +3 -3
  14. package/dist/lib/browser/compute-graph-registry-IXGGJJBU.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +17 -16
  16. package/dist/lib/browser/index.mjs.map +3 -3
  17. package/dist/lib/browser/{intent-resolver-6OUEM3IG.mjs → intent-resolver-UI4DHURQ.mjs} +2 -2
  18. package/dist/lib/browser/{markdown-DR4RDEEY.mjs → markdown-T4TUP4BF.mjs} +4 -4
  19. package/dist/lib/browser/markdown-T4TUP4BF.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-surface-ECKBP3UZ.mjs → react-surface-KI6T5M2X.mjs} +5 -5
  22. package/dist/lib/browser/types/index.mjs +1 -1
  23. package/dist/lib/node/SheetContainer-UUDOHLZR.cjs +351 -0
  24. package/dist/lib/node/SheetContainer-UUDOHLZR.cjs.map +7 -0
  25. package/dist/lib/node/{thread-WP43BC4N.cjs → anchor-sort-LTLYUTUP.cjs} +17 -10
  26. package/dist/lib/node/anchor-sort-LTLYUTUP.cjs.map +7 -0
  27. package/dist/lib/node/{chunk-D4MOMCEU.cjs → chunk-76NESQLB.cjs} +70 -78
  28. package/dist/lib/node/chunk-76NESQLB.cjs.map +7 -0
  29. package/dist/lib/node/chunk-BXBNSNDK.cjs +855 -0
  30. package/dist/lib/node/chunk-BXBNSNDK.cjs.map +7 -0
  31. package/dist/lib/node/{chunk-LEV7OSTK.cjs → chunk-FIM6EZ6M.cjs} +4 -4
  32. package/dist/lib/node/chunk-FIM6EZ6M.cjs.map +7 -0
  33. package/dist/lib/node/{chunk-O2FOEUYB.cjs → chunk-LJWWS53Z.cjs} +5 -5
  34. package/dist/lib/node/{chunk-O2FOEUYB.cjs.map → chunk-LJWWS53Z.cjs.map} +1 -1
  35. package/dist/lib/node/{compute-graph-registry-VVSRJUGS.cjs → compute-graph-registry-ARLDHPFW.cjs} +7 -7
  36. package/dist/lib/node/compute-graph-registry-ARLDHPFW.cjs.map +7 -0
  37. package/dist/lib/node/index.cjs +21 -20
  38. package/dist/lib/node/index.cjs.map +3 -3
  39. package/dist/lib/node/{intent-resolver-ICHNDL6F.cjs → intent-resolver-EVLGL7VZ.cjs} +9 -9
  40. package/dist/lib/node/{markdown-E7OUIMZO.cjs → markdown-DBPOAYI7.cjs} +8 -8
  41. package/dist/lib/node/markdown-DBPOAYI7.cjs.map +7 -0
  42. package/dist/lib/node/meta.json +1 -1
  43. package/dist/lib/node/{react-surface-6PBWE75L.cjs → react-surface-QHAPOAR2.cjs} +14 -14
  44. package/dist/lib/node/types/index.cjs +29 -29
  45. package/dist/lib/node/types/index.cjs.map +1 -1
  46. package/dist/lib/node-esm/SheetContainer-44KHKMPI.mjs +352 -0
  47. package/dist/lib/node-esm/SheetContainer-44KHKMPI.mjs.map +7 -0
  48. package/dist/lib/node-esm/anchor-sort-3E2VGLO6.mjs +25 -0
  49. package/dist/lib/node-esm/anchor-sort-3E2VGLO6.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-6NB67Y6X.mjs → chunk-DIF3IOAB.mjs} +55 -63
  51. package/dist/lib/node-esm/chunk-DIF3IOAB.mjs.map +7 -0
  52. package/dist/lib/node-esm/chunk-GCCM7R45.mjs +848 -0
  53. package/dist/lib/node-esm/chunk-GCCM7R45.mjs.map +7 -0
  54. package/dist/lib/node-esm/{chunk-76T5X4VP.mjs → chunk-IQ76YE6M.mjs} +2 -2
  55. package/dist/lib/{browser/chunk-EMSCNWEK.mjs.map → node-esm/chunk-IQ76YE6M.mjs.map} +1 -1
  56. package/dist/lib/node-esm/{chunk-HXBUY5ET.mjs → chunk-NMCVJWDT.mjs} +1 -1
  57. package/dist/lib/node-esm/chunk-NMCVJWDT.mjs.map +7 -0
  58. package/dist/lib/node-esm/{compute-graph-registry-PBQ52KH6.mjs → compute-graph-registry-7PDWXMHF.mjs} +3 -3
  59. package/dist/lib/node-esm/compute-graph-registry-7PDWXMHF.mjs.map +7 -0
  60. package/dist/lib/node-esm/index.mjs +17 -16
  61. package/dist/lib/node-esm/index.mjs.map +3 -3
  62. package/dist/lib/node-esm/{intent-resolver-2JNQCFCI.mjs → intent-resolver-TPOH5JM5.mjs} +2 -2
  63. package/dist/lib/node-esm/{markdown-BPKS2TNG.mjs → markdown-WWUJ3E5F.mjs} +4 -4
  64. package/dist/lib/node-esm/markdown-WWUJ3E5F.mjs.map +7 -0
  65. package/dist/lib/node-esm/meta.json +1 -1
  66. package/dist/lib/node-esm/{react-surface-UM2Y3ZWZ.mjs → react-surface-XT2J3S67.mjs} +5 -5
  67. package/dist/lib/node-esm/types/index.mjs +1 -1
  68. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/anchor-sort.d.ts +6 -0
  70. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/compute-graph-registry.d.ts +2 -2
  72. package/dist/types/src/capabilities/compute-graph-registry.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/index.d.ts +6 -6
  74. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/markdown.d.ts +2 -2
  76. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  77. package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -1
  78. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  79. package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
  80. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  81. package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
  82. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +3 -2
  83. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  84. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  85. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -1
  86. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +2 -2
  87. package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
  88. package/dist/types/src/components/SheetToolbar/align.d.ts +4 -1
  89. package/dist/types/src/components/SheetToolbar/align.d.ts.map +1 -1
  90. package/dist/types/src/components/SheetToolbar/style.d.ts +3 -1
  91. package/dist/types/src/components/SheetToolbar/style.d.ts.map +1 -1
  92. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +2 -3
  93. package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
  94. package/dist/types/src/components/index.d.ts +1 -6
  95. package/dist/types/src/components/index.d.ts.map +1 -1
  96. package/dist/types/src/extensions/compute.d.ts.map +1 -1
  97. package/dist/types/src/extensions/editor/extension.d.ts.map +1 -1
  98. package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
  99. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  100. package/dist/types/src/model/testing.d.ts.map +1 -1
  101. package/dist/types/src/model/useSheetModel.d.ts.map +1 -1
  102. package/dist/types/src/serializer.d.ts.map +1 -1
  103. package/dist/types/src/testing/data.d.ts.map +1 -1
  104. package/dist/types/src/testing/playwright/sheet-manager.d.ts.map +1 -1
  105. package/dist/types/src/testing/testing.d.ts.map +1 -1
  106. package/dist/types/src/translations.d.ts +2 -54
  107. package/dist/types/src/translations.d.ts.map +1 -1
  108. package/dist/types/src/types/schema.d.ts +38 -150
  109. package/dist/types/src/types/schema.d.ts.map +1 -1
  110. package/dist/types/src/types/sheet-range-types.d.ts.map +1 -1
  111. package/dist/types/src/types/types.d.ts +36 -36
  112. package/dist/types/src/types/types.d.ts.map +1 -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 +55 -48
  116. package/src/SheetPlugin.tsx +7 -5
  117. package/src/capabilities/anchor-sort.ts +22 -0
  118. package/src/capabilities/compute-graph-registry.ts +3 -3
  119. package/src/capabilities/index.ts +1 -1
  120. package/src/capabilities/markdown.ts +3 -3
  121. package/src/components/ComputeGraph/compute-graph.stories.tsx +4 -4
  122. package/src/components/FunctionEditor/FunctionEditor.tsx +1 -1
  123. package/src/components/GridSheet/GridSheet.stories.tsx +5 -2
  124. package/src/components/GridSheet/GridSheet.tsx +18 -12
  125. package/src/components/GridSheet/SheetCellEditor.stories.tsx +2 -2
  126. package/src/components/GridSheet/util.ts +17 -11
  127. package/src/components/RangeList/RangeList.tsx +2 -2
  128. package/src/components/SheetContainer/SheetContainer.stories.tsx +3 -6
  129. package/src/components/SheetContainer/SheetContainer.tsx +5 -8
  130. package/src/components/SheetToolbar/SheetToolbar.stories.tsx +2 -2
  131. package/src/components/SheetToolbar/SheetToolbar.tsx +56 -20
  132. package/src/components/SheetToolbar/align.ts +44 -14
  133. package/src/components/SheetToolbar/style.ts +48 -12
  134. package/src/components/SheetToolbar/useToolbarState.ts +3 -4
  135. package/src/extensions/compute.ts +1 -1
  136. package/src/integrations/thread-ranges.ts +14 -17
  137. package/src/model/sheet-model.test.ts +1 -1
  138. package/src/model/sheet-model.ts +17 -17
  139. package/src/sanity.test.ts +3 -3
  140. package/src/serializer.ts +3 -4
  141. package/src/testing/playwright/sheet-manager.ts +9 -9
  142. package/src/types/schema.ts +20 -22
  143. package/src/types/types.ts +25 -25
  144. package/src/types/util.ts +2 -3
  145. package/dist/lib/browser/SheetContainer-B3A5443Z.mjs +0 -370
  146. package/dist/lib/browser/SheetContainer-B3A5443Z.mjs.map +0 -7
  147. package/dist/lib/browser/chunk-AT5ZK6JD.mjs.map +0 -7
  148. package/dist/lib/browser/chunk-CHMPICA6.mjs +0 -815
  149. package/dist/lib/browser/chunk-CHMPICA6.mjs.map +0 -7
  150. package/dist/lib/browser/chunk-ZOKEQL2K.mjs.map +0 -7
  151. package/dist/lib/browser/compute-graph-registry-WEJLJJ6T.mjs.map +0 -7
  152. package/dist/lib/browser/markdown-DR4RDEEY.mjs.map +0 -7
  153. package/dist/lib/browser/thread-76MK2FMV.mjs +0 -17
  154. package/dist/lib/browser/thread-76MK2FMV.mjs.map +0 -7
  155. package/dist/lib/node/SheetContainer-LGRD3TTQ.cjs +0 -364
  156. package/dist/lib/node/SheetContainer-LGRD3TTQ.cjs.map +0 -7
  157. package/dist/lib/node/chunk-AEH3L5QZ.cjs +0 -822
  158. package/dist/lib/node/chunk-AEH3L5QZ.cjs.map +0 -7
  159. package/dist/lib/node/chunk-D4MOMCEU.cjs.map +0 -7
  160. package/dist/lib/node/chunk-LEV7OSTK.cjs.map +0 -7
  161. package/dist/lib/node/compute-graph-registry-VVSRJUGS.cjs.map +0 -7
  162. package/dist/lib/node/markdown-E7OUIMZO.cjs.map +0 -7
  163. package/dist/lib/node/thread-WP43BC4N.cjs.map +0 -7
  164. package/dist/lib/node-esm/SheetContainer-4FNTLG5R.mjs +0 -371
  165. package/dist/lib/node-esm/SheetContainer-4FNTLG5R.mjs.map +0 -7
  166. package/dist/lib/node-esm/chunk-6NB67Y6X.mjs.map +0 -7
  167. package/dist/lib/node-esm/chunk-HXBUY5ET.mjs.map +0 -7
  168. package/dist/lib/node-esm/chunk-WQHYR4WD.mjs +0 -816
  169. package/dist/lib/node-esm/chunk-WQHYR4WD.mjs.map +0 -7
  170. package/dist/lib/node-esm/compute-graph-registry-PBQ52KH6.mjs.map +0 -7
  171. package/dist/lib/node-esm/markdown-BPKS2TNG.mjs.map +0 -7
  172. package/dist/lib/node-esm/thread-4NCPE5FK.mjs +0 -18
  173. package/dist/lib/node-esm/thread-4NCPE5FK.mjs.map +0 -7
  174. package/dist/types/src/capabilities/thread.d.ts +0 -6
  175. package/dist/types/src/capabilities/thread.d.ts.map +0 -1
  176. package/dist/types/src/components/SheetToolbar/comment.d.ts +0 -23
  177. package/dist/types/src/components/SheetToolbar/comment.d.ts.map +0 -1
  178. package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts +0 -8
  179. package/dist/types/src/components/SheetToolbar/useToolbarAction.d.ts.map +0 -1
  180. package/src/capabilities/thread.ts +0 -14
  181. package/src/components/SheetToolbar/comment.ts +0 -56
  182. package/src/components/SheetToolbar/useToolbarAction.ts +0 -87
  183. /package/dist/lib/browser/{intent-resolver-6OUEM3IG.mjs.map → intent-resolver-UI4DHURQ.mjs.map} +0 -0
  184. /package/dist/lib/browser/{react-surface-ECKBP3UZ.mjs.map → react-surface-KI6T5M2X.mjs.map} +0 -0
  185. /package/dist/lib/node/{intent-resolver-ICHNDL6F.cjs.map → intent-resolver-EVLGL7VZ.cjs.map} +0 -0
  186. /package/dist/lib/node/{react-surface-6PBWE75L.cjs.map → react-surface-QHAPOAR2.cjs.map} +0 -0
  187. /package/dist/lib/node-esm/{intent-resolver-2JNQCFCI.mjs.map → intent-resolver-TPOH5JM5.mjs.map} +0 -0
  188. /package/dist/lib/node-esm/{react-surface-UM2Y3ZWZ.mjs.map → react-surface-XT2J3S67.mjs.map} +0 -0
@@ -1,816 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- rangeExtension,
4
- sheetExtension
5
- } from "./chunk-HXBUY5ET.mjs";
6
- import {
7
- DEFAULT_COLS,
8
- DEFAULT_ROWS,
9
- Range,
10
- SheetAction,
11
- cellClassNameForRange,
12
- rangeFromIndex,
13
- useSheetModel
14
- } from "./chunk-6NB67Y6X.mjs";
15
- import {
16
- SHEET_PLUGIN
17
- } from "./chunk-Y6ND5HWX.mjs";
18
-
19
- // packages/plugins/plugin-sheet/src/components/ComputeGraph/ComputeGraphContextProvider.tsx
20
- import React, { createContext, useContext } from "react";
21
- import { raise } from "@dxos/debug";
22
- import { useAsyncState } from "@dxos/react-hooks";
23
- var ComputeGraphContext = /* @__PURE__ */ createContext(void 0);
24
- var ComputeGraphContextProvider = ({ registry, children }) => {
25
- return /* @__PURE__ */ React.createElement(ComputeGraphContext.Provider, {
26
- value: {
27
- registry
28
- }
29
- }, children);
30
- };
31
- var useComputeGraph = (space) => {
32
- const { registry } = useContext(ComputeGraphContext) ?? raise(new Error("Missing ComputeGraphContext"));
33
- const [graph] = useAsyncState(async () => {
34
- if (space) {
35
- const graph2 = registry.getOrCreateGraph(space);
36
- await graph2.open();
37
- return graph2;
38
- }
39
- }, [
40
- space,
41
- registry
42
- ]);
43
- return graph;
44
- };
45
-
46
- // packages/plugins/plugin-sheet/src/components/RangeList/RangeList.tsx
47
- import React2, { useCallback } from "react";
48
- import { rangeToA1Notation } from "@dxos/compute";
49
- import { S } from "@dxos/echo-schema";
50
- import { useTranslation } from "@dxos/react-ui";
51
- import { List } from "@dxos/react-ui-list";
52
- import { ghostHover } from "@dxos/react-ui-theme";
53
- var RangeList = ({ sheet }) => {
54
- const { t } = useTranslation(SHEET_PLUGIN);
55
- const handleSelectRange = (range) => {
56
- };
57
- const handleDeleteRange = useCallback((range) => {
58
- const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);
59
- sheet.ranges.splice(index, 1);
60
- }, [
61
- sheet
62
- ]);
63
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement("h2", {
64
- className: "p-2 text-sm font-semibold"
65
- }, t("range list heading")), /* @__PURE__ */ React2.createElement(List.Root, {
66
- items: sheet.ranges,
67
- isItem: S.is(Range)
68
- }, ({ items: ranges }) => ranges.map((range, i) => /* @__PURE__ */ React2.createElement(List.Item, {
69
- key: i,
70
- item: range,
71
- classNames: [
72
- "p-2",
73
- ghostHover
74
- ]
75
- }, /* @__PURE__ */ React2.createElement(List.ItemDragHandle, null), /* @__PURE__ */ React2.createElement(List.ItemTitle, {
76
- onClick: () => handleSelectRange(range)
77
- }, t("range title", {
78
- position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),
79
- key: t(`range key ${range.key} label`),
80
- value: t(`range value ${range.value} label`)
81
- })), /* @__PURE__ */ React2.createElement(List.ItemDeleteButton, {
82
- onClick: () => handleDeleteRange(range)
83
- })))));
84
- };
85
-
86
- // packages/plugins/plugin-sheet/src/components/index.ts
87
- import { lazy } from "react";
88
-
89
- // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
90
- import React4, { useCallback as useCallback4, useMemo as useMemo2, useRef, useState as useState3 } from "react";
91
- import { createIntent as createIntent2, useIntentDispatcher as useIntentDispatcher2 } from "@dxos/app-framework";
92
- import { rangeToA1Notation as rangeToA1Notation2 } from "@dxos/compute";
93
- import { DropdownMenu, Icon, useTranslation as useTranslation2 } from "@dxos/react-ui";
94
- import { useAttention } from "@dxos/react-ui-attention";
95
- import { closestCell, defaultSizeRow, editorKeys, Grid as Grid2, GridCellEditor, parseCellIndex } from "@dxos/react-ui-grid";
96
-
97
- // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
98
- import { useEffect as useEffect2, useState } from "react";
99
- import { inRange as inRange2 } from "@dxos/compute";
100
- import { createDocAccessor, fullyQualifiedId as fullyQualifiedId2 } from "@dxos/react-client/echo";
101
- import { parseValue, cellClassesForFieldType } from "@dxos/react-ui-form";
102
- import { colToA1Notation, rowToA1Notation, commentedClassName } from "@dxos/react-ui-grid";
103
- import { mx } from "@dxos/react-ui-theme";
104
-
105
- // packages/plugins/plugin-sheet/src/integrations/thread-ranges.ts
106
- import { pipe } from "effect";
107
- import { useCallback as useCallback2, useEffect, useMemo } from "react";
108
- import { createIntent, createResolver, LayoutAction, useIntentResolver, useIntentDispatcher, chain } from "@dxos/app-framework";
109
- import { debounce } from "@dxos/async";
110
- import { inRange } from "@dxos/compute";
111
- import { S as S2 } from "@dxos/echo-schema";
112
- import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from "@dxos/plugin-deck/types";
113
- import { ThreadAction } from "@dxos/plugin-thread/types";
114
- import { fullyQualifiedId } from "@dxos/react-client/echo";
115
- var completeCellRangeToThreadCursor = (range) => {
116
- return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;
117
- };
118
- var parseThreadAnchorAsCellRange = (cursor) => {
119
- const coords = cursor.split(",");
120
- if (coords.length !== 4) {
121
- return null;
122
- } else {
123
- const [fromCol, fromRow, toCol, toRow] = coords;
124
- return {
125
- from: {
126
- col: parseInt(fromCol),
127
- row: parseInt(fromRow)
128
- },
129
- to: {
130
- col: parseInt(toCol),
131
- row: parseInt(toRow)
132
- }
133
- };
134
- }
135
- };
136
- var useUpdateFocusedCellOnThreadSelection = (grid) => {
137
- const { model, setActiveRefs } = useSheetContext();
138
- const scrollIntoViewResolver = useMemo(() => createResolver({
139
- intent: LayoutAction.ScrollIntoView,
140
- position: "hoist",
141
- filter: (data) => {
142
- if (!S2.is(LayoutAction.ScrollIntoView.fields.input)(data)) {
143
- return false;
144
- }
145
- return data.subject === fullyQualifiedId(model.sheet) && !!data.options?.cursor;
146
- },
147
- resolve: ({ options: { cursor, ref } }) => {
148
- setActiveRefs(ref);
149
- const range = parseThreadAnchorAsCellRange(cursor);
150
- range && grid?.setFocus({
151
- ...range.to,
152
- plane: "grid"
153
- }, true);
154
- }
155
- }), [
156
- model.sheet,
157
- setActiveRefs
158
- ]);
159
- useIntentResolver(SHEET_PLUGIN, scrollIntoViewResolver);
160
- };
161
- var useSelectThreadOnCellFocus = () => {
162
- const { model, cursor } = useSheetContext();
163
- const { dispatchPromise: dispatch } = useIntentDispatcher();
164
- const threads = useMemo(() => model.sheet.threads?.filter((thread) => !!thread) ?? [], [
165
- // TODO(thure): Surely we can find a better dependency for this…
166
- JSON.stringify(model.sheet.threads)
167
- ]);
168
- const selectClosestThread = useCallback2((cellAddress) => {
169
- if (!cellAddress || !threads) {
170
- return;
171
- }
172
- const closestThread = threads?.find((ref) => {
173
- if (ref.target?.anchor) {
174
- const range = parseThreadAnchorAsCellRange(ref.target.anchor);
175
- return range ? inRange(range, cellAddress) : false;
176
- } else {
177
- return false;
178
- }
179
- });
180
- if (closestThread) {
181
- const primary = fullyQualifiedId(model.sheet);
182
- const intent = pipe(createIntent(ThreadAction.Select, {
183
- current: fullyQualifiedId(closestThread)
184
- }), chain(DeckAction.ChangeCompanion, {
185
- primary,
186
- companion: `${primary}${ATTENDABLE_PATH_SEPARATOR}comments`
187
- }));
188
- void dispatch(intent);
189
- }
190
- }, [
191
- dispatch,
192
- threads
193
- ]);
194
- const debounced = useMemo(() => {
195
- return debounce((cellCoords) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);
196
- }, [
197
- selectClosestThread
198
- ]);
199
- useEffect(() => {
200
- if (!cursor) {
201
- return;
202
- }
203
- debounced(cursor);
204
- }, [
205
- cursor,
206
- debounced
207
- ]);
208
- };
209
-
210
- // packages/plugins/plugin-sheet/src/components/GridSheet/util.ts
211
- var createDxGridColumns = (model) => {
212
- return model.sheet.columns.reduce((acc, columnId, numericIndex) => {
213
- if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {
214
- acc.grid[numericIndex] = {
215
- size: model.sheet.columnMeta[columnId].size,
216
- resizeable: true
217
- };
218
- }
219
- return acc;
220
- }, {
221
- grid: {}
222
- });
223
- };
224
- var createDxGridRows = (model) => {
225
- return model.sheet.rows.reduce((acc, rowId, numericIndex) => {
226
- if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {
227
- acc.grid[numericIndex] = {
228
- size: model.sheet.rowMeta[rowId].size,
229
- resizeable: true
230
- };
231
- }
232
- return acc;
233
- }, {
234
- grid: {}
235
- });
236
- };
237
- var projectCellProps = (model, col, row) => {
238
- const address = {
239
- col,
240
- row
241
- };
242
- const rawValue = model.getValue(address);
243
- const ranges = model.sheet.ranges?.filter(({ range }) => inRange2(rangeFromIndex(model.sheet, range), address));
244
- const threadRefs = model.sheet.threads?.filter((thread) => {
245
- const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target.anchor);
246
- return thread && range ? inRange2(range, address) : false;
247
- }).map((thread) => fullyQualifiedId2(thread)).join(" ");
248
- const description = model.getValueDescription(address);
249
- const type = description?.type;
250
- const format = description?.format;
251
- const classNames = ranges?.map(cellClassNameForRange).reverse();
252
- return {
253
- value: parseValue({
254
- type,
255
- format,
256
- value: rawValue
257
- }),
258
- className: mx(cellClassesForFieldType({
259
- type,
260
- format
261
- }), threadRefs && commentedClassName, classNames),
262
- dataRefs: threadRefs
263
- };
264
- };
265
- var gridCellGetter = (model) => {
266
- const cachedGridCells = {};
267
- return (nextBounds) => {
268
- [
269
- ...Array(nextBounds.end.col - nextBounds.start.col)
270
- ].forEach((_, c0) => {
271
- return [
272
- ...Array(nextBounds.end.row - nextBounds.start.row)
273
- ].forEach((_2, r0) => {
274
- const col = nextBounds.start.col + c0;
275
- const row = nextBounds.start.row + r0;
276
- cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);
277
- });
278
- });
279
- return cachedGridCells;
280
- };
281
- };
282
- var rowLabelCell = (row) => ({
283
- value: rowToA1Notation(row),
284
- className: "text-end pie-1 text-subdued",
285
- resizeHandle: "row"
286
- });
287
- var colLabelCell = (col) => ({
288
- value: colToA1Notation(col),
289
- className: "text-subdued",
290
- resizeHandle: "col"
291
- });
292
- var cellGetter = (model) => {
293
- const getGridCells = gridCellGetter(model);
294
- return (nextBounds, plane) => {
295
- switch (plane) {
296
- case "grid":
297
- return getGridCells(nextBounds);
298
- case "frozenColsStart":
299
- return [
300
- ...Array(nextBounds.end.row - nextBounds.start.row)
301
- ].reduce((acc, _, r0) => {
302
- const r = nextBounds.start.row + r0;
303
- acc[`0,${r}`] = rowLabelCell(r);
304
- return acc;
305
- }, {});
306
- case "frozenRowsStart":
307
- return [
308
- ...Array(nextBounds.end.col - nextBounds.start.col)
309
- ].reduce((acc, _, c0) => {
310
- const c = nextBounds.start.col + c0;
311
- acc[`${c},0`] = colLabelCell(c);
312
- return acc;
313
- }, {});
314
- default:
315
- return {};
316
- }
317
- };
318
- };
319
- var useSheetModelDxGridProps = (dxGrid, model) => {
320
- const [columns, setColumns] = useState(createDxGridColumns(model));
321
- const [rows, setRows] = useState(createDxGridRows(model));
322
- useEffect2(() => {
323
- const cellsAccessor = createDocAccessor(model.sheet, [
324
- "cells"
325
- ]);
326
- if (dxGrid) {
327
- dxGrid.getCells = cellGetter(model);
328
- }
329
- const handleCellsUpdate = () => {
330
- dxGrid?.requestUpdate("initialCells");
331
- };
332
- cellsAccessor.handle.addListener("change", handleCellsUpdate);
333
- const unsubscribe = model.graph.update.on(handleCellsUpdate);
334
- return () => {
335
- cellsAccessor.handle.removeListener("change", handleCellsUpdate);
336
- unsubscribe();
337
- };
338
- }, [
339
- model,
340
- dxGrid
341
- ]);
342
- useEffect2(() => {
343
- const columnMetaAccessor = createDocAccessor(model.sheet, [
344
- "columnMeta"
345
- ]);
346
- const rowMetaAccessor = createDocAccessor(model.sheet, [
347
- "rowMeta"
348
- ]);
349
- const handleColumnMetaUpdate = () => {
350
- setColumns(createDxGridColumns(model));
351
- };
352
- const handleRowMetaUpdate = () => {
353
- setRows(createDxGridRows(model));
354
- };
355
- columnMetaAccessor.handle.addListener("change", handleColumnMetaUpdate);
356
- rowMetaAccessor.handle.addListener("change", handleRowMetaUpdate);
357
- return () => {
358
- columnMetaAccessor.handle.removeListener("change", handleColumnMetaUpdate);
359
- rowMetaAccessor.handle.removeListener("change", handleRowMetaUpdate);
360
- };
361
- }, [
362
- model,
363
- dxGrid
364
- ]);
365
- return {
366
- columns,
367
- rows
368
- };
369
- };
370
-
371
- // packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx
372
- import React3, { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useState as useState2 } from "react";
373
- import { invariant } from "@dxos/invariant";
374
- import { fullyQualifiedId as fullyQualifiedId3 } from "@dxos/react-client/echo";
375
- import { Grid, useGridContext } from "@dxos/react-ui-grid";
376
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-sheet/src/components/SheetContext/SheetContext.tsx";
377
- var SheetContext = /* @__PURE__ */ createContext2(void 0);
378
- var useSheetContext = () => {
379
- const context = useContext2(SheetContext);
380
- invariant(context, void 0, {
381
- F: __dxlog_file,
382
- L: 54,
383
- S: void 0,
384
- A: [
385
- "context",
386
- ""
387
- ]
388
- });
389
- return context;
390
- };
391
- var SheetProviderImpl = ({ model, onInfo, ignoreAttention, children, __gridScope }) => {
392
- const { id, editing, setEditing } = useGridContext("SheetProvider", __gridScope);
393
- const [cursor, setCursorInternal] = useState2();
394
- const [range, setRangeInternal] = useState2();
395
- const [cursorFallbackRange, setCursorFallbackRange] = useState2();
396
- const [activeRefs, setActiveRefs] = useState2("");
397
- const setCursor = useCallback3((nextCursor) => {
398
- setCursorInternal(nextCursor);
399
- setCursorFallbackRange(range?.to ? range : nextCursor ? {
400
- from: nextCursor,
401
- to: nextCursor
402
- } : void 0);
403
- }, [
404
- range
405
- ]);
406
- const setRange = useCallback3((nextRange) => {
407
- setRangeInternal(nextRange);
408
- setCursorFallbackRange(nextRange?.to ? nextRange : cursor ? {
409
- from: cursor,
410
- to: cursor
411
- } : void 0);
412
- }, [
413
- cursor
414
- ]);
415
- return /* @__PURE__ */ React3.createElement(SheetContext.Provider, {
416
- value: {
417
- id,
418
- model,
419
- editing,
420
- setEditing,
421
- cursor,
422
- setCursor,
423
- range,
424
- setRange,
425
- cursorFallbackRange,
426
- activeRefs,
427
- setActiveRefs,
428
- // TODO(burdon): Change to event.
429
- onInfo,
430
- ignoreAttention
431
- }
432
- }, children);
433
- };
434
- var SheetProvider = ({ children, graph, sheet, readonly, ignoreAttention, onInfo }) => {
435
- const model = useSheetModel(graph, sheet, {
436
- readonly
437
- });
438
- return !model ? null : /* @__PURE__ */ React3.createElement(Grid.Root, {
439
- id: fullyQualifiedId3(sheet)
440
- }, /* @__PURE__ */ React3.createElement(SheetProviderImpl, {
441
- model,
442
- onInfo,
443
- ignoreAttention
444
- }, children));
445
- };
446
-
447
- // packages/plugins/plugin-sheet/src/components/GridSheet/GridSheet.tsx
448
- var inertPosition = {
449
- plane: "grid",
450
- col: 0,
451
- row: 0
452
- };
453
- var initialCells = {
454
- grid: {},
455
- frozenColsStart: [
456
- ...Array(64)
457
- ].reduce((acc, _, i) => {
458
- acc[`0,${i}`] = rowLabelCell(i);
459
- return acc;
460
- }, {}),
461
- frozenRowsStart: [
462
- ...Array(12)
463
- ].reduce((acc, _, i) => {
464
- acc[`${i},0`] = colLabelCell(i);
465
- return acc;
466
- }, {})
467
- };
468
- var frozen = {
469
- frozenColsStart: 1,
470
- frozenRowsStart: 1
471
- };
472
- var sheetRowDefault = {
473
- frozenRowsStart: {
474
- size: defaultSizeRow,
475
- readonly: true
476
- },
477
- grid: {
478
- size: defaultSizeRow,
479
- resizeable: true
480
- }
481
- };
482
- var sheetColDefault = {
483
- frozenColsStart: {
484
- size: 48,
485
- readonly: true
486
- },
487
- grid: {
488
- size: 180,
489
- resizeable: true
490
- }
491
- };
492
- var GridSheet = () => {
493
- const { t } = useTranslation2(SHEET_PLUGIN);
494
- const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } = useSheetContext();
495
- const [dxGrid, setDxGrid] = useState3(null);
496
- const [extraplanarFocus, setExtraplanarFocus] = useState3(null);
497
- const { dispatchPromise: dispatch } = useIntentDispatcher2();
498
- const rangeController = useRef();
499
- const { hasAttention } = useAttention(id);
500
- const handleFocus = useCallback4((event) => {
501
- if (!editing) {
502
- const cell = closestCell(event.target);
503
- if (cell) {
504
- if (cell.plane === "grid") {
505
- setCursor({
506
- col: cell.col,
507
- row: cell.row
508
- });
509
- setExtraplanarFocus(null);
510
- } else {
511
- setExtraplanarFocus(cell);
512
- }
513
- } else {
514
- setExtraplanarFocus(null);
515
- }
516
- }
517
- }, [
518
- editing
519
- ]);
520
- const handleClose = useCallback4((_value, event) => {
521
- if (event) {
522
- const { key, shift } = event;
523
- const axis = [
524
- "Enter",
525
- "ArrowUp",
526
- "ArrowDown"
527
- ].includes(key) ? "row" : [
528
- "Tab",
529
- "ArrowLeft",
530
- "ArrowRight"
531
- ].includes(key) ? "col" : void 0;
532
- const delta = key.startsWith("Arrow") ? [
533
- "ArrowUp",
534
- "ArrowLeft"
535
- ].includes(key) ? -1 : 1 : shift ? -1 : 1;
536
- dxGrid?.refocus(axis, delta);
537
- }
538
- }, [
539
- model,
540
- editing,
541
- dxGrid
542
- ]);
543
- const handleBlur = useCallback4((value) => {
544
- if (value !== void 0) {
545
- model.setValue(parseCellIndex(editing.index), value);
546
- }
547
- }, [
548
- model,
549
- editing
550
- ]);
551
- const handleAxisResize = useCallback4(({ axis, size, index: numericIndex }) => {
552
- if (axis === "row") {
553
- const rowId = model.sheet.rows[parseInt(numericIndex)];
554
- model.sheet.rowMeta[rowId] ??= {};
555
- model.sheet.rowMeta[rowId].size = size;
556
- } else {
557
- const columnId = model.sheet.columns[parseInt(numericIndex)];
558
- model.sheet.columnMeta[columnId] ??= {};
559
- model.sheet.columnMeta[columnId].size = size;
560
- }
561
- }, [
562
- model
563
- ]);
564
- const handleSelect = useCallback4(({ minCol, maxCol, minRow, maxRow }) => {
565
- const range = {
566
- from: {
567
- col: minCol,
568
- row: minRow
569
- }
570
- };
571
- if (minCol !== maxCol || minRow !== maxRow) {
572
- range.to = {
573
- col: maxCol,
574
- row: maxRow
575
- };
576
- }
577
- if (editing) {
578
- rangeController.current?.setRange(rangeToA1Notation2(range));
579
- } else {
580
- setRange(range.to ? range : void 0);
581
- }
582
- }, [
583
- editing
584
- ]);
585
- const handleWheel = useCallback4((event) => {
586
- if (!ignoreAttention && !hasAttention) {
587
- event.stopPropagation();
588
- }
589
- }, [
590
- hasAttention,
591
- ignoreAttention
592
- ]);
593
- const selectEntireAxis = useCallback4((pos) => {
594
- switch (pos.plane) {
595
- case "frozenRowsStart":
596
- return dxGrid?.setSelection({
597
- start: {
598
- col: pos.col,
599
- row: 0,
600
- plane: "grid"
601
- },
602
- end: {
603
- col: pos.col,
604
- row: model.sheet.rows.length - 1,
605
- plane: "grid"
606
- }
607
- });
608
- case "frozenColsStart":
609
- return dxGrid?.setSelection({
610
- start: {
611
- row: pos.row,
612
- col: 0,
613
- plane: "grid"
614
- },
615
- end: {
616
- row: pos.row,
617
- col: model.sheet.columns.length - 1,
618
- plane: "grid"
619
- }
620
- });
621
- }
622
- }, [
623
- dxGrid,
624
- model.sheet
625
- ]);
626
- const handleClick = useCallback4((event) => {
627
- const cell = closestCell(event.target);
628
- if (cell) {
629
- selectEntireAxis(cell);
630
- }
631
- }, [
632
- selectEntireAxis
633
- ]);
634
- const handleKeyDown = useCallback4((event) => {
635
- switch (event.key) {
636
- case "Backspace":
637
- case "Delete":
638
- event.preventDefault();
639
- return cursorFallbackRange && model.clear(cursorFallbackRange);
640
- case "Enter":
641
- case "Space":
642
- if (dxGrid && extraplanarFocus) {
643
- switch (extraplanarFocus.plane) {
644
- case "frozenRowsStart":
645
- case "frozenColsStart":
646
- event.preventDefault();
647
- return selectEntireAxis(extraplanarFocus);
648
- }
649
- }
650
- }
651
- if (event.metaKey || event.ctrlKey) {
652
- switch (event.key) {
653
- case "x":
654
- case "X":
655
- event.preventDefault();
656
- return cursorFallbackRange && model.cut(cursorFallbackRange);
657
- case "c":
658
- case "C":
659
- event.preventDefault();
660
- return cursorFallbackRange && model.copy(cursorFallbackRange);
661
- case "v":
662
- case "V":
663
- event.preventDefault();
664
- return cursor && model.paste(cursor);
665
- case "z":
666
- event.preventDefault();
667
- return event.shiftKey ? model.redo() : model.undo();
668
- case "Z":
669
- case "y":
670
- event.preventDefault();
671
- return model.redo();
672
- }
673
- }
674
- }, [
675
- cursorFallbackRange,
676
- model,
677
- cursor,
678
- extraplanarFocus,
679
- selectEntireAxis
680
- ]);
681
- const contextMenuAnchorRef = useRef(null);
682
- const [contextMenuOpen, setContextMenuOpen] = useState3(null);
683
- const contextMenuAxis = contextMenuOpen?.plane.startsWith("frozenRows") ? "col" : "row";
684
- const handleContextMenu = useCallback4((event) => {
685
- const cell = closestCell(event.target);
686
- if (cell && cell.plane.startsWith("frozen")) {
687
- event.preventDefault();
688
- contextMenuAnchorRef.current = event.target;
689
- setContextMenuOpen(cell);
690
- }
691
- }, []);
692
- const handleAxisMenuAction = useCallback4((operation) => {
693
- switch (operation) {
694
- case "insert-before":
695
- case "insert-after":
696
- return dispatch(createIntent2(SheetAction.InsertAxis, {
697
- model,
698
- axis: contextMenuAxis,
699
- index: contextMenuOpen[contextMenuAxis] + (operation === "insert-before" ? 0 : 1)
700
- }));
701
- case "drop":
702
- return dispatch(createIntent2(SheetAction.DropAxis, {
703
- model,
704
- axis: contextMenuAxis,
705
- axisIndex: model.sheet[contextMenuAxis === "row" ? "rows" : "columns"][contextMenuOpen[contextMenuAxis]]
706
- }));
707
- }
708
- }, [
709
- contextMenuAxis,
710
- contextMenuOpen,
711
- model,
712
- dispatch
713
- ]);
714
- const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
715
- const extension = useMemo2(() => [
716
- editorKeys({
717
- onClose: handleClose,
718
- ...editing?.initialContent && {
719
- onNav: handleClose
720
- }
721
- }),
722
- sheetExtension({
723
- functions: model.graph.getFunctions()
724
- }),
725
- rangeExtension({
726
- onInit: (fn) => rangeController.current = fn,
727
- onStateChange: (state) => {
728
- if (dxGrid) {
729
- dxGrid.mode = typeof state.activeRange === "undefined" ? "edit" : "edit-select";
730
- }
731
- }
732
- })
733
- ], [
734
- model,
735
- handleClose,
736
- editing
737
- ]);
738
- const getCellContent = useCallback4((index) => {
739
- return model.getCellText(parseCellIndex(index));
740
- }, [
741
- model
742
- ]);
743
- useUpdateFocusedCellOnThreadSelection(dxGrid);
744
- useSelectThreadOnCellFocus();
745
- return /* @__PURE__ */ React4.createElement("div", {
746
- role: "none",
747
- className: "relative min-bs-0"
748
- }, /* @__PURE__ */ React4.createElement(GridCellEditor, {
749
- getCellContent,
750
- extension,
751
- onBlur: handleBlur
752
- }), /* @__PURE__ */ React4.createElement(Grid2.Content, {
753
- initialCells,
754
- limitColumns: DEFAULT_COLS,
755
- limitRows: DEFAULT_ROWS,
756
- columns,
757
- rows,
758
- onAxisResize: handleAxisResize,
759
- onSelect: handleSelect,
760
- rowDefault: sheetRowDefault,
761
- columnDefault: sheetColDefault,
762
- frozen,
763
- onFocus: handleFocus,
764
- onWheelCapture: handleWheel,
765
- onKeyDown: handleKeyDown,
766
- onContextMenu: handleContextMenu,
767
- onClick: handleClick,
768
- overscroll: "trap",
769
- className: "[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:border-bs [&_.dx-grid]:absolute [&_.dx-grid]:inset-0 [&_.dx-grid]:border-separator",
770
- activeRefs,
771
- ref: setDxGrid
772
- }), /* @__PURE__ */ React4.createElement(DropdownMenu.Root, {
773
- modal: false,
774
- open: !!contextMenuOpen,
775
- onOpenChange: (nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)
776
- }, /* @__PURE__ */ React4.createElement(DropdownMenu.VirtualTrigger, {
777
- virtualRef: contextMenuAnchorRef
778
- }), /* @__PURE__ */ React4.createElement(DropdownMenu.Content, {
779
- side: contextMenuAxis === "col" ? "bottom" : "right",
780
- sideOffset: 4,
781
- collisionPadding: 8
782
- }, /* @__PURE__ */ React4.createElement(DropdownMenu.Viewport, null, /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
783
- onClick: () => handleAxisMenuAction("insert-before"),
784
- "data-testid": `grid.${contextMenuAxis}.insert-before`
785
- }, /* @__PURE__ */ React4.createElement(Icon, {
786
- size: 5,
787
- icon: contextMenuAxis === "col" ? "ph--columns-plus-left--regular" : "ph--rows-plus-top--regular"
788
- }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} before label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
789
- onClick: () => handleAxisMenuAction("insert-after"),
790
- "data-testid": `grid.${contextMenuAxis}.insert-after`
791
- }, /* @__PURE__ */ React4.createElement(Icon, {
792
- size: 5,
793
- icon: contextMenuAxis === "col" ? "ph--columns-plus-right--regular" : "ph--rows-plus-bottom--regular"
794
- }), /* @__PURE__ */ React4.createElement("span", null, t(`add ${contextMenuAxis} after label`))), /* @__PURE__ */ React4.createElement(DropdownMenu.Item, {
795
- onClick: () => handleAxisMenuAction("drop"),
796
- "data-testid": `grid.${contextMenuAxis}.drop`
797
- }, /* @__PURE__ */ React4.createElement(Icon, {
798
- size: 5,
799
- icon: "ph--backspace--regular"
800
- }), /* @__PURE__ */ React4.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ React4.createElement(DropdownMenu.Arrow, null))));
801
- };
802
-
803
- // packages/plugins/plugin-sheet/src/components/index.ts
804
- var SheetContainer = lazy(() => import("./SheetContainer-4FNTLG5R.mjs"));
805
-
806
- export {
807
- ComputeGraphContextProvider,
808
- useComputeGraph,
809
- completeCellRangeToThreadCursor,
810
- useSheetContext,
811
- SheetProvider,
812
- GridSheet,
813
- RangeList,
814
- SheetContainer
815
- };
816
- //# sourceMappingURL=chunk-WQHYR4WD.mjs.map