@dxos/plugin-sheet 0.6.14-main.8b352a0 → 0.6.14-staging.54a8bab
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-R65IDJHN.mjs → SheetContainer-JZEKRM4Z.mjs} +41 -30
- package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5KVQ5IPW.mjs → chunk-BVUN7SHF.mjs} +4 -2
- package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +7 -0
- package/dist/lib/browser/{chunk-I2DKJ72A.mjs → chunk-G2FUL6PK.mjs} +257 -57
- package/dist/lib/browser/chunk-G2FUL6PK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-D3QTX46O.mjs → chunk-RABELMEQ.mjs} +3 -2
- package/dist/lib/browser/{chunk-D3QTX46O.mjs.map → chunk-RABELMEQ.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-KCYJSOFB.mjs → chunk-VMSX6Z4X.mjs} +51 -17
- package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +7 -0
- package/dist/lib/browser/{compute-graph-SJT67236.mjs → compute-graph-GGWUX644.mjs} +4 -4
- package/dist/lib/browser/index.mjs +38 -10
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types.mjs +2 -2
- package/dist/lib/node/{SheetContainer-6BO4C5X2.cjs → SheetContainer-PJE74VO4.cjs} +60 -50
- package/dist/lib/node/SheetContainer-PJE74VO4.cjs.map +7 -0
- package/dist/lib/node/{chunk-QIFIGEKV.cjs → chunk-2ZVZI2KJ.cjs} +6 -5
- package/dist/lib/node/{chunk-QIFIGEKV.cjs.map → chunk-2ZVZI2KJ.cjs.map} +3 -3
- package/dist/lib/node/{chunk-2XJ5I4UF.cjs → chunk-AWKOWDMI.cjs} +8 -6
- package/dist/lib/node/chunk-AWKOWDMI.cjs.map +7 -0
- package/dist/lib/node/{chunk-JF5XNTF3.cjs → chunk-O7XR4R7Y.cjs} +61 -26
- package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +7 -0
- package/dist/lib/node/{chunk-DEPJHN47.cjs → chunk-STZ7S7RF.cjs} +293 -94
- package/dist/lib/node/chunk-STZ7S7RF.cjs.map +7 -0
- package/dist/lib/node/{compute-graph-AQBDL7HO.cjs → compute-graph-KGWA2QLE.cjs} +21 -21
- package/dist/lib/node/{compute-graph-AQBDL7HO.cjs.map → compute-graph-KGWA2QLE.cjs.map} +2 -2
- package/dist/lib/node/index.cjs +66 -38
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.cjs +3 -3
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types.cjs +7 -7
- package/dist/lib/node/types.cjs.map +1 -1
- package/dist/lib/node-esm/{SheetContainer-MJXC5E3P.mjs → SheetContainer-R73XEXHU.mjs} +41 -30
- package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs → chunk-BM2Q3FFC.mjs} +3 -2
- package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs.map → chunk-BM2Q3FFC.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-XBEHKYO7.mjs → chunk-CR4K75EL.mjs} +51 -17
- package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-5TXLF6PL.mjs → chunk-UIBWRHW7.mjs} +4 -2
- package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-25V7WY4R.mjs → chunk-V5N3Y2O5.mjs} +257 -57
- package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs.map +7 -0
- package/dist/lib/node-esm/{compute-graph-FRCKXEYK.mjs → compute-graph-2SCZT7N5.mjs} +4 -4
- package/dist/lib/node-esm/index.mjs +38 -10
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/meta.mjs +1 -1
- package/dist/lib/node-esm/types.mjs +2 -2
- package/dist/types/src/SheetPlugin.d.ts.map +1 -1
- package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
- package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
- package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +5 -2
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/types/src/compute-graph/compute-graph.d.ts +2 -2
- package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -1
- package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -1
- package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -1
- package/dist/types/src/defs/sheet-range-types.d.ts +1 -1
- package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -1
- package/dist/types/src/defs/util.d.ts +1 -1
- package/dist/types/src/defs/util.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/model/sheet-model.d.ts +12 -5
- package/dist/types/src/model/sheet-model.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +10 -5
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +33 -3
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +36 -36
- package/src/SheetPlugin.tsx +20 -0
- package/src/components/GridSheet/GridSheet.tsx +77 -16
- package/src/components/GridSheet/util.ts +12 -6
- package/src/components/SheetContainer/SheetContainer.stories.tsx +2 -0
- package/src/components/Toolbar/Toolbar.tsx +62 -41
- package/src/compute-graph/compute-graph.ts +22 -7
- package/src/compute-graph/functions/async-function.ts +1 -0
- package/src/compute-graph/functions/edge-function.ts +5 -3
- package/src/defs/sheet-range-types.ts +4 -2
- package/src/defs/util.ts +1 -0
- package/src/meta.ts +1 -0
- package/src/model/sheet-model.test.ts +5 -3
- package/src/model/sheet-model.ts +93 -21
- package/src/translations.ts +10 -5
- package/src/types.ts +20 -0
- package/dist/lib/browser/SheetContainer-R65IDJHN.mjs.map +0 -7
- package/dist/lib/browser/chunk-5KVQ5IPW.mjs.map +0 -7
- package/dist/lib/browser/chunk-I2DKJ72A.mjs.map +0 -7
- package/dist/lib/browser/chunk-KCYJSOFB.mjs.map +0 -7
- package/dist/lib/node/SheetContainer-6BO4C5X2.cjs.map +0 -7
- package/dist/lib/node/chunk-2XJ5I4UF.cjs.map +0 -7
- package/dist/lib/node/chunk-DEPJHN47.cjs.map +0 -7
- package/dist/lib/node/chunk-JF5XNTF3.cjs.map +0 -7
- package/dist/lib/node-esm/SheetContainer-MJXC5E3P.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-25V7WY4R.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5TXLF6PL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XBEHKYO7.mjs.map +0 -7
- /package/dist/lib/browser/{compute-graph-SJT67236.mjs.map → compute-graph-GGWUX644.mjs.map} +0 -0
- /package/dist/lib/node-esm/{compute-graph-FRCKXEYK.mjs.map → compute-graph-2SCZT7N5.mjs.map} +0 -0
|
@@ -1,11 +1,41 @@
|
|
|
1
|
-
import type { GraphBuilderProvides, IntentResolverProvides, MetadataRecordsProvides, SurfaceProvides, TranslationsProvides } from '@dxos/app-framework';
|
|
1
|
+
import type { GraphBuilderProvides, IntentResolverProvides, MetadataRecordsProvides, SurfaceProvides, TranslationsProvides, IntentData } from '@dxos/app-framework';
|
|
2
2
|
import { ref, S } from '@dxos/echo-schema';
|
|
3
3
|
import { type SchemaProvides } from '@dxos/plugin-client';
|
|
4
4
|
import { type MarkdownExtensionProvides } from '@dxos/plugin-markdown';
|
|
5
5
|
import { type SpaceInitProvides } from '@dxos/plugin-space';
|
|
6
6
|
import { type StackProvides } from '@dxos/plugin-stack';
|
|
7
|
+
import { type DxGridAxis } from '@dxos/react-ui-grid';
|
|
8
|
+
import { type SheetModel } from './model';
|
|
7
9
|
export declare enum SheetAction {
|
|
8
|
-
CREATE = "dxos.org/plugin/sheet/action/create"
|
|
10
|
+
CREATE = "dxos.org/plugin/sheet/action/create",
|
|
11
|
+
INSERT_AXIS = "dxos.org/plugin/sheet/action/axis-insert",
|
|
12
|
+
DROP_AXIS = "dxos.org/plugin/sheet/action/axis-drop"
|
|
13
|
+
}
|
|
14
|
+
export type RestoreAxis = {
|
|
15
|
+
axis: DxGridAxis;
|
|
16
|
+
axisIndex: string;
|
|
17
|
+
index: number;
|
|
18
|
+
axisMeta?: S.Schema.Type<typeof RowColumnMeta>;
|
|
19
|
+
values: CellScalarValue[];
|
|
20
|
+
};
|
|
21
|
+
export declare namespace SheetAction {
|
|
22
|
+
type Create = IntentData<{
|
|
23
|
+
sheet: SheetType;
|
|
24
|
+
}>;
|
|
25
|
+
type InsertAxis = IntentData<{
|
|
26
|
+
model: SheetModel;
|
|
27
|
+
axis: DxGridAxis;
|
|
28
|
+
index: number;
|
|
29
|
+
count?: number;
|
|
30
|
+
}>;
|
|
31
|
+
type DropAxis = IntentData<{
|
|
32
|
+
model: SheetModel;
|
|
33
|
+
axis: DxGridAxis;
|
|
34
|
+
axisIndex: string;
|
|
35
|
+
}>;
|
|
36
|
+
type DropAxisRestore = IntentData<RestoreAxis & {
|
|
37
|
+
model: SheetModel;
|
|
38
|
+
}>;
|
|
9
39
|
}
|
|
10
40
|
type ThreadProvides<T> = {
|
|
11
41
|
thread: {
|
|
@@ -48,9 +78,9 @@ declare const SheetType_base: import("@dxos/echo-schema").AbstractTypedObject<{
|
|
|
48
78
|
};
|
|
49
79
|
};
|
|
50
80
|
ranges: {
|
|
81
|
+
readonly key: string;
|
|
51
82
|
readonly value: string;
|
|
52
83
|
readonly range: string;
|
|
53
|
-
readonly key: string;
|
|
54
84
|
}[];
|
|
55
85
|
threads?: import("@dxos/echo-schema").Ref<{
|
|
56
86
|
name?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-sheet",
|
|
3
|
-
"version": "0.6.14-
|
|
3
|
+
"version": "0.6.14-staging.54a8bab",
|
|
4
4
|
"description": "Braneframe sketch plugin",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -69,32 +69,32 @@
|
|
|
69
69
|
"re-resizable": "^6.9.17",
|
|
70
70
|
"react-markdown": "^8.0.5",
|
|
71
71
|
"react-resize-detector": "^11.0.1",
|
|
72
|
-
"@dxos/app-framework": "0.6.14-
|
|
73
|
-
"@dxos/async": "0.6.14-
|
|
74
|
-
"@dxos/client": "0.6.14-
|
|
75
|
-
"@dxos/crypto": "0.6.14-
|
|
76
|
-
"@dxos/
|
|
77
|
-
"@dxos/
|
|
78
|
-
"@dxos/echo-schema": "0.6.14-
|
|
79
|
-
"@dxos/invariant": "0.6.14-
|
|
80
|
-
"@dxos/keys": "0.6.14-
|
|
81
|
-
"@dxos/
|
|
82
|
-
"@dxos/plugin-
|
|
83
|
-
"@dxos/
|
|
84
|
-
"@dxos/plugin-graph": "0.6.14-
|
|
85
|
-
"@dxos/plugin-markdown": "0.6.14-
|
|
86
|
-
"@dxos/plugin-
|
|
87
|
-
"@dxos/plugin-
|
|
88
|
-
"@dxos/plugin-stack": "0.6.14-
|
|
89
|
-
"@dxos/react-client": "0.6.14-
|
|
90
|
-
"@dxos/react-hooks": "0.6.14-
|
|
91
|
-
"@dxos/react-ui-
|
|
92
|
-
"@dxos/react-ui-editor": "0.6.14-
|
|
93
|
-
"@dxos/react-ui-
|
|
94
|
-
"@dxos/react-ui-grid": "0.6.14-
|
|
95
|
-
"@dxos/
|
|
96
|
-
"@dxos/util": "0.6.14-
|
|
97
|
-
"@dxos/
|
|
72
|
+
"@dxos/app-framework": "0.6.14-staging.54a8bab",
|
|
73
|
+
"@dxos/async": "0.6.14-staging.54a8bab",
|
|
74
|
+
"@dxos/client": "0.6.14-staging.54a8bab",
|
|
75
|
+
"@dxos/crypto": "0.6.14-staging.54a8bab",
|
|
76
|
+
"@dxos/debug": "0.6.14-staging.54a8bab",
|
|
77
|
+
"@dxos/context": "0.6.14-staging.54a8bab",
|
|
78
|
+
"@dxos/echo-schema": "0.6.14-staging.54a8bab",
|
|
79
|
+
"@dxos/invariant": "0.6.14-staging.54a8bab",
|
|
80
|
+
"@dxos/keys": "0.6.14-staging.54a8bab",
|
|
81
|
+
"@dxos/plugin-attention": "0.6.14-staging.54a8bab",
|
|
82
|
+
"@dxos/plugin-client": "0.6.14-staging.54a8bab",
|
|
83
|
+
"@dxos/log": "0.6.14-staging.54a8bab",
|
|
84
|
+
"@dxos/plugin-graph": "0.6.14-staging.54a8bab",
|
|
85
|
+
"@dxos/plugin-markdown": "0.6.14-staging.54a8bab",
|
|
86
|
+
"@dxos/plugin-script": "0.6.14-staging.54a8bab",
|
|
87
|
+
"@dxos/plugin-space": "0.6.14-staging.54a8bab",
|
|
88
|
+
"@dxos/plugin-stack": "0.6.14-staging.54a8bab",
|
|
89
|
+
"@dxos/react-client": "0.6.14-staging.54a8bab",
|
|
90
|
+
"@dxos/react-hooks": "0.6.14-staging.54a8bab",
|
|
91
|
+
"@dxos/react-ui-data": "0.6.14-staging.54a8bab",
|
|
92
|
+
"@dxos/react-ui-editor": "0.6.14-staging.54a8bab",
|
|
93
|
+
"@dxos/react-ui-attention": "0.6.14-staging.54a8bab",
|
|
94
|
+
"@dxos/react-ui-grid": "0.6.14-staging.54a8bab",
|
|
95
|
+
"@dxos/react-ui-list": "0.6.14-staging.54a8bab",
|
|
96
|
+
"@dxos/util": "0.6.14-staging.54a8bab",
|
|
97
|
+
"@dxos/schema": "0.6.14-staging.54a8bab"
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
100
|
"@lezer/generator": "^1.7.1",
|
|
@@ -106,19 +106,19 @@
|
|
|
106
106
|
"react": "~18.2.0",
|
|
107
107
|
"react-dom": "~18.2.0",
|
|
108
108
|
"vite": "5.4.7",
|
|
109
|
-
"@dxos/echo-generator": "0.6.14-
|
|
110
|
-
"@dxos/
|
|
111
|
-
"@dxos/
|
|
112
|
-
"@dxos/react-ui": "0.6.14-
|
|
113
|
-
"@dxos/react-ui-theme": "0.6.14-
|
|
114
|
-
"@dxos/
|
|
115
|
-
"@dxos/
|
|
109
|
+
"@dxos/echo-generator": "0.6.14-staging.54a8bab",
|
|
110
|
+
"@dxos/react-ui": "0.6.14-staging.54a8bab",
|
|
111
|
+
"@dxos/random": "0.6.14-staging.54a8bab",
|
|
112
|
+
"@dxos/react-ui-syntax-highlighter": "0.6.14-staging.54a8bab",
|
|
113
|
+
"@dxos/react-ui-theme": "0.6.14-staging.54a8bab",
|
|
114
|
+
"@dxos/react-ui-types": "0.6.14-staging.54a8bab",
|
|
115
|
+
"@dxos/storybook-utils": "0.6.14-staging.54a8bab"
|
|
116
116
|
},
|
|
117
117
|
"peerDependencies": {
|
|
118
118
|
"react": "~18.2.0",
|
|
119
119
|
"react-dom": "~18.2.0",
|
|
120
|
-
"@dxos/react-ui": "0.6.14-
|
|
121
|
-
"@dxos/react-ui-theme": "0.6.14-
|
|
120
|
+
"@dxos/react-ui": "0.6.14-staging.54a8bab",
|
|
121
|
+
"@dxos/react-ui-theme": "0.6.14-staging.54a8bab"
|
|
122
122
|
},
|
|
123
123
|
"publishConfig": {
|
|
124
124
|
"access": "public"
|
package/src/SheetPlugin.tsx
CHANGED
|
@@ -175,6 +175,26 @@ export const SheetPlugin = (): PluginDefinition<SheetPluginProvides> => {
|
|
|
175
175
|
case SheetAction.CREATE: {
|
|
176
176
|
return { data: createSheet() };
|
|
177
177
|
}
|
|
178
|
+
case SheetAction.INSERT_AXIS: {
|
|
179
|
+
const { model, axis, index, count } = intent.data as SheetAction.InsertAxis;
|
|
180
|
+
const _indices = model[axis === 'col' ? 'insertColumns' : 'insertRows'](index, count);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
case SheetAction.DROP_AXIS: {
|
|
184
|
+
if (!intent.undo) {
|
|
185
|
+
const { model, axis, axisIndex } = intent.data as SheetAction.DropAxis;
|
|
186
|
+
const undoData = model[axis === 'col' ? 'dropColumn' : 'dropRow'](axisIndex);
|
|
187
|
+
return {
|
|
188
|
+
undoable: {
|
|
189
|
+
message: translations[0]['en-US'][SHEET_PLUGIN][`${axis} dropped label`],
|
|
190
|
+
data: { ...undoData, model },
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
} else {
|
|
194
|
+
const { model, ...undoData } = intent.data as SheetAction.DropAxisRestore;
|
|
195
|
+
model[undoData.axis === 'col' ? 'restoreColumn' : 'restoreRow'](undoData);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
178
198
|
}
|
|
179
199
|
},
|
|
180
200
|
},
|
|
@@ -13,6 +13,7 @@ import React, {
|
|
|
13
13
|
useState,
|
|
14
14
|
} from 'react';
|
|
15
15
|
|
|
16
|
+
import { useIntentDispatcher } from '@dxos/app-framework';
|
|
16
17
|
import { DropdownMenu, Icon, useTranslation } from '@dxos/react-ui';
|
|
17
18
|
import { useAttention } from '@dxos/react-ui-attention';
|
|
18
19
|
import {
|
|
@@ -31,6 +32,7 @@ import { DEFAULT_COLUMNS, DEFAULT_ROWS, rangeToA1Notation, type CellRange } from
|
|
|
31
32
|
import { rangeExtension, sheetExtension, type RangeController } from '../../extensions';
|
|
32
33
|
import { useSelectThreadOnCellFocus, useUpdateFocusedCellOnThreadSelection } from '../../integrations';
|
|
33
34
|
import { SHEET_PLUGIN } from '../../meta';
|
|
35
|
+
import { SheetAction } from '../../types';
|
|
34
36
|
import { useSheetContext } from '../SheetContext';
|
|
35
37
|
|
|
36
38
|
const inertPosition: DxGridPosition = { plane: 'grid', col: 0, row: 0 };
|
|
@@ -61,6 +63,8 @@ export const GridSheet = () => {
|
|
|
61
63
|
useSheetContext();
|
|
62
64
|
// NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.
|
|
63
65
|
const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);
|
|
66
|
+
const [extraplanarFocus, setExtraplanarFocus] = useState<DxGridPosition | null>(null);
|
|
67
|
+
const dispatch = useIntentDispatcher();
|
|
64
68
|
const rangeController = useRef<RangeController>();
|
|
65
69
|
const { hasAttention } = useAttention(id);
|
|
66
70
|
|
|
@@ -68,8 +72,15 @@ export const GridSheet = () => {
|
|
|
68
72
|
(event: FocusEvent) => {
|
|
69
73
|
if (!editing) {
|
|
70
74
|
const cell = closestCell(event.target);
|
|
71
|
-
if (cell
|
|
72
|
-
|
|
75
|
+
if (cell) {
|
|
76
|
+
if (cell.plane === 'grid') {
|
|
77
|
+
setCursor({ col: cell.col, row: cell.row });
|
|
78
|
+
setExtraplanarFocus(null);
|
|
79
|
+
} else {
|
|
80
|
+
setExtraplanarFocus(cell);
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
setExtraplanarFocus(null);
|
|
73
84
|
}
|
|
74
85
|
}
|
|
75
86
|
},
|
|
@@ -144,6 +155,34 @@ export const GridSheet = () => {
|
|
|
144
155
|
[hasAttention],
|
|
145
156
|
);
|
|
146
157
|
|
|
158
|
+
const selectEntireAxis = useCallback(
|
|
159
|
+
(pos: DxGridPosition) => {
|
|
160
|
+
switch (pos.plane) {
|
|
161
|
+
case 'frozenRowsStart':
|
|
162
|
+
return dxGrid?.setSelection({
|
|
163
|
+
start: { col: pos.col, row: 0, plane: 'grid' },
|
|
164
|
+
end: { col: pos.col, row: model.sheet.rows.length - 1, plane: 'grid' },
|
|
165
|
+
});
|
|
166
|
+
case 'frozenColsStart':
|
|
167
|
+
return dxGrid?.setSelection({
|
|
168
|
+
start: { row: pos.row, col: 0, plane: 'grid' },
|
|
169
|
+
end: { row: pos.row, col: model.sheet.columns.length - 1, plane: 'grid' },
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
[dxGrid, model.sheet],
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
const handleClick = useCallback(
|
|
177
|
+
(event: MouseEvent) => {
|
|
178
|
+
const cell = closestCell(event.target);
|
|
179
|
+
if (cell) {
|
|
180
|
+
selectEntireAxis(cell);
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
[selectEntireAxis],
|
|
184
|
+
);
|
|
185
|
+
|
|
147
186
|
const handleKeyDown = useCallback(
|
|
148
187
|
(event: KeyboardEvent) => {
|
|
149
188
|
switch (event.key) {
|
|
@@ -151,6 +190,16 @@ export const GridSheet = () => {
|
|
|
151
190
|
case 'Delete':
|
|
152
191
|
event.preventDefault();
|
|
153
192
|
return cursorFallbackRange && model.clear(cursorFallbackRange);
|
|
193
|
+
case 'Enter':
|
|
194
|
+
case 'Space':
|
|
195
|
+
if (dxGrid && extraplanarFocus) {
|
|
196
|
+
switch (extraplanarFocus.plane) {
|
|
197
|
+
case 'frozenRowsStart':
|
|
198
|
+
case 'frozenColsStart':
|
|
199
|
+
event.preventDefault();
|
|
200
|
+
return selectEntireAxis(extraplanarFocus);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
154
203
|
}
|
|
155
204
|
if (event.metaKey || event.ctrlKey) {
|
|
156
205
|
switch (event.key) {
|
|
@@ -176,7 +225,7 @@ export const GridSheet = () => {
|
|
|
176
225
|
}
|
|
177
226
|
}
|
|
178
227
|
},
|
|
179
|
-
[cursorFallbackRange, model, cursor],
|
|
228
|
+
[cursorFallbackRange, model, cursor, extraplanarFocus, selectEntireAxis],
|
|
180
229
|
);
|
|
181
230
|
|
|
182
231
|
const contextMenuAnchorRef = useRef<HTMLButtonElement | null>(null);
|
|
@@ -193,20 +242,31 @@ export const GridSheet = () => {
|
|
|
193
242
|
}, []);
|
|
194
243
|
|
|
195
244
|
const handleAxisMenuAction = useCallback(
|
|
196
|
-
(operation: '
|
|
245
|
+
(operation: 'insert-before' | 'insert-after' | 'drop') => {
|
|
197
246
|
switch (operation) {
|
|
198
|
-
case '
|
|
199
|
-
case '
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
247
|
+
case 'insert-before':
|
|
248
|
+
case 'insert-after':
|
|
249
|
+
return dispatch({
|
|
250
|
+
action: SheetAction.INSERT_AXIS,
|
|
251
|
+
data: {
|
|
252
|
+
model,
|
|
253
|
+
axis: contextMenuAxis,
|
|
254
|
+
index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),
|
|
255
|
+
} satisfies SheetAction.InsertAxis,
|
|
256
|
+
});
|
|
204
257
|
break;
|
|
205
|
-
case '
|
|
206
|
-
|
|
258
|
+
case 'drop':
|
|
259
|
+
return dispatch({
|
|
260
|
+
action: SheetAction.DROP_AXIS,
|
|
261
|
+
data: {
|
|
262
|
+
model,
|
|
263
|
+
axis: contextMenuAxis,
|
|
264
|
+
axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],
|
|
265
|
+
} satisfies SheetAction.DropAxis,
|
|
266
|
+
});
|
|
207
267
|
}
|
|
208
268
|
},
|
|
209
|
-
[contextMenuAxis, contextMenuOpen, model],
|
|
269
|
+
[contextMenuAxis, contextMenuOpen, model, dispatch],
|
|
210
270
|
);
|
|
211
271
|
|
|
212
272
|
const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);
|
|
@@ -257,6 +317,7 @@ export const GridSheet = () => {
|
|
|
257
317
|
onWheelCapture={handleWheel}
|
|
258
318
|
onKeyDown={handleKeyDown}
|
|
259
319
|
onContextMenu={handleContextMenu}
|
|
320
|
+
onClick={handleClick}
|
|
260
321
|
overscroll='inline'
|
|
261
322
|
className='[--dx-grid-base:var(--surface-bg)]'
|
|
262
323
|
activeRefs={activeRefs}
|
|
@@ -270,21 +331,21 @@ export const GridSheet = () => {
|
|
|
270
331
|
<DropdownMenu.VirtualTrigger virtualRef={contextMenuAnchorRef} />
|
|
271
332
|
<DropdownMenu.Content side={contextMenuAxis === 'col' ? 'bottom' : 'right'} sideOffset={4} collisionPadding={8}>
|
|
272
333
|
<DropdownMenu.Viewport>
|
|
273
|
-
<DropdownMenu.Item onClick={() => handleAxisMenuAction('
|
|
334
|
+
<DropdownMenu.Item onClick={() => handleAxisMenuAction('insert-before')}>
|
|
274
335
|
<Icon
|
|
275
336
|
size={5}
|
|
276
337
|
icon={contextMenuAxis === 'col' ? 'ph--columns-plus-left--regular' : 'ph--rows-plus-top--regular'}
|
|
277
338
|
/>
|
|
278
339
|
<span>{t(`add ${contextMenuAxis} before label`)}</span>
|
|
279
340
|
</DropdownMenu.Item>
|
|
280
|
-
<DropdownMenu.Item onClick={() => handleAxisMenuAction('
|
|
341
|
+
<DropdownMenu.Item onClick={() => handleAxisMenuAction('insert-after')}>
|
|
281
342
|
<Icon
|
|
282
343
|
size={5}
|
|
283
344
|
icon={contextMenuAxis === 'col' ? 'ph--columns-plus-right--regular' : 'ph--rows-plus-bottom--regular'}
|
|
284
345
|
/>
|
|
285
346
|
<span>{t(`add ${contextMenuAxis} after label`)}</span>
|
|
286
347
|
</DropdownMenu.Item>
|
|
287
|
-
<DropdownMenu.Item
|
|
348
|
+
<DropdownMenu.Item onClick={() => handleAxisMenuAction('drop')}>
|
|
288
349
|
<Icon size={5} icon='ph--backspace--regular' />
|
|
289
350
|
<span>{t(`delete ${contextMenuAxis} label`)}</span>
|
|
290
351
|
</DropdownMenu.Item>
|
|
@@ -67,16 +67,18 @@ const projectCellProps = (model: SheetModel, col: number, row: number): DxGridCe
|
|
|
67
67
|
})
|
|
68
68
|
.map((thread) => fullyQualifiedId(thread!))
|
|
69
69
|
.join(' ');
|
|
70
|
-
|
|
70
|
+
|
|
71
|
+
const description = model.getValueDescription(address);
|
|
72
|
+
const type = description?.type;
|
|
73
|
+
const format = description?.format;
|
|
71
74
|
const classNames = ranges?.map(cellClassNameForRange).reverse();
|
|
72
75
|
|
|
73
76
|
return {
|
|
74
|
-
value: parseValue(type, rawValue),
|
|
75
|
-
className: mx(cellClassesForFieldType(type), threadRefs && commentedClassName, classNames),
|
|
77
|
+
value: parseValue({ type, format, value: rawValue }),
|
|
78
|
+
className: mx(cellClassesForFieldType({ type, format }), threadRefs && commentedClassName, classNames),
|
|
76
79
|
dataRefs: threadRefs,
|
|
77
80
|
};
|
|
78
81
|
};
|
|
79
|
-
|
|
80
82
|
const gridCellGetter = (model: SheetModel) => {
|
|
81
83
|
// TODO(thure): Actually use the cache.
|
|
82
84
|
const cachedGridCells: DxGridPlaneCells = {};
|
|
@@ -140,7 +142,11 @@ export const useSheetModelDxGridProps = (
|
|
|
140
142
|
dxGrid?.requestUpdate('initialCells');
|
|
141
143
|
};
|
|
142
144
|
cellsAccessor.handle.addListener('change', handleCellsUpdate);
|
|
143
|
-
|
|
145
|
+
const unsubscribe = model.graph.update.on(handleCellsUpdate);
|
|
146
|
+
return () => {
|
|
147
|
+
cellsAccessor.handle.removeListener('change', handleCellsUpdate);
|
|
148
|
+
unsubscribe();
|
|
149
|
+
};
|
|
144
150
|
}, [model, dxGrid]);
|
|
145
151
|
|
|
146
152
|
useEffect(() => {
|
|
@@ -158,7 +164,7 @@ export const useSheetModelDxGridProps = (
|
|
|
158
164
|
columnMetaAccessor.handle.removeListener('change', handleColumnMetaUpdate);
|
|
159
165
|
rowMetaAccessor.handle.removeListener('change', handleRowMetaUpdate);
|
|
160
166
|
};
|
|
161
|
-
}, [model]);
|
|
167
|
+
}, [model, dxGrid]);
|
|
162
168
|
|
|
163
169
|
return { columns, rows };
|
|
164
170
|
};
|
|
@@ -11,6 +11,7 @@ import { withTheme, withLayout } from '@dxos/storybook-utils';
|
|
|
11
11
|
|
|
12
12
|
import { SheetContainer } from './SheetContainer';
|
|
13
13
|
import { createTestCells, useTestSheet, withComputeGraphDecorator } from '../../testing';
|
|
14
|
+
import translations from '../../translations';
|
|
14
15
|
import { SheetType } from '../../types';
|
|
15
16
|
import { useComputeGraph } from '../ComputeGraph';
|
|
16
17
|
|
|
@@ -38,6 +39,7 @@ const meta: Meta = {
|
|
|
38
39
|
classNames: 'grid grid-cols-1 grid-rows-[min-content_minmax(0,1fr)_min-content]',
|
|
39
40
|
}),
|
|
40
41
|
],
|
|
42
|
+
parameters: { translations },
|
|
41
43
|
};
|
|
42
44
|
|
|
43
45
|
export default meta;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { createContext } from '@radix-ui/react-context';
|
|
6
|
-
import React, { type PropsWithChildren, useCallback
|
|
6
|
+
import React, { type PropsWithChildren, useCallback } from 'react';
|
|
7
7
|
|
|
8
8
|
import { useIntentDispatcher } from '@dxos/app-framework';
|
|
9
9
|
import {
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
inRange,
|
|
29
29
|
rangeFromIndex,
|
|
30
30
|
rangeToIndex,
|
|
31
|
+
styleKey,
|
|
31
32
|
type StyleKey,
|
|
32
33
|
type StyleValue,
|
|
33
34
|
} from '../../defs';
|
|
@@ -89,10 +90,11 @@ type CommentAction = { key: CommentKey; value: CommentValue; cellContent?: strin
|
|
|
89
90
|
type StyleAction = { key: StyleKey; value: StyleValue };
|
|
90
91
|
|
|
91
92
|
export type ToolbarAction = StyleAction | AlignAction | CommentAction;
|
|
93
|
+
export type ToolbarActionAnnotated = ToolbarAction & { unset?: boolean };
|
|
92
94
|
|
|
93
95
|
export type ToolbarActionType = ToolbarAction['key'];
|
|
94
96
|
|
|
95
|
-
export type ToolbarActionHandler = (action:
|
|
97
|
+
export type ToolbarActionHandler = (action: ToolbarActionAnnotated) => void;
|
|
96
98
|
|
|
97
99
|
export type ToolbarProps = ThemedClassName<
|
|
98
100
|
PropsWithChildren<{
|
|
@@ -100,9 +102,9 @@ export type ToolbarProps = ThemedClassName<
|
|
|
100
102
|
}>
|
|
101
103
|
>;
|
|
102
104
|
|
|
103
|
-
const [ToolbarContextProvider, useToolbarContext] = createContext<{
|
|
104
|
-
|
|
105
|
-
);
|
|
105
|
+
const [ToolbarContextProvider, useToolbarContext] = createContext<{
|
|
106
|
+
onAction: (action: ToolbarActionAnnotated) => void;
|
|
107
|
+
}>('Toolbar');
|
|
106
108
|
|
|
107
109
|
// TODO(Zan): Factor out, copied this from MarkdownPlugin.
|
|
108
110
|
const sectionToolbarLayout =
|
|
@@ -117,13 +119,16 @@ const ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {
|
|
|
117
119
|
|
|
118
120
|
// TODO(Zan): Externalize the toolbar action handler. E.g., Toolbar/keys should both fire events.
|
|
119
121
|
const handleAction = useCallback(
|
|
120
|
-
(action:
|
|
122
|
+
(action: ToolbarActionAnnotated) => {
|
|
121
123
|
switch (action.key) {
|
|
122
124
|
case 'alignment':
|
|
123
|
-
if (
|
|
124
|
-
const index =
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
if (cursorFallbackRange) {
|
|
126
|
+
const index =
|
|
127
|
+
model.sheet.ranges?.findIndex(
|
|
128
|
+
(range) =>
|
|
129
|
+
range.key === action.key &&
|
|
130
|
+
inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),
|
|
131
|
+
) ?? -1;
|
|
127
132
|
const nextRangeEntity = {
|
|
128
133
|
range: rangeToIndex(model.sheet, cursorFallbackRange),
|
|
129
134
|
key: action.key,
|
|
@@ -131,14 +136,21 @@ const ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {
|
|
|
131
136
|
};
|
|
132
137
|
if (index < 0) {
|
|
133
138
|
model.sheet.ranges?.push(nextRangeEntity);
|
|
139
|
+
} else if (model.sheet.ranges![index].value === action.value) {
|
|
140
|
+
model.sheet.ranges?.splice(index, 1);
|
|
134
141
|
} else {
|
|
135
142
|
model.sheet.ranges?.splice(index, 1, nextRangeEntity);
|
|
136
143
|
}
|
|
137
144
|
}
|
|
138
145
|
break;
|
|
139
146
|
case 'style':
|
|
140
|
-
if (action.
|
|
141
|
-
const index = model.sheet.ranges?.findIndex(
|
|
147
|
+
if (action.unset) {
|
|
148
|
+
const index = model.sheet.ranges?.findIndex(
|
|
149
|
+
(range) =>
|
|
150
|
+
range.key === action.key &&
|
|
151
|
+
cursorFallbackRange &&
|
|
152
|
+
inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),
|
|
153
|
+
);
|
|
142
154
|
if (index >= 0) {
|
|
143
155
|
model.sheet.ranges?.splice(index, 1);
|
|
144
156
|
}
|
|
@@ -172,6 +184,7 @@ const ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {
|
|
|
172
184
|
<ToolbarContextProvider onAction={handleAction}>
|
|
173
185
|
<NaturalToolbar.Root
|
|
174
186
|
classNames={[
|
|
187
|
+
'pli-0.5',
|
|
175
188
|
...(role === 'section'
|
|
176
189
|
? ['z-[2] group-focus-within/section:visible', !hasAttention && 'invisible', sectionToolbarLayout]
|
|
177
190
|
: ['attention-surface']),
|
|
@@ -207,20 +220,20 @@ const Alignment = () => {
|
|
|
207
220
|
const { onAction } = useToolbarContext('Alignment');
|
|
208
221
|
const { t } = useTranslation(SHEET_PLUGIN);
|
|
209
222
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
: undefined,
|
|
217
|
-
[cursor, model.sheet.ranges],
|
|
218
|
-
);
|
|
223
|
+
// TODO(thure): Can this O(n) call be memoized?
|
|
224
|
+
const value = cursor
|
|
225
|
+
? model.sheet.ranges?.findLast(
|
|
226
|
+
({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),
|
|
227
|
+
)?.value
|
|
228
|
+
: undefined;
|
|
219
229
|
|
|
220
230
|
return (
|
|
221
231
|
<NaturalToolbar.ToggleGroup
|
|
222
232
|
type='single'
|
|
223
|
-
value={
|
|
233
|
+
value={
|
|
234
|
+
// TODO(thure): providing `undefined` leaves the last item active which was active rather than showing none.
|
|
235
|
+
value ?? 'never'
|
|
236
|
+
}
|
|
224
237
|
onValueChange={(value: AlignValue) => onAction?.({ key: alignKey, value })}
|
|
225
238
|
>
|
|
226
239
|
{alignmentOptions.map(({ value, icon }) => (
|
|
@@ -235,25 +248,27 @@ const Alignment = () => {
|
|
|
235
248
|
);
|
|
236
249
|
};
|
|
237
250
|
|
|
238
|
-
const styleOptions: ButtonProps<StyleValue>[] = [
|
|
251
|
+
const styleOptions: ButtonProps<StyleValue>[] = [
|
|
252
|
+
{ value: 'highlight', icon: 'ph--highlighter--regular' },
|
|
253
|
+
{ value: 'softwrap', icon: 'ph--paragraph--regular' },
|
|
254
|
+
];
|
|
239
255
|
|
|
240
256
|
const Styles = () => {
|
|
241
|
-
const {
|
|
257
|
+
const { cursorFallbackRange, model } = useSheetContext();
|
|
242
258
|
const { onAction } = useToolbarContext('Styles');
|
|
243
259
|
const { t } = useTranslation(SHEET_PLUGIN);
|
|
244
260
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
);
|
|
261
|
+
// TODO(thure): Can this O(n) call be memoized?
|
|
262
|
+
const activeValues = cursorFallbackRange
|
|
263
|
+
? model.sheet.ranges
|
|
264
|
+
?.filter(
|
|
265
|
+
({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),
|
|
266
|
+
)
|
|
267
|
+
.reduce((acc, { value }) => {
|
|
268
|
+
acc.add(value);
|
|
269
|
+
return acc;
|
|
270
|
+
}, new Set())
|
|
271
|
+
: undefined;
|
|
257
272
|
|
|
258
273
|
return (
|
|
259
274
|
<>
|
|
@@ -262,10 +277,15 @@ const Styles = () => {
|
|
|
262
277
|
itemType='toggle'
|
|
263
278
|
key={value}
|
|
264
279
|
pressed={activeValues?.has(value)}
|
|
265
|
-
onPressedChange={(nextPressed: boolean) =>
|
|
280
|
+
onPressedChange={(nextPressed: boolean) => {
|
|
281
|
+
onAction?.({ key: 'style', value, unset: !nextPressed });
|
|
282
|
+
}}
|
|
266
283
|
icon={icon}
|
|
267
284
|
>
|
|
268
|
-
{t(
|
|
285
|
+
{t('toolbar action label', {
|
|
286
|
+
key: t(`range key ${styleKey} label`),
|
|
287
|
+
value: t(`range value ${value} label`),
|
|
288
|
+
})}
|
|
269
289
|
</ToolbarItem>
|
|
270
290
|
))}
|
|
271
291
|
</>
|
|
@@ -281,6 +301,7 @@ const Actions = () => {
|
|
|
281
301
|
const { cursorFallbackRange, cursor, model } = useSheetContext();
|
|
282
302
|
const { t } = useTranslation(SHEET_PLUGIN);
|
|
283
303
|
|
|
304
|
+
// TODO(thure): Can this O(n) call be memoized?
|
|
284
305
|
const overlapsCommentAnchor = (model.sheet.threads ?? [])
|
|
285
306
|
.filter(nonNullable)
|
|
286
307
|
.filter((thread) => thread.status !== 'resolved')
|
|
@@ -304,16 +325,16 @@ const Actions = () => {
|
|
|
304
325
|
icon='ph--chat-text--regular'
|
|
305
326
|
data-testid='editor.toolbar.comment'
|
|
306
327
|
onClick={() => {
|
|
307
|
-
if (!
|
|
328
|
+
if (!cursorFallbackRange) {
|
|
308
329
|
return;
|
|
309
330
|
}
|
|
310
331
|
return onAction?.({
|
|
311
332
|
key: 'comment',
|
|
312
333
|
value: rangeToIndex(model.sheet, cursorFallbackRange),
|
|
313
|
-
cellContent: model.getCellText(
|
|
334
|
+
cellContent: model.getCellText(cursorFallbackRange.from),
|
|
314
335
|
});
|
|
315
336
|
}}
|
|
316
|
-
disabled={!
|
|
337
|
+
disabled={!cursorFallbackRange || overlapsCommentAnchor}
|
|
317
338
|
>
|
|
318
339
|
{t(tooltipLabelKey)}
|
|
319
340
|
</ToolbarItem>
|