@dxos/plugin-sheet 0.7.5-main.9d2a38b → 0.7.5-main.e94eead
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.
- package/dist/lib/browser/{SheetContainer-CM4CO3DC.mjs → SheetContainer-EDJA5L2H.mjs} +5 -5
- package/dist/lib/browser/{chunk-FOO6NGBM.mjs → chunk-DN6QF7VV.mjs} +6 -1
- package/dist/lib/browser/{chunk-FOO6NGBM.mjs.map → chunk-DN6QF7VV.mjs.map} +2 -2
- package/dist/lib/browser/chunk-GAFHJBCU.mjs +18 -0
- package/dist/lib/browser/chunk-GAFHJBCU.mjs.map +7 -0
- package/dist/lib/browser/{chunk-PW25VUP6.mjs → chunk-LXHRT3CC.mjs} +2 -2
- package/dist/lib/browser/{chunk-T3IVPMRX.mjs → chunk-OOSRC36N.mjs} +2 -2
- package/dist/lib/browser/{chunk-H23JW3DX.mjs → chunk-UGSCCRPW.mjs} +28 -20
- package/dist/lib/browser/chunk-UGSCCRPW.mjs.map +7 -0
- package/dist/lib/browser/{compute-graph-registry-XH6B2SWG.mjs → compute-graph-registry-EGPD4HEX.mjs} +3 -3
- package/dist/lib/browser/index.mjs +28 -36
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/intent-resolver-6S2RMLQF.mjs +56 -0
- package/dist/lib/browser/intent-resolver-6S2RMLQF.mjs.map +7 -0
- package/dist/lib/browser/{markdown-IKG5FNCA.mjs → markdown-EJU2M7EE.mjs} +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-URRC3AFC.mjs → react-surface-24GOYR7J.mjs} +20 -11
- package/dist/lib/browser/react-surface-24GOYR7J.mjs.map +7 -0
- package/dist/lib/browser/{thread-YX6KBQNQ.mjs → thread-7ZWW5EA7.mjs} +3 -3
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node/{SheetContainer-TJ3JQLWM.cjs → SheetContainer-B77HHBOC.cjs} +37 -37
- package/dist/lib/node/{chunk-E3RXOEL6.cjs → chunk-4LSYTNS4.cjs} +6 -6
- package/dist/lib/node/{chunk-NLDXUFDG.cjs → chunk-MLU6KRQN.cjs} +9 -6
- package/dist/lib/node/chunk-MLU6KRQN.cjs.map +7 -0
- package/dist/lib/node/{chunk-P4KSGZSS.cjs → chunk-SQZEJPZ7.cjs} +9 -4
- package/dist/lib/node/{chunk-P4KSGZSS.cjs.map → chunk-SQZEJPZ7.cjs.map} +2 -2
- package/dist/lib/node/{chunk-ZPWW4LPY.cjs → chunk-VMJK5QN4.cjs} +41 -33
- package/dist/lib/node/chunk-VMJK5QN4.cjs.map +7 -0
- package/dist/lib/node/{chunk-FU5K66DS.cjs → chunk-ZV2RS3QH.cjs} +6 -6
- package/dist/lib/node/{compute-graph-registry-ORGTIE5M.cjs → compute-graph-registry-GJK5H264.cjs} +7 -7
- package/dist/lib/node/index.cjs +43 -51
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/intent-resolver-I25V7SBT.cjs +69 -0
- package/dist/lib/node/intent-resolver-I25V7SBT.cjs.map +7 -0
- package/dist/lib/node/{markdown-EUUL3Q36.cjs → markdown-SQHC4EGJ.cjs} +9 -9
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-IQN5JKSS.cjs → react-surface-6BJQU2XB.cjs} +24 -18
- package/dist/lib/node/react-surface-6BJQU2XB.cjs.map +7 -0
- package/dist/lib/node/{thread-VBPS23P2.cjs → thread-DRNYTR6M.cjs} +8 -8
- package/dist/lib/node/types/index.cjs +30 -30
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/{SheetContainer-QEEFORIC.mjs → SheetContainer-KXWIQCP4.mjs} +5 -5
- package/dist/lib/node-esm/{chunk-OXD6RBFF.mjs → chunk-3PA7XGUK.mjs} +28 -20
- package/dist/lib/node-esm/chunk-3PA7XGUK.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-PTOI45NK.mjs → chunk-7TL2H7LA.mjs} +6 -1
- package/dist/lib/node-esm/{chunk-PTOI45NK.mjs.map → chunk-7TL2H7LA.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-NSVUOAI6.mjs → chunk-HPAMZ6SP.mjs} +2 -2
- package/dist/lib/node-esm/chunk-RTZXXOS2.mjs +20 -0
- package/dist/lib/node-esm/chunk-RTZXXOS2.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-KCXK5UM6.mjs → chunk-SX3S7UKU.mjs} +2 -2
- package/dist/lib/node-esm/{compute-graph-registry-JH2FRHLD.mjs → compute-graph-registry-3F5JCYEN.mjs} +3 -3
- package/dist/lib/node-esm/index.mjs +28 -36
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/intent-resolver-IPRSINII.mjs +57 -0
- package/dist/lib/node-esm/intent-resolver-IPRSINII.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-D2ZMN7LR.mjs → markdown-UXKP45S3.mjs} +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-XJIX5G3I.mjs → react-surface-YGNWYLVN.mjs} +20 -11
- package/dist/lib/node-esm/react-surface-YGNWYLVN.mjs.map +7 -0
- package/dist/lib/node-esm/{thread-HSJD3SR6.mjs → thread-6T5VXPAF.mjs} +3 -3
- package/dist/lib/node-esm/types/index.mjs +2 -2
- package/dist/types/src/SheetPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +8 -13
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts +1 -1
- package/dist/types/src/components/ComputeGraph/ComputeGraphContextProvider.d.ts.map +1 -1
- package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts +1 -2
- package/dist/types/src/components/FunctionEditor/FunctionEditor.d.ts.map +1 -1
- package/dist/types/src/components/GridSheet/GridSheet.d.ts +1 -2
- package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts +1 -2
- package/dist/types/src/components/GridSheet/GridSheet.stories.d.ts.map +1 -1
- package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts +1 -2
- package/dist/types/src/components/GridSheet/SheetCellEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/RangeList/RangeList.d.ts +1 -2
- package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
- package/dist/types/src/components/SheetContainer/SheetContainer.d.ts +1 -2
- package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
- package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts +2 -3
- package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/SheetContext/SheetContext.d.ts +2 -2
- package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -1
- package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts +2 -2
- package/dist/types/src/components/SheetToolbar/SheetToolbar.d.ts.map +1 -1
- package/dist/types/src/components/SheetToolbar/align.d.ts +1 -1
- package/dist/types/src/components/SheetToolbar/style.d.ts +1 -1
- package/dist/types/src/components/index.d.ts +2 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions/compute.stories.d.ts +2 -3
- package/dist/types/src/extensions/compute.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/editor/extension.d.ts.map +1 -1
- package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -0
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +14 -14
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/package.json +46 -45
- package/src/SheetPlugin.tsx +22 -32
- package/src/capabilities/index.ts +0 -1
- package/src/capabilities/intent-resolver.ts +24 -15
- package/src/capabilities/react-surface.tsx +12 -5
- package/src/components/GridSheet/util.ts +1 -1
- package/src/components/SheetContainer/SheetContainer.stories.tsx +5 -2
- package/src/extensions/compute.stories.tsx +2 -2
- package/src/extensions/editor/extension.ts +2 -0
- package/src/integrations/thread-ranges.ts +21 -10
- package/src/meta.ts +3 -1
- package/dist/lib/browser/chunk-H23JW3DX.mjs.map +0 -7
- package/dist/lib/browser/chunk-K6EUYKWT.mjs +0 -15
- package/dist/lib/browser/chunk-K6EUYKWT.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-Q7DTHAM5.mjs +0 -47
- package/dist/lib/browser/intent-resolver-Q7DTHAM5.mjs.map +0 -7
- package/dist/lib/browser/react-context-JG43577H.mjs +0 -28
- package/dist/lib/browser/react-context-JG43577H.mjs.map +0 -7
- package/dist/lib/browser/react-surface-URRC3AFC.mjs.map +0 -7
- package/dist/lib/node/chunk-NLDXUFDG.cjs.map +0 -7
- package/dist/lib/node/chunk-ZPWW4LPY.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-ZUDJJUFG.cjs +0 -60
- package/dist/lib/node/intent-resolver-ZUDJJUFG.cjs.map +0 -7
- package/dist/lib/node/react-context-OOH5QFE2.cjs +0 -50
- package/dist/lib/node/react-context-OOH5QFE2.cjs.map +0 -7
- package/dist/lib/node/react-surface-IQN5JKSS.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-FMOVRTS4.mjs +0 -17
- package/dist/lib/node-esm/chunk-FMOVRTS4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OXD6RBFF.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-IF64RN7B.mjs +0 -48
- package/dist/lib/node-esm/intent-resolver-IF64RN7B.mjs.map +0 -7
- package/dist/lib/node-esm/react-context-CJVSLO74.mjs +0 -29
- package/dist/lib/node-esm/react-context-CJVSLO74.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-XJIX5G3I.mjs.map +0 -7
- package/dist/types/src/capabilities/react-context.d.ts +0 -8
- package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
- package/dist/types/src/testing/playwright/playwright.config.d.ts +0 -3
- package/dist/types/src/testing/playwright/playwright.config.d.ts.map +0 -1
- package/src/capabilities/react-context.tsx +0 -20
- /package/dist/lib/browser/{SheetContainer-CM4CO3DC.mjs.map → SheetContainer-EDJA5L2H.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-PW25VUP6.mjs.map → chunk-LXHRT3CC.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-T3IVPMRX.mjs.map → chunk-OOSRC36N.mjs.map} +0 -0
- /package/dist/lib/browser/{compute-graph-registry-XH6B2SWG.mjs.map → compute-graph-registry-EGPD4HEX.mjs.map} +0 -0
- /package/dist/lib/browser/{markdown-IKG5FNCA.mjs.map → markdown-EJU2M7EE.mjs.map} +0 -0
- /package/dist/lib/browser/{thread-YX6KBQNQ.mjs.map → thread-7ZWW5EA7.mjs.map} +0 -0
- /package/dist/lib/node/{SheetContainer-TJ3JQLWM.cjs.map → SheetContainer-B77HHBOC.cjs.map} +0 -0
- /package/dist/lib/node/{chunk-E3RXOEL6.cjs.map → chunk-4LSYTNS4.cjs.map} +0 -0
- /package/dist/lib/node/{chunk-FU5K66DS.cjs.map → chunk-ZV2RS3QH.cjs.map} +0 -0
- /package/dist/lib/node/{compute-graph-registry-ORGTIE5M.cjs.map → compute-graph-registry-GJK5H264.cjs.map} +0 -0
- /package/dist/lib/node/{markdown-EUUL3Q36.cjs.map → markdown-SQHC4EGJ.cjs.map} +0 -0
- /package/dist/lib/node/{thread-VBPS23P2.cjs.map → thread-DRNYTR6M.cjs.map} +0 -0
- /package/dist/lib/node-esm/{SheetContainer-QEEFORIC.mjs.map → SheetContainer-KXWIQCP4.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-NSVUOAI6.mjs.map → chunk-HPAMZ6SP.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-KCXK5UM6.mjs.map → chunk-SX3S7UKU.mjs.map} +0 -0
- /package/dist/lib/node-esm/{compute-graph-registry-JH2FRHLD.mjs.map → compute-graph-registry-3F5JCYEN.mjs.map} +0 -0
- /package/dist/lib/node-esm/{markdown-D2ZMN7LR.mjs.map → markdown-UXKP45S3.mjs.map} +0 -0
- /package/dist/lib/node-esm/{thread-HSJD3SR6.mjs.map → thread-6T5VXPAF.mjs.map} +0 -0
- /package/src/testing/playwright/{playwright.config.ts → playwright.config.cts} +0 -0
|
@@ -26,15 +26,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var SheetContainer_B77HHBOC_exports = {};
|
|
30
|
+
__export(SheetContainer_B77HHBOC_exports, {
|
|
31
31
|
default: () => SheetContainer_default
|
|
32
32
|
});
|
|
33
|
-
module.exports = __toCommonJS(
|
|
34
|
-
var
|
|
35
|
-
var
|
|
36
|
-
var
|
|
37
|
-
var
|
|
33
|
+
module.exports = __toCommonJS(SheetContainer_B77HHBOC_exports);
|
|
34
|
+
var import_chunk_VMJK5QN4 = require("./chunk-VMJK5QN4.cjs");
|
|
35
|
+
var import_chunk_SQZEJPZ7 = require("./chunk-SQZEJPZ7.cjs");
|
|
36
|
+
var import_chunk_4LSYTNS4 = require("./chunk-4LSYTNS4.cjs");
|
|
37
|
+
var import_chunk_MLU6KRQN = require("./chunk-MLU6KRQN.cjs");
|
|
38
38
|
var import_react = __toESM(require("react"));
|
|
39
39
|
var import_echo = require("@dxos/react-client/echo");
|
|
40
40
|
var import_react_ui_stack = require("@dxos/react-ui-stack");
|
|
@@ -59,13 +59,13 @@ var import_types = require("@dxos/plugin-thread/types");
|
|
|
59
59
|
var import_react8 = require("react");
|
|
60
60
|
var import_live_object2 = require("@dxos/live-object");
|
|
61
61
|
var FunctionEditor = () => {
|
|
62
|
-
const { model, cursor, range } = (0,
|
|
62
|
+
const { model, cursor, range } = (0, import_chunk_VMJK5QN4.useSheetContext)();
|
|
63
63
|
let value;
|
|
64
64
|
let formula = false;
|
|
65
65
|
if (cursor) {
|
|
66
66
|
value = model.getCellValue(cursor);
|
|
67
67
|
if ((0, import_compute.isFormula)(value)) {
|
|
68
|
-
value = model.graph.mapFunctionBindingFromId((0,
|
|
68
|
+
value = model.graph.mapFunctionBindingFromId((0, import_chunk_4LSYTNS4.mapFormulaIndicesToRefs)(model.sheet, value));
|
|
69
69
|
formula = true;
|
|
70
70
|
} else if (value != null) {
|
|
71
71
|
value = String(value);
|
|
@@ -95,9 +95,9 @@ var aligns = {
|
|
|
95
95
|
end: "ph--text-align-right--regular"
|
|
96
96
|
};
|
|
97
97
|
var useAlignState = (state) => {
|
|
98
|
-
const { cursor, model } = (0,
|
|
98
|
+
const { cursor, model } = (0, import_chunk_VMJK5QN4.useSheetContext)();
|
|
99
99
|
(0, import_react4.useEffect)(() => {
|
|
100
|
-
state[
|
|
100
|
+
state[import_chunk_4LSYTNS4.alignKey] = cursor ? model.sheet.ranges?.findLast(({ range, key }) => key === import_chunk_4LSYTNS4.alignKey && (0, import_compute2.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), cursor))?.value : void 0;
|
|
101
101
|
}, [
|
|
102
102
|
cursor,
|
|
103
103
|
model.sheet
|
|
@@ -107,29 +107,29 @@ var createAlignGroupAction = (value) => (0, import_react_ui_menu2.createMenuItem
|
|
|
107
107
|
label: [
|
|
108
108
|
"align label",
|
|
109
109
|
{
|
|
110
|
-
ns:
|
|
110
|
+
ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
|
|
111
111
|
}
|
|
112
112
|
],
|
|
113
113
|
variant: "toggleGroup",
|
|
114
114
|
selectCardinality: "single",
|
|
115
|
-
value: `${
|
|
115
|
+
value: `${import_chunk_4LSYTNS4.alignKey}--${value}`
|
|
116
116
|
});
|
|
117
117
|
var createAlignActions = (value) => Object.entries(aligns).map(([alignValue, icon]) => {
|
|
118
|
-
return (0, import_react_ui_menu2.createMenuAction)(`${
|
|
119
|
-
key:
|
|
118
|
+
return (0, import_react_ui_menu2.createMenuAction)(`${import_chunk_4LSYTNS4.alignKey}--${alignValue}`, {
|
|
119
|
+
key: import_chunk_4LSYTNS4.alignKey,
|
|
120
120
|
value: alignValue,
|
|
121
121
|
checked: value === alignValue,
|
|
122
122
|
label: [
|
|
123
123
|
`range value ${alignValue} label`,
|
|
124
124
|
{
|
|
125
|
-
ns:
|
|
125
|
+
ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
|
|
126
126
|
}
|
|
127
127
|
],
|
|
128
128
|
icon,
|
|
129
|
-
testId: `grid.toolbar.${
|
|
129
|
+
testId: `grid.toolbar.${import_chunk_4LSYTNS4.alignKey}.${alignValue}`
|
|
130
130
|
});
|
|
131
131
|
});
|
|
132
|
-
var createAlign = ({ [
|
|
132
|
+
var createAlign = ({ [import_chunk_4LSYTNS4.alignKey]: alignValue }) => {
|
|
133
133
|
const alignGroup = createAlignGroupAction(alignValue);
|
|
134
134
|
const alignActions = createAlignActions(alignValue);
|
|
135
135
|
return {
|
|
@@ -150,12 +150,12 @@ var createAlign = ({ [import_chunk_E3RXOEL6.alignKey]: alignValue }) => {
|
|
|
150
150
|
};
|
|
151
151
|
};
|
|
152
152
|
var useCommentState = (state) => {
|
|
153
|
-
const { cursorFallbackRange, model } = (0,
|
|
153
|
+
const { cursorFallbackRange, model } = (0, import_chunk_VMJK5QN4.useSheetContext)();
|
|
154
154
|
const overlapsCommentAnchor = (0, import_react5.useMemo)(() => import_live_object.RefArray.allResolvedTargets(model.sheet.threads ?? []).filter((thread) => thread.status !== "resolved").some((thread) => {
|
|
155
155
|
if (!cursorFallbackRange) {
|
|
156
156
|
return false;
|
|
157
157
|
}
|
|
158
|
-
return (0,
|
|
158
|
+
return (0, import_chunk_4LSYTNS4.rangeToIndex)(model.sheet, cursorFallbackRange) === thread.anchor;
|
|
159
159
|
}), [
|
|
160
160
|
cursorFallbackRange,
|
|
161
161
|
model.sheet
|
|
@@ -168,13 +168,13 @@ var useCommentState = (state) => {
|
|
|
168
168
|
]);
|
|
169
169
|
};
|
|
170
170
|
var createCommentAction = (state) => (0, import_react_ui_menu3.createMenuAction)("comment", {
|
|
171
|
-
key:
|
|
171
|
+
key: import_chunk_4LSYTNS4.commentKey,
|
|
172
172
|
testId: "editor.toolbar.comment",
|
|
173
173
|
icon: "ph--chat-text--regular",
|
|
174
174
|
label: [
|
|
175
175
|
`${state.commentEnabled} label`,
|
|
176
176
|
{
|
|
177
|
-
ns:
|
|
177
|
+
ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
|
|
178
178
|
}
|
|
179
179
|
],
|
|
180
180
|
disabled: state.commentEnabled !== "comment"
|
|
@@ -195,12 +195,12 @@ var styles = {
|
|
|
195
195
|
softwrap: "ph--paragraph--regular"
|
|
196
196
|
};
|
|
197
197
|
var useStyleState = (state) => {
|
|
198
|
-
const { cursorFallbackRange, model } = (0,
|
|
198
|
+
const { cursorFallbackRange, model } = (0, import_chunk_VMJK5QN4.useSheetContext)();
|
|
199
199
|
(0, import_react6.useEffect)(() => {
|
|
200
200
|
state.highlight = false;
|
|
201
201
|
state.softwrap = false;
|
|
202
202
|
if (cursorFallbackRange && model.sheet.ranges) {
|
|
203
|
-
model.sheet.ranges.filter(({ range, key }) => key === "style" && (0, import_compute3.inRange)((0,
|
|
203
|
+
model.sheet.ranges.filter(({ range, key }) => key === "style" && (0, import_compute3.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).forEach(({ value }) => {
|
|
204
204
|
state[value] = true;
|
|
205
205
|
});
|
|
206
206
|
}
|
|
@@ -224,7 +224,7 @@ var createStyleActions = (state) => Object.entries(styles).map(([styleValue, ico
|
|
|
224
224
|
label: [
|
|
225
225
|
`range value ${styleValue} label`,
|
|
226
226
|
{
|
|
227
|
-
ns:
|
|
227
|
+
ns: import_chunk_MLU6KRQN.SHEET_PLUGIN
|
|
228
228
|
}
|
|
229
229
|
],
|
|
230
230
|
checked: !!state[styleValue]
|
|
@@ -251,14 +251,14 @@ var createStyle = (state) => {
|
|
|
251
251
|
};
|
|
252
252
|
};
|
|
253
253
|
var useToolbarAction = (state) => {
|
|
254
|
-
const { model, cursorFallbackRange, cursor } = (0,
|
|
254
|
+
const { model, cursorFallbackRange, cursor } = (0, import_chunk_VMJK5QN4.useSheetContext)();
|
|
255
255
|
const { dispatchPromise: dispatch } = (0, import_app_framework.useIntentDispatcher)();
|
|
256
256
|
return (0, import_react7.useCallback)((action) => {
|
|
257
257
|
const { key, value } = action.properties;
|
|
258
258
|
if (cursorFallbackRange) {
|
|
259
|
-
const index = model.sheet.ranges?.findIndex((range) => range.key === key && (0, import_compute4.inRange)((0,
|
|
259
|
+
const index = model.sheet.ranges?.findIndex((range) => range.key === key && (0, import_compute4.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range.range), cursorFallbackRange.from)) ?? -1;
|
|
260
260
|
const nextRangeEntity = {
|
|
261
|
-
range: (0,
|
|
261
|
+
range: (0, import_chunk_4LSYTNS4.rangeToIndex)(model.sheet, cursorFallbackRange),
|
|
262
262
|
key,
|
|
263
263
|
value
|
|
264
264
|
};
|
|
@@ -266,17 +266,17 @@ var useToolbarAction = (state) => {
|
|
|
266
266
|
case "alignment":
|
|
267
267
|
if (index < 0) {
|
|
268
268
|
model.sheet.ranges?.push(nextRangeEntity);
|
|
269
|
-
state[
|
|
269
|
+
state[import_chunk_4LSYTNS4.alignKey] = value;
|
|
270
270
|
} else if (model.sheet.ranges[index].value === value) {
|
|
271
271
|
model.sheet.ranges?.splice(index, 1);
|
|
272
|
-
state[
|
|
272
|
+
state[import_chunk_4LSYTNS4.alignKey] = void 0;
|
|
273
273
|
} else {
|
|
274
274
|
model.sheet.ranges?.splice(index, 1, nextRangeEntity);
|
|
275
|
-
state[
|
|
275
|
+
state[import_chunk_4LSYTNS4.alignKey] = value;
|
|
276
276
|
}
|
|
277
277
|
break;
|
|
278
278
|
case "style":
|
|
279
|
-
if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && (0, import_compute4.inRange)((0,
|
|
279
|
+
if (model.sheet.ranges.filter(({ range, key: rangeKey }) => rangeKey === "style" && (0, import_compute4.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), cursorFallbackRange.from)).some(({ value: rangeValue }) => rangeValue === value)) {
|
|
280
280
|
if (index >= 0) {
|
|
281
281
|
model.sheet.ranges?.splice(index, 1);
|
|
282
282
|
}
|
|
@@ -289,7 +289,7 @@ var useToolbarAction = (state) => {
|
|
|
289
289
|
case "comment": {
|
|
290
290
|
const cellContent = model.getCellText(cursorFallbackRange.from);
|
|
291
291
|
void dispatch((0, import_app_framework.createIntent)(import_types.ThreadAction.Create, {
|
|
292
|
-
cursor: (0,
|
|
292
|
+
cursor: (0, import_chunk_VMJK5QN4.completeCellRangeToThreadCursor)(cursorFallbackRange),
|
|
293
293
|
name: cellContent,
|
|
294
294
|
subject: model.sheet
|
|
295
295
|
}));
|
|
@@ -345,8 +345,8 @@ var SheetToolbar = ({ attendableId, classNames }) => {
|
|
|
345
345
|
}));
|
|
346
346
|
};
|
|
347
347
|
var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
|
|
348
|
-
const graph = (0,
|
|
349
|
-
return graph ? /* @__PURE__ */ import_react.default.createElement(
|
|
348
|
+
const graph = (0, import_chunk_VMJK5QN4.useComputeGraph)(space);
|
|
349
|
+
return graph ? /* @__PURE__ */ import_react.default.createElement(import_chunk_VMJK5QN4.SheetProvider, {
|
|
350
350
|
sheet,
|
|
351
351
|
graph,
|
|
352
352
|
ignoreAttention
|
|
@@ -358,7 +358,7 @@ var SheetContainer = ({ space, sheet, role, ignoreAttention }) => {
|
|
|
358
358
|
}
|
|
359
359
|
}, /* @__PURE__ */ import_react.default.createElement(SheetToolbar, {
|
|
360
360
|
attendableId: (0, import_echo.fullyQualifiedId)(sheet)
|
|
361
|
-
}), /* @__PURE__ */ import_react.default.createElement(
|
|
361
|
+
}), /* @__PURE__ */ import_react.default.createElement(import_chunk_VMJK5QN4.GridSheet, null), /* @__PURE__ */ import_react.default.createElement(FunctionEditor, null))) : null;
|
|
362
362
|
};
|
|
363
363
|
var SheetContainer_default = SheetContainer;
|
|
364
|
-
//# sourceMappingURL=SheetContainer-
|
|
364
|
+
//# sourceMappingURL=SheetContainer-B77HHBOC.cjs.map
|
|
@@ -16,8 +16,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var chunk_4LSYTNS4_exports = {};
|
|
20
|
+
__export(chunk_4LSYTNS4_exports, {
|
|
21
21
|
ApiError: () => ApiError,
|
|
22
22
|
CellValue: () => CellValue,
|
|
23
23
|
DEFAULT_COLS: () => DEFAULT_COLS,
|
|
@@ -48,8 +48,8 @@ __export(chunk_E3RXOEL6_exports, {
|
|
|
48
48
|
styleKey: () => styleKey,
|
|
49
49
|
useSheetModel: () => useSheetModel
|
|
50
50
|
});
|
|
51
|
-
module.exports = __toCommonJS(
|
|
52
|
-
var
|
|
51
|
+
module.exports = __toCommonJS(chunk_4LSYTNS4_exports);
|
|
52
|
+
var import_chunk_MLU6KRQN = require("./chunk-MLU6KRQN.cjs");
|
|
53
53
|
var import_echo_schema = require("@dxos/echo-schema");
|
|
54
54
|
var import_types = require("@dxos/plugin-space/types");
|
|
55
55
|
var import_echo_schema2 = require("@dxos/echo-schema");
|
|
@@ -732,7 +732,7 @@ var useSheetModel = (graph, sheet, { readonly } = {}) => {
|
|
|
732
732
|
};
|
|
733
733
|
var SheetAction;
|
|
734
734
|
(function(SheetAction2) {
|
|
735
|
-
const SHEET_ACTION = `${
|
|
735
|
+
const SHEET_ACTION = `${import_chunk_MLU6KRQN.SHEET_PLUGIN}/action`;
|
|
736
736
|
class Create extends import_echo_schema2.S.TaggedClass()(`${SHEET_ACTION}/create`, {
|
|
737
737
|
input: import_echo_schema2.S.Struct({
|
|
738
738
|
name: import_echo_schema2.S.optional(import_echo_schema2.S.String)
|
|
@@ -932,4 +932,4 @@ var mapFormulaIndicesToRefs = (sheet, formula) => {
|
|
|
932
932
|
styleKey,
|
|
933
933
|
useSheetModel
|
|
934
934
|
});
|
|
935
|
-
//# sourceMappingURL=chunk-
|
|
935
|
+
//# sourceMappingURL=chunk-4LSYTNS4.cjs.map
|
|
@@ -16,23 +16,26 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var chunk_MLU6KRQN_exports = {};
|
|
20
|
+
__export(chunk_MLU6KRQN_exports, {
|
|
21
21
|
SHEET_PLUGIN: () => SHEET_PLUGIN,
|
|
22
22
|
meta: () => meta
|
|
23
23
|
});
|
|
24
|
-
module.exports = __toCommonJS(
|
|
24
|
+
module.exports = __toCommonJS(chunk_MLU6KRQN_exports);
|
|
25
25
|
var SHEET_PLUGIN = "dxos.org/plugin/sheet";
|
|
26
26
|
var meta = {
|
|
27
27
|
id: SHEET_PLUGIN,
|
|
28
28
|
name: "Sheet",
|
|
29
|
-
description: "
|
|
29
|
+
description: "Sheets in Composer are simple spreadsheets which allow you to leverage custom functions inside of cell grids. Leverage more than 400 pre-built formulas like Sum, Average, Count, Max, Min along with many others. You can also deploy your own custom functions using the Scripts plugin. ",
|
|
30
30
|
icon: "ph--grid-nine--regular",
|
|
31
|
-
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet"
|
|
31
|
+
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet",
|
|
32
|
+
screenshots: [
|
|
33
|
+
"https://dxos.network/plugin-details-sheet-dark.png"
|
|
34
|
+
]
|
|
32
35
|
};
|
|
33
36
|
// Annotate the CommonJS export names for ESM import in node:
|
|
34
37
|
0 && (module.exports = {
|
|
35
38
|
SHEET_PLUGIN,
|
|
36
39
|
meta
|
|
37
40
|
});
|
|
38
|
-
//# sourceMappingURL=chunk-
|
|
41
|
+
//# sourceMappingURL=chunk-MLU6KRQN.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/meta.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const SHEET_PLUGIN = 'dxos.org/plugin/sheet';\n\nexport const meta = {\n id: SHEET_PLUGIN,\n name: 'Sheet',\n description:\n 'Sheets in Composer are simple spreadsheets which allow you to leverage custom functions inside of cell grids. Leverage more than 400 pre-built formulas like Sum, Average, Count, Max, Min along with many others. You can also deploy your own custom functions using the Scripts plugin. ',\n icon: 'ph--grid-nine--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-sheet',\n screenshots: ['https://dxos.network/plugin-details-sheet-dark.png'],\n} satisfies PluginMeta;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAMA,eAAe;AAErB,IAAMC,OAAO;EAClBC,IAAIF;EACJG,MAAM;EACNC,aACE;EACFC,MAAM;EACNC,QAAQ;EACRC,aAAa;IAAC;;AAChB;",
|
|
6
|
+
"names": ["SHEET_PLUGIN", "meta", "id", "name", "description", "icon", "source", "screenshots"]
|
|
7
|
+
}
|
|
@@ -16,13 +16,13 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
19
|
+
var chunk_SQZEJPZ7_exports = {};
|
|
20
|
+
__export(chunk_SQZEJPZ7_exports, {
|
|
21
21
|
computeGraphFacet: () => computeGraphFacet,
|
|
22
22
|
rangeExtension: () => rangeExtension,
|
|
23
23
|
sheetExtension: () => sheetExtension
|
|
24
24
|
});
|
|
25
|
-
module.exports = __toCommonJS(
|
|
25
|
+
module.exports = __toCommonJS(chunk_SQZEJPZ7_exports);
|
|
26
26
|
var import_language = require("@codemirror/language");
|
|
27
27
|
var import_state = require("@codemirror/state");
|
|
28
28
|
var import_view = require("@codemirror/view");
|
|
@@ -223,6 +223,11 @@ var rangeExtension = ({ onInit, onStateChange }) => {
|
|
|
223
223
|
from: 1,
|
|
224
224
|
to: str.length + 1
|
|
225
225
|
};
|
|
226
|
+
} else {
|
|
227
|
+
activeRange = {
|
|
228
|
+
from: str.length + 1,
|
|
229
|
+
to: str.length + 1
|
|
230
|
+
};
|
|
226
231
|
}
|
|
227
232
|
}
|
|
228
233
|
onStateChange?.({
|
|
@@ -248,4 +253,4 @@ var visitTree = (node, callback) => {
|
|
|
248
253
|
rangeExtension,
|
|
249
254
|
sheetExtension
|
|
250
255
|
});
|
|
251
|
-
//# sourceMappingURL=chunk-
|
|
256
|
+
//# sourceMappingURL=chunk-SQZEJPZ7.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/extensions/compute.ts", "../../../src/extensions/editor/extension.ts"],
|
|
4
|
-
"sourcesContent": ["//\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"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,sBAA2B;AAC3B,mBAQO;AACP,kBAA+D;AAE/D,mBAAmD;AACnD,qBAMO;AACP,uBAA0B;AAC1B,6BAA6C;ACrB7C,0BAQO;AACP,IAAAA,mBAAkE;AAElE,IAAAC,eAAqE;AAErE,uBAAqB;AACrB,yCAA4B;AAG5B,IAAAC,kBAA+B;AAC/B,IAAAC,0BAAiC;AACjC,4BAAmB;ADOnB,IAAMC,uBAAuBC,yBAAYC,OAAM;AAExC,IAAMC,wBAAoBC,yCAAAA;ACDjC,IAAMC,kBAAkBC,gCAAeJ,OAAO;;EAE5C;IACEK,KAAKC,sBAAKC;IACVC,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKG;IACVD,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKI;IACVF,OAAO;EACT;EACA;IACEH,KAAKC,sBAAKK;IACVH,OAAO;EACT;EACA;IACEH,KAAKC,sBAAKM;IACVJ,OAAO;EACT;;EAEA;IACEH,KAAKC,sBAAKO;IACVL,OAAO;EACT;CACD;AAED,IAAMM,oBAAgBZ,wBAAAA,kBAAAA;AAcf,IAAMa,iBAAiB,CAAC,EAAEC,OAAOC,YAAY,CAAA,EAAE,MAAyB;AAC7E,QAAM,EAAEC,WAAWC,SAAQ,QAAKC,gDAAY;IAAEC,OAAO;IAASC,kBAAkB;EAAI,CAAA;AAEpF,QAAMC,mBAAmB,CAAChB,SAAAA;AACxB,UAAM,EAAEiB,UAAU,UAAUC,aAAaC,OAAM,IAAKT,UAAUU,KAAK,CAACC,UAAUA,MAAMrB,SAASA,IAAAA,KAAS,CAAC;AAEvG,WAAO;MACLiB;MACAK,OAAOtB;MACPuB,MAAM,MAAA;AACJ,YAAI,CAACL,eAAe,CAACC,QAAQ;AAC3B,iBAAO;QACT;AAGA,cAAMK,OAAOC,SAASC,cAAc,KAAA;AACpCF,aAAKG,YAAY;AAEjB,cAAMC,QAAQH,SAASC,cAAc,IAAA;AACrCE,cAAMC,YAAY7B;AAClB4B,cAAMD,YAAY;AAClBH,aAAKM,YAAYF,KAAAA;AAEjB,YAAIV,aAAa;AACf,gBAAMK,OAAOE,SAASC,cAAc,GAAA;AACpCH,eAAKM,YAAYX;AACjBK,eAAKI,YAAY;AACjBH,eAAKM,YAAYP,IAAAA;QACnB;AAEA,YAAIJ,QAAQ;AACV,gBAAMY,SAASN,SAASC,cAAc,KAAA;AACtCK,iBAAOF,YAAYV;AACnBY,iBAAOJ,YAAY;AACnBH,eAAKM,YAAYC,MAAAA;QACnB;AAEA,eAAOP;MACT;MACAQ,OAAO,CAACC,MAAMC,YAAYC,MAAMC,OAAAA;AAC9B,cAAMC,eAAeD,OAAOH,KAAKK,MAAMC,IAAIC,SAAQ,EAAGC;AACtDR,aAAKS,SACHT,KAAKK,MAAMK,OAAO;UAChBC,SAAS;YACPT;YACAC;YACAS,QAAQX,WAAWZ,SAASe,eAAe,OAAO;UACpD;UACAS,WAAW;YACTC,QAAQZ,OAAOD,WAAWZ,MAAMmB,SAAS;UAC3C;QACF,CAAA,CAAA;MAEJ;IACF;EACF;AAEA,SAAO;IACL9B;IACAJ,cAAcyC,GAAGpC,QAAAA;IACjBA,SAASqC,KAAKD,GAAG;MACfE,cAAc,CAACC,YAAAA;AACb,YAAIA,QAAQb,MAAMC,IAAIC,SAAQ,EAAG,CAAA,MAAO,KAAK;AAC3C,iBAAO;QACT;AACA,cAAMY,QAAQD,QAAQE,YAAY,KAAA;AAClC,YAAI,CAACD,SAASA,MAAMjB,SAASiB,MAAMhB,IAAI;AACrC,iBAAO;QACT;AAEA,cAAMkB,OAAOF,MAAME,KAAKC,YAAW;AACnC,YAAI,CAACJ,QAAQK,YAAYJ,MAAME,KAAKb,SAAS,GAAG;AAC9C,iBAAO;QACT;AAEA,eAAO;UACLN,MAAMiB,MAAMjB;UACZsB,SACE/C,WAAWgD,OAAO,CAAC,EAAE1D,KAAI,MAAOA,KAAK2D,WAAWL,IAAAA,CAAAA,EAAOM,IAAI,CAAC,EAAE5D,KAAI,MAAOgB,iBAAiBhB,IAAAA,CAAAA,KAAU,CAAA;QACxG;MACF;IACF,CAAA;QAEA6D,qCAAmBjE,eAAAA;QACnBkE,oCAAe;MACbC,aAAa;MACbC,eAAe;MACfC,kBAAkB;MAClBC,aAAa,CAACzD;MACd0D,OAAO;MACPC,cAAc,UACZC,0BACE,2EACA,8CACA,kBAAA;IAEN,CAAA;IACAC,oBAAOtB,GAAG;MACR;QACEuB,KAAK;QACLC,KAAK,CAACvC,SAAAA;AACJ,qBAAOwC,sCAAiBxC,KAAKK,KAAK,MAAM,eAAWoC,sCAAiBzC,IAAAA,QAAQ0C,qCAAgB1C,IAAAA;QAC9F;MACF;KACD;;AAeL;AAwBO,IAAM2C,iBAAiB,CAAC,EAAEC,QAAQC,cAAa,MAAyB;AAC7E,MAAI7C;AACJ,MAAI8C;AAGJ,QAAMC,WAA4B;IAChCC,UAAU,CAACC,UAAAA;AACT,UAAIH,aAAa;AACf9C,aAAKS,SACHT,KAAKK,MAAMK,OAAO;UAChBC,SAAS;YAAE,GAAGmC;YAAalC,QAAQqC,MAAM1C,SAAQ;UAAG;UACpDM,WAAW;YAAEC,QAAQgC,YAAY5C,OAAO+C,MAAMzC;UAAO;QACvD,CAAA,CAAA;MAEJ;AAEAR,WAAKkD,MAAK;IACZ;EACF;AAEA,SAAOC,aAAAA,WAAWC,UAChB,MAAA;IACEC,YAAYC,OAAmB;AAC7BtD,aAAOsD;AACPV,eAASG,QAAAA;IACX;IAEArC,OAAOV,OAAkB;AACvB,YAAM,EAAEc,OAAM,IAAKd,MAAKK,MAAMQ,UAAU0C,OAAO,CAAA;AAG/CT,oBAAcU;AACd,YAAM7E,WAAWqB,MAAKK,MAAMoD,MAAMnF,aAAAA;AAClC,YAAM,EAAEoF,QAAO,IAAK/E,SAASgF,OAAOC,MAAM5D,MAAKK,MAAMC,IAAIC,SAAQ,CAAA;AACjEsD,gBAAUH,SAAS,CAAC,EAAEI,MAAM5D,MAAMC,GAAE,MAAE;AACpC,YAAID,QAAQY,UAAUX,MAAMW,QAAQ;AAClC,kBAAQgD,KAAK/F,MAAI;YACf,KAAK;AAEH+E,4BAAc;gBAAE5C,MAAMC;gBAAIA;cAAG;AAC7B;YAEF,KAAK;AAEH2C,4BAAc;gBAAE5C;gBAAMC,IAAID;cAAK;AAC/B;YAEF,KAAK;YACL,KAAK;AACH4C,4BAAc;gBAAE5C;gBAAMC;cAAG;AACzB,qBAAO;UACX;QACF;AAEA,eAAO;MACT,CAAA;AAGA,UAAI,CAAC2C,eAAe9C,MAAKK,MAAMC,IAAIC,SAAQ,EAAG,CAAA,MAAO,KAAK;AACxD,cAAMwD,MAAM/D,MAAKK,MAAMC,IAAI0D,YAAY,CAAA;AACvC,YAAIC,+BAAeC,KAAKH,GAAAA,GAAM;AAC5BjB,wBAAc;YAAE5C,MAAM;YAAGC,IAAI4D,IAAIvD,SAAS;UAAE;QAC9C;MACF;AAEAqC,sBAAgB;QACdC,aAAaA,cAAc9C,MAAKK,MAAMC,IAAI0D,YAAYlB,YAAY5C,MAAM4C,YAAY3C,EAAE,IAAIqD;MAC5F,CAAA;IACF;EACF,CAAA;AAEJ;AAKA,IAAMK,YAAY,CAACM,MAAkBC,aAAAA;AACnC,MAAIA,SAASD,IAAAA,GAAO;AAClB,WAAO;EACT;AAEA,WAASE,QAAQF,KAAKG,YAAYD,UAAU,MAAMA,QAAQA,MAAME,aAAa;AAC3E,QAAIV,UAAUQ,OAAOD,QAAAA,GAAW;AAC9B,aAAO;IACT;EACF;AAEA,SAAO;AACT;",
|
|
4
|
+
"sourcesContent": ["//\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 } else {\n activeRange = { from: str.length + 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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_language", "import_view", "import_compute", "import_react_ui_editor", "updateAllDecorations", "StateEffect", "define", "computeGraphFacet", "singleValueFacet", "highlightStyles", "HighlightStyle", "tag", "tags", "name", "class", "tagName", "number", "bool", "string", "invalid", "languageFacet", "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"]
|
|
7
7
|
}
|
|
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_VMJK5QN4_exports = {};
|
|
30
|
+
__export(chunk_VMJK5QN4_exports, {
|
|
31
31
|
ComputeGraphContextProvider: () => ComputeGraphContextProvider,
|
|
32
32
|
GridSheet: () => GridSheet,
|
|
33
33
|
RangeList: () => RangeList,
|
|
@@ -37,10 +37,10 @@ __export(chunk_ZPWW4LPY_exports, {
|
|
|
37
37
|
useComputeGraph: () => useComputeGraph,
|
|
38
38
|
useSheetContext: () => useSheetContext
|
|
39
39
|
});
|
|
40
|
-
module.exports = __toCommonJS(
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var
|
|
40
|
+
module.exports = __toCommonJS(chunk_VMJK5QN4_exports);
|
|
41
|
+
var import_chunk_SQZEJPZ7 = require("./chunk-SQZEJPZ7.cjs");
|
|
42
|
+
var import_chunk_4LSYTNS4 = require("./chunk-4LSYTNS4.cjs");
|
|
43
|
+
var import_chunk_MLU6KRQN = require("./chunk-MLU6KRQN.cjs");
|
|
44
44
|
var import_react = __toESM(require("react"));
|
|
45
45
|
var import_debug = require("@dxos/debug");
|
|
46
46
|
var import_react_hooks = require("@dxos/react-hooks");
|
|
@@ -67,6 +67,7 @@ var import_react6 = require("react");
|
|
|
67
67
|
var import_app_framework2 = require("@dxos/app-framework");
|
|
68
68
|
var import_async = require("@dxos/async");
|
|
69
69
|
var import_compute4 = require("@dxos/compute");
|
|
70
|
+
var import_echo_schema2 = require("@dxos/echo-schema");
|
|
70
71
|
var import_types = require("@dxos/plugin-thread/types");
|
|
71
72
|
var import_echo2 = require("@dxos/react-client/echo");
|
|
72
73
|
var import_react7 = __toESM(require("react"));
|
|
@@ -96,7 +97,7 @@ var useComputeGraph = (space) => {
|
|
|
96
97
|
return graph;
|
|
97
98
|
};
|
|
98
99
|
var RangeList = ({ sheet }) => {
|
|
99
|
-
const { t } = (0, import_react_ui.useTranslation)(
|
|
100
|
+
const { t } = (0, import_react_ui.useTranslation)(import_chunk_MLU6KRQN.SHEET_PLUGIN);
|
|
100
101
|
const handleSelectRange = (range) => {
|
|
101
102
|
};
|
|
102
103
|
const handleDeleteRange = (0, import_react2.useCallback)((range) => {
|
|
@@ -109,7 +110,7 @@ var RangeList = ({ sheet }) => {
|
|
|
109
110
|
className: "p-2 text-sm font-semibold"
|
|
110
111
|
}, t("range list heading")), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.Root, {
|
|
111
112
|
items: sheet.ranges,
|
|
112
|
-
isItem: import_echo_schema.S.is(
|
|
113
|
+
isItem: import_echo_schema.S.is(import_chunk_4LSYTNS4.Range)
|
|
113
114
|
}, ({ items: ranges }) => ranges.map((range, i) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.Item, {
|
|
114
115
|
key: i,
|
|
115
116
|
item: range,
|
|
@@ -120,7 +121,7 @@ var RangeList = ({ sheet }) => {
|
|
|
120
121
|
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemDragHandle, null), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemTitle, {
|
|
121
122
|
onClick: () => handleSelectRange(range)
|
|
122
123
|
}, t("range title", {
|
|
123
|
-
position: (0, import_compute.rangeToA1Notation)((0,
|
|
124
|
+
position: (0, import_compute.rangeToA1Notation)((0, import_chunk_4LSYTNS4.rangeFromIndex)(sheet, range.range)),
|
|
124
125
|
key: t(`range key ${range.key} label`),
|
|
125
126
|
value: t(`range value ${range.value} label`)
|
|
126
127
|
})), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemDeleteButton, {
|
|
@@ -150,21 +151,28 @@ var parseThreadAnchorAsCellRange = (cursor) => {
|
|
|
150
151
|
};
|
|
151
152
|
var useUpdateFocusedCellOnThreadSelection = (grid) => {
|
|
152
153
|
const { model, setActiveRefs } = useSheetContext();
|
|
153
|
-
const scrollIntoViewResolver = (0, import_react6.useMemo)(() => (0, import_app_framework2.createResolver)(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
const scrollIntoViewResolver = (0, import_react6.useMemo)(() => (0, import_app_framework2.createResolver)({
|
|
155
|
+
intent: import_app_framework2.LayoutAction.ScrollIntoView,
|
|
156
|
+
position: "hoist",
|
|
157
|
+
filter: (data) => {
|
|
158
|
+
if (!import_echo_schema2.S.is(import_app_framework2.LayoutAction.ScrollIntoView.fields.input)(data)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
return data.subject === (0, import_echo2.fullyQualifiedId)(model.sheet) && !!data.options?.cursor;
|
|
162
|
+
},
|
|
163
|
+
resolve: ({ options: { cursor, ref } }) => {
|
|
164
|
+
setActiveRefs(ref);
|
|
165
|
+
const range = parseThreadAnchorAsCellRange(cursor);
|
|
166
|
+
range && grid?.setFocus({
|
|
167
|
+
...range.to,
|
|
168
|
+
plane: "grid"
|
|
169
|
+
}, true);
|
|
170
|
+
}
|
|
163
171
|
}), [
|
|
164
172
|
model.sheet,
|
|
165
173
|
setActiveRefs
|
|
166
174
|
]);
|
|
167
|
-
(0, import_app_framework2.useIntentResolver)(
|
|
175
|
+
(0, import_app_framework2.useIntentResolver)(import_chunk_MLU6KRQN.SHEET_PLUGIN, scrollIntoViewResolver);
|
|
168
176
|
};
|
|
169
177
|
var useSelectThreadOnCellFocus = () => {
|
|
170
178
|
const { model, cursor } = useSheetContext();
|
|
@@ -241,7 +249,7 @@ var projectCellProps = (model, col, row) => {
|
|
|
241
249
|
row
|
|
242
250
|
};
|
|
243
251
|
const rawValue = model.getValue(address);
|
|
244
|
-
const ranges = model.sheet.ranges?.filter(({ range }) => (0, import_compute3.inRange)((0,
|
|
252
|
+
const ranges = model.sheet.ranges?.filter(({ range }) => (0, import_compute3.inRange)((0, import_chunk_4LSYTNS4.rangeFromIndex)(model.sheet, range), address));
|
|
245
253
|
const threadRefs = model.sheet.threads?.filter((thread) => {
|
|
246
254
|
const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target.anchor);
|
|
247
255
|
return thread && range ? (0, import_compute3.inRange)(range, address) : false;
|
|
@@ -249,7 +257,7 @@ var projectCellProps = (model, col, row) => {
|
|
|
249
257
|
const description = model.getValueDescription(address);
|
|
250
258
|
const type = description?.type;
|
|
251
259
|
const format = description?.format;
|
|
252
|
-
const classNames = ranges?.map(
|
|
260
|
+
const classNames = ranges?.map(import_chunk_4LSYTNS4.cellClassNameForRange).reverse();
|
|
253
261
|
return {
|
|
254
262
|
value: (0, import_react_ui_form.parseValue)({
|
|
255
263
|
type,
|
|
@@ -282,7 +290,7 @@ var gridCellGetter = (model) => {
|
|
|
282
290
|
};
|
|
283
291
|
var rowLabelCell = (row) => ({
|
|
284
292
|
value: (0, import_react_ui_grid2.rowToA1Notation)(row),
|
|
285
|
-
className: "text-end
|
|
293
|
+
className: "text-end pie-1 text-subdued",
|
|
286
294
|
resizeHandle: "row"
|
|
287
295
|
});
|
|
288
296
|
var colLabelCell = (col) => ({
|
|
@@ -427,7 +435,7 @@ var SheetProviderImpl = ({ model, onInfo, ignoreAttention, children, __gridScope
|
|
|
427
435
|
}, children);
|
|
428
436
|
};
|
|
429
437
|
var SheetProvider = ({ children, graph, sheet, readonly, ignoreAttention, onInfo }) => {
|
|
430
|
-
const model = (0,
|
|
438
|
+
const model = (0, import_chunk_4LSYTNS4.useSheetModel)(graph, sheet, {
|
|
431
439
|
readonly
|
|
432
440
|
});
|
|
433
441
|
return !model ? null : /* @__PURE__ */ import_react7.default.createElement(import_react_ui_grid3.Grid.Root, {
|
|
@@ -483,7 +491,7 @@ var sheetColDefault = {
|
|
|
483
491
|
}
|
|
484
492
|
};
|
|
485
493
|
var GridSheet = () => {
|
|
486
|
-
const { t } = (0, import_react_ui2.useTranslation)(
|
|
494
|
+
const { t } = (0, import_react_ui2.useTranslation)(import_chunk_MLU6KRQN.SHEET_PLUGIN);
|
|
487
495
|
const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } = useSheetContext();
|
|
488
496
|
const [dxGrid, setDxGrid] = (0, import_react4.useState)(null);
|
|
489
497
|
const [extraplanarFocus, setExtraplanarFocus] = (0, import_react4.useState)(null);
|
|
@@ -686,13 +694,13 @@ var GridSheet = () => {
|
|
|
686
694
|
switch (operation) {
|
|
687
695
|
case "insert-before":
|
|
688
696
|
case "insert-after":
|
|
689
|
-
return dispatch((0, import_app_framework.createIntent)(
|
|
697
|
+
return dispatch((0, import_app_framework.createIntent)(import_chunk_4LSYTNS4.SheetAction.InsertAxis, {
|
|
690
698
|
model,
|
|
691
699
|
axis: contextMenuAxis,
|
|
692
700
|
index: contextMenuOpen[contextMenuAxis] + (operation === "insert-before" ? 0 : 1)
|
|
693
701
|
}));
|
|
694
702
|
case "drop":
|
|
695
|
-
return dispatch((0, import_app_framework.createIntent)(
|
|
703
|
+
return dispatch((0, import_app_framework.createIntent)(import_chunk_4LSYTNS4.SheetAction.DropAxis, {
|
|
696
704
|
model,
|
|
697
705
|
axis: contextMenuAxis,
|
|
698
706
|
axisIndex: model.sheet[contextMenuAxis === "row" ? "rows" : "columns"][contextMenuOpen[contextMenuAxis]]
|
|
@@ -712,10 +720,10 @@ var GridSheet = () => {
|
|
|
712
720
|
onNav: handleClose
|
|
713
721
|
}
|
|
714
722
|
}),
|
|
715
|
-
(0,
|
|
723
|
+
(0, import_chunk_SQZEJPZ7.sheetExtension)({
|
|
716
724
|
functions: model.graph.getFunctions()
|
|
717
725
|
}),
|
|
718
|
-
(0,
|
|
726
|
+
(0, import_chunk_SQZEJPZ7.rangeExtension)({
|
|
719
727
|
onInit: (fn) => rangeController.current = fn,
|
|
720
728
|
onStateChange: (state) => {
|
|
721
729
|
if (dxGrid) {
|
|
@@ -744,8 +752,8 @@ var GridSheet = () => {
|
|
|
744
752
|
onBlur: handleBlur
|
|
745
753
|
}), /* @__PURE__ */ import_react4.default.createElement(import_react_ui_grid.Grid.Content, {
|
|
746
754
|
initialCells,
|
|
747
|
-
limitColumns:
|
|
748
|
-
limitRows:
|
|
755
|
+
limitColumns: import_chunk_4LSYTNS4.DEFAULT_COLS,
|
|
756
|
+
limitRows: import_chunk_4LSYTNS4.DEFAULT_ROWS,
|
|
749
757
|
columns,
|
|
750
758
|
rows,
|
|
751
759
|
onAxisResize: handleAxisResize,
|
|
@@ -792,7 +800,7 @@ var GridSheet = () => {
|
|
|
792
800
|
icon: "ph--backspace--regular"
|
|
793
801
|
}), /* @__PURE__ */ import_react4.default.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Arrow, null))));
|
|
794
802
|
};
|
|
795
|
-
var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-
|
|
803
|
+
var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-B77HHBOC.cjs"));
|
|
796
804
|
// Annotate the CommonJS export names for ESM import in node:
|
|
797
805
|
0 && (module.exports = {
|
|
798
806
|
ComputeGraphContextProvider,
|
|
@@ -804,4 +812,4 @@ var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-TJ3J
|
|
|
804
812
|
useComputeGraph,
|
|
805
813
|
useSheetContext
|
|
806
814
|
});
|
|
807
|
-
//# sourceMappingURL=chunk-
|
|
815
|
+
//# sourceMappingURL=chunk-VMJK5QN4.cjs.map
|