aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/ScriptingBox.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/ScriptingBox.tsx')
-rw-r--r--src/client/views/nodes/ScriptingBox.tsx168
1 files changed, 156 insertions, 12 deletions
diff --git a/src/client/views/nodes/ScriptingBox.tsx b/src/client/views/nodes/ScriptingBox.tsx
index f84b996ab..55525ee41 100644
--- a/src/client/views/nodes/ScriptingBox.tsx
+++ b/src/client/views/nodes/ScriptingBox.tsx
@@ -15,10 +15,10 @@ import { OverlayView } from "../OverlayView";
import { DocumentIconContainer, DocumentIcon } from "./DocumentIcon";
import { List } from "../../../fields/List";
import { DragManager } from "../../util/DragManager";
-import { Doc } from "../../../fields/Doc";
-import { Dropdown } from "prosemirror-menu";
-import { isNumber } from "util";
import { faSearch, faKaaba } from "@fortawesome/free-solid-svg-icons";
+import { undoBatch } from "../../util/UndoManager";
+import { Utils } from "../../../Utils";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
const ScriptingSchema = createSchema({});
type ScriptingDocument = makeInterface<[typeof ScriptingSchema, typeof documentSchema]>;
@@ -40,11 +40,14 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
@observable private _paramsNames: string[] = [];
@observable private _paramsTypes: string[] = [];
@observable private _paramsValues: string[] = [];
+ @observable private _paramsCollapsed: boolean[] = [];
@computed get rawScript() { return StrCast(this.dataDoc[this.props.fieldKey + "-rawScript"], StrCast(this.layoutDoc[this.props.fieldKey + "-rawScript"])); }
@computed get compileParams() { return Cast(this.dataDoc[this.props.fieldKey + "-params"], listSpec("string"), Cast(this.layoutDoc[this.props.fieldKey + "-params"], listSpec("string"), [])); }
set rawScript(value) { this.dataDoc[this.props.fieldKey + "-rawScript"] = value; }
+ stopPropagation = (e: React.SyntheticEvent) => e.stopPropagation();
+
set compileParams(value) { this.dataDoc[this.props.fieldKey + "-params"] = value; }
@action
@@ -197,9 +200,37 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
@action
onDelete = (num: number) => {
this.compileParams.splice(num, 1);
- // delete from fields, delete from _paramNames, _paramTypes, _paramValues
+ const name = this._paramsNames[this._paramsNames.length - num - 1];
+ this.props.Document[name] = undefined;
+ this._paramsNames.splice(this._paramsNames.length - num - 1, 1);
+ this._paramsTypes.splice(this._paramsTypes.length - num - 1, 1);
+ this._paramsValues.splice(this._paramsValues.length - num - 1, 1);
+ }
+
+ @undoBatch
+ viewChanged = (e: React.ChangeEvent) => {
+ //@ts-ignore
+ this.document._viewType = e.target.selectedOptions[0].value;
+ }
+
+ @action
+ selected = (val: string, index: number, name: string) => {
+ this.stopPropagation;
+ this.props.Document[name] = val;
+ this._paramsValues[index] = val;
}
+ @action
+ toggleCollapse = (num: number) => {
+ console.log("hello");
+ if (this._paramsCollapsed[num]) {
+ this._paramsCollapsed[num] = false;
+ } else {
+ this._paramsCollapsed[num] = true;
+ }
+ }
+
+
render() {
const params = <EditableView
@@ -214,7 +245,8 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
const parameter = value.split(":");
if (parameter[1] !== undefined) {
if (parameter[1].trim() === "Doc" || parameter[1].trim() === "string"
- || parameter[1].split("|")[1] || parameter[1].trim() === "number") {
+ || parameter[1].split("|")[1] || parameter[1].trim() === "number"
+ || parameter[1].trim() === "boolean") {
if (!!!this._paramsNames.includes(parameter[0].trim()) &&
this.props.Document[parameter[0].trim()] === undefined) {
@@ -227,6 +259,7 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
this._paramsNames.push(parameter[0].trim());
this._paramsTypes.push(parameter[1].trim());
this._paramsValues.push("undefined");
+ this._paramsCollapsed.push(true);
return true;
} else {
@@ -269,9 +302,33 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
onDrop={(e: Event, de: DragManager.DropEvent) => this.onDrop(e, de, i)}
SetValue={value => {
if (value !== "" && value !== " ") {
- this.compileParams[i] = value;
- parameter = value;
- return true;
+ const parameter = value.split(":");
+ if (parameter[1] !== undefined) {
+ if (parameter[1].trim() === "Doc" || parameter[1].trim() === "string"
+ || parameter[1].split("|")[1] || parameter[1].trim() === "number"
+ || parameter[1].trim() === "boolean") {
+
+ if ((!!!this._paramsNames.includes(parameter[0].trim()) &&
+ this.props.Document[parameter[0].trim()] === undefined) || parameter[0].trim() === this._paramsNames[this._paramsNames.length - i - 1]) {
+ this._errorMessage = "";
+ this._paramsNames[this._paramsNames.length - i - 1] = parameter[0].trim();
+ this._paramsTypes[this._paramsTypes.length - i - 1] = parameter[1].trim();
+ this._paramsValues[this._paramsValues.length - i - 1] = "undefined";
+ this.compileParams[i] = value;
+ return true;
+
+ } else {
+ this._errorMessage = "this name has already been used";
+ return false;
+ }
+ } else {
+ this._errorMessage = "this type is not supported";
+ return false;
+ }
+ } else {
+ this._errorMessage = "must set type of parameter";
+ return false;
+ }
} else {
this.onDelete(i);
return true;
@@ -348,8 +405,7 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
<div className="scriptingBox-paramNames">
{parameter + ":" + this._paramsTypes[i] + " = "}
</div>
- <div className="scriptingBox-paramInputs"
- onFocus={this.onFocus}>
+ <div className="scriptingBox-paramInputs">
<EditableView
contents={this.props.Document[parameter] ?? "undefined"}
display={"block"}
@@ -380,8 +436,7 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
<div className="scriptingBox-paramNames">
{parameter + ":" + this._paramsTypes[i] + " = "}
</div>
- <div className="scriptingBox-paramInputs"
- onFocus={this.onFocus}>
+ <div className="scriptingBox-paramInputs">
<EditableView
contents={this.props.Document[parameter] ?? "undefined"}
display={"block"}
@@ -412,6 +467,95 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc
</div>
</div> : null}
+ {this._paramsTypes[i].split("|")[1] ? <div>
+ <div className="scriptingBox-wrapper">
+ <div className="scriptingBox-paramNames">
+ {parameter + ":" + this._paramsTypes[i] + " = "}
+ </div>
+
+ <div className="scriptingBox-paramInputs">
+ <div className="scriptingBox-viewBase">
+ <button className="scriptingBox-collapse"
+ style={{
+ top: this._paramsCollapsed[i] ? 30 : 10,
+ transform: `rotate(${this._paramsCollapsed[i] ? 180 : 0}deg) scale(0.5) translate(${this._paramsCollapsed[i] ? "-100%, -100%" : "0, 0"})`,
+ opacity: 0.9,
+ display: (this._paramsCollapsed[i] && !this.props.isSelected()) ? "none" : undefined,
+ left: (this._paramsCollapsed[i] ? 0 : "unset"),
+ }}
+ onClick={(event) => this.toggleCollapse(i)}>
+ <FontAwesomeIcon icon="caret-up" size="2x" />
+ </button>
+ <div className="scriptingBox-viewBase" style={{ display: this._paramsCollapsed[i] ? "none" : undefined }}>
+ <div className="commandEntry-outerDiv" title="select value">
+ <select
+ className="scriptingBox-viewPicker"
+ onPointerDown={this.stopPropagation}
+ onChange={this.viewChanged}
+ value={StrCast(this.props.Document[parameter])}>
+ {this._paramsTypes[i].split("|").map((type: string, index: number) =>
+ <option
+ key={Utils.GenerateGuid()}
+ className="scriptingBox-viewOption"
+ onPointerDown={(e: React.PointerEvent<HTMLOptionElement>) => this.selected(type, i, parameter)}
+ value={type.trim()}>
+ {type.trim()}
+ </option>
+ )}
+ </select>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div> : null}
+
+ {this._paramsTypes[i] === "boolean" ? <div>
+ <div className="scriptingBox-wrapper">
+ <div className="scriptingBox-paramNames">
+ {parameter + ":" + this._paramsTypes[i] + " = "}
+ </div>
+ <div className="scriptingBox-paramInputs"
+ onFocus={this.onFocus}>
+ <EditableView
+ contents={this._paramsValues[i]}
+ display={"block"}
+ maxHeight={72}
+ height={35}
+ fontSize={14}
+ GetValue={() => StrCast(this._paramsValues[i])}
+ SetValue={value => {
+ runInAction(() => {
+ if (value !== "" && value !== " ") {
+ if (value.trim() === "true") {
+ console.log("hello");
+ this._errorMessage = "";
+ // does not set this
+ this.props.Document[parameter] = true;
+ // sets this
+ this._paramsValues[i] = "true";
+ return true;
+ } else {
+ if (value.trim() === "false") {
+ this._errorMessage = "";
+ this.props.Document[parameter] = false;
+ this._paramsValues[i] = "false";
+ return true;
+ } else {
+ this._errorMessage = "not a boolean";
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ });
+ return true;
+ }}
+ />
+ </div>
+ </div>
+ </div> : null}