diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/client/util/CurrentUserUtils.ts | 3 | ||||
-rw-r--r-- | src/client/util/Scripting.ts | 1 | ||||
-rw-r--r-- | src/client/views/nodes/ScriptingBox.scss | 76 | ||||
-rw-r--r-- | src/client/views/nodes/ScriptingBox.tsx | 168 |
4 files changed, 180 insertions, 68 deletions
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts index 1fdf50dd4..632187b49 100644 --- a/src/client/util/CurrentUserUtils.ts +++ b/src/client/util/CurrentUserUtils.ts @@ -737,5 +737,6 @@ export class CurrentUserUtils { } Scripting.addGlobal("setupMobileInkingDoc", function setupMobileInkingDoc(userDoc: Doc) { return CurrentUserUtils.setupMobileInkingDoc(userDoc); }); -Scripting.addGlobal(function setupMobileUploadDoc(userDoc: Doc) { return CurrentUserUtils.setupMobileUploadDoc(userDoc); }); +Scripting.addGlobal(function setupMobileUploadDoc(userDoc: Doc) { return CurrentUserUtils.setupMobileUploadDoc(userDoc); }, + "initializes the Mobile upload document", "{ userDoc: the document to initialize }"); Scripting.addGlobal(function createNewWorkspace() { return MainView.Instance.createNewWorkspace(); });
\ No newline at end of file diff --git a/src/client/util/Scripting.ts b/src/client/util/Scripting.ts index 817e6b29d..00b01a75a 100644 --- a/src/client/util/Scripting.ts +++ b/src/client/util/Scripting.ts @@ -49,7 +49,6 @@ export function isCompileError(toBeDetermined: CompileResult): toBeDetermined is export namespace Scripting { export function addGlobal(global: { name: string }): void; export function addGlobal(name: string, global: any): void; - export function addGlobal(global: { name: string }, decription?: string, params?: any): void; export function addGlobal(nameOrGlobal: any, global?: any, params?: any) { diff --git a/src/client/views/nodes/ScriptingBox.scss b/src/client/views/nodes/ScriptingBox.scss index 256119809..6113efbb5 100644 --- a/src/client/views/nodes/ScriptingBox.scss +++ b/src/client/views/nodes/ScriptingBox.scss @@ -22,7 +22,7 @@ display: flex; flex-direction: row; justify-content: center; - overflow-y: scroll; + overflow-y: hidden; .scriptingBox-textArea { flex: 70; @@ -32,53 +32,43 @@ resize: none; padding: 7px; overflow-y: scroll; + overflow-x: hidden; body { font-family: Arial, Helvetica, sans-serif; border: 1px solid red; - } - + } + .rta { position: relative; - font-size: 18px; + font-size: 12px; width: 100%; height: 100%; margin-bottom: 60px !important; - } - .rta__loader.rta__loader--empty-suggestion-data { - border-radius: 3px; - box-shadow: 0 0 5px rgba(27, 31, 35, 0.1); - padding: 5px; - } - .rta--loading .rta__loader.rta__loader--suggestion-data { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(255, 255, 255, 0.8); - } - .rta--loading .rta__loader.rta__loader--suggestion-data > * { - position: relative; - top: 50%; - } - .rta__textarea { + overflow-y: scroll; + font-size: 9px; + } + + .rta__textarea { width: 100%; height: 100%; - font-size: 1em; - } - .rta__autocomplete { + font-size: 10px; + } + + .rta__autocomplete { position: absolute; display: block; margin-top: 1em; - } - .rta__autocomplete--top { + } + + .rta__autocomplete--top { margin-top: 0; margin-bottom: 1em; max-height: 100px; overflow-y: auto; - } - .rta__list { + } + + .rta__list { margin: 0; padding: 0; background: #fff; @@ -86,28 +76,30 @@ border-radius: 3px; box-shadow: 0 0 5px rgba(27, 31, 35, 0.1); list-style: none; - } - .rta__entity { + overflow-y: scroll; + } + + .rta__entity { background: white; width: 100%; text-align: left; outline: none; - } - .rta__entity:hover { + } + + .rta__entity:hover { cursor: pointer; - } - .rta__item:not(:last-child) { - border-bottom: 1px solid #dfe2e5; - } - .rta__entity > * { + } + + .rta__entity>* { padding-left: 4px; padding-right: 4px; - } - .rta__entity--selected { + } + + .rta__entity--selected { color: #fff; text-decoration: none; background: #0366d6; - } + } } .scriptingBox-plist { diff --git a/src/client/views/nodes/ScriptingBox.tsx b/src/client/views/nodes/ScriptingBox.tsx index b0f7b3993..72c92f00b 100644 --- a/src/client/views/nodes/ScriptingBox.tsx +++ b/src/client/views/nodes/ScriptingBox.tsx @@ -38,18 +38,62 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc @observable private _errorMessage: string = ""; @observable private _applied: boolean = false; + @observable private _hovered: boolean = false; @observable private _scriptKeys: any = Scripting.getGlobals(); + @observable private _scriptGlobals: any = Scripting.getGlobalObj(); @observable private _currWord: string = ""; @observable private _suggestions: string[] = []; // vars included in fields that store parameters types and names and the script itself - @computed get paramsNames() { return this.compileParams.map(p => p.split(":")[0].trim()); } - @computed get paramsTypes() { return this.compileParams.map(p => p.split(":")[1].trim()); } - @computed get rawScript() { return StrCast(this.dataDoc[this.props.fieldKey + "-rawScript"], ""); } - @computed get compileParams() { return Cast(this.dataDoc[this.props.fieldKey + "-params"], listSpec("string"), []); } + @computed({ keepAlive: true }) get paramsNames() { return this.compileParams.map(p => p.split(":")[0].trim()); } + @computed({ keepAlive: true }) get paramsTypes() { return this.compileParams.map(p => p.split(":")[1].trim()); } + @computed({ keepAlive: true }) get rawScript() { return StrCast(this.dataDoc[this.props.fieldKey + "-rawScript"], ""); } + @computed({ keepAlive: true }) get compileParams() { return Cast(this.dataDoc[this.props.fieldKey + "-params"], listSpec("string"), []); } set rawScript(value) { this.dataDoc[this.props.fieldKey + "-rawScript"] = value; } set compileParams(value) { this.dataDoc[this.props.fieldKey + "-params"] = new List<string>(value); } + // WORK ON THIS + // in: global, description, params + @computed get _descriptions() { + const descrip: string[] = []; + let value = ""; + this._scriptKeys.forEach((element: any) => { + const result = this._scriptGlobals[element]; + if (typeof result === "object") { + const d = result[1]; + if (d !== undefined) { + value = d; + } else { + value = ""; + } + } else { + value = ""; + } + descrip.push(value); + }); + return descrip; + } + + @computed get _scriptParams() { + const params: string[] = []; + let value = ""; + this._scriptKeys.forEach((element: any) => { + const result = this._scriptGlobals[element]; + if (typeof result === "object") { + const p = result[2]; + if (p !== undefined) { + value = StrCast(p); + } else { + value = ""; + } + } else { + value = ""; + } + params.push(value); + }); + return params; + } + @action componentDidMount() { this.rawScript = ScriptCast(this.dataDoc[this.props.fieldKey])?.script?.originalScript ?? this.rawScript; @@ -307,16 +351,32 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc // console.log(this._suggestions); // } - @action - handleKeyPress(num: number) { + // @action + // handleKeyPress(num: number) { - const scriptString = this.rawScript.slice(0, num); + // const scriptString = this.rawScript.slice(0, num); - this._currWord = scriptString.split(" ")[scriptString.split(" ").length - 1]; + // this._currWord = scriptString.split(" ")[scriptString.split(" ").length - 1]; + // this._suggestions = []; + + // this._scriptKeys.forEach((element: string) => { + // if (element.indexOf(this._currWord) >= 0) { + // this._suggestions.push(StrCast(element)); + // } + // }); + + // console.log(this._suggestions); + // return (this._suggestions); + // } + + @action + handleToken(str: string) { + + this._currWord = str; this._suggestions = []; this._scriptKeys.forEach((element: string) => { - if (element.indexOf(this._currWord) >= 0) { + if (element.toLowerCase().indexOf(this._currWord.toLowerCase()) >= 0) { this._suggestions.push(StrCast(element)); } }); @@ -326,23 +386,67 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc } @action - handleToken(str: string) { - - this._currWord = str; + handleFunc(pos: number) { + const scriptString = this.rawScript.slice(0, pos - 1); + this._currWord = scriptString.split(" ")[scriptString.split(" ").length - 1]; this._suggestions = []; - this._scriptKeys.forEach((element: string) => { - if (element.indexOf(this._currWord) >= 0) { - this._suggestions.push(StrCast(element)); - } - }); + const index = this._scriptKeys.indexOf(this._currWord); + const params = StrCast(this._scriptParams[index]); + + this._suggestions.push(params); console.log(this._suggestions); + return (this._suggestions); } + + getDescription(value: string) { + const index = this._scriptKeys.indexOf(value); + const descrip = this._descriptions[index]; + let display = ""; + if (descrip !== undefined) { + if (descrip.length > 0) { + display = descrip; + } + } + return display; + } + + getParams(value: string) { + const index = this._scriptKeys.indexOf(value); + const descrip = this._scriptParams[index]; + let display = ""; + if (descrip !== undefined) { + if (descrip.length > 0) { + display = descrip; + } + } + return display; + } + + setHovered(bool: boolean) { + this._hovered = bool; + } + + returnParam(item: string) { + const params = item.split(","); + let value = ""; + let first = true; + params.forEach((element) => { + if (first) { + value = element.split(":")[0].trim(); + first = false; + } else { + value = value + ", " + element.split(":")[0].trim(); + } + }); + return value; + } + textarea: any; - @computed get renderScriptingBox() { + @computed({ keepAlive: true }) get renderScriptingBox() { return <ReactTextareaAutocomplete onFocus={this.onFocus} @@ -354,19 +458,35 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc style={{ width: this.compileParams.length > 0 ? "70%" : "100%", resize: "none", height: "100%" }} movePopupAsYouType={true} loadingComponent={() => <span>Loading</span>} - ref={(rta: any) => { this.rta = rta; }} + + ref={(rta) => { this.rta = rta; }} //innerRef={textarea => { this.rawScript = textarea.value; }} minChar={0} - // ISSUE IS HEERE, doesn't display entity in a menu, prints hello for reach item in the list trigger={{ " ": { dataProvider: (token: any) => this.handleToken(token), + component: ({ entity: value }) => + <div><div + style={{ fontSize: "14px" }} + onMouseEnter={() => this.setHovered(true)} + onMouseLeave={() => this.setHovered(false)}> + {value} + </div> + {this._hovered ? <div style={{ fontSize: "10px" }}>{this.getDescription(value)}</div> : (null)} + {this._hovered ? <div style={{ fontSize: "10px" }}>{this.getParams(value)}</div> : (null)} + </div> + , + output: (item: any, trigger) => trigger + item.trim(), + }, + + "(": { + dataProvider: (token: any) => this.handleFunc(this.rta.getCaretPosition()), component: ({ entity: value }) => <div>{value}</div>, - //afterWhitespace: true, - output: (item: any) => item, + output: (item: any) => "(" + this.returnParam(item) + ")", } + }} onCaretPositionChange={(number: any) => null} //this.handleKeyPress(number)} @@ -374,7 +494,7 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc } // inputs for scripting div (script box, params box, and params column) - renderScriptingInputs() { + @computed({ keepAlive: true }) get renderScriptingInputs() { // params box on bottom const parameterInput = <div className="scriptingBox-params"> @@ -467,7 +587,7 @@ export class ScriptingBox extends ViewBoxAnnotatableComponent<FieldViewProps, Sc return ( <div className={`scriptingBox`} onContextMenu={this.specificContextMenu}> <div className="scriptingBox-outerDiv" onWheel={e => this.props.isSelected(true) && e.stopPropagation()}> - {!this._applied ? this.renderScriptingInputs() : this.renderParamsInputs()} + {!this._applied ? this.renderScriptingInputs : this.renderParamsInputs()} {!this._applied ? this.renderScriptingTools() : this.renderParamsTools()} </div> </div> |