From b21aeae569c3ebcf2538918a13cf64b9d4c8bade Mon Sep 17 00:00:00 2001 From: anika-ahluwalia Date: Mon, 8 Jun 2020 10:57:59 -0500 Subject: adding ScriptManager and saving --- src/client/util/ScriptManager.ts | 63 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/client/util/ScriptManager.ts (limited to 'src/client/util/ScriptManager.ts') diff --git a/src/client/util/ScriptManager.ts b/src/client/util/ScriptManager.ts new file mode 100644 index 000000000..5bddb44ca --- /dev/null +++ b/src/client/util/ScriptManager.ts @@ -0,0 +1,63 @@ +import { Doc, DocListCast } from "../../fields/Doc"; +import { List } from "../../fields/List"; +import { Docs } from "../documents/Documents"; +import { Scripting, ScriptParam } from "./Scripting"; +import { StrCast } from "../../fields/Types"; + + +export class ScriptManager { + + private static _instance: ScriptManager; + public static get Instance(): ScriptManager { + return this._instance || (this._instance = new this()); + } + private constructor() { + } + + public get ScriptManagerDoc(): Doc | undefined { + return Docs.Prototypes.MainScriptDocument(); + } + + public getAllScripts(): Doc[] { + const sdoc = ScriptManager.Instance.ScriptManagerDoc; + if (sdoc) { + const docs = DocListCast(sdoc.data); + return docs; + } + return []; + } + + public addScript(scriptDoc: Doc): boolean { + const scriptList = ScriptManager.Instance.getAllScripts(); + scriptList.push(scriptDoc); + if (ScriptManager.Instance.ScriptManagerDoc) { + ScriptManager.Instance.ScriptManagerDoc.data = new List(scriptList); + return true; + } + return false; + } + + public deleteScript(scriptDoc: Doc): boolean { + const scriptList = ScriptManager.Instance.getAllScripts(); + const index = ScriptManager.Instance.getAllScripts().indexOf(scriptDoc); + if (index > -1) { + scriptList.splice(index, 1); + if (ScriptManager.Instance.ScriptManagerDoc) { + ScriptManager.Instance.ScriptManagerDoc.data = new List(scriptList); + return true; + } + } + return false; + } +} + +const scriptList = ScriptManager.Instance.getAllScripts(); + +scriptList.forEach((scriptDoc: Doc) => { + + const p = scriptDoc.compileParams?.reduce((o: ScriptParam, p: string) => { o[p] = "any"; return o; }, {} as ScriptParam); + const f = new Function(...Array.from(Object.keys(p)), StrCast(scriptDoc.rawScript)); + + Scripting.addGlobal(f, StrCast(scriptDoc.description), StrCast(p), StrCast(scriptDoc.name)); + +}); \ No newline at end of file -- cgit v1.2.3-70-g09d2 From c232bbfd28937c139ae18727310c91d9c6c2dbec Mon Sep 17 00:00:00 2001 From: anika-ahluwalia Date: Mon, 8 Jun 2020 13:07:11 -0500 Subject: added function UI --- src/client/util/ScriptManager.ts | 25 ++++++++- src/client/util/Scripting.ts | 14 ++++- src/client/views/nodes/ScriptingBox.scss | 2 + src/client/views/nodes/ScriptingBox.tsx | 96 +++++++++++++++++++++++++++++--- 4 files changed, 126 insertions(+), 11 deletions(-) (limited to 'src/client/util/ScriptManager.ts') diff --git a/src/client/util/ScriptManager.ts b/src/client/util/ScriptManager.ts index 5bddb44ca..c87fdf5fd 100644 --- a/src/client/util/ScriptManager.ts +++ b/src/client/util/ScriptManager.ts @@ -2,7 +2,8 @@ import { Doc, DocListCast } from "../../fields/Doc"; import { List } from "../../fields/List"; import { Docs } from "../documents/Documents"; import { Scripting, ScriptParam } from "./Scripting"; -import { StrCast } from "../../fields/Types"; +import { StrCast, Cast } from "../../fields/Types"; +import { listSpec } from "../../fields/Schema"; export class ScriptManager { @@ -38,6 +39,10 @@ export class ScriptManager { } public deleteScript(scriptDoc: Doc): boolean { + + if (scriptDoc.funcName) { + Scripting.removeGlobal(StrCast(scriptDoc.funcName)); + } const scriptList = ScriptManager.Instance.getAllScripts(); const index = ScriptManager.Instance.getAllScripts().indexOf(scriptDoc); if (index > -1) { @@ -55,9 +60,23 @@ const scriptList = ScriptManager.Instance.getAllScripts(); scriptList.forEach((scriptDoc: Doc) => { - const p = scriptDoc.compileParams?.reduce((o: ScriptParam, p: string) => { o[p] = "any"; return o; }, {} as ScriptParam); + const params = Cast(scriptDoc.compileParams, listSpec("string"), []); + const p = params.reduce((o: ScriptParam, p: string) => { o[p] = "any"; return o; }, {} as ScriptParam); const f = new Function(...Array.from(Object.keys(p)), StrCast(scriptDoc.rawScript)); - Scripting.addGlobal(f, StrCast(scriptDoc.description), StrCast(p), StrCast(scriptDoc.name)); + let parameters = "("; + params.forEach((element: string, i: number) => { + if (i === params.length - 1) { + parameters = parameters + element + ")"; + } else { + parameters = parameters + element + ", "; + } + }); + + if (parameters === "(") { + Scripting.addGlobal(f, StrCast(scriptDoc.description), StrCast(scriptDoc.funcName)); + } else { + Scripting.addGlobal(f, StrCast(scriptDoc.description), parameters, StrCast(scriptDoc.funcName)); + } }); \ No newline at end of file diff --git a/src/client/util/Scripting.ts b/src/client/util/Scripting.ts index 5619b22b0..16012eb5a 100644 --- a/src/client/util/Scripting.ts +++ b/src/client/util/Scripting.ts @@ -65,7 +65,11 @@ export namespace Scripting { obj = [nameOrGlobal]; obj.push(global); if (params) { - obj.push(params); + if (params.indexOf("(") > 0) { + obj.push(params); + } else { + n = params; + } } if (name) { n = name; @@ -93,6 +97,14 @@ export namespace Scripting { scriptingGlobals = globals; } + export function removeGlobal(name: string) { + if (_scriptingGlobals.hasKey(name)) { + delete _scriptingGlobals.container[name]; + return true; + } + return false; + } + export function resetScriptingGlobals() { scriptingGlobals = _scriptingGlobals; } diff --git a/src/client/views/nodes/ScriptingBox.scss b/src/client/views/nodes/ScriptingBox.scss index f28a2fcef..1e4dc4868 100644 --- a/src/client/views/nodes/ScriptingBox.scss +++ b/src/client/views/nodes/ScriptingBox.scss @@ -35,6 +35,8 @@ flex-direction: row; justify-content: center; + + .scriptingBox-textArea { flex: 70; height: 100%; diff --git a/src/client/views/nodes/ScriptingBox.tsx b/src/client/views/nodes/ScriptingBox.tsx index 6f94ae8f9..2e7b544d2 100644 --- a/src/client/views/nodes/ScriptingBox.tsx +++ b/src/client/views/nodes/ScriptingBox.tsx @@ -39,6 +39,7 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent p.split(":")[0].trim()); } @computed({ keepAlive: true }) get paramsTypes() { return this.compileParams.map(p => p.split(":")[1].trim()); } @@ -213,20 +217,46 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent { + this._errorMessage = ""; this._applied = false; + this._function = false; } @action onSave = () => { if (this.onCompile()) { - this.dataDoc.funcName = "testingTitle"; - this.dataDoc.descripition = "description test"; - ScriptManager.Instance.addScript(this.dataDoc); + this._function = true; } else { this._errorMessage = "Can not save script, does not compile"; } } + @action + onCreate = () => { + + if (this._functionName.length === 0) { + this._errorMessage = "Must enter a function name"; + return false; + } + + if (this._functionName.indexOf(" ") > 0) { + this._errorMessage = "Name can not include spaces"; + return false; + } + + this.dataDoc.funcName = this._functionName; + this.dataDoc.descripition = this._functionDescription; + + ScriptManager.Instance.deleteScript(this.dataDoc); + + this.dataDoc.funcName = "testingTitle"; + this.dataDoc.descripition = "description test"; + + ScriptManager.Instance.addScript(this.dataDoc); + + console.log("created"); + } + // overlays document numbers (ex. d32) over all documents when clicked on onFocus = () => { this._overlayDisposer?.(); @@ -270,6 +300,40 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent this._functionDescription = e.target.value} + placeholder="enter description here" + value={this._functionDescription} + style={{ height: "40%", width: "100%" }} + />; + + const nameInput = +