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