From df170f53e2c88bd77a552e42b2eba5470b15cb03 Mon Sep 17 00:00:00 2001 From: Bob Zeleznik Date: Thu, 9 Apr 2020 02:31:19 -0400 Subject: cleaned up some scriptingBox code -- added parameters --- src/client/util/Scripting.ts | 8 ++++ src/client/views/ScriptBox.tsx | 4 +- src/client/views/nodes/ScriptingBox.scss | 3 ++ src/client/views/nodes/ScriptingBox.tsx | 81 ++++++++++++++++---------------- 4 files changed, 52 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/client/util/Scripting.ts b/src/client/util/Scripting.ts index f97d91d10..57d22eaf8 100644 --- a/src/client/util/Scripting.ts +++ b/src/client/util/Scripting.ts @@ -24,6 +24,8 @@ export interface ScriptError { export type ScriptResult = ScriptSucccess | ScriptError; +export type ScriptParam = { [name: string]: string }; + export interface CompiledScript { readonly compiled: true; readonly originalScript: string; @@ -37,6 +39,12 @@ export interface CompileError { } export type CompileResult = CompiledScript | CompileError; +export function isCompileError(toBeDetermined: CompileResult): toBeDetermined is CompileError { + if ((toBeDetermined as CompileError).errors) { + return true + } + return false +} export namespace Scripting { export function addGlobal(global: { name: string }): void; diff --git a/src/client/views/ScriptBox.tsx b/src/client/views/ScriptBox.tsx index 0352ddaca..6735a8b54 100644 --- a/src/client/views/ScriptBox.tsx +++ b/src/client/views/ScriptBox.tsx @@ -43,9 +43,7 @@ export class ScriptBox extends React.Component { overlayDisposer?: () => void; onFocus = () => { - if (this.overlayDisposer) { - this.overlayDisposer(); - } + this.overlayDisposer?.(); this.overlayDisposer = OverlayView.Instance.addElement(, { x: 0, y: 0 }); } diff --git a/src/client/views/nodes/ScriptingBox.scss b/src/client/views/nodes/ScriptingBox.scss index f31c72bb2..678a1a22d 100644 --- a/src/client/views/nodes/ScriptingBox.scss +++ b/src/client/views/nodes/ScriptingBox.scss @@ -13,6 +13,9 @@ .scriptingBox-errorMessage { overflow: auto; } + .scripting-params { + background: "beige"; + } .scriptingBox-textArea { width: 100%; height: 100%; diff --git a/src/client/views/nodes/ScriptingBox.tsx b/src/client/views/nodes/ScriptingBox.tsx index 74d9c2e94..93956592f 100644 --- a/src/client/views/nodes/ScriptingBox.tsx +++ b/src/client/views/nodes/ScriptingBox.tsx @@ -1,22 +1,21 @@ import { action, observable, computed } from "mobx"; import { observer } from "mobx-react"; import * as React from "react"; -import { Opt } from "../../../new_fields/Doc"; import { documentSchema } from "../../../new_fields/documentSchemas"; -import { createSchema, makeInterface } from "../../../new_fields/Schema"; +import { createSchema, makeInterface, listSpec } from "../../../new_fields/Schema"; import { ScriptField } from "../../../new_fields/ScriptField"; -import { StrCast, ScriptCast } from "../../../new_fields/Types"; -import { returnTrue } from "../../../Utils"; +import { StrCast, ScriptCast, Cast } from "../../../new_fields/Types"; import { InteractionUtils } from "../../util/InteractionUtils"; -import { CompileScript } from "../../util/Scripting"; +import { CompileScript, isCompileError, ScriptParam } from "../../util/Scripting"; import { DocAnnotatableComponent } from "../DocComponent"; import { EditableView } from "../EditableView"; import { FieldView, FieldViewProps } from "../nodes/FieldView"; import "./ScriptingBox.scss"; +import { OverlayView } from "../OverlayView"; +import { DocumentIconContainer } from "./DocumentIcon"; +import { List } from "../../../new_fields/List"; -const ScriptingSchema = createSchema({ -}); - +const ScriptingSchema = createSchema({}); type ScriptingDocument = makeInterface<[typeof ScriptingSchema, typeof documentSchema]>; const ScriptingDocument = makeInterface(ScriptingSchema, documentSchema); @@ -25,66 +24,66 @@ export class ScriptingBox extends DocAnnotatableComponent void; + @observable private _errorMessage: string = ""; + @computed get rawScript() { return StrCast(this.dataDoc[this.props.fieldKey + "-raw"]); } + @computed get compileParams() { return Cast(this.dataDoc[this.props.fieldKey + "-params"], listSpec("string"), []); } set rawScript(value) { this.dataDoc[this.props.fieldKey + "-raw"] = value; } + set compileParams(value) { this.dataDoc[this.props.fieldKey + "-params"] = value; } @action componentDidMount() { this.rawScript = ScriptCast(this.dataDoc[this.props.fieldKey])?.script?.originalScript || this.rawScript; } - @action - onChange = (e: React.ChangeEvent) => { - this.rawScript = e.target.value; - } - - @action - onError = (error: any) => { - this._errorMessage = (error as any).map((e: any) => e.messageText).join(" "); - } - @action onCompile = () => { - const result = CompileScript(this.rawScript, {}); - this._errorMessage = ""; - if (result.compiled) { - this._errorMessage = ""; - this.dataDoc[this.props.fieldKey] = new ScriptField(result); - } - else { - this.dataDoc[this.props.fieldKey] = undefined; - this.onError(result.errors); - } + const params = this.compileParams.reduce((o: ScriptParam, p: string) => { o[p] = "any"; return o; }, {} as ScriptParam); + const result = CompileScript(this.rawScript, { + editable: true, + transformer: DocumentIconContainer.getTransformer(), + params + }); + this.dataDoc[this.props.fieldKey] = result.compiled ? new ScriptField(result) : undefined; + this._errorMessage = isCompileError(result) ? result.errors.map(e => e.messageText).join("\n") : ""; + return ScriptCast(this.dataDoc[this.props.fieldKey]); } @action onRun = () => { - this.onCompile(); - ScriptCast(this.dataDoc[this.props.fieldKey])?.script.run({}, - (err: any) => { - this._errorMessage = ""; - this.onError(err); - }); + this.onCompile()?.script.run({}, err => this._errorMessage = err.map((e: any) => e.messageText).join("\n")); + } + + onFocus = () => { + this._overlayDisposer?.(); + this._overlayDisposer = OverlayView.Instance.addElement(, { x: 0, y: 0 }); } render() { - let onFocus: Opt<() => void> = undefined, onBlur: Opt<() => void> = undefined; const params = ""} - SetValue={returnTrue} + SetValue={value => { this.compileParams = new List(value.split(" ").filter(s => s !== " ")); return true; }} />; return ( -
this.props.isSelected() && e.stopPropagation()} onWheel={(e) => this.props.isSelected() && e.stopPropagation()}> +
this.props.isSelected(true) && e.stopPropagation()} + onWheel={e => this.props.isSelected(true) && e.stopPropagation()}>
-