@dxos/plugin-sheet 0.8.1 → 0.8.2-main.2f9c567
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-B3A5443Z.mjs → SheetContainer-N74FX62K.mjs} +5 -5
- package/dist/lib/browser/{SheetContainer-B3A5443Z.mjs.map → SheetContainer-N74FX62K.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-ZOKEQL2K.mjs → chunk-N2FOQHUH.mjs} +51 -50
- package/dist/lib/browser/chunk-N2FOQHUH.mjs.map +7 -0
- package/dist/lib/browser/{chunk-CHMPICA6.mjs → chunk-SY25UNYZ.mjs} +7 -8
- package/dist/lib/browser/chunk-SY25UNYZ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +6 -6
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-6OUEM3IG.mjs → intent-resolver-DN7JXDAV.mjs} +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-ECKBP3UZ.mjs → react-surface-XUJZGNUH.mjs} +3 -3
- package/dist/lib/browser/{thread-76MK2FMV.mjs → thread-WU64QL2A.mjs} +2 -2
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node/{SheetContainer-LGRD3TTQ.cjs → SheetContainer-MERCQUPB.cjs} +32 -32
- package/dist/lib/node/{SheetContainer-LGRD3TTQ.cjs.map → SheetContainer-MERCQUPB.cjs.map} +3 -3
- package/dist/lib/node/{chunk-AEH3L5QZ.cjs → chunk-62JKBCGO.cjs} +19 -20
- package/dist/lib/node/chunk-62JKBCGO.cjs.map +7 -0
- package/dist/lib/node/{chunk-D4MOMCEU.cjs → chunk-HLSQVT3C.cjs} +66 -65
- package/dist/lib/node/chunk-HLSQVT3C.cjs.map +7 -0
- package/dist/lib/node/index.cjs +10 -10
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/{intent-resolver-ICHNDL6F.cjs → intent-resolver-OPF56TAL.cjs} +9 -9
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-6PBWE75L.cjs → react-surface-GSS7VQ2D.cjs} +11 -11
- package/dist/lib/node/{thread-WP43BC4N.cjs → thread-E7YPGR5T.cjs} +7 -7
- package/dist/lib/node/types/index.cjs +29 -29
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/{SheetContainer-4FNTLG5R.mjs → SheetContainer-XFQTSA3I.mjs} +5 -5
- package/dist/lib/node-esm/{SheetContainer-4FNTLG5R.mjs.map → SheetContainer-XFQTSA3I.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-6NB67Y6X.mjs → chunk-LYZV4Q4C.mjs} +51 -50
- package/dist/lib/node-esm/chunk-LYZV4Q4C.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-WQHYR4WD.mjs → chunk-RRIPYVEN.mjs} +7 -8
- package/dist/lib/node-esm/chunk-RRIPYVEN.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +6 -6
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-2JNQCFCI.mjs → intent-resolver-7AN5CN4R.mjs} +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-UM2Y3ZWZ.mjs → react-surface-XUFWQE5B.mjs} +3 -3
- package/dist/lib/node-esm/{thread-4NCPE5FK.mjs → thread-ULESW6IX.mjs} +2 -2
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/components/RangeList/RangeList.d.ts.map +1 -1
- package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts +1 -1
- package/dist/types/src/components/SheetToolbar/useToolbarState.d.ts.map +1 -1
- package/dist/types/src/integrations/thread-ranges.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +363 -144
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +36 -36
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +47 -47
- package/src/components/ComputeGraph/compute-graph.stories.tsx +3 -3
- package/src/components/GridSheet/SheetCellEditor.stories.tsx +2 -2
- package/src/components/RangeList/RangeList.tsx +2 -2
- package/src/components/SheetToolbar/useToolbarState.ts +2 -2
- package/src/integrations/thread-ranges.ts +2 -3
- package/src/model/sheet-model.test.ts +1 -1
- package/src/sanity.test.ts +3 -3
- package/src/serializer.ts +2 -2
- package/src/types/schema.ts +21 -19
- package/src/types/types.ts +25 -25
- package/src/types/util.ts +2 -2
- package/dist/lib/browser/chunk-CHMPICA6.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZOKEQL2K.mjs.map +0 -7
- package/dist/lib/node/chunk-AEH3L5QZ.cjs.map +0 -7
- package/dist/lib/node/chunk-D4MOMCEU.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-6NB67Y6X.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-WQHYR4WD.mjs.map +0 -7
- /package/dist/lib/browser/{intent-resolver-6OUEM3IG.mjs.map → intent-resolver-DN7JXDAV.mjs.map} +0 -0
- /package/dist/lib/browser/{react-surface-ECKBP3UZ.mjs.map → react-surface-XUJZGNUH.mjs.map} +0 -0
- /package/dist/lib/browser/{thread-76MK2FMV.mjs.map → thread-WU64QL2A.mjs.map} +0 -0
- /package/dist/lib/node/{intent-resolver-ICHNDL6F.cjs.map → intent-resolver-OPF56TAL.cjs.map} +0 -0
- /package/dist/lib/node/{react-surface-6PBWE75L.cjs.map → react-surface-GSS7VQ2D.cjs.map} +0 -0
- /package/dist/lib/node/{thread-WP43BC4N.cjs.map → thread-E7YPGR5T.cjs.map} +0 -0
- /package/dist/lib/node-esm/{intent-resolver-2JNQCFCI.mjs.map → intent-resolver-7AN5CN4R.mjs.map} +0 -0
- /package/dist/lib/node-esm/{react-surface-UM2Y3ZWZ.mjs.map → react-surface-XUFWQE5B.mjs.map} +0 -0
- /package/dist/lib/node-esm/{thread-4NCPE5FK.mjs.map → thread-ULESW6IX.mjs.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/SheetContainer/SheetContainer.tsx", "../../../src/components/FunctionEditor/FunctionEditor.tsx", "../../../src/components/SheetToolbar/SheetToolbar.tsx", "../../../src/components/SheetToolbar/align.ts", "../../../src/components/SheetToolbar/comment.ts", "../../../src/components/SheetToolbar/style.ts", "../../../src/components/SheetToolbar/useToolbarAction.ts", "../../../src/components/SheetToolbar/useToolbarState.ts", "../../../src/components/SheetContainer/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { fullyQualifiedId, type Space } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { type SheetType } from '../../types';\nimport { useComputeGraph } from '../ComputeGraph';\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider } from '../SheetContext';\nimport { SheetToolbar } from '../SheetToolbar';\n\nexport const SheetContainer = ({\n space,\n sheet,\n role,\n ignoreAttention,\n}: {\n space: Space;\n sheet: SheetType;\n role?: string;\n ignoreAttention?: boolean;\n}) => {\n const graph = useComputeGraph(space);\n\n return graph ? (\n <SheetProvider sheet={sheet} graph={graph} ignoreAttention={ignoreAttention}>\n <StackItem.Content toolbar statusbar {...(role === 'section' && { classNames: 'aspect-video' })}>\n <SheetToolbar attendableId={fullyQualifiedId(sheet)} />\n <GridSheet />\n <FunctionEditor />\n </StackItem.Content>\n </SheetProvider>\n ) : null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { addressToA1Notation, isFormula, rangeToA1Notation } from '@dxos/compute';\nimport { Icon } from '@dxos/react-ui';\n\nimport { mapFormulaIndicesToRefs } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let formula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (isFormula(value)) {\n value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));\n formula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div className='flex shrink-0 justify-between items-center px-4 py-1 text-sm attention-surface border-bs !border-separator'>\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', formula ? '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 React, { type PropsWithChildren, useCallback } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { createGapSeparator, MenuProvider, ToolbarMenu, useMenuActions } from '@dxos/react-ui-menu';\n\nimport { createAlign, useAlignState } from './align';\nimport { createComment, useCommentState } from './comment';\nimport { createStyle, useStyleState } from './style';\nimport { useToolbarAction } from './useToolbarAction';\nimport { type ToolbarState, useToolbarState } from './useToolbarState';\n\n//\n// Root\n//\n\nexport type SheetToolbarProps = ThemedClassName<PropsWithChildren<{ attendableId?: string }>>;\n\nconst createToolbarActions = (state: ToolbarState) => {\n const align = createAlign(state);\n const style = createStyle(state);\n const gap = createGapSeparator();\n const comment = createComment(state);\n return {\n nodes: [...align.nodes, ...style.nodes, ...gap.nodes, ...comment.nodes],\n edges: [...align.edges, ...style.edges, ...gap.edges, ...comment.edges],\n };\n};\n\nexport const SheetToolbar = ({ attendableId, classNames }: SheetToolbarProps) => {\n const state = useToolbarState({});\n useAlignState(state);\n useStyleState(state);\n useCommentState(state);\n\n const actionsCreator = useCallback(() => createToolbarActions(state), [state]);\n const menu = useMenuActions(actionsCreator);\n const handleAction = useToolbarAction(state);\n\n return (\n <MenuProvider {...menu} attendableId={attendableId} onAction={handleAction}>\n <ToolbarMenu classNames={classNames} />\n </MenuProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { inRange } from '@dxos/compute';\nimport { createMenuAction, createMenuItemGroup, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type AlignKey, alignKey, type AlignValue, rangeFromIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type AlignAction = { key: AlignKey; value: AlignValue };\n\nexport type AlignState = { [alignKey]: AlignValue | undefined };\n\nconst aligns: Record<AlignValue, string> = {\n start: 'ph--text-align-left--regular',\n center: 'ph--text-align-center--regular',\n end: 'ph--text-align-right--regular',\n};\n\nexport const useAlignState = (state: Partial<AlignState>) => {\n const { cursor, model } = useSheetContext();\n useEffect(() => {\n // TODO(thure): Can this O(n) call be memoized?\n state[alignKey] = (\n cursor\n ? model.sheet.ranges?.findLast(\n ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),\n )?.value\n : undefined\n ) as AlignValue | undefined;\n }, [cursor, model.sheet]);\n};\n\nconst createAlignGroupAction = (value?: AlignValue) =>\n createMenuItemGroup('align', {\n label: ['align label', { ns: SHEET_PLUGIN }],\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value: `${alignKey}--${value}`,\n } as ToolbarMenuActionGroupProperties);\n\nconst createAlignActions = (value?: AlignValue) =>\n Object.entries(aligns).map(([alignValue, icon]) => {\n return createMenuAction<AlignAction>(`${alignKey}--${alignValue}`, {\n key: alignKey,\n value: alignValue as AlignValue,\n checked: value === alignValue,\n label: [`range value ${alignValue} label`, { ns: SHEET_PLUGIN }],\n icon,\n testId: `grid.toolbar.${alignKey}.${alignValue}`,\n });\n });\n\nexport const createAlign = ({ [alignKey]: alignValue }: Partial<AlignState>) => {\n const alignGroup = createAlignGroupAction(alignValue);\n const alignActions = createAlignActions(alignValue);\n return {\n nodes: [alignGroup, ...alignActions],\n edges: [\n { source: 'root', target: 'align' },\n ...alignActions.map(({ id }) => ({ source: alignGroup.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { RefArray } from '@dxos/live-object';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { commentKey, type CommentKey, type CommentValue, rangeToIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type CommentAction = { key: CommentKey; value: CommentValue; cellContent?: string };\n\nexport type CommentState = { commentEnabled: 'comment' | 'no cursor' | 'selection overlaps existing comment' };\n\nexport const useCommentState = (state: Partial<CommentState>) => {\n const { cursorFallbackRange, model } = useSheetContext();\n\n // TODO(thure): Can this O(n) call be memoized?\n const overlapsCommentAnchor = useMemo(\n () =>\n RefArray.targets(model.sheet.threads ?? [])\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursorFallbackRange) {\n return false;\n }\n return rangeToIndex(model.sheet, cursorFallbackRange) === thread.anchor;\n }),\n [cursorFallbackRange, model.sheet],\n );\n\n useEffect(() => {\n state.commentEnabled = !cursorFallbackRange\n ? 'no cursor'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment'\n : 'comment';\n }, [overlapsCommentAnchor, cursorFallbackRange]);\n};\n\nconst createCommentAction = (state: Partial<CommentState>) =>\n createMenuAction<Pick<CommentAction, 'key'>>('comment', {\n key: commentKey,\n testId: 'editor.toolbar.comment',\n icon: 'ph--chat-text--regular',\n label: [`${state.commentEnabled} label`, { ns: SHEET_PLUGIN }],\n disabled: state.commentEnabled !== 'comment',\n });\n\nexport const createComment = (state: Partial<CommentState>) => ({\n nodes: [createCommentAction(state)],\n edges: [{ source: 'root', target: 'comment' }],\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { inRange } from '@dxos/compute';\nimport { createMenuAction, createMenuItemGroup, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { rangeFromIndex, type StyleKey, type StyleValue } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type StyleState = Partial<Record<StyleValue, boolean>>;\n\nexport type StyleAction = { key: StyleKey; value: StyleValue };\n\nconst styles: Record<StyleValue, string> = {\n highlight: 'ph--highlighter--regular',\n softwrap: 'ph--paragraph--regular',\n};\n\nexport const useStyleState = (state: StyleState) => {\n const { cursorFallbackRange, model } = useSheetContext();\n\n useEffect(() => {\n state.highlight = false;\n state.softwrap = false;\n if (cursorFallbackRange && model.sheet.ranges) {\n model.sheet.ranges\n .filter(\n ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .forEach(({ value }) => {\n state[value as StyleValue] = true;\n });\n }\n }, [cursorFallbackRange, model.sheet]);\n};\n\nconst createStyleGroup = (state: StyleState) => {\n return createMenuItemGroup('style', {\n variant: 'toggleGroup',\n selectCardinality: 'multiple',\n value: Object.keys(styles)\n .filter((key) => !!state[key as StyleValue])\n .map((styleValue) => `style--${styleValue}`),\n } as ToolbarMenuActionGroupProperties);\n};\n\nconst createStyleActions = (state: StyleState) =>\n Object.entries(styles).map(([styleValue, icon]) => {\n return createMenuAction<StyleAction>(`style--${styleValue}`, {\n key: 'style',\n value: styleValue as StyleValue,\n icon,\n label: [`range value ${styleValue} label`, { ns: SHEET_PLUGIN }],\n checked: !!state[styleValue as StyleValue],\n });\n });\n\nexport const createStyle = (state: StyleState) => {\n const styleGroupAction = createStyleGroup(state);\n const styleActions = createStyleActions(state);\n return {\n nodes: [styleGroupAction, ...styleActions],\n edges: [\n { source: 'root', target: 'style' },\n ...styleActions.map(({ id }) => ({ source: styleGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { inRange } from '@dxos/compute';\nimport { ThreadAction } from '@dxos/plugin-thread/types';\nimport type { MenuAction, MenuActionHandler } from '@dxos/react-ui-menu';\n\nimport { type AlignAction } from './align';\nimport { type CommentAction } from './comment';\nimport { type StyleAction } from './style';\nimport { type ToolbarState } from './useToolbarState';\nimport { completeCellRangeToThreadCursor } from '../../integrations';\nimport { alignKey, rangeFromIndex, rangeToIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type ToolbarAction = StyleAction | AlignAction | CommentAction;\n\nexport const useToolbarAction = (state: ToolbarState) => {\n const { model, cursorFallbackRange, cursor } = useSheetContext();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n // TODO(Zan): Externalize the toolbar action handler. E.g., Toolbar/keys should both fire events.\n return useCallback(\n (action: MenuAction<ToolbarAction>) => {\n const { key, value } = action.properties;\n if (cursorFallbackRange) {\n const index =\n model.sheet.ranges?.findIndex(\n (range) => range.key === key && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key,\n value,\n };\n switch (key) {\n case 'alignment':\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n state[alignKey] = value;\n } else if (model.sheet.ranges![index].value === value) {\n model.sheet.ranges?.splice(index, 1);\n state[alignKey] = undefined;\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n state[alignKey] = value;\n }\n break;\n case 'style':\n if (\n model.sheet.ranges\n .filter(\n ({ range, key: rangeKey }) =>\n rangeKey === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .some(({ value: rangeValue }) => rangeValue === value)\n ) {\n // this value should be unset\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n state[value] = false;\n } else {\n model.sheet.ranges?.push(nextRangeEntity);\n state[value] = true;\n }\n break;\n case 'comment': {\n const cellContent = model.getCellText(cursorFallbackRange.from);\n void dispatch(\n createIntent(ThreadAction.Create, {\n cursor: completeCellRangeToThreadCursor(cursorFallbackRange),\n name: cellContent,\n subject: model.sheet,\n }),\n );\n }\n }\n }\n },\n [model.sheet, cursorFallbackRange, cursor, dispatch],\n ) as MenuActionHandler;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { create } from '@dxos/live-object';\n\nimport { type AlignState } from './align';\nimport { type CommentState } from './comment';\nimport { type StyleState } from './style';\n\nexport type ToolbarState = Partial<StyleState & AlignState & CommentState>;\n\nexport const useToolbarState = (initialState: ToolbarState = {}) => {\n return useMemo(() => create<ToolbarState>(initialState), []);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { SheetContainer } from './SheetContainer';\n\nexport default SheetContainer;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAAkB;AAElB,kBAA6C;AAC7C,4BAA0B;ACH1B,IAAAA,gBAAkB;AAElB,qBAAkE;AAClE,sBAAqB;ACHrB,IAAAA,gBAA2D;AAG3D,2BAA8E;ACH9E,IAAAA,gBAA0B;AAE1B,IAAAC,kBAAwB;AACxB,IAAAC,wBAA6F;ACH7F,IAAAF,gBAAmC;AAEnC,yBAAyB;AACzB,IAAAE,wBAAiC;ACHjC,IAAAF,gBAA0B;AAE1B,IAAAC,kBAAwB;AACxB,IAAAC,wBAA6F;ACH7F,IAAAF,gBAA4B;AAE5B,2BAAkD;AAClD,IAAAC,kBAAwB;AACxB,mBAA6B;ACJ7B,IAAAD,gBAAwB;AAExB,IAAAG,
|
|
6
|
-
"names": ["import_react", "import_compute", "import_react_ui_menu", "import_live_object", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "React", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "aligns", "start", "center", "end", "useAlignState", "state", "useEffect", "alignKey", "ranges", "findLast", "key", "inRange", "rangeFromIndex", "undefined", "createAlignGroupAction", "createMenuItemGroup", "label", "ns", "SHEET_PLUGIN", "variant", "selectCardinality", "createAlignActions", "Object", "entries", "map", "alignValue", "createMenuAction", "checked", "testId", "createAlign", "alignGroup", "alignActions", "nodes", "edges", "source", "target", "id", "useCommentState", "cursorFallbackRange", "overlapsCommentAnchor", "useMemo", "RefArray", "targets", "threads", "filter", "thread", "status", "some", "rangeToIndex", "anchor", "commentEnabled", "createCommentAction", "commentKey", "disabled", "createComment", "styles", "highlight", "softwrap", "useStyleState", "from", "forEach", "createStyleGroup", "keys", "styleValue", "createStyleActions", "createStyle", "styleGroupAction", "styleActions", "useToolbarAction", "dispatchPromise", "dispatch", "useIntentDispatcher", "useCallback", "action", "properties", "index", "findIndex", "nextRangeEntity", "push", "splice", "rangeKey", "rangeValue", "cellContent", "getCellText", "createIntent", "ThreadAction", "Create", "completeCellRangeToThreadCursor", "name", "subject", "useToolbarState", "initialState", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { fullyQualifiedId, type Space } from '@dxos/react-client/echo';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { type SheetType } from '../../types';\nimport { useComputeGraph } from '../ComputeGraph';\nimport { FunctionEditor } from '../FunctionEditor';\nimport { GridSheet } from '../GridSheet';\nimport { SheetProvider } from '../SheetContext';\nimport { SheetToolbar } from '../SheetToolbar';\n\nexport const SheetContainer = ({\n space,\n sheet,\n role,\n ignoreAttention,\n}: {\n space: Space;\n sheet: SheetType;\n role?: string;\n ignoreAttention?: boolean;\n}) => {\n const graph = useComputeGraph(space);\n\n return graph ? (\n <SheetProvider sheet={sheet} graph={graph} ignoreAttention={ignoreAttention}>\n <StackItem.Content toolbar statusbar {...(role === 'section' && { classNames: 'aspect-video' })}>\n <SheetToolbar attendableId={fullyQualifiedId(sheet)} />\n <GridSheet />\n <FunctionEditor />\n </StackItem.Content>\n </SheetProvider>\n ) : null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { addressToA1Notation, isFormula, rangeToA1Notation } from '@dxos/compute';\nimport { Icon } from '@dxos/react-ui';\n\nimport { mapFormulaIndicesToRefs } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport const FunctionEditor = () => {\n const { model, cursor, range } = useSheetContext();\n\n let value;\n let formula = false;\n if (cursor) {\n value = model.getCellValue(cursor);\n if (isFormula(value)) {\n value = model.graph.mapFunctionBindingFromId(mapFormulaIndicesToRefs(model.sheet, value));\n formula = true;\n } else if (value != null) {\n value = String(value);\n }\n }\n\n return (\n <div className='flex shrink-0 justify-between items-center px-4 py-1 text-sm attention-surface border-bs !border-separator'>\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', formula ? '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 React, { type PropsWithChildren, useCallback } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { createGapSeparator, MenuProvider, ToolbarMenu, useMenuActions } from '@dxos/react-ui-menu';\n\nimport { createAlign, useAlignState } from './align';\nimport { createComment, useCommentState } from './comment';\nimport { createStyle, useStyleState } from './style';\nimport { useToolbarAction } from './useToolbarAction';\nimport { type ToolbarState, useToolbarState } from './useToolbarState';\n\n//\n// Root\n//\n\nexport type SheetToolbarProps = ThemedClassName<PropsWithChildren<{ attendableId?: string }>>;\n\nconst createToolbarActions = (state: ToolbarState) => {\n const align = createAlign(state);\n const style = createStyle(state);\n const gap = createGapSeparator();\n const comment = createComment(state);\n return {\n nodes: [...align.nodes, ...style.nodes, ...gap.nodes, ...comment.nodes],\n edges: [...align.edges, ...style.edges, ...gap.edges, ...comment.edges],\n };\n};\n\nexport const SheetToolbar = ({ attendableId, classNames }: SheetToolbarProps) => {\n const state = useToolbarState({});\n useAlignState(state);\n useStyleState(state);\n useCommentState(state);\n\n const actionsCreator = useCallback(() => createToolbarActions(state), [state]);\n const menu = useMenuActions(actionsCreator);\n const handleAction = useToolbarAction(state);\n\n return (\n <MenuProvider {...menu} attendableId={attendableId} onAction={handleAction}>\n <ToolbarMenu classNames={classNames} />\n </MenuProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { inRange } from '@dxos/compute';\nimport { createMenuAction, createMenuItemGroup, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { type AlignKey, alignKey, type AlignValue, rangeFromIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type AlignAction = { key: AlignKey; value: AlignValue };\n\nexport type AlignState = { [alignKey]: AlignValue | undefined };\n\nconst aligns: Record<AlignValue, string> = {\n start: 'ph--text-align-left--regular',\n center: 'ph--text-align-center--regular',\n end: 'ph--text-align-right--regular',\n};\n\nexport const useAlignState = (state: Partial<AlignState>) => {\n const { cursor, model } = useSheetContext();\n useEffect(() => {\n // TODO(thure): Can this O(n) call be memoized?\n state[alignKey] = (\n cursor\n ? model.sheet.ranges?.findLast(\n ({ range, key }) => key === alignKey && inRange(rangeFromIndex(model.sheet, range), cursor),\n )?.value\n : undefined\n ) as AlignValue | undefined;\n }, [cursor, model.sheet]);\n};\n\nconst createAlignGroupAction = (value?: AlignValue) =>\n createMenuItemGroup('align', {\n label: ['align label', { ns: SHEET_PLUGIN }],\n variant: 'toggleGroup',\n selectCardinality: 'single',\n value: `${alignKey}--${value}`,\n } as ToolbarMenuActionGroupProperties);\n\nconst createAlignActions = (value?: AlignValue) =>\n Object.entries(aligns).map(([alignValue, icon]) => {\n return createMenuAction<AlignAction>(`${alignKey}--${alignValue}`, {\n key: alignKey,\n value: alignValue as AlignValue,\n checked: value === alignValue,\n label: [`range value ${alignValue} label`, { ns: SHEET_PLUGIN }],\n icon,\n testId: `grid.toolbar.${alignKey}.${alignValue}`,\n });\n });\n\nexport const createAlign = ({ [alignKey]: alignValue }: Partial<AlignState>) => {\n const alignGroup = createAlignGroupAction(alignValue);\n const alignActions = createAlignActions(alignValue);\n return {\n nodes: [alignGroup, ...alignActions],\n edges: [\n { source: 'root', target: 'align' },\n ...alignActions.map(({ id }) => ({ source: alignGroup.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useMemo } from 'react';\n\nimport { RefArray } from '@dxos/live-object';\nimport { createMenuAction } from '@dxos/react-ui-menu';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { commentKey, type CommentKey, type CommentValue, rangeToIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type CommentAction = { key: CommentKey; value: CommentValue; cellContent?: string };\n\nexport type CommentState = { commentEnabled: 'comment' | 'no cursor' | 'selection overlaps existing comment' };\n\nexport const useCommentState = (state: Partial<CommentState>) => {\n const { cursorFallbackRange, model } = useSheetContext();\n\n // TODO(thure): Can this O(n) call be memoized?\n const overlapsCommentAnchor = useMemo(\n () =>\n RefArray.targets(model.sheet.threads ?? [])\n .filter((thread) => thread.status !== 'resolved')\n .some((thread) => {\n if (!cursorFallbackRange) {\n return false;\n }\n return rangeToIndex(model.sheet, cursorFallbackRange) === thread.anchor;\n }),\n [cursorFallbackRange, model.sheet],\n );\n\n useEffect(() => {\n state.commentEnabled = !cursorFallbackRange\n ? 'no cursor'\n : overlapsCommentAnchor\n ? 'selection overlaps existing comment'\n : 'comment';\n }, [overlapsCommentAnchor, cursorFallbackRange]);\n};\n\nconst createCommentAction = (state: Partial<CommentState>) =>\n createMenuAction<Pick<CommentAction, 'key'>>('comment', {\n key: commentKey,\n testId: 'editor.toolbar.comment',\n icon: 'ph--chat-text--regular',\n label: [`${state.commentEnabled} label`, { ns: SHEET_PLUGIN }],\n disabled: state.commentEnabled !== 'comment',\n });\n\nexport const createComment = (state: Partial<CommentState>) => ({\n nodes: [createCommentAction(state)],\n edges: [{ source: 'root', target: 'comment' }],\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect } from 'react';\n\nimport { inRange } from '@dxos/compute';\nimport { createMenuAction, createMenuItemGroup, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { rangeFromIndex, type StyleKey, type StyleValue } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type StyleState = Partial<Record<StyleValue, boolean>>;\n\nexport type StyleAction = { key: StyleKey; value: StyleValue };\n\nconst styles: Record<StyleValue, string> = {\n highlight: 'ph--highlighter--regular',\n softwrap: 'ph--paragraph--regular',\n};\n\nexport const useStyleState = (state: StyleState) => {\n const { cursorFallbackRange, model } = useSheetContext();\n\n useEffect(() => {\n state.highlight = false;\n state.softwrap = false;\n if (cursorFallbackRange && model.sheet.ranges) {\n model.sheet.ranges\n .filter(\n ({ range, key }) => key === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .forEach(({ value }) => {\n state[value as StyleValue] = true;\n });\n }\n }, [cursorFallbackRange, model.sheet]);\n};\n\nconst createStyleGroup = (state: StyleState) => {\n return createMenuItemGroup('style', {\n variant: 'toggleGroup',\n selectCardinality: 'multiple',\n value: Object.keys(styles)\n .filter((key) => !!state[key as StyleValue])\n .map((styleValue) => `style--${styleValue}`),\n } as ToolbarMenuActionGroupProperties);\n};\n\nconst createStyleActions = (state: StyleState) =>\n Object.entries(styles).map(([styleValue, icon]) => {\n return createMenuAction<StyleAction>(`style--${styleValue}`, {\n key: 'style',\n value: styleValue as StyleValue,\n icon,\n label: [`range value ${styleValue} label`, { ns: SHEET_PLUGIN }],\n checked: !!state[styleValue as StyleValue],\n });\n });\n\nexport const createStyle = (state: StyleState) => {\n const styleGroupAction = createStyleGroup(state);\n const styleActions = createStyleActions(state);\n return {\n nodes: [styleGroupAction, ...styleActions],\n edges: [\n { source: 'root', target: 'style' },\n ...styleActions.map(({ id }) => ({ source: styleGroupAction.id, target: id })),\n ],\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { inRange } from '@dxos/compute';\nimport { ThreadAction } from '@dxos/plugin-thread/types';\nimport type { MenuAction, MenuActionHandler } from '@dxos/react-ui-menu';\n\nimport { type AlignAction } from './align';\nimport { type CommentAction } from './comment';\nimport { type StyleAction } from './style';\nimport { type ToolbarState } from './useToolbarState';\nimport { completeCellRangeToThreadCursor } from '../../integrations';\nimport { alignKey, rangeFromIndex, rangeToIndex } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nexport type ToolbarAction = StyleAction | AlignAction | CommentAction;\n\nexport const useToolbarAction = (state: ToolbarState) => {\n const { model, cursorFallbackRange, cursor } = useSheetContext();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n // TODO(Zan): Externalize the toolbar action handler. E.g., Toolbar/keys should both fire events.\n return useCallback(\n (action: MenuAction<ToolbarAction>) => {\n const { key, value } = action.properties;\n if (cursorFallbackRange) {\n const index =\n model.sheet.ranges?.findIndex(\n (range) => range.key === key && inRange(rangeFromIndex(model.sheet, range.range), cursorFallbackRange.from),\n ) ?? -1;\n const nextRangeEntity = {\n range: rangeToIndex(model.sheet, cursorFallbackRange),\n key,\n value,\n };\n switch (key) {\n case 'alignment':\n if (index < 0) {\n model.sheet.ranges?.push(nextRangeEntity);\n state[alignKey] = value;\n } else if (model.sheet.ranges![index].value === value) {\n model.sheet.ranges?.splice(index, 1);\n state[alignKey] = undefined;\n } else {\n model.sheet.ranges?.splice(index, 1, nextRangeEntity);\n state[alignKey] = value;\n }\n break;\n case 'style':\n if (\n model.sheet.ranges\n .filter(\n ({ range, key: rangeKey }) =>\n rangeKey === 'style' && inRange(rangeFromIndex(model.sheet, range), cursorFallbackRange.from),\n )\n .some(({ value: rangeValue }) => rangeValue === value)\n ) {\n // this value should be unset\n if (index >= 0) {\n model.sheet.ranges?.splice(index, 1);\n }\n state[value] = false;\n } else {\n model.sheet.ranges?.push(nextRangeEntity);\n state[value] = true;\n }\n break;\n case 'comment': {\n const cellContent = model.getCellText(cursorFallbackRange.from);\n void dispatch(\n createIntent(ThreadAction.Create, {\n cursor: completeCellRangeToThreadCursor(cursorFallbackRange),\n name: cellContent,\n subject: model.sheet,\n }),\n );\n }\n }\n }\n },\n [model.sheet, cursorFallbackRange, cursor, dispatch],\n ) as MenuActionHandler;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useMemo } from 'react';\n\nimport { live } from '@dxos/live-object';\n\nimport { type AlignState } from './align';\nimport { type CommentState } from './comment';\nimport { type StyleState } from './style';\n\nexport type ToolbarState = Partial<StyleState & AlignState & CommentState>;\n\nexport const useToolbarState = (initialState: ToolbarState = {}) => {\n return useMemo(() => live<ToolbarState>(initialState), []);\n};\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": ["import_react", "import_compute", "import_react_ui_menu", "import_live_object", "FunctionEditor", "model", "cursor", "range", "useSheetContext", "value", "formula", "getCellValue", "isFormula", "graph", "mapFunctionBindingFromId", "mapFormulaIndicesToRefs", "sheet", "String", "React", "div", "className", "rangeToA1Notation", "addressToA1Notation", "Icon", "icon", "classNames", "span", "aligns", "start", "center", "end", "useAlignState", "state", "useEffect", "alignKey", "ranges", "findLast", "key", "inRange", "rangeFromIndex", "undefined", "createAlignGroupAction", "createMenuItemGroup", "label", "ns", "SHEET_PLUGIN", "variant", "selectCardinality", "createAlignActions", "Object", "entries", "map", "alignValue", "createMenuAction", "checked", "testId", "createAlign", "alignGroup", "alignActions", "nodes", "edges", "source", "target", "id", "useCommentState", "cursorFallbackRange", "overlapsCommentAnchor", "useMemo", "RefArray", "targets", "threads", "filter", "thread", "status", "some", "rangeToIndex", "anchor", "commentEnabled", "createCommentAction", "commentKey", "disabled", "createComment", "styles", "highlight", "softwrap", "useStyleState", "from", "forEach", "createStyleGroup", "keys", "styleValue", "createStyleActions", "createStyle", "styleGroupAction", "styleActions", "useToolbarAction", "dispatchPromise", "dispatch", "useIntentDispatcher", "useCallback", "action", "properties", "index", "findIndex", "nextRangeEntity", "push", "splice", "rangeKey", "rangeValue", "cellContent", "getCellText", "createIntent", "ThreadAction", "Create", "completeCellRangeToThreadCursor", "name", "subject", "useToolbarState", "initialState", "live", "createToolbarActions", "align", "style", "gap", "createGapSeparator", "comment", "SheetToolbar", "attendableId", "actionsCreator", "menu", "useMenuActions", "handleAction", "MenuProvider", "onAction", "ToolbarMenu", "SheetContainer", "space", "role", "ignoreAttention", "useComputeGraph", "SheetProvider", "StackItem", "Content", "toolbar", "statusbar", "fullyQualifiedId", "GridSheet"]
|
|
7
7
|
}
|
|
@@ -26,8 +26,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
var
|
|
30
|
-
__export(
|
|
29
|
+
var chunk_62JKBCGO_exports = {};
|
|
30
|
+
__export(chunk_62JKBCGO_exports, {
|
|
31
31
|
ComputeGraphContextProvider: () => ComputeGraphContextProvider,
|
|
32
32
|
GridSheet: () => GridSheet,
|
|
33
33
|
RangeList: () => RangeList,
|
|
@@ -37,16 +37,16 @@ __export(chunk_AEH3L5QZ_exports, {
|
|
|
37
37
|
useComputeGraph: () => useComputeGraph,
|
|
38
38
|
useSheetContext: () => useSheetContext
|
|
39
39
|
});
|
|
40
|
-
module.exports = __toCommonJS(
|
|
40
|
+
module.exports = __toCommonJS(chunk_62JKBCGO_exports);
|
|
41
41
|
var import_chunk_LEV7OSTK = require("./chunk-LEV7OSTK.cjs");
|
|
42
|
-
var
|
|
42
|
+
var import_chunk_HLSQVT3C = require("./chunk-HLSQVT3C.cjs");
|
|
43
43
|
var import_chunk_JSIDCZHB = require("./chunk-JSIDCZHB.cjs");
|
|
44
44
|
var import_react = __toESM(require("react"));
|
|
45
45
|
var import_debug = require("@dxos/debug");
|
|
46
46
|
var import_react_hooks = require("@dxos/react-hooks");
|
|
47
|
+
var import_effect = require("effect");
|
|
47
48
|
var import_react2 = __toESM(require("react"));
|
|
48
49
|
var import_compute = require("@dxos/compute");
|
|
49
|
-
var import_echo_schema = require("@dxos/echo-schema");
|
|
50
50
|
var import_react_ui = require("@dxos/react-ui");
|
|
51
51
|
var import_react_ui_list = require("@dxos/react-ui-list");
|
|
52
52
|
var import_react_ui_theme = require("@dxos/react-ui-theme");
|
|
@@ -63,12 +63,11 @@ var import_echo = require("@dxos/react-client/echo");
|
|
|
63
63
|
var import_react_ui_form = require("@dxos/react-ui-form");
|
|
64
64
|
var import_react_ui_grid2 = require("@dxos/react-ui-grid");
|
|
65
65
|
var import_react_ui_theme2 = require("@dxos/react-ui-theme");
|
|
66
|
-
var
|
|
66
|
+
var import_effect2 = require("effect");
|
|
67
67
|
var import_react6 = require("react");
|
|
68
68
|
var import_app_framework2 = require("@dxos/app-framework");
|
|
69
69
|
var import_async = require("@dxos/async");
|
|
70
70
|
var import_compute4 = require("@dxos/compute");
|
|
71
|
-
var import_echo_schema2 = require("@dxos/echo-schema");
|
|
72
71
|
var import_types = require("@dxos/plugin-deck/types");
|
|
73
72
|
var import_types2 = require("@dxos/plugin-thread/types");
|
|
74
73
|
var import_echo2 = require("@dxos/react-client/echo");
|
|
@@ -112,7 +111,7 @@ var RangeList = ({ sheet }) => {
|
|
|
112
111
|
className: "p-2 text-sm font-semibold"
|
|
113
112
|
}, t("range list heading")), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.Root, {
|
|
114
113
|
items: sheet.ranges,
|
|
115
|
-
isItem:
|
|
114
|
+
isItem: import_effect.Schema.is(import_chunk_HLSQVT3C.Range)
|
|
116
115
|
}, ({ items: ranges }) => ranges.map((range, i) => /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.Item, {
|
|
117
116
|
key: i,
|
|
118
117
|
item: range,
|
|
@@ -123,7 +122,7 @@ var RangeList = ({ sheet }) => {
|
|
|
123
122
|
}, /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemDragHandle, null), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemTitle, {
|
|
124
123
|
onClick: () => handleSelectRange(range)
|
|
125
124
|
}, t("range title", {
|
|
126
|
-
position: (0, import_compute.rangeToA1Notation)((0,
|
|
125
|
+
position: (0, import_compute.rangeToA1Notation)((0, import_chunk_HLSQVT3C.rangeFromIndex)(sheet, range.range)),
|
|
127
126
|
key: t(`range key ${range.key} label`),
|
|
128
127
|
value: t(`range value ${range.value} label`)
|
|
129
128
|
})), /* @__PURE__ */ import_react2.default.createElement(import_react_ui_list.List.ItemDeleteButton, {
|
|
@@ -157,7 +156,7 @@ var useUpdateFocusedCellOnThreadSelection = (grid) => {
|
|
|
157
156
|
intent: import_app_framework2.LayoutAction.ScrollIntoView,
|
|
158
157
|
position: "hoist",
|
|
159
158
|
filter: (data) => {
|
|
160
|
-
if (!
|
|
159
|
+
if (!import_effect2.Schema.is(import_app_framework2.LayoutAction.ScrollIntoView.fields.input)(data)) {
|
|
161
160
|
return false;
|
|
162
161
|
}
|
|
163
162
|
return data.subject === (0, import_echo2.fullyQualifiedId)(model.sheet) && !!data.options?.cursor;
|
|
@@ -197,7 +196,7 @@ var useSelectThreadOnCellFocus = () => {
|
|
|
197
196
|
});
|
|
198
197
|
if (closestThread) {
|
|
199
198
|
const primary = (0, import_echo2.fullyQualifiedId)(model.sheet);
|
|
200
|
-
const intent = (0,
|
|
199
|
+
const intent = (0, import_effect2.pipe)((0, import_app_framework2.createIntent)(import_types2.ThreadAction.Select, {
|
|
201
200
|
current: (0, import_echo2.fullyQualifiedId)(closestThread)
|
|
202
201
|
}), (0, import_app_framework2.chain)(import_types.DeckAction.ChangeCompanion, {
|
|
203
202
|
primary,
|
|
@@ -256,7 +255,7 @@ var projectCellProps = (model, col, row) => {
|
|
|
256
255
|
row
|
|
257
256
|
};
|
|
258
257
|
const rawValue = model.getValue(address);
|
|
259
|
-
const ranges = model.sheet.ranges?.filter(({ range }) => (0, import_compute3.inRange)((0,
|
|
258
|
+
const ranges = model.sheet.ranges?.filter(({ range }) => (0, import_compute3.inRange)((0, import_chunk_HLSQVT3C.rangeFromIndex)(model.sheet, range), address));
|
|
260
259
|
const threadRefs = model.sheet.threads?.filter((thread) => {
|
|
261
260
|
const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target.anchor);
|
|
262
261
|
return thread && range ? (0, import_compute3.inRange)(range, address) : false;
|
|
@@ -264,7 +263,7 @@ var projectCellProps = (model, col, row) => {
|
|
|
264
263
|
const description = model.getValueDescription(address);
|
|
265
264
|
const type = description?.type;
|
|
266
265
|
const format = description?.format;
|
|
267
|
-
const classNames = ranges?.map(
|
|
266
|
+
const classNames = ranges?.map(import_chunk_HLSQVT3C.cellClassNameForRange).reverse();
|
|
268
267
|
return {
|
|
269
268
|
value: (0, import_react_ui_form.parseValue)({
|
|
270
269
|
type,
|
|
@@ -442,7 +441,7 @@ var SheetProviderImpl = ({ model, onInfo, ignoreAttention, children, __gridScope
|
|
|
442
441
|
}, children);
|
|
443
442
|
};
|
|
444
443
|
var SheetProvider = ({ children, graph, sheet, readonly, ignoreAttention, onInfo }) => {
|
|
445
|
-
const model = (0,
|
|
444
|
+
const model = (0, import_chunk_HLSQVT3C.useSheetModel)(graph, sheet, {
|
|
446
445
|
readonly
|
|
447
446
|
});
|
|
448
447
|
return !model ? null : /* @__PURE__ */ import_react7.default.createElement(import_react_ui_grid3.Grid.Root, {
|
|
@@ -701,13 +700,13 @@ var GridSheet = () => {
|
|
|
701
700
|
switch (operation) {
|
|
702
701
|
case "insert-before":
|
|
703
702
|
case "insert-after":
|
|
704
|
-
return dispatch((0, import_app_framework.createIntent)(
|
|
703
|
+
return dispatch((0, import_app_framework.createIntent)(import_chunk_HLSQVT3C.SheetAction.InsertAxis, {
|
|
705
704
|
model,
|
|
706
705
|
axis: contextMenuAxis,
|
|
707
706
|
index: contextMenuOpen[contextMenuAxis] + (operation === "insert-before" ? 0 : 1)
|
|
708
707
|
}));
|
|
709
708
|
case "drop":
|
|
710
|
-
return dispatch((0, import_app_framework.createIntent)(
|
|
709
|
+
return dispatch((0, import_app_framework.createIntent)(import_chunk_HLSQVT3C.SheetAction.DropAxis, {
|
|
711
710
|
model,
|
|
712
711
|
axis: contextMenuAxis,
|
|
713
712
|
axisIndex: model.sheet[contextMenuAxis === "row" ? "rows" : "columns"][contextMenuOpen[contextMenuAxis]]
|
|
@@ -759,8 +758,8 @@ var GridSheet = () => {
|
|
|
759
758
|
onBlur: handleBlur
|
|
760
759
|
}), /* @__PURE__ */ import_react4.default.createElement(import_react_ui_grid.Grid.Content, {
|
|
761
760
|
initialCells,
|
|
762
|
-
limitColumns:
|
|
763
|
-
limitRows:
|
|
761
|
+
limitColumns: import_chunk_HLSQVT3C.DEFAULT_COLS,
|
|
762
|
+
limitRows: import_chunk_HLSQVT3C.DEFAULT_ROWS,
|
|
764
763
|
columns,
|
|
765
764
|
rows,
|
|
766
765
|
onAxisResize: handleAxisResize,
|
|
@@ -807,7 +806,7 @@ var GridSheet = () => {
|
|
|
807
806
|
icon: "ph--backspace--regular"
|
|
808
807
|
}), /* @__PURE__ */ import_react4.default.createElement("span", null, t(`delete ${contextMenuAxis} label`)))), /* @__PURE__ */ import_react4.default.createElement(import_react_ui2.DropdownMenu.Arrow, null))));
|
|
809
808
|
};
|
|
810
|
-
var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-
|
|
809
|
+
var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-MERCQUPB.cjs"));
|
|
811
810
|
// Annotate the CommonJS export names for ESM import in node:
|
|
812
811
|
0 && (module.exports = {
|
|
813
812
|
ComputeGraphContextProvider,
|
|
@@ -819,4 +818,4 @@ var SheetContainer = (0, import_react3.lazy)(() => import("./SheetContainer-LGRD
|
|
|
819
818
|
useComputeGraph,
|
|
820
819
|
useSheetContext
|
|
821
820
|
});
|
|
822
|
-
//# sourceMappingURL=chunk-
|
|
821
|
+
//# sourceMappingURL=chunk-62JKBCGO.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/ComputeGraph/ComputeGraphContextProvider.tsx", "../../../src/components/RangeList/RangeList.tsx", "../../../src/components/index.ts", "../../../src/components/GridSheet/GridSheet.tsx", "../../../src/components/GridSheet/util.ts", "../../../src/integrations/thread-ranges.ts", "../../../src/components/SheetContext/SheetContext.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { createContext, type PropsWithChildren, useContext } from 'react';\n\nimport { type ComputeGraph, type ComputeGraphRegistry } from '@dxos/compute';\nimport { raise } from '@dxos/debug';\nimport { type Space } from '@dxos/react-client/echo';\nimport { useAsyncState } from '@dxos/react-hooks';\n\nexport type ComputeGraphContextType = {\n registry: ComputeGraphRegistry;\n};\n\n/**\n * The compute graph context manages a ComputeGraph for each space.\n */\nexport const ComputeGraphContext = createContext<ComputeGraphContextType | undefined>(undefined);\n\nexport const ComputeGraphContextProvider = ({ registry, children }: PropsWithChildren<ComputeGraphContextType>) => {\n return <ComputeGraphContext.Provider value={{ registry }}>{children}</ComputeGraphContext.Provider>;\n};\n\nexport const useComputeGraph = (space?: Space): ComputeGraph | undefined => {\n const { registry } = useContext(ComputeGraphContext) ?? raise(new Error('Missing ComputeGraphContext'));\n const [graph] = useAsyncState(async () => {\n if (space) {\n const graph = registry.getOrCreateGraph(space);\n await graph.open();\n return graph;\n }\n }, [space, registry]);\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\nimport React, { useCallback } from 'react';\n\nimport { rangeToA1Notation } from '@dxos/compute';\nimport { useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover } from '@dxos/react-ui-theme';\n\nimport { SHEET_PLUGIN } from '../../meta';\nimport { rangeFromIndex } from '../../types';\nimport { Range, type SheetType } from '../../types';\n\nexport type RangeListProps = {\n sheet: SheetType;\n};\n\nexport const RangeList = ({ sheet }: RangeListProps) => {\n const { t } = useTranslation(SHEET_PLUGIN);\n // TODO(thure): Implement similar to comments, #8121\n const handleSelectRange = (range: Range) => {};\n const handleDeleteRange = useCallback(\n (range: Range) => {\n const index = sheet.ranges.findIndex((sheetRange) => sheetRange === range);\n sheet.ranges.splice(index, 1);\n },\n [sheet],\n );\n return (\n <>\n <h2 className='p-2 text-sm font-semibold'>{t('range list heading')}</h2>\n <List.Root<Range> items={sheet.ranges} isItem={Schema.is(Range)}>\n {({ items: ranges }) =>\n ranges.map((range, i) => (\n <List.Item key={i} item={range} classNames={['p-2', ghostHover]}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleSelectRange(range)}>\n {t('range title', {\n position: rangeToA1Notation(rangeFromIndex(sheet, range.range)),\n key: t(`range key ${range.key} label`),\n value: t(`range value ${range.value} label`),\n })}\n </List.ItemTitle>\n <List.ItemDeleteButton onClick={() => handleDeleteRange(range)} />\n </List.Item>\n ))\n }\n </List.Root>\n </>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { lazy } from 'react';\n\nexport * from './ComputeGraph';\nexport * from './GridSheet';\nexport * from './RangeList';\nexport * from './SheetContext';\n\nexport const SheetContainer = lazy(() => import('./SheetContainer'));\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n type FocusEvent,\n type KeyboardEvent,\n type WheelEvent,\n type MouseEvent,\n useState,\n} from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { rangeToA1Notation, type CellRange } from '@dxos/compute';\nimport { DropdownMenu, Icon, useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n closestCell,\n defaultSizeRow,\n editorKeys,\n Grid,\n GridCellEditor,\n type DxGridElement,\n type DxGridPosition,\n type DxGridCellIndex,\n type EditorKeyHandler,\n type EditorBlurHandler,\n type GridContentProps,\n parseCellIndex,\n} from '@dxos/react-ui-grid';\n\nimport { colLabelCell, rowLabelCell, useSheetModelDxGridProps } from './util';\nimport { rangeExtension, sheetExtension, type RangeController } from '../../extensions';\nimport { useSelectThreadOnCellFocus, useUpdateFocusedCellOnThreadSelection } from '../../integrations';\nimport { SHEET_PLUGIN } from '../../meta';\nimport { DEFAULT_COLS, DEFAULT_ROWS, SheetAction } from '../../types';\nimport { useSheetContext } from '../SheetContext';\n\nconst inertPosition: DxGridPosition = { plane: 'grid', col: 0, row: 0 };\n\nconst initialCells = {\n grid: {},\n frozenColsStart: [...Array(64)].reduce((acc, _, i) => {\n acc[`0,${i}`] = rowLabelCell(i);\n return acc;\n }, {}),\n frozenRowsStart: [...Array(12)].reduce((acc, _, i) => {\n acc[`${i},0`] = colLabelCell(i);\n return acc;\n }, {}),\n};\n\nconst frozen = {\n frozenColsStart: 1,\n frozenRowsStart: 1,\n};\n\nconst sheetRowDefault = {\n frozenRowsStart: { size: defaultSizeRow, readonly: true },\n grid: { size: defaultSizeRow, resizeable: true },\n};\nconst sheetColDefault = { frozenColsStart: { size: 48, readonly: true }, grid: { size: 180, resizeable: true } };\n\nexport const GridSheet = () => {\n const { t } = useTranslation(SHEET_PLUGIN);\n const { id, model, editing, setCursor, setRange, cursor, cursorFallbackRange, activeRefs, ignoreAttention } =\n useSheetContext();\n // NOTE(thure): using `useState` instead of `useRef` works with refs provided by `@lit/react` and gives us\n // a reliable dependency for `useEffect` whereas `useLayoutEffect` does not guarantee the element will be defined.\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const [extraplanarFocus, setExtraplanarFocus] = useState<DxGridPosition | null>(null);\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n const rangeController = useRef<RangeController>();\n const { hasAttention } = useAttention(id);\n\n const handleFocus = useCallback(\n (event: FocusEvent) => {\n if (!editing) {\n const cell = closestCell(event.target);\n if (cell) {\n if (cell.plane === 'grid') {\n setCursor({ col: cell.col, row: cell.row });\n setExtraplanarFocus(null);\n } else {\n setExtraplanarFocus(cell);\n }\n } else {\n setExtraplanarFocus(null);\n }\n }\n },\n [editing],\n );\n\n // TODO(burdon): Validate formula before closing: hf.validateFormula();\n const handleClose = useCallback<EditorKeyHandler>(\n (_value, event) => {\n if (event) {\n const { key, shift } = event;\n const axis = ['Enter', 'ArrowUp', 'ArrowDown'].includes(key)\n ? 'row'\n : ['Tab', 'ArrowLeft', 'ArrowRight'].includes(key)\n ? 'col'\n : undefined;\n const delta = key.startsWith('Arrow') ? (['ArrowUp', 'ArrowLeft'].includes(key) ? -1 : 1) : shift ? -1 : 1;\n dxGrid?.refocus(axis, delta);\n }\n },\n [model, editing, dxGrid],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n (value) => {\n if (value !== undefined) {\n model.setValue(parseCellIndex(editing!.index), value);\n }\n },\n [model, editing],\n );\n\n const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(\n ({ axis, size, index: numericIndex }) => {\n if (axis === 'row') {\n const rowId = model.sheet.rows[parseInt(numericIndex)];\n model.sheet.rowMeta[rowId] ??= {};\n model.sheet.rowMeta[rowId].size = size;\n } else {\n const columnId = model.sheet.columns[parseInt(numericIndex)];\n model.sheet.columnMeta[columnId] ??= {};\n model.sheet.columnMeta[columnId].size = size;\n }\n },\n [model],\n );\n\n const handleSelect = useCallback<NonNullable<GridContentProps['onSelect']>>(\n ({ minCol, maxCol, minRow, maxRow }) => {\n const range: CellRange = { from: { col: minCol, row: minRow } };\n if (minCol !== maxCol || minRow !== maxRow) {\n range.to = { col: maxCol, row: maxRow };\n }\n if (editing) {\n // Update range selection in formula.\n rangeController.current?.setRange(rangeToA1Notation(range));\n } else {\n // Setting range while editing causes focus to move to null, avoid doing so.\n setRange(range.to ? range : undefined);\n }\n },\n [editing],\n );\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const selectEntireAxis = useCallback(\n (pos: DxGridPosition) => {\n switch (pos.plane) {\n case 'frozenRowsStart':\n return dxGrid?.setSelection({\n start: { col: pos.col, row: 0, plane: 'grid' },\n end: { col: pos.col, row: model.sheet.rows.length - 1, plane: 'grid' },\n });\n case 'frozenColsStart':\n return dxGrid?.setSelection({\n start: { row: pos.row, col: 0, plane: 'grid' },\n end: { row: pos.row, col: model.sheet.columns.length - 1, plane: 'grid' },\n });\n }\n },\n [dxGrid, model.sheet],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell) {\n selectEntireAxis(cell);\n }\n },\n [selectEntireAxis],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n switch (event.key) {\n case 'Backspace':\n case 'Delete':\n event.preventDefault();\n return cursorFallbackRange && model.clear(cursorFallbackRange);\n case 'Enter':\n case 'Space':\n if (dxGrid && extraplanarFocus) {\n switch (extraplanarFocus.plane) {\n case 'frozenRowsStart':\n case 'frozenColsStart':\n event.preventDefault();\n return selectEntireAxis(extraplanarFocus);\n }\n }\n }\n if (event.metaKey || event.ctrlKey) {\n switch (event.key) {\n case 'x':\n case 'X':\n event.preventDefault();\n return cursorFallbackRange && model.cut(cursorFallbackRange);\n case 'c':\n case 'C':\n event.preventDefault();\n return cursorFallbackRange && model.copy(cursorFallbackRange);\n case 'v':\n case 'V':\n event.preventDefault();\n return cursor && model.paste(cursor);\n case 'z':\n event.preventDefault();\n return event.shiftKey ? model.redo() : model.undo();\n case 'Z':\n case 'y':\n event.preventDefault();\n return model.redo();\n }\n }\n },\n [cursorFallbackRange, model, cursor, extraplanarFocus, selectEntireAxis],\n );\n\n const contextMenuAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [contextMenuOpen, setContextMenuOpen] = useState<DxGridPosition | null>(null);\n const contextMenuAxis = contextMenuOpen?.plane.startsWith('frozenRows') ? 'col' : 'row';\n\n const handleContextMenu = useCallback((event: MouseEvent) => {\n const cell = closestCell(event.target);\n if (cell && cell.plane.startsWith('frozen')) {\n event.preventDefault();\n contextMenuAnchorRef.current = event.target as HTMLButtonElement;\n setContextMenuOpen(cell);\n }\n }, []);\n\n const handleAxisMenuAction = useCallback(\n (operation: 'insert-before' | 'insert-after' | 'drop') => {\n switch (operation) {\n case 'insert-before':\n case 'insert-after':\n return dispatch(\n createIntent(SheetAction.InsertAxis, {\n model,\n axis: contextMenuAxis,\n index: contextMenuOpen![contextMenuAxis] + (operation === 'insert-before' ? 0 : 1),\n }),\n );\n case 'drop':\n return dispatch(\n createIntent(SheetAction.DropAxis, {\n model,\n axis: contextMenuAxis,\n axisIndex: model.sheet[contextMenuAxis === 'row' ? 'rows' : 'columns'][contextMenuOpen![contextMenuAxis]],\n }),\n );\n }\n },\n [contextMenuAxis, contextMenuOpen, model, dispatch],\n );\n\n const { columns, rows } = useSheetModelDxGridProps(dxGrid, model);\n\n const extension = useMemo(\n () => [\n editorKeys({ onClose: handleClose, ...(editing?.initialContent && { onNav: handleClose }) }),\n sheetExtension({ functions: model.graph.getFunctions() }),\n rangeExtension({\n onInit: (fn) => (rangeController.current = fn),\n onStateChange: (state) => {\n if (dxGrid) {\n // This can’t dispatch a setState in this component, otherwise the cell editor remounts and loses focus.\n dxGrid.mode = typeof state.activeRange === 'undefined' ? 'edit' : 'edit-select';\n }\n },\n }),\n ],\n [model, handleClose, editing],\n );\n\n const getCellContent = useCallback(\n (index: DxGridCellIndex) => {\n return model.getCellText(parseCellIndex(index));\n },\n [model],\n );\n\n useUpdateFocusedCellOnThreadSelection(dxGrid);\n useSelectThreadOnCellFocus();\n\n return (\n <div role='none' className='relative min-bs-0'>\n <GridCellEditor getCellContent={getCellContent} extension={extension} onBlur={handleBlur} />\n <Grid.Content\n initialCells={initialCells}\n limitColumns={DEFAULT_COLS}\n limitRows={DEFAULT_ROWS}\n columns={columns}\n rows={rows}\n onAxisResize={handleAxisResize}\n onSelect={handleSelect}\n rowDefault={sheetRowDefault}\n columnDefault={sheetColDefault}\n frozen={frozen}\n onFocus={handleFocus}\n onWheelCapture={handleWheel}\n onKeyDown={handleKeyDown}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n overscroll='trap'\n className='[--dx-grid-base:var(--surface-bg)] [&_.dx-grid]:border-bs [&_.dx-grid]:absolute [&_.dx-grid]:inset-0 [&_.dx-grid]:border-separator'\n activeRefs={activeRefs}\n ref={setDxGrid}\n />\n <DropdownMenu.Root\n modal={false}\n open={!!contextMenuOpen}\n onOpenChange={(nextOpen) => setContextMenuOpen(nextOpen ? inertPosition : null)}\n >\n <DropdownMenu.VirtualTrigger virtualRef={contextMenuAnchorRef} />\n <DropdownMenu.Content side={contextMenuAxis === 'col' ? 'bottom' : 'right'} sideOffset={4} collisionPadding={8}>\n <DropdownMenu.Viewport>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-before')}\n data-testid={`grid.${contextMenuAxis}.insert-before`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-left--regular' : 'ph--rows-plus-top--regular'}\n />\n <span>{t(`add ${contextMenuAxis} before label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('insert-after')}\n data-testid={`grid.${contextMenuAxis}.insert-after`}\n >\n <Icon\n size={5}\n icon={contextMenuAxis === 'col' ? 'ph--columns-plus-right--regular' : 'ph--rows-plus-bottom--regular'}\n />\n <span>{t(`add ${contextMenuAxis} after label`)}</span>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onClick={() => handleAxisMenuAction('drop')}\n data-testid={`grid.${contextMenuAxis}.drop`}\n >\n <Icon size={5} icon='ph--backspace--regular' />\n <span>{t(`delete ${contextMenuAxis} label`)}</span>\n </DropdownMenu.Item>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { inRange } from '@dxos/compute';\nimport { createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';\nimport { parseValue, cellClassesForFieldType } from '@dxos/react-ui-form';\nimport {\n type GridContentProps,\n type DxGridElement,\n type DxGridAxisMeta,\n type DxGridPlane,\n type DxGridPlaneRange,\n type DxGridPlaneCells,\n type DxGridCellValue,\n colToA1Notation,\n rowToA1Notation,\n commentedClassName,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { parseThreadAnchorAsCellRange } from '../../integrations';\nimport { type SheetModel } from '../../model';\nimport { cellClassNameForRange, rangeFromIndex } from '../../types';\n\nconst createDxGridColumns = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.columns.reduce(\n (acc: DxGridAxisMeta, columnId, numericIndex) => {\n if (model.sheet.columnMeta[columnId] && model.sheet.columnMeta[columnId].size) {\n acc.grid[numericIndex] = { size: model.sheet.columnMeta[columnId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst createDxGridRows = (model: SheetModel): DxGridAxisMeta => {\n return model.sheet.rows.reduce(\n (acc: DxGridAxisMeta, rowId, numericIndex) => {\n if (model.sheet.rowMeta[rowId] && model.sheet.rowMeta[rowId].size) {\n acc.grid[numericIndex] = { size: model.sheet.rowMeta[rowId].size, resizeable: true };\n }\n return acc;\n },\n { grid: {} },\n );\n};\n\nconst projectCellProps = (model: SheetModel, col: number, row: number): DxGridCellValue => {\n const address = { col, row };\n const rawValue = model.getValue(address);\n const ranges = model.sheet.ranges?.filter(({ range }) => inRange(rangeFromIndex(model.sheet, range), address));\n const threadRefs = model.sheet.threads\n ?.filter((thread) => {\n const range = thread.target?.anchor && parseThreadAnchorAsCellRange(thread.target!.anchor);\n return thread && range ? inRange(range, address) : false;\n })\n .map((thread) => fullyQualifiedId(thread!))\n .join(' ');\n\n const description = model.getValueDescription(address);\n const type = description?.type;\n const format = description?.format;\n const classNames = ranges?.map(cellClassNameForRange).reverse();\n\n return {\n value: parseValue({ type, format, value: rawValue }),\n className: mx(cellClassesForFieldType({ type, format }), threadRefs && commentedClassName, classNames),\n dataRefs: threadRefs,\n };\n};\nconst gridCellGetter = (model: SheetModel) => {\n // TODO(thure): Actually use the cache.\n const cachedGridCells: DxGridPlaneCells = {};\n return (nextBounds: DxGridPlaneRange): DxGridPlaneCells => {\n [...Array(nextBounds.end.col - nextBounds.start.col)].forEach((_, c0) => {\n return [...Array(nextBounds.end.row - nextBounds.start.row)].forEach((_, r0) => {\n const col = nextBounds.start.col + c0;\n const row = nextBounds.start.row + r0;\n cachedGridCells[`${col},${row}`] = projectCellProps(model, col, row);\n });\n });\n return cachedGridCells;\n };\n};\n\nexport const rowLabelCell = (row: number) => ({\n value: rowToA1Notation(row),\n className: 'text-end pie-1 text-subdued',\n resizeHandle: 'row',\n});\n\nexport const colLabelCell = (col: number) => ({\n value: colToA1Notation(col),\n className: 'text-subdued',\n resizeHandle: 'col',\n});\n\nconst cellGetter = (model: SheetModel) => {\n const getGridCells = gridCellGetter(model);\n return (nextBounds: DxGridPlaneRange, plane: DxGridPlane): DxGridPlaneCells => {\n switch (plane) {\n case 'grid':\n return getGridCells(nextBounds);\n case 'frozenColsStart':\n return [...Array(nextBounds.end.row - nextBounds.start.row)].reduce((acc, _, r0) => {\n const r = nextBounds.start.row + r0;\n acc[`0,${r}`] = rowLabelCell(r);\n return acc;\n }, {});\n case 'frozenRowsStart':\n return [...Array(nextBounds.end.col - nextBounds.start.col)].reduce((acc, _, c0) => {\n const c = nextBounds.start.col + c0;\n acc[`${c},0`] = colLabelCell(c);\n return acc;\n }, {});\n default:\n return {};\n }\n };\n};\n\nexport const useSheetModelDxGridProps = (\n dxGrid: DxGridElement | null,\n model: SheetModel,\n): Pick<GridContentProps, 'columns' | 'rows'> => {\n const [columns, setColumns] = useState<DxGridAxisMeta>(createDxGridColumns(model));\n const [rows, setRows] = useState<DxGridAxisMeta>(createDxGridRows(model));\n\n useEffect(() => {\n const cellsAccessor = createDocAccessor(model.sheet, ['cells']);\n if (dxGrid) {\n dxGrid.getCells = cellGetter(model);\n }\n const handleCellsUpdate = () => {\n dxGrid?.requestUpdate('initialCells');\n };\n cellsAccessor.handle.addListener('change', handleCellsUpdate);\n const unsubscribe = model.graph.update.on(handleCellsUpdate);\n return () => {\n cellsAccessor.handle.removeListener('change', handleCellsUpdate);\n unsubscribe();\n };\n }, [model, dxGrid]);\n\n useEffect(() => {\n const columnMetaAccessor = createDocAccessor(model.sheet, ['columnMeta']);\n const rowMetaAccessor = createDocAccessor(model.sheet, ['rowMeta']);\n const handleColumnMetaUpdate = () => {\n setColumns(createDxGridColumns(model));\n };\n const handleRowMetaUpdate = () => {\n setRows(createDxGridRows(model));\n };\n columnMetaAccessor.handle.addListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.addListener('change', handleRowMetaUpdate);\n return () => {\n columnMetaAccessor.handle.removeListener('change', handleColumnMetaUpdate);\n rowMetaAccessor.handle.removeListener('change', handleRowMetaUpdate);\n };\n }, [model, dxGrid]);\n\n return { columns, rows };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema, pipe } from 'effect';\nimport { useCallback, useEffect, useMemo } from 'react';\n\nimport {\n createIntent,\n createResolver,\n LayoutAction,\n useIntentResolver,\n useIntentDispatcher,\n chain,\n} from '@dxos/app-framework';\nimport { debounce } from '@dxos/async';\nimport { type CellAddress, type CompleteCellRange, inRange } from '@dxos/compute';\nimport { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';\nimport { ThreadAction } from '@dxos/plugin-thread/types';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport { type DxGridElement, type DxGridPosition, type GridContentProps } from '@dxos/react-ui-grid';\n\nimport { useSheetContext } from '../components';\nimport { SHEET_PLUGIN } from '../meta';\n\nexport const completeCellRangeToThreadCursor = (range: CompleteCellRange): string => {\n return `${range.from.col},${range.from.row},${range.to.col},${range.to.row}`;\n};\n\nexport const parseThreadAnchorAsCellRange = (cursor: string): CompleteCellRange | null => {\n const coords = cursor.split(',');\n if (coords.length !== 4) {\n return null;\n } else {\n const [fromCol, fromRow, toCol, toRow] = coords;\n return {\n from: { col: parseInt(fromCol), row: parseInt(fromRow) },\n to: { col: parseInt(toCol), row: parseInt(toRow) },\n };\n }\n};\n\nexport const useUpdateFocusedCellOnThreadSelection = (grid: DxGridElement | null) => {\n const { model, setActiveRefs } = useSheetContext();\n const scrollIntoViewResolver = useMemo(\n () =>\n createResolver({\n intent: LayoutAction.ScrollIntoView,\n position: 'hoist',\n filter: (\n data,\n ): data is {\n part: 'current';\n subject: string;\n options: { cursor: string; ref: GridContentProps['activeRefs'] };\n } => {\n if (!Schema.is(LayoutAction.ScrollIntoView.fields.input)(data)) {\n return false;\n }\n\n return data.subject === fullyQualifiedId(model.sheet) && !!data.options?.cursor;\n },\n resolve: ({ options: { cursor, ref } }) => {\n setActiveRefs(ref);\n // TODO(Zan): Everywhere we refer to the cursor in a thread context should change to `anchor`.\n const range = parseThreadAnchorAsCellRange(cursor!);\n range && grid?.setFocus({ ...range.to, plane: 'grid' }, true);\n },\n }),\n [model.sheet, setActiveRefs],\n );\n\n useIntentResolver(SHEET_PLUGIN, scrollIntoViewResolver);\n};\n\nexport const useSelectThreadOnCellFocus = () => {\n const { model, cursor } = useSheetContext();\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const threads = useMemo(\n () => model.sheet.threads?.filter((thread): thread is NonNullable<typeof thread> => !!thread) ?? [],\n [\n // TODO(thure): Surely we can find a better dependency for this…\n JSON.stringify(model.sheet.threads),\n ],\n );\n\n const selectClosestThread = useCallback(\n (cellAddress: CellAddress) => {\n if (!cellAddress || !threads) {\n return;\n }\n\n const closestThread = threads?.find((ref) => {\n if (ref.target?.anchor) {\n const range = parseThreadAnchorAsCellRange(ref.target!.anchor);\n return range ? inRange(range, cellAddress) : false;\n } else {\n return false;\n }\n });\n\n if (closestThread) {\n const primary = fullyQualifiedId(model.sheet);\n const intent = pipe(\n createIntent(ThreadAction.Select, { current: fullyQualifiedId(closestThread) }),\n chain(DeckAction.ChangeCompanion, { primary, companion: `${primary}${ATTENDABLE_PATH_SEPARATOR}comments` }),\n );\n void dispatch(intent);\n }\n },\n [dispatch, threads],\n );\n\n const debounced = useMemo(() => {\n return debounce((cellCoords: DxGridPosition) => requestAnimationFrame(() => selectClosestThread(cellCoords)), 50);\n }, [selectClosestThread]);\n\n useEffect(() => {\n if (!cursor) {\n return;\n }\n debounced(cursor);\n }, [cursor, debounced]);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type PropsWithChildren, createContext, useCallback, useContext, useState } from 'react';\n\nimport { type ComputeGraph, type CellAddress, type CellRange, type CompleteCellRange } from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport {\n Grid,\n type GridContentProps,\n type GridEditing,\n type GridScopedProps,\n useGridContext,\n} from '@dxos/react-ui-grid';\n\nimport { type SheetModel, useSheetModel } from '../../model';\nimport { type SheetType } from '../../types';\n\nexport type SheetContextValue = {\n id: string;\n\n model: SheetModel;\n\n // Cursor state.\n // TODO(burdon): Cursor and range should use indices.\n cursor?: CellAddress;\n setCursor: (cell: CellAddress | undefined) => void;\n range?: CellRange;\n setRange: (range: CellRange | undefined) => void;\n cursorFallbackRange?: CompleteCellRange;\n\n // Editing state (undefined if not editing).\n editing: GridEditing;\n setEditing: (editing: GridEditing) => void;\n\n // Active refs\n activeRefs: GridContentProps['activeRefs'];\n setActiveRefs: (activeRefs: GridContentProps['activeRefs']) => void;\n\n // Events.\n // TODO(burdon): Generalize.\n onInfo?: () => void;\n\n // Flags\n ignoreAttention?: boolean;\n};\n\nconst SheetContext = createContext<SheetContextValue | undefined>(undefined);\n\nexport const useSheetContext = (): SheetContextValue => {\n const context = useContext(SheetContext);\n invariant(context);\n return context;\n};\n\nconst SheetProviderImpl = ({\n model,\n onInfo,\n ignoreAttention,\n children,\n __gridScope,\n}: GridScopedProps<PropsWithChildren<Pick<SheetContextValue, 'onInfo' | 'model' | 'ignoreAttention'>>>) => {\n const { id, editing, setEditing } = useGridContext('SheetProvider', __gridScope);\n\n const [cursor, setCursorInternal] = useState<CellAddress>();\n const [range, setRangeInternal] = useState<CellRange>();\n const [cursorFallbackRange, setCursorFallbackRange] = useState<CompleteCellRange>();\n const [activeRefs, setActiveRefs] = useState<GridContentProps['activeRefs']>('');\n\n const setCursor = useCallback(\n (nextCursor?: CellAddress) => {\n setCursorInternal(nextCursor);\n setCursorFallbackRange(\n range?.to ? (range as CompleteCellRange) : nextCursor ? { from: nextCursor!, to: nextCursor! } : undefined,\n );\n },\n [range],\n );\n const setRange = useCallback(\n (nextRange?: CellRange) => {\n setRangeInternal(nextRange);\n setCursorFallbackRange(\n nextRange?.to ? (nextRange as CompleteCellRange) : cursor ? { from: cursor!, to: cursor! } : undefined,\n );\n },\n [cursor],\n );\n\n return (\n <SheetContext.Provider\n value={{\n id,\n model,\n editing,\n setEditing,\n cursor,\n setCursor,\n range,\n setRange,\n cursorFallbackRange,\n activeRefs,\n setActiveRefs,\n // TODO(burdon): Change to event.\n onInfo,\n ignoreAttention,\n }}\n >\n {children}\n </SheetContext.Provider>\n );\n};\n\nexport type SheetProviderProps = {\n graph: ComputeGraph;\n sheet: SheetType;\n readonly?: boolean;\n ignoreAttention?: boolean;\n} & Pick<SheetContextValue, 'onInfo'>;\n\nexport const SheetProvider = ({\n children,\n graph,\n sheet,\n readonly,\n ignoreAttention,\n onInfo,\n}: PropsWithChildren<SheetProviderProps>) => {\n const model = useSheetModel(graph, sheet, { readonly });\n\n return !model ? null : (\n <Grid.Root id={fullyQualifiedId(sheet)}>\n <SheetProviderImpl model={model} onInfo={onInfo} ignoreAttention={ignoreAttention}>\n {children}\n </SheetProviderImpl>\n </Grid.Root>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "import_compute", "import_react_ui", "import_react_ui_grid", "import_react_ui_theme", "import_effect", "import_app_framework", "import_types", "import_echo", "ComputeGraphContext", "createContext", "undefined", "ComputeGraphContextProvider", "registry", "children", "React", "Provider", "value", "useComputeGraph", "space", "useContext", "raise", "Error", "graph", "useAsyncState", "getOrCreateGraph", "open", "RangeList", "sheet", "t", "useTranslation", "SHEET_PLUGIN", "handleSelectRange", "range", "handleDeleteRange", "useCallback", "index", "ranges", "findIndex", "sheetRange", "splice", "h2", "className", "List", "Root", "items", "isItem", "Schema", "is", "Range", "map", "i", "Item", "key", "item", "classNames", "ghostHover", "ItemDragHandle", "ItemTitle", "onClick", "position", "rangeToA1Notation", "rangeFromIndex", "ItemDeleteButton", "completeCellRangeToThreadCursor", "from", "col", "row", "to", "parseThreadAnchorAsCellRange", "cursor", "coords", "split", "length", "fromCol", "fromRow", "toCol", "toRow", "parseInt", "useUpdateFocusedCellOnThreadSelection", "grid", "model", "setActiveRefs", "useSheetContext", "scrollIntoViewResolver", "useMemo", "createResolver", "intent", "LayoutAction", "ScrollIntoView", "filter", "data", "fields", "input", "subject", "fullyQualifiedId", "options", "resolve", "ref", "setFocus", "plane", "useIntentResolver", "useSelectThreadOnCellFocus", "dispatchPromise", "dispatch", "useIntentDispatcher", "threads", "thread", "JSON", "stringify", "selectClosestThread", "cellAddress", "closestThread", "find", "target", "anchor", "inRange", "primary", "pipe", "createIntent", "ThreadAction", "Select", "current", "chain", "DeckAction", "ChangeCompanion", "companion", "ATTENDABLE_PATH_SEPARATOR", "debounced", "debounce", "cellCoords", "requestAnimationFrame", "useEffect", "createDxGridColumns", "columns", "reduce", "acc", "columnId", "numericIndex", "columnMeta", "size", "resizeable", "createDxGridRows", "rows", "rowId", "rowMeta", "projectCellProps", "address", "rawValue", "getValue", "threadRefs", "join", "description", "getValueDescription", "type", "format", "cellClassNameForRange", "reverse", "parseValue", "mx", "cellClassesForFieldType", "commentedClassName", "dataRefs", "gridCellGetter", "cachedGridCells", "nextBounds", "Array", "end", "start", "forEach", "_", "c0", "r0", "rowLabelCell", "rowToA1Notation", "resizeHandle", "colLabelCell", "colToA1Notation", "cellGetter", "getGridCells", "r", "c", "useSheetModelDxGridProps", "dxGrid", "setColumns", "useState", "setRows", "cellsAccessor", "createDocAccessor", "getCells", "handleCellsUpdate", "requestUpdate", "handle", "addListener", "unsubscribe", "update", "on", "removeListener", "columnMetaAccessor", "rowMetaAccessor", "handleColumnMetaUpdate", "handleRowMetaUpdate", "SheetContext", "context", "invariant", "SheetProviderImpl", "onInfo", "ignoreAttention", "__gridScope", "id", "editing", "setEditing", "useGridContext", "setCursorInternal", "setRangeInternal", "cursorFallbackRange", "setCursorFallbackRange", "activeRefs", "setCursor", "nextCursor", "setRange", "nextRange", "SheetProvider", "readonly", "useSheetModel", "Grid", "inertPosition", "initialCells", "frozenColsStart", "frozenRowsStart", "frozen", "sheetRowDefault", "defaultSizeRow", "sheetColDefault", "GridSheet", "setDxGrid", "extraplanarFocus", "setExtraplanarFocus", "rangeController", "useRef", "hasAttention", "useAttention", "handleFocus", "event", "cell", "closestCell", "handleClose", "_value", "shift", "axis", "includes", "delta", "startsWith", "refocus", "handleBlur", "setValue", "parseCellIndex", "handleAxisResize", "handleSelect", "minCol", "maxCol", "minRow", "maxRow", "handleWheel", "stopPropagation", "selectEntireAxis", "pos", "setSelection", "handleClick", "handleKeyDown", "preventDefault", "clear", "metaKey", "ctrlKey", "cut", "copy", "paste", "shiftKey", "redo", "undo", "contextMenuAnchorRef", "contextMenuOpen", "setContextMenuOpen", "contextMenuAxis", "handleContextMenu", "handleAxisMenuAction", "operation", "SheetAction", "InsertAxis", "DropAxis", "axisIndex", "extension", "editorKeys", "onClose", "initialContent", "onNav", "sheetExtension", "functions", "getFunctions", "rangeExtension", "onInit", "fn", "onStateChange", "state", "mode", "activeRange", "getCellContent", "getCellText", "div", "role", "GridCellEditor", "onBlur", "Content", "limitColumns", "DEFAULT_COLS", "limitRows", "DEFAULT_ROWS", "onAxisResize", "onSelect", "rowDefault", "columnDefault", "onFocus", "onWheelCapture", "onKeyDown", "onContextMenu", "overscroll", "DropdownMenu", "modal", "onOpenChange", "nextOpen", "VirtualTrigger", "virtualRef", "side", "sideOffset", "collisionPadding", "Viewport", "data-testid", "Icon", "icon", "span", "Arrow", "SheetContainer", "lazy"]
|
|
7
|
+
}
|