@dxos/plugin-sheet 0.6.13-main.548ca8d → 0.6.13-main.ed424a1

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 (79) hide show
  1. package/dist/lib/browser/{SheetContainer-NDNIS44E.mjs → SheetContainer-RVRACGCZ.mjs} +107 -82
  2. package/dist/lib/browser/SheetContainer-RVRACGCZ.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-GKI67SEF.mjs → chunk-BWN5DZWZ.mjs} +16 -11
  4. package/dist/lib/browser/chunk-BWN5DZWZ.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-AQSGDA4X.mjs → chunk-HOG37RYS.mjs} +92 -178
  6. package/dist/lib/browser/chunk-HOG37RYS.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +2 -2
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/types.mjs +3 -3
  10. package/dist/lib/node/{SheetContainer-YSQGJD7K.cjs → SheetContainer-J7XROAMN.cjs} +113 -89
  11. package/dist/lib/node/SheetContainer-J7XROAMN.cjs.map +7 -0
  12. package/dist/lib/node/{chunk-6F43RV45.cjs → chunk-AXQZA2YS.cjs} +103 -186
  13. package/dist/lib/node/chunk-AXQZA2YS.cjs.map +7 -0
  14. package/dist/lib/node/{chunk-ER3PM7GD.cjs → chunk-NZARD7UP.cjs} +20 -15
  15. package/dist/lib/node/chunk-NZARD7UP.cjs.map +7 -0
  16. package/dist/lib/node/index.cjs +18 -18
  17. package/dist/lib/node/meta.json +1 -1
  18. package/dist/lib/node/types.cjs +7 -7
  19. package/dist/lib/node/types.cjs.map +1 -1
  20. package/dist/lib/node-esm/{SheetContainer-M7WRMZDU.mjs → SheetContainer-YWQVKHQB.mjs} +107 -82
  21. package/dist/lib/node-esm/SheetContainer-YWQVKHQB.mjs.map +7 -0
  22. package/dist/lib/node-esm/{chunk-ELTFPX5B.mjs → chunk-BPXXIAOQ.mjs} +92 -178
  23. package/dist/lib/node-esm/chunk-BPXXIAOQ.mjs.map +7 -0
  24. package/dist/lib/node-esm/{chunk-ZVLLQ2PJ.mjs → chunk-WFDTY3IC.mjs} +16 -11
  25. package/dist/lib/node-esm/chunk-WFDTY3IC.mjs.map +7 -0
  26. package/dist/lib/node-esm/index.mjs +2 -2
  27. package/dist/lib/node-esm/meta.json +1 -1
  28. package/dist/lib/node-esm/types.mjs +3 -3
  29. package/dist/types/src/components/GridSheet/GridSheet.d.ts.map +1 -1
  30. package/dist/types/src/components/GridSheet/util.d.ts +2 -2
  31. package/dist/types/src/components/GridSheet/util.d.ts.map +1 -1
  32. package/dist/types/src/components/SheetContainer/SheetContainer.d.ts.map +1 -1
  33. package/dist/types/src/components/SheetContainer/SheetContainer.stories.d.ts.map +1 -1
  34. package/dist/types/src/components/SheetContext/SheetContext.d.ts +1 -2
  35. package/dist/types/src/components/SheetContext/SheetContext.d.ts.map +1 -1
  36. package/dist/types/src/components/Toolbar/Toolbar.d.ts +11 -17
  37. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  38. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +1 -2
  39. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/index.d.ts.map +1 -1
  41. package/dist/types/src/defs/index.d.ts +1 -0
  42. package/dist/types/src/defs/index.d.ts.map +1 -1
  43. package/dist/types/src/defs/sheet-range-types.d.ts +13 -0
  44. package/dist/types/src/defs/sheet-range-types.d.ts.map +1 -0
  45. package/dist/types/src/hooks/index.d.ts +0 -1
  46. package/dist/types/src/hooks/index.d.ts.map +1 -1
  47. package/dist/types/src/model/index.d.ts +0 -1
  48. package/dist/types/src/model/index.d.ts.map +1 -1
  49. package/dist/types/src/types.d.ts +39 -20
  50. package/dist/types/src/types.d.ts.map +1 -1
  51. package/package.json +35 -34
  52. package/src/components/GridSheet/GridSheet.stories.tsx +2 -2
  53. package/src/components/GridSheet/GridSheet.tsx +5 -3
  54. package/src/components/GridSheet/util.ts +24 -10
  55. package/src/components/SheetContainer/SheetContainer.stories.tsx +2 -2
  56. package/src/components/SheetContainer/SheetContainer.tsx +3 -28
  57. package/src/components/SheetContext/SheetContext.tsx +5 -9
  58. package/src/components/Toolbar/Toolbar.tsx +116 -68
  59. package/src/defs/index.ts +1 -0
  60. package/src/defs/sheet-range-types.ts +46 -0
  61. package/src/defs/util.ts +1 -1
  62. package/src/hooks/index.ts +0 -1
  63. package/src/model/index.ts +0 -1
  64. package/src/types.ts +5 -11
  65. package/dist/lib/browser/SheetContainer-NDNIS44E.mjs.map +0 -7
  66. package/dist/lib/browser/chunk-AQSGDA4X.mjs.map +0 -7
  67. package/dist/lib/browser/chunk-GKI67SEF.mjs.map +0 -7
  68. package/dist/lib/node/SheetContainer-YSQGJD7K.cjs.map +0 -7
  69. package/dist/lib/node/chunk-6F43RV45.cjs.map +0 -7
  70. package/dist/lib/node/chunk-ER3PM7GD.cjs.map +0 -7
  71. package/dist/lib/node-esm/SheetContainer-M7WRMZDU.mjs.map +0 -7
  72. package/dist/lib/node-esm/chunk-ELTFPX5B.mjs.map +0 -7
  73. package/dist/lib/node-esm/chunk-ZVLLQ2PJ.mjs.map +0 -7
  74. package/dist/types/src/hooks/useFormattingModel.d.ts +0 -3
  75. package/dist/types/src/hooks/useFormattingModel.d.ts.map +0 -1
  76. package/dist/types/src/model/formatting-model.d.ts +0 -19
  77. package/dist/types/src/model/formatting-model.d.ts.map +0 -1
  78. package/src/hooks/useFormattingModel.ts +0 -11
  79. package/src/model/formatting-model.ts +0 -116
@@ -3,18 +3,18 @@ import {
3
3
  SheetProvider,
4
4
  addressToA1Notation,
5
5
  addressToIndex,
6
+ inRange,
6
7
  rangeToA1Notation,
7
8
  useSheetContext
8
- } from "./chunk-AQSGDA4X.mjs";
9
- import "./chunk-GKI67SEF.mjs";
9
+ } from "./chunk-HOG37RYS.mjs";
10
+ import "./chunk-BWN5DZWZ.mjs";
10
11
  import {
11
12
  SHEET_PLUGIN
12
13
  } from "./chunk-D3QTX46O.mjs";
13
14
  import "./chunk-GSV5QNLD.mjs";
14
15
 
15
16
  // packages/plugins/plugin-sheet/src/components/SheetContainer/SheetContainer.tsx
16
- import React3, { useCallback } from "react";
17
- import { useIntentDispatcher } from "@dxos/app-framework";
17
+ import React3 from "react";
18
18
 
19
19
  // packages/plugins/plugin-sheet/src/components/FunctionEditor/FunctionEditor.tsx
20
20
  import React from "react";
@@ -54,7 +54,8 @@ var FunctionEditor = () => {
54
54
 
55
55
  // packages/plugins/plugin-sheet/src/components/Toolbar/Toolbar.tsx
56
56
  import { createContext } from "@radix-ui/react-context";
57
- import React2 from "react";
57
+ import React2, { useCallback, useMemo } from "react";
58
+ import { useIntentDispatcher } from "@dxos/app-framework";
58
59
  import { Icon as Icon2, Toolbar as NaturalToolbar, useTranslation, Tooltip } from "@dxos/react-ui";
59
60
  import { useAttention } from "@dxos/react-ui-attention";
60
61
  import { nonNullable } from "@dxos/util";
@@ -84,11 +85,74 @@ var ToolbarItem = ({ itemType, icon, children, ...props }) => {
84
85
  };
85
86
  var [ToolbarContextProvider, useToolbarContext] = createContext("Toolbar");
86
87
  var sectionToolbarLayout = "bs-[--rail-action] bg-[--sticky-bg] sticky block-start-0 __-block-start-px transition-opacity";
87
- var ToolbarRoot = ({ children, onAction, role, classNames }) => {
88
- const { id } = useSheetContext();
88
+ var ToolbarRoot = ({ children, role, classNames }) => {
89
+ const { id, model, range, cursor } = useSheetContext();
89
90
  const { hasAttention } = useAttention(id);
91
+ const dispatch = useIntentDispatcher();
92
+ const handleAction = useCallback((action) => {
93
+ switch (action.key) {
94
+ case "align":
95
+ if (cursor) {
96
+ const index = model.sheet.ranges?.findIndex((range2) => range2.key === action.key && inRange(range2.range, cursor));
97
+ const nextRange = range ? {
98
+ from: range.from,
99
+ to: range.to ?? range.from
100
+ } : {
101
+ from: cursor,
102
+ to: cursor
103
+ };
104
+ const nextRangeEntity = {
105
+ range: nextRange,
106
+ key: action.key,
107
+ value: action.value
108
+ };
109
+ if (index < 0) {
110
+ model.sheet.ranges?.push(nextRangeEntity);
111
+ } else {
112
+ model.sheet.ranges?.splice(index, 1, nextRangeEntity);
113
+ }
114
+ }
115
+ break;
116
+ case "style":
117
+ if (action.value === "unset") {
118
+ const index = model.sheet.ranges?.findIndex((range2) => range2.key === action.key);
119
+ if (index >= 0) {
120
+ model.sheet.ranges?.splice(index, 1);
121
+ }
122
+ } else if (range || cursor) {
123
+ const nextRange = range ? {
124
+ from: range.from,
125
+ to: range.to ?? range.from
126
+ } : {
127
+ from: cursor,
128
+ to: cursor
129
+ };
130
+ model.sheet.ranges?.push({
131
+ range: nextRange,
132
+ key: action.key,
133
+ value: action.value
134
+ });
135
+ }
136
+ break;
137
+ case "comment": {
138
+ void dispatch({
139
+ action: "dxos.org/plugin/thread/action/create",
140
+ data: {
141
+ cursor: action.value,
142
+ name: action.cellContent,
143
+ subject: model.sheet
144
+ }
145
+ });
146
+ }
147
+ }
148
+ }, [
149
+ model.sheet,
150
+ range,
151
+ cursor,
152
+ dispatch
153
+ ]);
90
154
  return /* @__PURE__ */ React2.createElement(ToolbarContextProvider, {
91
- onAction
155
+ onAction: handleAction
92
156
  }, /* @__PURE__ */ React2.createElement(NaturalToolbar.Root, {
93
157
  classNames: [
94
158
  ...role === "section" ? [
@@ -102,85 +166,66 @@ var ToolbarRoot = ({ children, onAction, role, classNames }) => {
102
166
  ]
103
167
  }, children));
104
168
  };
105
- var formatOptions = [
106
- {
107
- value: "date",
108
- icon: "ph--calendar--regular",
109
- getState: (state) => false
110
- },
111
- {
112
- value: "currency",
113
- icon: "ph--currency-dollar--regular",
114
- getState: (state) => false
115
- }
116
- ];
117
- var Format = () => {
118
- const { onAction } = useToolbarContext("Format");
119
- const { t } = useTranslation(SHEET_PLUGIN);
120
- return /* @__PURE__ */ React2.createElement(NaturalToolbar.ToggleGroup, {
121
- type: "single"
122
- }, formatOptions.map(({ value, getState, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
123
- itemType: "toggleGroupItem",
124
- key: value,
125
- value,
126
- icon,
127
- onClick: () => onAction?.({
128
- type: "format",
129
- value
130
- })
131
- }, t(`toolbar ${value} label`))));
132
- };
133
169
  var alignmentOptions = [
134
170
  {
135
- value: "left",
136
- icon: "ph--text-align-left--regular",
137
- getState: (state) => false
171
+ value: "start",
172
+ icon: "ph--text-align-left--regular"
138
173
  },
139
174
  {
140
175
  value: "center",
141
- icon: "ph--text-align-center--regular",
142
- getState: (state) => false
176
+ icon: "ph--text-align-center--regular"
143
177
  },
144
178
  {
145
- value: "right",
146
- icon: "ph--text-align-right--regular",
147
- getState: (state) => false
179
+ value: "end",
180
+ icon: "ph--text-align-right--regular"
148
181
  }
149
182
  ];
150
183
  var Alignment = () => {
184
+ const { cursor, model } = useSheetContext();
151
185
  const { onAction } = useToolbarContext("Alignment");
152
186
  const { t } = useTranslation(SHEET_PLUGIN);
187
+ const value = useMemo(() => cursor ? model.sheet.ranges?.find(({ range, key }) => key === "alignment" && inRange(range, cursor))?.value : void 0, [
188
+ cursor,
189
+ model.sheet.ranges
190
+ ]);
153
191
  return /* @__PURE__ */ React2.createElement(NaturalToolbar.ToggleGroup, {
154
192
  type: "single",
155
- // value={cellStyles.filter(({ getState }) => state && getState(state)).map(({ type }) => type)}
156
- // disabled={state?.blockType === 'codeblock'}
157
- onValueChange: (value) => onAction?.({
158
- type: "align",
159
- value
193
+ value,
194
+ onValueChange: (value2) => onAction?.({
195
+ key: "align",
196
+ value: value2
160
197
  })
161
- }, alignmentOptions.map(({ value, getState, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
198
+ }, alignmentOptions.map(({ value: value2, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
162
199
  itemType: "toggleGroupItem",
163
- key: value,
164
- value,
200
+ key: value2,
201
+ value: value2,
165
202
  icon
166
- }, t(`toolbar ${value} label`))));
203
+ }, t(`toolbar ${value2} label`))));
167
204
  };
168
205
  var styleOptions = [
169
206
  {
170
207
  value: "highlight",
171
- icon: "ph--highlighter--regular",
172
- getState: (state) => false
208
+ icon: "ph--highlighter--regular"
173
209
  }
174
210
  ];
175
211
  var Styles = () => {
212
+ const { cursor, model } = useSheetContext();
176
213
  const { onAction } = useToolbarContext("Styles");
177
214
  const { t } = useTranslation(SHEET_PLUGIN);
178
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, styleOptions.map(({ value, getState, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
215
+ const activeValues = useMemo(() => cursor ? model.sheet.ranges?.filter(({ range, key }) => key === "style" && inRange(range, cursor)).reduce((acc, { value }) => {
216
+ acc.add(value);
217
+ return acc;
218
+ }, /* @__PURE__ */ new Set()) : void 0, [
219
+ cursor,
220
+ model.sheet.ranges
221
+ ]);
222
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, styleOptions.map(({ value, icon }) => /* @__PURE__ */ React2.createElement(ToolbarItem, {
179
223
  itemType: "toggle",
180
224
  key: value,
225
+ pressed: activeValues?.has(value),
181
226
  onPressedChange: (nextPressed) => onAction?.({
182
- type: "style",
183
- value: nextPressed ? "highlight" : "unset"
227
+ key: "style",
228
+ value: nextPressed ? value : "unset"
184
229
  }),
185
230
  icon
186
231
  }, t(`toolbar ${value} label`))));
@@ -208,8 +253,8 @@ var Actions = () => {
208
253
  return;
209
254
  }
210
255
  return onAction?.({
211
- type: "comment",
212
- anchor: addressToIndex(model.sheet, cursor),
256
+ key: "comment",
257
+ value: addressToIndex(model.sheet, cursor),
213
258
  cellContent: model.getCellText(cursor)
214
259
  });
215
260
  },
@@ -220,38 +265,18 @@ var Toolbar = {
220
265
  Root: ToolbarRoot,
221
266
  Separator: ToolbarSeparator,
222
267
  Alignment,
223
- Format,
224
268
  Styles,
225
269
  Actions
226
270
  };
227
271
 
228
272
  // packages/plugins/plugin-sheet/src/components/SheetContainer/SheetContainer.tsx
229
273
  var SheetContainer = ({ graph, sheet, role }) => {
230
- const dispatch = useIntentDispatcher();
231
- const handleAction = useCallback((action) => {
232
- switch (action.type) {
233
- case "comment": {
234
- void dispatch({
235
- action: "dxos.org/plugin/thread/action/create",
236
- data: {
237
- cursor: action.anchor,
238
- name: action.cellContent,
239
- subject: sheet
240
- }
241
- });
242
- }
243
- }
244
- }, [
245
- sheet,
246
- dispatch
247
- ]);
248
274
  return /* @__PURE__ */ React3.createElement(SheetProvider, {
249
275
  sheet,
250
276
  graph
251
277
  }, /* @__PURE__ */ React3.createElement(Toolbar.Root, {
252
- onAction: handleAction,
253
278
  role
254
- }, /* @__PURE__ */ React3.createElement(Toolbar.Styles, null), /* @__PURE__ */ React3.createElement(Toolbar.Format, null), /* @__PURE__ */ React3.createElement(Toolbar.Alignment, null), /* @__PURE__ */ React3.createElement(Toolbar.Separator, null), /* @__PURE__ */ React3.createElement(Toolbar.Actions, null)), /* @__PURE__ */ React3.createElement("div", {
279
+ }, /* @__PURE__ */ React3.createElement(Toolbar.Styles, null), /* @__PURE__ */ React3.createElement(Toolbar.Alignment, null), /* @__PURE__ */ React3.createElement(Toolbar.Separator, null), /* @__PURE__ */ React3.createElement(Toolbar.Actions, null)), /* @__PURE__ */ React3.createElement("div", {
255
280
  role: "none",
256
281
  className: "border-bs border-separator grid cols-1 rows-[1fr_min-content] min-bs-0"
257
282
  }, /* @__PURE__ */ React3.createElement(GridSheet, null), /* @__PURE__ */ React3.createElement(FunctionEditor, null)));
@@ -262,4 +287,4 @@ var SheetContainer_default = SheetContainer;
262
287
  export {
263
288
  SheetContainer_default as default
264
289
  };
265
- //# sourceMappingURL=SheetContainer-NDNIS44E.mjs.map
290
+ //# sourceMappingURL=SheetContainer-RVRACGCZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/SheetContainer/SheetContainer.tsx", "../../../src/components/FunctionEditor/FunctionEditor.tsx", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/SheetContainer/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider, type SheetProviderProps } from '../SheetContext';\nimport { Toolbar } from '../Toolbar';\n\nexport const SheetContainer = ({ graph, sheet, role }: SheetProviderProps & { role?: string }) => {\n return (\n <SheetProvider sheet={sheet} graph={graph}>\n <Toolbar.Root role={role}>\n <Toolbar.Styles />\n <Toolbar.Alignment />\n <Toolbar.Separator />\n <Toolbar.Actions />\n </Toolbar.Root>\n <div role='none' className='border-bs border-separator grid cols-1 rows-[1fr_min-content] min-bs-0'>\n <GridSheet />\n <FunctionEditor />\n </div>\n </SheetProvider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Icon } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { addressToA1Notation, rangeToA1Notation } from '../../defs';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let isFormula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (typeof value === 'string' && value.charAt(0) === '=') {\n value = model.graph.mapFunctionBindingFromId(model.mapFormulaIndicesToRefs(value));\n isFormula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div\n className={mx(\n 'flex shrink-0 justify-between items-center px-4 py-1 text-sm border-bs !border-separator attention-surface',\n )}\n >\n <div className='flex gap-4 items-center'>\n <div className='flex w-16 items-center font-mono'>\n {(range && rangeToA1Notation(range)) || (cursor && addressToA1Notation(cursor))}\n </div>\n <div className='flex gap-2 items-center'>\n <Icon icon='ph--function--regular' classNames={['text-greenText', isFormula ? 'visible' : 'invisible']} />\n <span className='font-mono'>{value}</span>\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, useCallback, useMemo } from 'react';\n\nimport { useIntentDispatcher } from '@dxos/app-framework';\nimport {\n Icon,\n Toolbar as NaturalToolbar,\n useTranslation,\n Tooltip,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleProps as NaturalToolbarToggleProps,\n type ThemedClassName,\n} from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { nonNullable } from '@dxos/util';\n\nimport {\n addressToIndex,\n type AlignKey,\n type AlignValue,\n type CommentKey,\n type CommentValue,\n inRange,\n type StyleKey,\n type StyleValue,\n} from '../../defs';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type SheetType } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\n//\n// Buttons\n//\n\nconst buttonStyles = 'min-bs-0 p-2';\nconst tooltipProps = { side: 'bottom' as const, classNames: 'z-10' };\n\nconst ToolbarSeparator = () => <div role='separator' className='grow' />;\n\n//\n// ToolbarItem\n//\n\ntype ToolbarItemProps =\n | (NaturalToolbarButtonProps & { itemType: 'button'; icon: string })\n | (NaturalToolbarToggleGroupItemProps & { itemType: 'toggleGroupItem'; icon: string })\n | (NaturalToolbarToggleProps & { itemType: 'toggle'; icon: string });\n\nexport const ToolbarItem = ({ itemType, icon, children, ...props }: ToolbarItemProps) => {\n const Invoker =\n itemType === 'toggleGroupItem'\n ? NaturalToolbar.ToggleGroupItem\n : itemType === 'toggle'\n ? NaturalToolbar.Toggle\n : NaturalToolbar.Button;\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n {/* TODO(thure): type the props spread better. */}\n <Invoker variant='ghost' {...(props as any)} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </Invoker>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\n//\n// Root\n//\n\ntype AlignAction = { key: AlignKey; value: AlignValue };\ntype CommentAction = { key: CommentKey; value: CommentValue; cellContent?: string };\ntype StyleAction = { key: StyleKey; value: StyleValue };\n\nexport type ToolbarAction = StyleAction | AlignAction | CommentAction;\n\nexport type ToolbarActionType = ToolbarAction['key'];\n\nexport type ToolbarActionHandler = (action: ToolbarAction) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n role?: string;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<{ onAction: (action: ToolbarAction) => void }>(\n 'Toolbar',\n);\n\n// TODO(Zan): Factor out, copied this from MarkdownPlugin.\nconst sectionToolbarLayout =\n 'bs-[--rail-action] bg-[--sticky-bg] sticky block-start-0 __-block-start-px transition-opacity';\n\ntype Range = SheetType['ranges'][number];\n\nconst ToolbarRoot = ({ children, role, classNames }: ToolbarProps) => {\n const { id, model, range, cursor } = useSheetContext();\n const { hasAttention } = useAttention(id);\n const dispatch = useIntentDispatcher();\n\n // TODO(Zan): Centralise the toolbar action handler. Current implementation in stories.\n const handleAction = useCallback(\n (action: ToolbarAction) => {\n switch (action.key) {\n case 'align':\n if (cursor) {\n const index = model.sheet.ranges?.findIndex(\n (range) => range.key === action.key && inRange(range.range, cursor),\n );\n const nextRange = range ? { from: range.from, to: range.to ?? range.from } : { from: cursor, to: cursor };\n const nextRangeEntity = {\n range: nextRange as Range['range'],\n key: action.key,\n value: action.value,\n };\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n }\n }\n break;\n case 'style':\n if (action.value === 'unset') {\n const index = model.sheet.ranges?.findIndex((range) => range.key === action.key);\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n } else if (range || cursor) {\n const nextRange = range ? { from: range.from, to: range.to ?? range.from } : { from: cursor, to: cursor };\n model.sheet.ranges?.push({\n range: nextRange as Range['range'],\n key: action.key,\n value: action.value,\n });\n }\n break;\n case 'comment': {\n // TODO(Zan): We shouldn't hardcode the action ID.\n void dispatch({\n action: 'dxos.org/plugin/thread/action/create',\n data: {\n cursor: action.value,\n name: action.cellContent,\n subject: model.sheet,\n },\n });\n }\n }\n },\n [model.sheet, range, cursor, dispatch],\n );\n\n return (\n <ToolbarContextProvider onAction={handleAction}>\n <NaturalToolbar.Root\n classNames={[\n ...(role === 'section'\n ? ['z-[2] group-focus-within/section:visible', !hasAttention && 'invisible', sectionToolbarLayout]\n : ['attention-surface']),\n classNames,\n ]}\n >\n {children}\n </NaturalToolbar.Root>\n </ToolbarContextProvider>\n );\n};\n\n// TODO(burdon): Generalize.\n// TODO(burdon): Detect and display current state.\ntype ButtonProps<T> = {\n value: T;\n icon: string;\n disabled?: (state: Range) => boolean;\n};\n\n//\n// Alignment\n//\n\nconst alignmentOptions: ButtonProps<AlignValue>[] = [\n { value: 'start', icon: 'ph--text-align-left--regular' },\n { value: 'center', icon: 'ph--text-align-center--regular' },\n { value: 'end', icon: 'ph--text-align-right--regular' },\n];\n\nconst Alignment = () => {\n const { cursor, model } = useSheetContext();\n const { onAction } = useToolbarContext('Alignment');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n const value = useMemo(\n () =>\n cursor\n ? model.sheet.ranges?.find(({ range, key }) => key === 'alignment' && inRange(range, cursor))?.value\n : undefined,\n [cursor, model.sheet.ranges],\n );\n\n return (\n <NaturalToolbar.ToggleGroup\n type='single'\n value={value}\n onValueChange={(value: AlignValue) => onAction?.({ key: 'align', value })}\n >\n {alignmentOptions.map(({ value, icon }) => (\n <ToolbarItem itemType='toggleGroupItem' key={value} value={value} icon={icon}>\n {t(`toolbar ${value} label`)}\n </ToolbarItem>\n ))}\n </NaturalToolbar.ToggleGroup>\n );\n};\n\nconst styleOptions: ButtonProps<StyleValue>[] = [{ value: 'highlight', icon: 'ph--highlighter--regular' }];\n\nconst Styles = () => {\n const { cursor, model } = useSheetContext();\n const { onAction } = useToolbarContext('Styles');\n const { t } = useTranslation(SHEET_PLUGIN);\n\n const activeValues = useMemo(\n () =>\n cursor\n ? model.sheet.ranges\n ?.filter(({ range, key }) => key === 'style' && inRange(range, cursor))\n .reduce((acc, { value }) => {\n acc.add(value);\n return acc;\n }, new Set())\n : undefined,\n [cursor, model.sheet.ranges],\n );\n\n return (\n <>\n {styleOptions.map(({ value, icon }) => (\n <ToolbarItem\n itemType='toggle'\n key={value}\n pressed={activeValues?.has(value)}\n onPressedChange={(nextPressed: boolean) => onAction?.({ key: 'style', value: nextPressed ? value : 'unset' })}\n icon={icon}\n >\n {t(`toolbar ${value} label`)}\n </ToolbarItem>\n ))}\n </>\n );\n};\n\n//\n// Actions\n//\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { cursor, range, model } = useSheetContext();\n const { t } = useTranslation(SHEET_PLUGIN);\n\n const overlapsCommentAnchor = (model.sheet.threads ?? [])\n .filter(nonNullable)\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursor) {\n return false;\n }\n return addressToIndex(model.sheet, cursor) === thread.anchor;\n });\n\n const hasCursor = !!cursor;\n const cursorOnly = hasCursor && !range && !overlapsCommentAnchor;\n\n const tooltipLabelKey = !hasCursor\n ? 'no cursor label'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment label'\n : range\n ? 'comment ranges not supported label'\n : 'comment label';\n\n return (\n <ToolbarItem\n itemType='button'\n value='comment'\n icon='ph--chat-text--regular'\n data-testid='editor.toolbar.comment'\n onClick={() => {\n if (!cursor) {\n return;\n }\n return onAction?.({\n key: 'comment',\n value: addressToIndex(model.sheet, cursor),\n cellContent: model.getCellText(cursor),\n });\n }}\n disabled={!cursorOnly || overlapsCommentAnchor}\n >\n {t(tooltipLabelKey)}\n </ToolbarItem>\n );\n};\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Separator: ToolbarSeparator,\n Alignment,\n Styles,\n Actions,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { SheetContainer } from './SheetContainer';\n\nexport default SheetContainer;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "React", "Icon", "mx", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "isFormula", "getCellValue", "charAt", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "String", "div", "className", "mx", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "createContext", "React", "useCallback", "useMemo", "useIntentDispatcher", "Icon", "Toolbar", "NaturalToolbar", "useTranslation", "Tooltip", "useAttention", "nonNullable", "buttonStyles", "tooltipProps", "side", "classNames", "ToolbarSeparator", "React", "div", "role", "className", "ToolbarItem", "itemType", "icon", "children", "props", "Invoker", "NaturalToolbar", "ToggleGroupItem", "Toggle", "Button", "Tooltip", "Root", "Trigger", "asChild", "variant", "Icon", "size", "span", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "sectionToolbarLayout", "ToolbarRoot", "id", "model", "range", "cursor", "useSheetContext", "hasAttention", "useAttention", "dispatch", "useIntentDispatcher", "handleAction", "useCallback", "action", "key", "index", "sheet", "ranges", "findIndex", "inRange", "nextRange", "from", "to", "nextRangeEntity", "value", "push", "splice", "data", "name", "cellContent", "subject", "onAction", "alignmentOptions", "Alignment", "t", "useTranslation", "SHEET_PLUGIN", "useMemo", "find", "undefined", "ToggleGroup", "type", "onValueChange", "map", "styleOptions", "Styles", "activeValues", "filter", "reduce", "acc", "add", "Set", "pressed", "has", "onPressedChange", "nextPressed", "Actions", "overlapsCommentAnchor", "threads", "nonNullable", "thread", "status", "some", "addressToIndex", "anchor", "hasCursor", "cursorOnly", "tooltipLabelKey", "data-testid", "onClick", "getCellText", "disabled", "Toolbar", "Separator", "SheetContainer", "graph", "sheet", "role", "React", "SheetProvider", "Toolbar", "Root", "Styles", "Alignment", "Separator", "Actions", "div", "className", "GridSheet", "FunctionEditor", "SheetContainer"]
7
+ }
@@ -5,7 +5,6 @@ import {
5
5
  // packages/plugins/plugin-sheet/src/types.ts
6
6
  import { ref, S, TypedObject } from "@dxos/echo-schema";
7
7
  import { ThreadType } from "@dxos/plugin-space/types";
8
- import { FieldValueType } from "@dxos/schema";
9
8
  var SHEET_ACTION = `${SHEET_PLUGIN}/action`;
10
9
  var SheetAction;
11
10
  (function(SheetAction2) {
@@ -17,12 +16,19 @@ var CellValue = S.Struct({
17
16
  // TODO(burdon): Automerge (long string) or short string or number.
18
17
  value: S.Any
19
18
  });
20
- var Formatting = S.Struct({
21
- range: S.String,
22
- type: S.optional(S.Enums(FieldValueType)),
23
- format: S.optional(S.String),
24
- precision: S.optional(S.Number),
25
- classNames: S.optional(S.Array(S.String))
19
+ var Range = S.Struct({
20
+ range: S.Struct({
21
+ from: S.Struct({
22
+ col: S.Number,
23
+ row: S.Number
24
+ }),
25
+ to: S.Struct({
26
+ col: S.Number,
27
+ row: S.Number
28
+ })
29
+ }),
30
+ key: S.String,
31
+ value: S.String
26
32
  });
27
33
  var RowColumnMeta = S.Struct({
28
34
  size: S.optional(S.Number)
@@ -51,9 +57,8 @@ var SheetType = class extends TypedObject({
51
57
  key: S.String,
52
58
  value: S.mutable(RowColumnMeta)
53
59
  })),
54
- // TODO(burdon): Change to array.
55
60
  // Cell formatting referenced by indexed range.
56
- formatting: S.mutable(S.Array(Formatting)),
61
+ ranges: S.mutable(S.Array(Range)),
57
62
  // Threads associated with the sheet
58
63
  threads: S.optional(S.mutable(S.Array(ref(ThreadType))))
59
64
  }) {
@@ -62,8 +67,8 @@ var SheetType = class extends TypedObject({
62
67
  export {
63
68
  SheetAction,
64
69
  CellValue,
65
- Formatting,
70
+ Range,
66
71
  RowColumnMeta,
67
72
  SheetType
68
73
  };
69
- //# sourceMappingURL=chunk-GKI67SEF.mjs.map
74
+ //# sourceMappingURL=chunk-BWN5DZWZ.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport type {\n GraphBuilderProvides,\n IntentResolverProvides,\n MetadataRecordsProvides,\n SurfaceProvides,\n TranslationsProvides,\n} from '@dxos/app-framework';\nimport { ref, S, TypedObject } from '@dxos/echo-schema';\nimport { type SchemaProvides } from '@dxos/plugin-client';\nimport { type MarkdownExtensionProvides } from '@dxos/plugin-markdown';\nimport { type SpaceInitProvides } from '@dxos/plugin-space';\nimport { ThreadType } from '@dxos/plugin-space/types';\nimport { type StackProvides } from '@dxos/plugin-stack';\n\nimport { SHEET_PLUGIN } from './meta';\n\nconst SHEET_ACTION = `${SHEET_PLUGIN}/action`;\n\nexport enum SheetAction {\n CREATE = `${SHEET_ACTION}/create`,\n}\n\n// TODO(Zan): Move this to the plugin-space plugin or another common location\n// when we implement comments in sheets.\n// This is currently duplicated in a few places.\ntype ThreadProvides<T> = {\n thread: {\n predicate: (obj: any) => obj is T;\n createSort: (obj: T) => (anchorA: string | undefined, anchorB: string | undefined) => number;\n };\n};\n\nexport type SheetPluginProvides = SurfaceProvides &\n IntentResolverProvides &\n GraphBuilderProvides &\n MarkdownExtensionProvides &\n MetadataRecordsProvides &\n TranslationsProvides &\n SchemaProvides &\n SpaceInitProvides &\n StackProvides &\n ThreadProvides<SheetType>;\n\nexport type CellScalarValue = number | string | boolean | null;\n\nexport const CellValue = S.Struct({\n // TODO(burdon): How to store dates (datetime, date, time), percentages, etc.\n // Consider import/export; natural access for other plugins. Special handling for currency (precision).\n // TODO(burdon): Automerge (long string) or short string or number.\n value: S.Any,\n});\n\nexport type CellValue = S.Schema.Type<typeof CellValue>;\n\n// TODO(burdon): IMPORTANT: Reconcile with Field definition.\nexport const Range = S.Struct({\n range: S.Struct({ from: S.Struct({ col: S.Number, row: S.Number }), to: S.Struct({ col: S.Number, row: S.Number }) }),\n key: S.String,\n value: S.String,\n});\n\n// TODO(burdon): Visibility, locked, frozen, etc.\nexport const RowColumnMeta = S.Struct({\n size: S.optional(S.Number),\n});\n\n// TODO(burdon): Index to all updates when rows/columns are inserted/deleted.\nexport class SheetType extends TypedObject({ typename: 'dxos.org/type/SheetType', version: '0.1.0' })({\n name: S.optional(S.String),\n\n // Sparse map of cells referenced by index.\n cells: S.mutable(S.Record({ key: S.String, value: S.mutable(CellValue) })),\n\n // Ordered row indices.\n rows: S.mutable(S.Array(S.String)),\n\n // Ordered column indices.\n columns: S.mutable(S.Array(S.String)),\n\n // Row metadata referenced by index.\n rowMeta: S.mutable(S.Record({ key: S.String, value: S.mutable(RowColumnMeta) })),\n\n // Column metadata referenced by index.\n columnMeta: S.mutable(S.Record({ key: S.String, value: S.mutable(RowColumnMeta) })),\n\n // Cell formatting referenced by indexed range.\n ranges: S.mutable(S.Array(Range)),\n\n // Threads associated with the sheet\n threads: S.optional(S.mutable(S.Array(ref(ThreadType)))),\n}) {}\n\nexport type SheetSize = {\n rows: number;\n columns: number;\n};\n\nexport type CreateSheetOptions = {\n name?: string;\n cells?: Record<string, CellValue>;\n} & Partial<SheetSize>;\n"],
5
+ "mappings": ";;;;;AAWA,SAASA,KAAKC,GAAGC,mBAAmB;AAIpC,SAASC,kBAAkB;AAK3B,IAAMC,eAAe,GAAGC,YAAAA;;UAEZC,cAAAA;wCACD,GAAGF,YAAAA,SAAqB,IAAA;GADvBE,gBAAAA,cAAAA,CAAAA,EAAAA;AA2BL,IAAMC,YAAYC,EAAEC,OAAO;;;;EAIhCC,OAAOF,EAAEG;AACX,CAAA;AAKO,IAAMC,QAAQJ,EAAEC,OAAO;EAC5BI,OAAOL,EAAEC,OAAO;IAAEK,MAAMN,EAAEC,OAAO;MAAEM,KAAKP,EAAEQ;MAAQC,KAAKT,EAAEQ;IAAO,CAAA;IAAIE,IAAIV,EAAEC,OAAO;MAAEM,KAAKP,EAAEQ;MAAQC,KAAKT,EAAEQ;IAAO,CAAA;EAAG,CAAA;EACnHG,KAAKX,EAAEY;EACPV,OAAOF,EAAEY;AACX,CAAA;AAGO,IAAMC,gBAAgBb,EAAEC,OAAO;EACpCa,MAAMd,EAAEe,SAASf,EAAEQ,MAAM;AAC3B,CAAA;AAGO,IAAMQ,YAAN,cAAwBC,YAAY;EAAEC,UAAU;EAA2BC,SAAS;AAAQ,CAAA,EAAG;EACpGC,MAAMpB,EAAEe,SAASf,EAAEY,MAAM;;EAGzBS,OAAOrB,EAAEsB,QAAQtB,EAAEuB,OAAO;IAAEZ,KAAKX,EAAEY;IAAQV,OAAOF,EAAEsB,QAAQvB,SAAAA;EAAW,CAAA,CAAA;;EAGvEyB,MAAMxB,EAAEsB,QAAQtB,EAAEyB,MAAMzB,EAAEY,MAAM,CAAA;;EAGhCc,SAAS1B,EAAEsB,QAAQtB,EAAEyB,MAAMzB,EAAEY,MAAM,CAAA;;EAGnCe,SAAS3B,EAAEsB,QAAQtB,EAAEuB,OAAO;IAAEZ,KAAKX,EAAEY;IAAQV,OAAOF,EAAEsB,QAAQT,aAAAA;EAAe,CAAA,CAAA;;EAG7Ee,YAAY5B,EAAEsB,QAAQtB,EAAEuB,OAAO;IAAEZ,KAAKX,EAAEY;IAAQV,OAAOF,EAAEsB,QAAQT,aAAAA;EAAe,CAAA,CAAA;;EAGhFgB,QAAQ7B,EAAEsB,QAAQtB,EAAEyB,MAAMrB,KAAAA,CAAAA;;EAG1B0B,SAAS9B,EAAEe,SAASf,EAAEsB,QAAQtB,EAAEyB,MAAMM,IAAIC,UAAAA,CAAAA,CAAAA,CAAAA;AAC5C,CAAA,EAAA;AAAI;",
6
+ "names": ["ref", "S", "TypedObject", "ThreadType", "SHEET_ACTION", "SHEET_PLUGIN", "SheetAction", "CellValue", "S", "Struct", "value", "Any", "Range", "range", "from", "col", "Number", "row", "to", "key", "String", "RowColumnMeta", "size", "optional", "SheetType", "TypedObject", "typename", "version", "name", "cells", "mutable", "Record", "rows", "Array", "columns", "rowMeta", "columnMeta", "ranges", "threads", "ref", "ThreadType"]
7
+ }