@dxos/plugin-script 0.8.4-main.28f8d3d → 0.8.4-main.406dc2a
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/DeploymentDialog-65TWT6S5.mjs +13 -0
- package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs +683 -0
- package/dist/lib/browser/NotebookContainer-LVGRPFY3.mjs.map +7 -0
- package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs +149 -0
- package/dist/lib/browser/ScriptContainer-LRTRN7JW.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-builder-IABOSTBK.mjs → app-graph-builder-DPYULSME.mjs} +8 -7
- package/dist/lib/browser/app-graph-builder-DPYULSME.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-ET5KZ46I.mjs +28 -0
- package/dist/lib/browser/blueprint-definition-ET5KZ46I.mjs.map +7 -0
- package/dist/lib/browser/chunk-5CYLWXRH.mjs +89 -0
- package/dist/lib/browser/chunk-5CYLWXRH.mjs.map +7 -0
- package/dist/lib/browser/chunk-75LH4EUR.mjs +326 -0
- package/dist/lib/browser/chunk-75LH4EUR.mjs.map +7 -0
- package/dist/lib/browser/{chunk-MWZDJNCQ.mjs → chunk-E7DXDICD.mjs} +27 -28
- package/dist/lib/browser/chunk-E7DXDICD.mjs.map +7 -0
- package/dist/lib/browser/{chunk-QYAREHGH.mjs → chunk-EZVXV6DA.mjs} +3 -5
- package/dist/lib/browser/chunk-EZVXV6DA.mjs.map +7 -0
- package/dist/lib/browser/{chunk-OULPWKXN.mjs → chunk-I3QSGUFJ.mjs} +157 -66
- package/dist/lib/browser/chunk-I3QSGUFJ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-SUOLJH55.mjs → chunk-JO2O7W6J.mjs} +71 -50
- package/dist/lib/browser/chunk-JO2O7W6J.mjs.map +7 -0
- package/dist/lib/browser/chunk-N6M34EUC.mjs +112 -0
- package/dist/lib/browser/chunk-N6M34EUC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-OAVS36Q3.mjs → chunk-NM4WQS4F.mjs} +14 -14
- package/dist/lib/browser/chunk-NM4WQS4F.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5TVBECWH.mjs → chunk-OKXN2N7M.mjs} +2 -2
- package/dist/lib/browser/chunk-ST3ACVUC.mjs +88 -0
- package/dist/lib/browser/chunk-ST3ACVUC.mjs.map +7 -0
- package/dist/lib/browser/{compiler-RIWQVBPX.mjs → compiler-G2N2CG63.mjs} +24 -11
- package/dist/lib/browser/{compiler-RIWQVBPX.mjs.map → compiler-G2N2CG63.mjs.map} +2 -2
- package/dist/lib/browser/index.mjs +113 -37
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-SAL2TM7U.mjs → intent-resolver-JLU7DVLQ.mjs} +31 -15
- package/dist/lib/browser/intent-resolver-JLU7DVLQ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-E3SXU6ON.mjs → react-surface-76SDTUYG.mjs} +38 -15
- package/dist/lib/browser/react-surface-76SDTUYG.mjs.map +7 -0
- package/dist/lib/browser/{settings-KCTBK5TY.mjs → settings-ERFKVNUK.mjs} +9 -8
- package/dist/lib/browser/settings-ERFKVNUK.mjs.map +7 -0
- package/dist/lib/browser/templates/index.mjs +1 -1
- package/dist/lib/browser/types/index.mjs +7 -4
- package/dist/lib/node-esm/{DeploymentDialog-O2XZVRLU.mjs → DeploymentDialog-I63ZC2HH.mjs} +6 -5
- package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs +684 -0
- package/dist/lib/node-esm/NotebookContainer-QY5NJGJI.mjs.map +7 -0
- package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs +150 -0
- package/dist/lib/node-esm/ScriptContainer-SVXCSLNH.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-CQTTAYHP.mjs → app-graph-builder-UXJGHXSL.mjs} +8 -7
- package/dist/lib/node-esm/app-graph-builder-UXJGHXSL.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-AIYFOT7Q.mjs +30 -0
- package/dist/lib/node-esm/blueprint-definition-AIYFOT7Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-2GVTWESW.mjs +90 -0
- package/dist/lib/node-esm/chunk-2GVTWESW.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4X375PGY.mjs +90 -0
- package/dist/lib/node-esm/chunk-4X375PGY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-67OVZHI3.mjs +327 -0
- package/dist/lib/node-esm/chunk-67OVZHI3.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-IO6T72KY.mjs → chunk-C2ORIPKH.mjs} +14 -14
- package/dist/lib/node-esm/chunk-C2ORIPKH.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-35M3CHYE.mjs → chunk-NUXZQQ6P.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-AHXJ6NQU.mjs → chunk-OG2SIKHE.mjs} +3 -5
- package/dist/lib/node-esm/chunk-OG2SIKHE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-6WMFL3JL.mjs → chunk-SMFPSKQT.mjs} +157 -66
- package/dist/lib/node-esm/chunk-SMFPSKQT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-VRSDE4CI.mjs +114 -0
- package/dist/lib/node-esm/chunk-VRSDE4CI.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7L4JDSXJ.mjs → chunk-VZAFGLD7.mjs} +27 -28
- package/dist/lib/node-esm/chunk-VZAFGLD7.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-PACUN7RS.mjs → chunk-YW36TZ7K.mjs} +71 -50
- package/dist/lib/node-esm/chunk-YW36TZ7K.mjs.map +7 -0
- package/dist/lib/node-esm/{compiler-S52P5P3F.mjs → compiler-PLDAZ5GJ.mjs} +24 -11
- package/dist/lib/node-esm/{compiler-S52P5P3F.mjs.map → compiler-PLDAZ5GJ.mjs.map} +2 -2
- package/dist/lib/node-esm/index.mjs +113 -37
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-GO53JOPL.mjs → intent-resolver-SFGTIFOG.mjs} +31 -15
- package/dist/lib/node-esm/intent-resolver-SFGTIFOG.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-W3NRCS5O.mjs → react-surface-SHEBNW4R.mjs} +38 -15
- package/dist/lib/node-esm/react-surface-SHEBNW4R.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-DXZ334A3.mjs → settings-5TYXQ42N.mjs} +9 -8
- package/dist/lib/node-esm/settings-5TYXQ42N.mjs.map +7 -0
- package/dist/lib/node-esm/templates/index.mjs +1 -1
- package/dist/lib/node-esm/types/index.mjs +7 -4
- package/dist/types/src/ScriptPlugin.d.ts +1 -1
- package/dist/types/src/ScriptPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/compiler.d.ts +1 -1
- package/dist/types/src/capabilities/index.d.ts +6 -5
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts +2 -2
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.d.ts.map +1 -1
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts +246 -13
- package/dist/types/src/components/DeploymentDialog/DeploymentDialog.stories.d.ts.map +1 -1
- package/dist/types/src/components/FrameContainer/FrameContainer.d.ts.map +1 -1
- package/dist/types/src/components/NotebookContainer.d.ts +10 -0
- package/dist/types/src/components/NotebookContainer.d.ts.map +1 -0
- package/dist/types/src/components/NotebookContainer.stories.d.ts +248 -0
- package/dist/types/src/components/NotebookContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookCell.d.ts +14 -0
- package/dist/types/src/components/NotebookStack/NotebookCell.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts +9 -0
- package/dist/types/src/components/NotebookStack/NotebookMenu.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.d.ts +14 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts +248 -0
- package/dist/types/src/components/NotebookStack/NotebookStack.stories.d.ts.map +1 -0
- package/dist/types/src/components/NotebookStack/index.d.ts +3 -0
- package/dist/types/src/components/NotebookStack/index.d.ts.map +1 -0
- package/dist/types/src/components/ScriptContainer.d.ts +2 -2
- package/dist/types/src/components/ScriptContainer.d.ts.map +1 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.d.ts.map +1 -1
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts +245 -10
- package/dist/types/src/components/ScriptToolbar/ScriptToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/Settings/ScriptObjectSettings.d.ts.map +1 -1
- package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts +2 -2
- package/dist/types/src/components/Settings/ScriptPluginSettings.d.ts.map +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts +4 -2
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.d.ts.map +1 -1
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts +11 -4
- package/dist/types/src/components/TypescriptEditor/TypescriptEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +3 -4
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/hooks/deploy.d.ts +12 -11
- package/dist/types/src/hooks/deploy.d.ts.map +1 -1
- package/dist/types/src/hooks/template.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +0 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/notebook/eval.d.ts +13 -0
- package/dist/types/src/notebook/eval.d.ts.map +1 -0
- package/dist/types/src/notebook/index.d.ts +2 -0
- package/dist/types/src/notebook/index.d.ts.map +1 -0
- package/dist/types/src/notebook/notebook.d.ts +35 -0
- package/dist/types/src/notebook/notebook.d.ts.map +1 -0
- package/dist/types/src/notebook/notebook.test.d.ts +2 -0
- package/dist/types/src/notebook/notebook.test.d.ts.map +1 -0
- package/dist/types/src/notebook/vfs-parser.d.ts +74 -0
- package/dist/types/src/notebook/vfs-parser.d.ts.map +1 -0
- package/dist/types/src/notebook/vfs-parser.test.d.ts +2 -0
- package/dist/types/src/notebook/vfs-parser.test.d.ts.map +1 -0
- package/dist/types/src/templates/chess.d.ts.map +1 -1
- package/dist/types/src/templates/data-generator.d.ts.map +1 -1
- package/dist/types/src/templates/discord.d.ts.map +1 -1
- package/dist/types/src/templates/forex-effect.d.ts.map +1 -1
- package/dist/types/src/templates/forex.d.ts.map +1 -1
- package/dist/types/src/templates/gmail.d.ts.map +1 -1
- package/dist/types/src/templates/index.d.ts +43 -1
- package/dist/types/src/templates/index.d.ts.map +1 -1
- package/dist/types/src/templates/{echo.d.ts → ping.d.ts} +1 -1
- package/dist/types/src/templates/ping.d.ts.map +1 -0
- package/dist/types/src/testing/data.d.ts +19 -0
- package/dist/types/src/testing/data.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +28 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/actions.d.ts +66 -0
- package/dist/types/src/types/actions.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +1 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +54 -31
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/util/deploy.d.ts +3 -3
- package/dist/types/src/util/deploy.d.ts.map +1 -1
- package/dist/types/src/util/functions.d.ts +5 -2
- package/dist/types/src/util/functions.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +72 -68
- package/src/ScriptPlugin.tsx +99 -64
- package/src/capabilities/app-graph-builder.ts +4 -3
- package/src/capabilities/artifact-definition.ts +1 -1
- package/src/capabilities/blueprint-definition.ts +30 -0
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +14 -4
- package/src/capabilities/react-surface.tsx +17 -5
- package/src/capabilities/settings.ts +3 -3
- package/src/components/DeploymentDialog/DeploymentDialog.stories.tsx +34 -20
- package/src/components/DeploymentDialog/DeploymentDialog.tsx +12 -18
- package/src/components/FrameContainer/FrameContainer.tsx +3 -2
- package/src/components/NotebookContainer.stories.tsx +32 -0
- package/src/components/NotebookContainer.tsx +124 -0
- package/src/components/NotebookStack/NotebookCell.tsx +217 -0
- package/src/components/NotebookStack/NotebookMenu.tsx +47 -0
- package/src/components/NotebookStack/NotebookStack.stories.tsx +32 -0
- package/src/components/NotebookStack/NotebookStack.tsx +79 -0
- package/src/components/NotebookStack/index.ts +6 -0
- package/src/components/ScriptContainer.tsx +2 -2
- package/src/components/ScriptToolbar/ScriptToolbar.stories.tsx +34 -18
- package/src/components/ScriptToolbar/ScriptToolbar.tsx +29 -22
- package/src/components/Settings/ScriptObjectSettings.tsx +109 -29
- package/src/components/Settings/ScriptPluginSettings.tsx +37 -47
- package/src/components/TestPanel/TestPanel.tsx +6 -6
- package/src/components/TypescriptEditor/TypescriptEditor.stories.tsx +74 -27
- package/src/components/TypescriptEditor/TypescriptEditor.tsx +30 -24
- package/src/components/index.ts +3 -0
- package/src/events.ts +2 -2
- package/src/hooks/deploy.ts +17 -18
- package/src/hooks/format.ts +2 -2
- package/src/hooks/template.ts +4 -3
- package/src/hooks/useCreateAndDeployScriptTemplates.ts +3 -3
- package/src/index.ts +1 -0
- package/src/meta.ts +2 -4
- package/src/notebook/eval.ts +105 -0
- package/src/notebook/index.ts +5 -0
- package/src/notebook/notebook.test.ts +70 -0
- package/src/notebook/notebook.ts +183 -0
- package/src/notebook/vfs-parser.test.ts +149 -0
- package/src/notebook/vfs-parser.ts +451 -0
- package/src/templates/chess.ts +2 -0
- package/src/templates/data-generator.ts +2 -0
- package/src/templates/discord.ts +11 -3
- package/src/templates/forex-effect.ts +6 -2
- package/src/templates/forex.ts +2 -0
- package/src/templates/gmail.ts +31 -60
- package/src/templates/index.ts +6 -6
- package/src/testing/data.ts +47 -0
- package/src/testing/index.ts +5 -0
- package/src/translations.ts +31 -4
- package/src/types/actions.ts +53 -0
- package/src/types/index.ts +1 -0
- package/src/types/schema.ts +30 -19
- package/src/util/deploy.ts +20 -33
- package/src/util/functions.ts +35 -6
- package/dist/lib/browser/DeploymentDialog-C3XH2Z56.mjs +0 -12
- package/dist/lib/browser/ScriptContainer-FUBR4OZE.mjs +0 -263
- package/dist/lib/browser/ScriptContainer-FUBR4OZE.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-IABOSTBK.mjs.map +0 -7
- package/dist/lib/browser/chunk-G4A2MGAL.mjs +0 -88
- package/dist/lib/browser/chunk-G4A2MGAL.mjs.map +0 -7
- package/dist/lib/browser/chunk-IS4OG2UW.mjs +0 -39
- package/dist/lib/browser/chunk-IS4OG2UW.mjs.map +0 -7
- package/dist/lib/browser/chunk-MWZDJNCQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-OAVS36Q3.mjs.map +0 -7
- package/dist/lib/browser/chunk-OULPWKXN.mjs.map +0 -7
- package/dist/lib/browser/chunk-QYAREHGH.mjs.map +0 -7
- package/dist/lib/browser/chunk-SUOLJH55.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-SAL2TM7U.mjs.map +0 -7
- package/dist/lib/browser/react-surface-E3SXU6ON.mjs.map +0 -7
- package/dist/lib/browser/settings-KCTBK5TY.mjs.map +0 -7
- package/dist/lib/node-esm/ScriptContainer-VJ75TM24.mjs +0 -264
- package/dist/lib/node-esm/ScriptContainer-VJ75TM24.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-CQTTAYHP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3BBEM2U7.mjs +0 -90
- package/dist/lib/node-esm/chunk-3BBEM2U7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6WMFL3JL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7L4JDSXJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AHXJ6NQU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IO6T72KY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JIPFLBYA.mjs +0 -40
- package/dist/lib/node-esm/chunk-JIPFLBYA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PACUN7RS.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-GO53JOPL.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-W3NRCS5O.mjs.map +0 -7
- package/dist/lib/node-esm/settings-DXZ334A3.mjs.map +0 -7
- package/dist/types/src/templates/echo.d.ts.map +0 -1
- /package/dist/lib/browser/{DeploymentDialog-C3XH2Z56.mjs.map → DeploymentDialog-65TWT6S5.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-5TVBECWH.mjs.map → chunk-OKXN2N7M.mjs.map} +0 -0
- /package/dist/lib/node-esm/{DeploymentDialog-O2XZVRLU.mjs.map → DeploymentDialog-I63ZC2HH.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-35M3CHYE.mjs.map → chunk-NUXZQQ6P.mjs.map} +0 -0
- /package/src/templates/{echo.ts → ping.ts} +0 -0
|
@@ -10,23 +10,23 @@ import { Button, Dialog, Icon, useTranslation } from '@dxos/react-ui';
|
|
|
10
10
|
import { type DataType } from '@dxos/schema';
|
|
11
11
|
|
|
12
12
|
import { useCreateAndDeployScriptTemplates } from '../../hooks/useCreateAndDeployScriptTemplates';
|
|
13
|
-
import {
|
|
13
|
+
import { meta } from '../../meta';
|
|
14
14
|
import { type Template } from '../../templates';
|
|
15
15
|
|
|
16
|
-
export const DEPLOYMENT_DIALOG = `${
|
|
16
|
+
export const DEPLOYMENT_DIALOG = `${meta.id}/deployment/dialog`;
|
|
17
17
|
|
|
18
18
|
// TODO(ZaymonFC):
|
|
19
19
|
// - Show activity and feedback to the user.
|
|
20
20
|
// - Only take an array of templateIds and get the name from the data.
|
|
21
21
|
// - Pending / onError states.
|
|
22
22
|
|
|
23
|
-
type DeploymentDialogProps = {
|
|
23
|
+
export type DeploymentDialogProps = {
|
|
24
24
|
accessToken: DataType.AccessToken;
|
|
25
25
|
scriptTemplates: Template[];
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export const DeploymentDialog = ({ accessToken, scriptTemplates }: DeploymentDialogProps) => {
|
|
29
|
-
const { t } = useTranslation(
|
|
29
|
+
const { t } = useTranslation(meta.id);
|
|
30
30
|
const space = useMemo(() => getSpace(accessToken), [accessToken]);
|
|
31
31
|
|
|
32
32
|
// TODO(ZaymonFC): Thinking further. All of this should get moved to intents to run async in the background.
|
|
@@ -41,12 +41,12 @@ export const DeploymentDialog = ({ accessToken, scriptTemplates }: DeploymentDia
|
|
|
41
41
|
createIntent(LayoutAction.AddToast, {
|
|
42
42
|
part: 'toast',
|
|
43
43
|
subject: {
|
|
44
|
-
id: `${
|
|
44
|
+
id: `${meta.id}/deployment-success`,
|
|
45
45
|
icon: 'ph--check--regular',
|
|
46
46
|
duration: Infinity,
|
|
47
|
-
title: ['script deployment toast label', { ns:
|
|
48
|
-
description: ['script deployment toast description', { ns:
|
|
49
|
-
closeLabel: ['script deployment toast close label', { ns:
|
|
47
|
+
title: ['script deployment toast label', { ns: meta.id, count: scriptTemplates.length }],
|
|
48
|
+
description: ['script deployment toast description', { ns: meta.id, count: scriptTemplates.length }],
|
|
49
|
+
closeLabel: ['script deployment toast close label', { ns: meta.id, count: scriptTemplates.length }],
|
|
50
50
|
},
|
|
51
51
|
}),
|
|
52
52
|
);
|
|
@@ -58,18 +58,12 @@ export const DeploymentDialog = ({ accessToken, scriptTemplates }: DeploymentDia
|
|
|
58
58
|
createIntent(LayoutAction.AddToast, {
|
|
59
59
|
part: 'toast',
|
|
60
60
|
subject: {
|
|
61
|
-
id: `${
|
|
61
|
+
id: `${meta.id}/deployment-error`,
|
|
62
62
|
icon: 'ph--warning--regular',
|
|
63
63
|
duration: Infinity,
|
|
64
|
-
title: ['script deployment error toast label', { ns:
|
|
65
|
-
description: [
|
|
66
|
-
|
|
67
|
-
{ ns: SCRIPT_PLUGIN, count: scriptTemplates.length },
|
|
68
|
-
],
|
|
69
|
-
closeLabel: [
|
|
70
|
-
'script deployment error toast close label',
|
|
71
|
-
{ ns: SCRIPT_PLUGIN, count: scriptTemplates.length },
|
|
72
|
-
],
|
|
64
|
+
title: ['script deployment error toast label', { ns: meta.id, count: scriptTemplates.length }],
|
|
65
|
+
description: ['script deployment error toast description', { ns: meta.id, count: scriptTemplates.length }],
|
|
66
|
+
closeLabel: ['script deployment error toast close label', { ns: meta.id, count: scriptTemplates.length }],
|
|
73
67
|
},
|
|
74
68
|
}),
|
|
75
69
|
);
|
|
@@ -48,7 +48,8 @@ export const FrameContainer = ({ containerUrl, result, debug = true }: FrameCont
|
|
|
48
48
|
// Encodes compiled code via URL.
|
|
49
49
|
invariant(result.sourceHash, 'Source hash is required.');
|
|
50
50
|
const sourceHash = Buffer.from(result.sourceHash).toString('hex');
|
|
51
|
-
const src =
|
|
51
|
+
const src =
|
|
52
|
+
'bundle' in result ? `${containerUrl}?ts=${sourceHash}#code=${encodeURIComponent(result.bundle)}` : undefined;
|
|
52
53
|
|
|
53
54
|
return (
|
|
54
55
|
<>
|
|
@@ -68,7 +69,7 @@ export const FrameContainer = ({ containerUrl, result, debug = true }: FrameCont
|
|
|
68
69
|
{
|
|
69
70
|
timestamp: result.timestamp,
|
|
70
71
|
sourceHash,
|
|
71
|
-
error: result.error,
|
|
72
|
+
error: 'error' in result ? result.error : undefined,
|
|
72
73
|
src,
|
|
73
74
|
},
|
|
74
75
|
undefined,
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
|
|
7
|
+
import { withClientProvider } from '@dxos/react-client/testing';
|
|
8
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
9
|
+
|
|
10
|
+
import { createNotebook } from '../testing';
|
|
11
|
+
import { translations } from '../translations';
|
|
12
|
+
|
|
13
|
+
import { NotebookContainer } from './NotebookContainer';
|
|
14
|
+
|
|
15
|
+
const meta = {
|
|
16
|
+
title: 'plugins/plugin-script/NotebookContainer',
|
|
17
|
+
component: NotebookContainer,
|
|
18
|
+
decorators: [withTheme, withLayout({ container: 'column', classNames: 'is-prose' }), withClientProvider()],
|
|
19
|
+
parameters: {
|
|
20
|
+
translations,
|
|
21
|
+
},
|
|
22
|
+
} satisfies Meta<typeof NotebookContainer>;
|
|
23
|
+
|
|
24
|
+
export default meta;
|
|
25
|
+
|
|
26
|
+
type Story = StoryObj<typeof meta>;
|
|
27
|
+
|
|
28
|
+
export const Default: Story = {
|
|
29
|
+
args: {
|
|
30
|
+
notebook: createNotebook(),
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { useCallback, useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { Ref } from '@dxos/echo';
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { Assistant } from '@dxos/plugin-assistant';
|
|
10
|
+
import { getSpace } from '@dxos/react-client/echo';
|
|
11
|
+
import { DropdownMenu, IconButton, Toolbar, useTranslation } from '@dxos/react-ui';
|
|
12
|
+
import { StackItem } from '@dxos/react-ui-stack';
|
|
13
|
+
import { DataType } from '@dxos/schema';
|
|
14
|
+
|
|
15
|
+
import { meta } from '../meta';
|
|
16
|
+
import { ComputeGraph } from '../notebook';
|
|
17
|
+
import { type Notebook } from '../types';
|
|
18
|
+
|
|
19
|
+
import { NotebookMenu, NotebookStack, type NotebookStackProps } from './NotebookStack';
|
|
20
|
+
import { type TypescriptEditorProps } from './TypescriptEditor';
|
|
21
|
+
|
|
22
|
+
// TODO(burdon): Support calling named deployed functions (as with sheet).
|
|
23
|
+
|
|
24
|
+
export type NotebookContainerProps = {
|
|
25
|
+
role?: string;
|
|
26
|
+
notebook?: Notebook.Notebook;
|
|
27
|
+
} & Pick<TypescriptEditorProps, 'env'>;
|
|
28
|
+
|
|
29
|
+
export const NotebookContainer = ({ notebook, env }: NotebookContainerProps) => {
|
|
30
|
+
const { t } = useTranslation(meta.id);
|
|
31
|
+
const space = getSpace(notebook);
|
|
32
|
+
const graph = useMemo(() => notebook && new ComputeGraph(notebook), [notebook]);
|
|
33
|
+
|
|
34
|
+
// TODO(burdon): Cache values in context (preserve when switched).
|
|
35
|
+
const handleCompute = useCallback(() => {
|
|
36
|
+
graph?.evaluate();
|
|
37
|
+
}, [graph]);
|
|
38
|
+
|
|
39
|
+
const handleRearrange = useCallback<NonNullable<NotebookStackProps['onRearrange']>>(
|
|
40
|
+
(source, target) => {
|
|
41
|
+
invariant(notebook);
|
|
42
|
+
const from = notebook.cells.findIndex((cell) => cell.id === source.id);
|
|
43
|
+
const to = notebook.cells.findIndex((cell) => cell.id === target.id);
|
|
44
|
+
if (from != null && to != null) {
|
|
45
|
+
const cell = notebook.cells.splice(from, 1)[0];
|
|
46
|
+
if (cell) {
|
|
47
|
+
notebook.cells.splice(to, 0, cell);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
[notebook],
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const handleCellInsert = useCallback<NonNullable<NotebookStackProps['onCellInsert']>>(
|
|
55
|
+
(type, after) => {
|
|
56
|
+
invariant(notebook);
|
|
57
|
+
const cell: Notebook.Cell = { id: crypto.randomUUID(), type };
|
|
58
|
+
switch (type) {
|
|
59
|
+
case 'markdown':
|
|
60
|
+
case 'script':
|
|
61
|
+
case 'query': {
|
|
62
|
+
cell.script = Ref.make(DataType.makeText());
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
case 'prompt': {
|
|
67
|
+
if (space) {
|
|
68
|
+
cell.chat = Ref.make(Assistant.makeChat({ queue: space.queues.create() }));
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const idx = after ? notebook.cells.findIndex((cell) => cell.id === after) : notebook.cells.length;
|
|
75
|
+
notebook.cells.splice(idx, 0, cell);
|
|
76
|
+
},
|
|
77
|
+
[space, notebook],
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const handleCellDelete = useCallback<NonNullable<NotebookStackProps['onCellDelete']>>(
|
|
81
|
+
(id) => {
|
|
82
|
+
invariant(notebook);
|
|
83
|
+
const idx = notebook.cells.findIndex((cell) => cell.id === id);
|
|
84
|
+
if (idx !== -1) {
|
|
85
|
+
notebook.cells.splice(idx, 1);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
[notebook],
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<StackItem.Content toolbar>
|
|
93
|
+
<Toolbar.Root textBlockWidth>
|
|
94
|
+
<DropdownMenu.Root>
|
|
95
|
+
<DropdownMenu.Trigger asChild>
|
|
96
|
+
<IconButton icon='ph--plus--regular' iconOnly label={t('notebook cell insert label')} />
|
|
97
|
+
</DropdownMenu.Trigger>
|
|
98
|
+
<NotebookMenu onCellInsert={handleCellInsert} />
|
|
99
|
+
</DropdownMenu.Root>
|
|
100
|
+
<Toolbar.IconButton
|
|
101
|
+
icon='ph--play--fill'
|
|
102
|
+
iconOnly
|
|
103
|
+
label={t('compute label')}
|
|
104
|
+
classNames='text-green-500'
|
|
105
|
+
onClick={handleCompute}
|
|
106
|
+
/>
|
|
107
|
+
</Toolbar.Root>
|
|
108
|
+
<div role='none' className='flex bs-full overflow-hidden -mis-[1px] -mie-[1px]'>
|
|
109
|
+
<NotebookStack
|
|
110
|
+
classNames='container-max-width border-l border-r border-subduedSeparator'
|
|
111
|
+
space={space}
|
|
112
|
+
notebook={notebook}
|
|
113
|
+
graph={graph}
|
|
114
|
+
env={env}
|
|
115
|
+
onRearrange={handleRearrange}
|
|
116
|
+
onCellInsert={handleCellInsert}
|
|
117
|
+
onCellDelete={handleCellDelete}
|
|
118
|
+
/>
|
|
119
|
+
</div>
|
|
120
|
+
</StackItem.Content>
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export default NotebookContainer;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { useCallback, useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { Surface } from '@dxos/app-framework';
|
|
8
|
+
import { Query, Ref } from '@dxos/echo';
|
|
9
|
+
import { QueryBuilder } from '@dxos/echo-query';
|
|
10
|
+
import { invariant } from '@dxos/invariant';
|
|
11
|
+
import { useChatProcessor, useChatServices } from '@dxos/plugin-assistant';
|
|
12
|
+
import { Chat } from '@dxos/plugin-assistant';
|
|
13
|
+
import { Graph } from '@dxos/plugin-explorer/types';
|
|
14
|
+
import { createDocAccessor } from '@dxos/react-client/echo';
|
|
15
|
+
import { type Space } from '@dxos/react-client/echo';
|
|
16
|
+
import { useAsyncEffect, useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
17
|
+
import { QueryEditor, type QueryEditorProps } from '@dxos/react-ui-components';
|
|
18
|
+
import {
|
|
19
|
+
Editor,
|
|
20
|
+
type EditorProps,
|
|
21
|
+
createBasicExtensions,
|
|
22
|
+
createDataExtensions,
|
|
23
|
+
createMarkdownExtensions,
|
|
24
|
+
createThemeExtensions,
|
|
25
|
+
decorateMarkdown,
|
|
26
|
+
} from '@dxos/react-ui-editor';
|
|
27
|
+
import { mx } from '@dxos/react-ui-theme';
|
|
28
|
+
import { isNonNullable } from '@dxos/util';
|
|
29
|
+
|
|
30
|
+
import { meta } from '../../meta';
|
|
31
|
+
import { type ComputeGraph } from '../../notebook';
|
|
32
|
+
import { type Notebook } from '../../types';
|
|
33
|
+
import { TypescriptEditor, type TypescriptEditorProps } from '../TypescriptEditor';
|
|
34
|
+
|
|
35
|
+
import { type NotebookMenuProps } from './NotebookMenu';
|
|
36
|
+
|
|
37
|
+
const editorStyles = 'p-2 pis-3';
|
|
38
|
+
const valueStyles = 'p-1 pis-3';
|
|
39
|
+
|
|
40
|
+
export type NotebookCellProps = {
|
|
41
|
+
space?: Space;
|
|
42
|
+
graph?: ComputeGraph;
|
|
43
|
+
dragging?: boolean;
|
|
44
|
+
cell: Notebook.Cell;
|
|
45
|
+
} & (Pick<NotebookMenuProps, 'onCellInsert' | 'onCellDelete'> & Pick<TypescriptEditorProps, 'env'>);
|
|
46
|
+
|
|
47
|
+
// TODO(burdon): Display errors.
|
|
48
|
+
export const NotebookCell = ({ space, graph, dragging, cell, env }: NotebookCellProps) => {
|
|
49
|
+
const { t } = useTranslation(meta.id);
|
|
50
|
+
|
|
51
|
+
//
|
|
52
|
+
// Common.
|
|
53
|
+
//
|
|
54
|
+
const extensions = useMemo(() => {
|
|
55
|
+
return cell.script?.target
|
|
56
|
+
? [createDataExtensions({ id: cell.id, text: createDocAccessor(cell.script.target, ['content']) })].filter(
|
|
57
|
+
isNonNullable,
|
|
58
|
+
)
|
|
59
|
+
: [];
|
|
60
|
+
}, [cell.script?.target]);
|
|
61
|
+
|
|
62
|
+
//
|
|
63
|
+
// Query.
|
|
64
|
+
//
|
|
65
|
+
const view = cell.view?.target;
|
|
66
|
+
const builder = useMemo(() => new QueryBuilder(), []);
|
|
67
|
+
useAsyncEffect(async () => {
|
|
68
|
+
if (!space || !cell.script?.target) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (cell.type === 'query') {
|
|
73
|
+
const query = cell.script.target.content;
|
|
74
|
+
const filter = builder.build(query);
|
|
75
|
+
if (filter) {
|
|
76
|
+
const ast = Query.select(filter).ast;
|
|
77
|
+
const view = cell.view?.target;
|
|
78
|
+
if (!view) {
|
|
79
|
+
const graph = Graph.make({ query: { ast } });
|
|
80
|
+
const { view } = await Graph.makeView({ space, presentation: graph });
|
|
81
|
+
cell.view = Ref.make(view);
|
|
82
|
+
} else {
|
|
83
|
+
view.query.ast = ast;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}, [space, builder, cell, cell.script?.target?.content]);
|
|
88
|
+
|
|
89
|
+
const handleQueryChange = useCallback<NonNullable<QueryEditorProps['onChange']>>(
|
|
90
|
+
(value: string) => {
|
|
91
|
+
invariant(cell.script?.target);
|
|
92
|
+
cell.script.target.content = value;
|
|
93
|
+
},
|
|
94
|
+
[cell],
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
//
|
|
98
|
+
// Prompt.
|
|
99
|
+
// TODO(burdon): Add values to context or system message (via blueprint?).
|
|
100
|
+
//
|
|
101
|
+
const services = useChatServices({ space, chat: cell.chat?.target });
|
|
102
|
+
const processor = useChatProcessor({ chat: cell.chat?.target, services });
|
|
103
|
+
|
|
104
|
+
switch (cell.type) {
|
|
105
|
+
case 'markdown':
|
|
106
|
+
if (!cell.script?.target) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return (
|
|
111
|
+
<MarkdownEditor
|
|
112
|
+
id={cell.id}
|
|
113
|
+
classNames={editorStyles}
|
|
114
|
+
initialValue={cell.script.target.content}
|
|
115
|
+
extensions={extensions}
|
|
116
|
+
/>
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
case 'script':
|
|
120
|
+
if (!cell.script?.target) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
<>
|
|
126
|
+
<TypescriptEditor
|
|
127
|
+
id={cell.id}
|
|
128
|
+
role='section'
|
|
129
|
+
classNames={editorStyles}
|
|
130
|
+
initialValue={cell.script.target.content}
|
|
131
|
+
extensions={extensions}
|
|
132
|
+
env={env}
|
|
133
|
+
options={{
|
|
134
|
+
placeholder: t('notebook cell placeholder'),
|
|
135
|
+
highlightActiveLine: false,
|
|
136
|
+
lineNumbers: false,
|
|
137
|
+
}}
|
|
138
|
+
/>
|
|
139
|
+
<NotebookCellValue cell={cell} graph={graph} />
|
|
140
|
+
</>
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
case 'query':
|
|
144
|
+
if (!cell.script?.target) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return (
|
|
149
|
+
<div className={mx('bs-full overflow-hidden grid', view && !dragging && 'grid-rows-[min-content_1fr]')}>
|
|
150
|
+
<QueryEditor
|
|
151
|
+
id={cell.id}
|
|
152
|
+
classNames={[editorStyles, 'border-b border-subduedSeparator']}
|
|
153
|
+
db={space?.db}
|
|
154
|
+
value={cell.script.target.content}
|
|
155
|
+
onChange={handleQueryChange}
|
|
156
|
+
/>
|
|
157
|
+
{view && !dragging && <Surface role='section' limit={1} data={{ subject: view }} />}
|
|
158
|
+
</div>
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
case 'prompt':
|
|
162
|
+
if (!cell.chat?.target || !processor) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<Chat.Root chat={cell.chat.target} processor={processor}>
|
|
168
|
+
<Chat.Thread overscroll={0} />
|
|
169
|
+
<Chat.Prompt settings={false} classNames='p-2 border-t border-subduedSeparator' />
|
|
170
|
+
</Chat.Root>
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
default:
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
const NotebookCellValue = ({ cell, graph }: NotebookCellProps) => {
|
|
179
|
+
const name = graph?.expressions.value[cell.id]?.name;
|
|
180
|
+
const value = graph?.values.value[cell.id];
|
|
181
|
+
if (value == null) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return (
|
|
186
|
+
<div
|
|
187
|
+
className={mx(
|
|
188
|
+
'flex is-full bg-groupSurface border-t border-subduedSeparator text-description font-mono',
|
|
189
|
+
valueStyles,
|
|
190
|
+
)}
|
|
191
|
+
>
|
|
192
|
+
{name && (
|
|
193
|
+
<>
|
|
194
|
+
<span className='text-successText'>{name}</span>
|
|
195
|
+
<span className='text-description'> = </span>
|
|
196
|
+
</>
|
|
197
|
+
)}
|
|
198
|
+
<span>{value}</span>
|
|
199
|
+
</div>
|
|
200
|
+
);
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const MarkdownEditor = ({ extensions: extensionsParam, ...props }: EditorProps) => {
|
|
204
|
+
const { t } = useTranslation(meta.id);
|
|
205
|
+
const { themeMode } = useThemeContext();
|
|
206
|
+
const extensions = useMemo(() => {
|
|
207
|
+
return [
|
|
208
|
+
createBasicExtensions({ placeholder: t('notebook markdown placeholder') }),
|
|
209
|
+
createThemeExtensions({ themeMode, syntaxHighlighting: true }),
|
|
210
|
+
createMarkdownExtensions(),
|
|
211
|
+
decorateMarkdown(),
|
|
212
|
+
extensionsParam,
|
|
213
|
+
].filter(isNonNullable);
|
|
214
|
+
}, [extensionsParam]);
|
|
215
|
+
|
|
216
|
+
return <Editor {...props} extensions={extensions} moveToEnd />;
|
|
217
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
import { DropdownMenu, useTranslation } from '@dxos/react-ui';
|
|
8
|
+
|
|
9
|
+
import { meta } from '../../meta';
|
|
10
|
+
import { type Notebook } from '../../types';
|
|
11
|
+
|
|
12
|
+
export type NotebookMenuProps = {
|
|
13
|
+
cell?: Notebook.Cell;
|
|
14
|
+
onCellInsert?: (type: Notebook.CellType, after: string | undefined) => void;
|
|
15
|
+
onCellDelete?: (id: string) => void;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// TODO(burdon): Better way to organize menu?
|
|
19
|
+
export const NotebookMenu = ({ cell, onCellInsert, onCellDelete }: NotebookMenuProps) => {
|
|
20
|
+
const { t } = useTranslation(meta.id);
|
|
21
|
+
return (
|
|
22
|
+
<DropdownMenu.Portal>
|
|
23
|
+
<DropdownMenu.Content>
|
|
24
|
+
<DropdownMenu.Viewport>
|
|
25
|
+
<DropdownMenu.Item onClick={() => onCellInsert?.('script', cell?.id)}>
|
|
26
|
+
{t('notebook cell insert script label')}
|
|
27
|
+
</DropdownMenu.Item>
|
|
28
|
+
<DropdownMenu.Item onClick={() => onCellInsert?.('prompt', cell?.id)}>
|
|
29
|
+
{t('notebook cell insert prompt label')}
|
|
30
|
+
</DropdownMenu.Item>
|
|
31
|
+
<DropdownMenu.Item onClick={() => onCellInsert?.('query', cell?.id)}>
|
|
32
|
+
{t('notebook cell insert query label')}
|
|
33
|
+
</DropdownMenu.Item>
|
|
34
|
+
<DropdownMenu.Item onClick={() => onCellInsert?.('markdown', cell?.id)}>
|
|
35
|
+
{t('notebook cell insert markdown label')}
|
|
36
|
+
</DropdownMenu.Item>
|
|
37
|
+
{cell && onCellDelete && (
|
|
38
|
+
<DropdownMenu.Item onClick={() => onCellDelete?.(cell.id)}>
|
|
39
|
+
{t('notebook cell delete label')}
|
|
40
|
+
</DropdownMenu.Item>
|
|
41
|
+
)}
|
|
42
|
+
</DropdownMenu.Viewport>
|
|
43
|
+
<DropdownMenu.Arrow />
|
|
44
|
+
</DropdownMenu.Content>
|
|
45
|
+
</DropdownMenu.Portal>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
|
|
7
|
+
import { withClientProvider } from '@dxos/react-client/testing';
|
|
8
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
9
|
+
|
|
10
|
+
import { createNotebook } from '../../testing';
|
|
11
|
+
import { translations } from '../../translations';
|
|
12
|
+
|
|
13
|
+
import { NotebookStack } from './NotebookStack';
|
|
14
|
+
|
|
15
|
+
const meta = {
|
|
16
|
+
title: 'plugins/plugin-script/NotebookStack',
|
|
17
|
+
component: NotebookStack,
|
|
18
|
+
decorators: [withTheme, withLayout({ container: 'column', classNames: 'is-prose' }), withClientProvider()],
|
|
19
|
+
parameters: {
|
|
20
|
+
translations,
|
|
21
|
+
},
|
|
22
|
+
} satisfies Meta<typeof NotebookStack>;
|
|
23
|
+
|
|
24
|
+
export default meta;
|
|
25
|
+
|
|
26
|
+
type Story = StoryObj<typeof meta>;
|
|
27
|
+
|
|
28
|
+
export const Default: Story = {
|
|
29
|
+
args: {
|
|
30
|
+
notebook: createNotebook(),
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
import { DropdownMenu, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
|
|
8
|
+
import { Stack, StackItem, type StackProps } from '@dxos/react-ui-stack';
|
|
9
|
+
|
|
10
|
+
import { meta } from '../../meta';
|
|
11
|
+
import { type Notebook } from '../../types';
|
|
12
|
+
import { type TypescriptEditorProps } from '../TypescriptEditor';
|
|
13
|
+
|
|
14
|
+
import { NotebookCell, type NotebookCellProps } from './NotebookCell';
|
|
15
|
+
import { NotebookMenu } from './NotebookMenu';
|
|
16
|
+
|
|
17
|
+
const minSectionHeight = 'min-bs-[16rem]';
|
|
18
|
+
|
|
19
|
+
export type NotebookStackProps = ThemedClassName<
|
|
20
|
+
{
|
|
21
|
+
notebook?: Notebook.Notebook;
|
|
22
|
+
onRearrange?: StackProps['onRearrange'];
|
|
23
|
+
} & (Pick<NotebookSectionProps, 'space' | 'graph' | 'onCellInsert' | 'onCellDelete'> &
|
|
24
|
+
Pick<TypescriptEditorProps, 'env'>)
|
|
25
|
+
>;
|
|
26
|
+
|
|
27
|
+
// TODO(burdon): Option for narrow rail (with compact buttons that align with first button in toolbar).
|
|
28
|
+
export const NotebookStack = ({ classNames, notebook, onRearrange, ...props }: NotebookStackProps) => {
|
|
29
|
+
return (
|
|
30
|
+
<Stack classNames={classNames} orientation='vertical' size='contain' rail onRearrange={onRearrange}>
|
|
31
|
+
{notebook?.cells.map((cell, i) => (
|
|
32
|
+
<NotebookSection key={i} cell={cell} {...props} />
|
|
33
|
+
))}
|
|
34
|
+
</Stack>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
type NotebookSectionProps = NotebookCellProps;
|
|
39
|
+
|
|
40
|
+
const NotebookSection = ({ cell, space, env, onCellInsert, onCellDelete, ...props }: NotebookSectionProps) => {
|
|
41
|
+
const { t } = useTranslation(meta.id);
|
|
42
|
+
const resizable = cell.type === 'query' || cell.type === 'prompt';
|
|
43
|
+
|
|
44
|
+
// TOOD(burdon): Set size if no extrinsic size (provider).
|
|
45
|
+
return (
|
|
46
|
+
<StackItem.Root role='section' item={cell} draggable classNames={resizable && minSectionHeight}>
|
|
47
|
+
<StackItem.Heading classNames='bs-full p-1 justify-between attention-surface'>
|
|
48
|
+
<StackItem.DragHandle asChild>
|
|
49
|
+
<IconButton variant='ghost' icon='ph--dots-six-vertical--regular' iconOnly label='Drag handle' />
|
|
50
|
+
</StackItem.DragHandle>
|
|
51
|
+
<DropdownMenu.Root>
|
|
52
|
+
<DropdownMenu.Trigger asChild>
|
|
53
|
+
<IconButton
|
|
54
|
+
variant='ghost'
|
|
55
|
+
icon='ph--dots-three--regular'
|
|
56
|
+
iconOnly
|
|
57
|
+
label={t('notebook cell insert label')}
|
|
58
|
+
/>
|
|
59
|
+
</DropdownMenu.Trigger>
|
|
60
|
+
<NotebookMenu cell={cell} onCellInsert={onCellInsert} onCellDelete={onCellDelete} />
|
|
61
|
+
</DropdownMenu.Root>
|
|
62
|
+
{resizable && <StackItem.ResizeHandle />}
|
|
63
|
+
</StackItem.Heading>
|
|
64
|
+
|
|
65
|
+
{/* TODO(burdon): Move drag preview to outer stack (uniformly). */}
|
|
66
|
+
<StackItem.DragPreview>
|
|
67
|
+
{({ item: cell }) => (
|
|
68
|
+
<StackItem.Content classNames='overflow-visible bg-groupSurface border border-subduedSeparator'>
|
|
69
|
+
<NotebookCell space={space} cell={cell} env={env} dragging />
|
|
70
|
+
</StackItem.Content>
|
|
71
|
+
)}
|
|
72
|
+
</StackItem.DragPreview>
|
|
73
|
+
|
|
74
|
+
<StackItem.Content classNames='overflow-visible'>
|
|
75
|
+
<NotebookCell space={space} cell={cell} env={env} {...props} />
|
|
76
|
+
</StackItem.Content>
|
|
77
|
+
</StackItem.Root>
|
|
78
|
+
);
|
|
79
|
+
};
|
|
@@ -11,7 +11,7 @@ import { createDataExtensions, listener, stackItemContentEditorClassNames } from
|
|
|
11
11
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
12
12
|
|
|
13
13
|
import { useDeployState, useToolbarState } from '../hooks';
|
|
14
|
-
import { type
|
|
14
|
+
import { type ScriptSettings } from '../types';
|
|
15
15
|
|
|
16
16
|
import { ScriptToolbar } from './ScriptToolbar';
|
|
17
17
|
import { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor';
|
|
@@ -19,7 +19,7 @@ import { TypescriptEditor, type TypescriptEditorProps } from './TypescriptEditor
|
|
|
19
19
|
export type ScriptEditorProps = {
|
|
20
20
|
role: string;
|
|
21
21
|
script: ScriptType;
|
|
22
|
-
settings?:
|
|
22
|
+
settings?: ScriptSettings;
|
|
23
23
|
} & Pick<TypescriptEditorProps, 'env'>;
|
|
24
24
|
|
|
25
25
|
export const ScriptContainer = ({ role, script, settings = { editorInputMode: 'vscode' }, env }: ScriptEditorProps) => {
|