@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.
Files changed (103) hide show
  1. package/dist/lib/browser/{SheetContainer-R65IDJHN.mjs → SheetContainer-JZEKRM4Z.mjs} +41 -30
  2. package/dist/lib/browser/SheetContainer-JZEKRM4Z.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-5KVQ5IPW.mjs → chunk-BVUN7SHF.mjs} +4 -2
  4. package/dist/lib/browser/chunk-BVUN7SHF.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-I2DKJ72A.mjs → chunk-G2FUL6PK.mjs} +257 -57
  6. package/dist/lib/browser/chunk-G2FUL6PK.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-D3QTX46O.mjs → chunk-RABELMEQ.mjs} +3 -2
  8. package/dist/lib/browser/{chunk-D3QTX46O.mjs.map → chunk-RABELMEQ.mjs.map} +3 -3
  9. package/dist/lib/browser/{chunk-KCYJSOFB.mjs → chunk-VMSX6Z4X.mjs} +51 -17
  10. package/dist/lib/browser/chunk-VMSX6Z4X.mjs.map +7 -0
  11. package/dist/lib/browser/{compute-graph-SJT67236.mjs → compute-graph-GGWUX644.mjs} +4 -4
  12. package/dist/lib/browser/index.mjs +38 -10
  13. package/dist/lib/browser/index.mjs.map +3 -3
  14. package/dist/lib/browser/meta.json +1 -1
  15. package/dist/lib/browser/meta.mjs +1 -1
  16. package/dist/lib/browser/types.mjs +2 -2
  17. package/dist/lib/node/{SheetContainer-6BO4C5X2.cjs → SheetContainer-PJE74VO4.cjs} +60 -50
  18. package/dist/lib/node/SheetContainer-PJE74VO4.cjs.map +7 -0
  19. package/dist/lib/node/{chunk-QIFIGEKV.cjs → chunk-2ZVZI2KJ.cjs} +6 -5
  20. package/dist/lib/node/{chunk-QIFIGEKV.cjs.map → chunk-2ZVZI2KJ.cjs.map} +3 -3
  21. package/dist/lib/node/{chunk-2XJ5I4UF.cjs → chunk-AWKOWDMI.cjs} +8 -6
  22. package/dist/lib/node/chunk-AWKOWDMI.cjs.map +7 -0
  23. package/dist/lib/node/{chunk-JF5XNTF3.cjs → chunk-O7XR4R7Y.cjs} +61 -26
  24. package/dist/lib/node/chunk-O7XR4R7Y.cjs.map +7 -0
  25. package/dist/lib/node/{chunk-DEPJHN47.cjs → chunk-STZ7S7RF.cjs} +293 -94
  26. package/dist/lib/node/chunk-STZ7S7RF.cjs.map +7 -0
  27. package/dist/lib/node/{compute-graph-AQBDL7HO.cjs → compute-graph-KGWA2QLE.cjs} +21 -21
  28. package/dist/lib/node/{compute-graph-AQBDL7HO.cjs.map → compute-graph-KGWA2QLE.cjs.map} +2 -2
  29. package/dist/lib/node/index.cjs +66 -38
  30. package/dist/lib/node/index.cjs.map +3 -3
  31. package/dist/lib/node/meta.cjs +3 -3
  32. package/dist/lib/node/meta.cjs.map +1 -1
  33. package/dist/lib/node/meta.json +1 -1
  34. package/dist/lib/node/types.cjs +7 -7
  35. package/dist/lib/node/types.cjs.map +1 -1
  36. package/dist/lib/node-esm/{SheetContainer-MJXC5E3P.mjs → SheetContainer-R73XEXHU.mjs} +41 -30
  37. package/dist/lib/node-esm/SheetContainer-R73XEXHU.mjs.map +7 -0
  38. package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs → chunk-BM2Q3FFC.mjs} +3 -2
  39. package/dist/lib/node-esm/{chunk-VCYJWE3O.mjs.map → chunk-BM2Q3FFC.mjs.map} +3 -3
  40. package/dist/lib/node-esm/{chunk-XBEHKYO7.mjs → chunk-CR4K75EL.mjs} +51 -17
  41. package/dist/lib/node-esm/chunk-CR4K75EL.mjs.map +7 -0
  42. package/dist/lib/node-esm/{chunk-5TXLF6PL.mjs → chunk-UIBWRHW7.mjs} +4 -2
  43. package/dist/lib/node-esm/chunk-UIBWRHW7.mjs.map +7 -0
  44. package/dist/lib/node-esm/{chunk-25V7WY4R.mjs → chunk-V5N3Y2O5.mjs} +257 -57
  45. package/dist/lib/node-esm/chunk-V5N3Y2O5.mjs.map +7 -0
  46. package/dist/lib/node-esm/{compute-graph-FRCKXEYK.mjs → compute-graph-2SCZT7N5.mjs} +4 -4
  47. package/dist/lib/node-esm/index.mjs +38 -10
  48. package/dist/lib/node-esm/index.mjs.map +3 -3
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/meta.mjs +1 -1
  51. package/dist/lib/node-esm/types.mjs +2 -2
  52. package/dist/types/src/SheetPlugin.d.ts.map +1 -1
  53. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  54. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  55. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  56. package/dist/types/src/components/Toolbar/Toolbar.d.ts +5 -2
  57. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  58. package/dist/types/src/compute-graph/compute-graph.d.ts +2 -2
  59. package/dist/types/src/compute-graph/compute-graph.d.ts.map +1 -1
  60. package/dist/types/src/compute-graph/functions/async-function.d.ts.map +1 -1
  61. package/dist/types/src/compute-graph/functions/edge-function.d.ts.map +1 -1
  62. package/dist/types/src/defs/sheet-range-types.d.ts +1 -1
  63. package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -1
  64. package/dist/types/src/defs/util.d.ts +1 -1
  65. package/dist/types/src/defs/util.d.ts.map +1 -1
  66. package/dist/types/src/meta.d.ts +1 -0
  67. package/dist/types/src/meta.d.ts.map +1 -1
  68. package/dist/types/src/model/sheet-model.d.ts +12 -5
  69. package/dist/types/src/model/sheet-model.d.ts.map +1 -1
  70. package/dist/types/src/translations.d.ts +10 -5
  71. package/dist/types/src/translations.d.ts.map +1 -1
  72. package/dist/types/src/types.d.ts +33 -3
  73. package/dist/types/src/types.d.ts.map +1 -1
  74. package/package.json +36 -36
  75. package/src/SheetPlugin.tsx +20 -0
  76. package/src/components/GridSheet/GridSheet.tsx +77 -16
  77. package/src/components/GridSheet/util.ts +12 -6
  78. package/src/components/SheetContainer/SheetContainer.stories.tsx +2 -0
  79. package/src/components/Toolbar/Toolbar.tsx +62 -41
  80. package/src/compute-graph/compute-graph.ts +22 -7
  81. package/src/compute-graph/functions/async-function.ts +1 -0
  82. package/src/compute-graph/functions/edge-function.ts +5 -3
  83. package/src/defs/sheet-range-types.ts +4 -2
  84. package/src/defs/util.ts +1 -0
  85. package/src/meta.ts +1 -0
  86. package/src/model/sheet-model.test.ts +5 -3
  87. package/src/model/sheet-model.ts +93 -21
  88. package/src/translations.ts +10 -5
  89. package/src/types.ts +20 -0
  90. package/dist/lib/browser/SheetContainer-R65IDJHN.mjs.map +0 -7
  91. package/dist/lib/browser/chunk-5KVQ5IPW.mjs.map +0 -7
  92. package/dist/lib/browser/chunk-I2DKJ72A.mjs.map +0 -7
  93. package/dist/lib/browser/chunk-KCYJSOFB.mjs.map +0 -7
  94. package/dist/lib/node/SheetContainer-6BO4C5X2.cjs.map +0 -7
  95. package/dist/lib/node/chunk-2XJ5I4UF.cjs.map +0 -7
  96. package/dist/lib/node/chunk-DEPJHN47.cjs.map +0 -7
  97. package/dist/lib/node/chunk-JF5XNTF3.cjs.map +0 -7
  98. package/dist/lib/node-esm/SheetContainer-MJXC5E3P.mjs.map +0 -7
  99. package/dist/lib/node-esm/chunk-25V7WY4R.mjs.map +0 -7
  100. package/dist/lib/node-esm/chunk-5TXLF6PL.mjs.map +0 -7
  101. package/dist/lib/node-esm/chunk-XBEHKYO7.mjs.map +0 -7
  102. /package/dist/lib/browser/{compute-graph-SJT67236.mjs.map → compute-graph-GGWUX644.mjs.map} +0 -0
  103. /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,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,oBAAY,WAAW;IACrB,MAAM,wCAA2B;CAClC;AAKD,KAAK,cAAc,CAAC,CAAC,IAAI;IACvB,MAAM,EAAE;QACN,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;KAC9F,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAC/C,sBAAsB,GACtB,oBAAoB,GACpB,yBAAyB,GACzB,uBAAuB,GACvB,oBAAoB,GACpB,cAAc,GACd,iBAAiB,GACjB,aAAa,GACb,cAAc,CAAC,SAAS,CAAC,CAAC;AAE5B,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE/D,eAAO,MAAM,SAAS;;EAKpB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC;AAGxD,eAAO,MAAM,KAAK;;;;EAIhB,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC;AAGhD,eAAO,MAAM,aAAa;;EAExB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqCgR,CAAC;;oBAA8D,CAAC;uBAAyC,CAAC;wBAAwD,CAAC;;;;;;;;2BAAsP,CAAC;qBAAuC,CAAC;;iBAA8C,CAAC;sBAA4E,CAAC;;;mBAAwE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAvoB,CAAC;;oBAA8D,CAAC;uBAAyC,CAAC;wBAAwD,CAAC;;;;;;;;2BAAsP,CAAC;qBAAuC,CAAC;;iBAA8C,CAAC;sBAA4E,CAAC;;;mBAAwE,CAAC;;;;;;;;AAlC15B,qBAAa,SAAU,SAAQ,cAuB7B;CAAG;AAEL,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACnC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC"}
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-main.8b352a0",
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-main.8b352a0",
73
- "@dxos/async": "0.6.14-main.8b352a0",
74
- "@dxos/client": "0.6.14-main.8b352a0",
75
- "@dxos/crypto": "0.6.14-main.8b352a0",
76
- "@dxos/context": "0.6.14-main.8b352a0",
77
- "@dxos/debug": "0.6.14-main.8b352a0",
78
- "@dxos/echo-schema": "0.6.14-main.8b352a0",
79
- "@dxos/invariant": "0.6.14-main.8b352a0",
80
- "@dxos/keys": "0.6.14-main.8b352a0",
81
- "@dxos/log": "0.6.14-main.8b352a0",
82
- "@dxos/plugin-attention": "0.6.14-main.8b352a0",
83
- "@dxos/plugin-client": "0.6.14-main.8b352a0",
84
- "@dxos/plugin-graph": "0.6.14-main.8b352a0",
85
- "@dxos/plugin-markdown": "0.6.14-main.8b352a0",
86
- "@dxos/plugin-space": "0.6.14-main.8b352a0",
87
- "@dxos/plugin-script": "0.6.14-main.8b352a0",
88
- "@dxos/plugin-stack": "0.6.14-main.8b352a0",
89
- "@dxos/react-client": "0.6.14-main.8b352a0",
90
- "@dxos/react-hooks": "0.6.14-main.8b352a0",
91
- "@dxos/react-ui-attention": "0.6.14-main.8b352a0",
92
- "@dxos/react-ui-editor": "0.6.14-main.8b352a0",
93
- "@dxos/react-ui-data": "0.6.14-main.8b352a0",
94
- "@dxos/react-ui-grid": "0.6.14-main.8b352a0",
95
- "@dxos/schema": "0.6.14-main.8b352a0",
96
- "@dxos/util": "0.6.14-main.8b352a0",
97
- "@dxos/react-ui-list": "0.6.14-main.8b352a0"
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-main.8b352a0",
110
- "@dxos/random": "0.6.14-main.8b352a0",
111
- "@dxos/react-ui-syntax-highlighter": "0.6.14-main.8b352a0",
112
- "@dxos/react-ui": "0.6.14-main.8b352a0",
113
- "@dxos/react-ui-theme": "0.6.14-main.8b352a0",
114
- "@dxos/storybook-utils": "0.6.14-main.8b352a0",
115
- "@dxos/react-ui-types": "0.6.14-main.8b352a0"
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-main.8b352a0",
121
- "@dxos/react-ui-theme": "0.6.14-main.8b352a0"
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"
@@ -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 && cell.plane === 'grid') {
72
- setCursor({ col: cell.col, row: cell.row });
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: 'add-before' | 'add-after' | 'remove') => {
245
+ (operation: 'insert-before' | 'insert-after' | 'drop') => {
197
246
  switch (operation) {
198
- case 'add-before':
199
- case 'add-after':
200
- model[contextMenuAxis === 'col' ? 'insertColumns' : 'insertRows'](
201
- contextMenuOpen![contextMenuAxis] + (operation === 'add-before' ? 0 : 1),
202
- 1,
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 'remove':
206
- // console.warn('[model does not implement]');
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('add-before')}>
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('add-after')}>
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 disabled onClick={() => handleAxisMenuAction('remove')}>
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
- const type = model.getValueType(address);
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
- return () => cellsAccessor.handle.removeListener('change', handleCellsUpdate);
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, useMemo } from 'react';
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: ToolbarAction) => void;
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<{ onAction: (action: ToolbarAction) => void }>(
104
- 'Toolbar',
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: ToolbarAction) => {
122
+ (action: ToolbarActionAnnotated) => {
121
123
  switch (action.key) {
122
124
  case 'alignment':
123
- if (cursor && cursorFallbackRange) {
124
- const index = model.sheet.ranges?.findIndex(
125
- (range) => range.key === action.key && inRange(rangeFromIndex(model.sheet, range.range), cursor),
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.value === 'unset') {
141
- const index = model.sheet.ranges?.findIndex((range) => range.key === action.key);
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
- const value = useMemo(
211
- () =>
212
- cursor
213
- ? model.sheet.ranges?.find(
214
- ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),
215
- )?.value
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={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>[] = [{ value: 'highlight', icon: 'ph--highlighter--regular' }];
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 { cursor, model } = useSheetContext();
257
+ const { cursorFallbackRange, model } = useSheetContext();
242
258
  const { onAction } = useToolbarContext('Styles');
243
259
  const { t } = useTranslation(SHEET_PLUGIN);
244
260
 
245
- const activeValues = useMemo(
246
- () =>
247
- cursor
248
- ? model.sheet.ranges
249
- ?.filter(({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursor))
250
- .reduce((acc, { value }) => {
251
- acc.add(value);
252
- return acc;
253
- }, new Set())
254
- : undefined,
255
- [cursor, model.sheet.ranges],
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) => onAction?.({ key: 'style', value: nextPressed ? value : 'unset' })}
280
+ onPressedChange={(nextPressed: boolean) => {
281
+ onAction?.({ key: 'style', value, unset: !nextPressed });
282
+ }}
266
283
  icon={icon}
267
284
  >
268
- {t(`toolbar ${value} label`)}
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 (!(cursorFallbackRange && cursor)) {
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(cursor),
334
+ cellContent: model.getCellText(cursorFallbackRange.from),
314
335
  });
315
336
  }}
316
- disabled={!cursor || overlapsCommentAnchor}
337
+ disabled={!cursorFallbackRange || overlapsCommentAnchor}
317
338
  >
318
339
  {t(tooltipLabelKey)}
319
340
  </ToolbarItem>