diff --git a/src/main.tsx b/src/main.tsx index 35a9f7f4..30d6fb92 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -29,6 +29,21 @@ function isBlank(s : string) : boolean { return (s == null || s == ""); } +function windowLinesDOMId(windowid : string) { + return "window-lines-" + windowid; +} + +function scrollDiv(div : any, amt : number) { + if (div == null) { + return; + } + let newScrollTop = div.scrollTop + amt; + if (newScrollTop < 0) { + newScrollTop = 0; + } + div.scrollTo({top: newScrollTop, behavior: "smooth"}); +} + function interObsCallback(entries) { let now = Date.now(); entries.forEach((entry) => { @@ -454,6 +469,23 @@ class TextAreaInput extends React.Component<{}, {}> { return; } } + if (e.code == "PageUp" || e.code == "PageDown") { + e.preventDefault(); + let infoScroll = GlobalModel.hasScrollingInfoMsg(); + if (infoScroll) { + let div = document.querySelector(".cmd-iinput-info"); + scrollDiv(div, (e.code == "PageUp" ? -500 : 500)); + } + else { + let win = GlobalModel.getActiveWindow(); + if (win == null) { + return; + } + let id = windowLinesDOMId(win.windowId); + let div = document.getElementById(id); + scrollDiv(div, (e.code == "PageUp" ? -500 : 500)); + } + } // console.log(e.code, e.keyCode, e.key, event.which, ctrlMod, e); })(); } @@ -696,7 +728,7 @@ class ScreenWindowView extends React.Component<{sw : ScreenWindow}, {}> { } getLinesDOMId() { - return "window-lines-" + this.getWindowId(); + return windowLinesDOMId(this.getWindowId()); } @boundMethod diff --git a/src/model.ts b/src/model.ts index 3d974ca7..dd01f46e 100644 --- a/src/model.ts +++ b/src/model.ts @@ -4,7 +4,7 @@ import {boundMethod} from "autobind-decorator"; import {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeSimpleData} from "./util"; import {TermWrap} from "./term"; import {v4 as uuidv4} from "uuid"; -import type {SessionDataType, WindowDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenWindowType, ScreenOptsType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType} from "./types"; +import type {SessionDataType, WindowDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenWindowType, ScreenOptsType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType} from "./types"; import {WSControl} from "./ws"; var GlobalUser = "sawka"; @@ -769,7 +769,7 @@ class Model { let key = sessionId + "/" + cmdId + "/" + width; this.termUsedRowsCache[key] = usedRows; } - + contextScreen(e : any, screenId : string) { console.log("model", screenId); getApi().contextScreen({screenId: screenId}, {x: e.x, y: e.y}); @@ -791,6 +791,44 @@ class Model { } } + getUIContext() : UIContextType { + let rtn : UIContextType = { + sessionid : null, + screenid : null, + windowid : null, + remote : null, + }; + let session = this.getActiveSession(); + if (session != null) { + rtn.sessionid = session.sessionId; + let screen = session.getActiveScreen(); + if (screen != null) { + rtn.screenid = screen.screenId; + let win = this.getActiveWindow(); + if (win != null) { + rtn.windowid = win.windowId; + rtn.remote = win.curRemote.get(); + } + } + } + return rtn; + } + + hasScrollingInfoMsg() : boolean { + if (!this.infoShow.get()) { + return false; + } + let info = this.infoMsg.get(); + if (info == null) { + return false; + } + let div = document.querySelector(".cmd-input-info"); + if (div == null) { + return false; + } + return div.scrollHeight > div.clientHeight; + } + clearInfoMsg(setNull : boolean) { this.infoTimeoutId = null; mobx.action(() => { @@ -1162,13 +1200,14 @@ class Model { }); } - submitCommand(metaCmd : string, metaSubCmd : string, args : string[], kwargs : Record, interactive : boolean) { + submitCommand(metaCmd : string, metaSubCmd : string, args : string[], kwargs : Record, interactive : boolean) : void { let pk : FeCmdPacketType = { type: "fecmd", metacmd: metaCmd, metasubcmd: metaSubCmd, args: args, kwargs: Object.assign({}, this.getClientKwargs(), kwargs), + uicontext : this.getUIContext(), }; this.submitCommandPacket(pk, interactive); } @@ -1179,6 +1218,7 @@ class Model { metacmd: "eval", args: [cmdStr], kwargs: this.getClientKwargs(), + uicontext : this.getUIContext(), }; if (!addToHistory) { pk.kwargs["nohist"] = "1"; @@ -1186,7 +1226,7 @@ class Model { this.submitCommandPacket(pk, interactive) } - loadSessionList() { + loadSessionList() : void { let url = new URL("http://localhost:8080/api/get-all-sessions"); fetch(url).then((resp) => handleJsonFetchResponse(url, resp)).then((data) => { this.runUpdate(data.data, false); @@ -1331,7 +1371,7 @@ class InputClass { clearCmdInput() : void { mobx.action(() => { GlobalModel.clearInfoMsg(true); - GlobalModel.clearCurLine(); + GlobalModel.inputModel.clearCurLine(); })(); } diff --git a/src/types.ts b/src/types.ts index 3d8a40d1..baa54c5c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -137,12 +137,20 @@ type CmdRemoteStateType = { cwd : string, }; +type UIContextType = { + sessionid : string, + screenid : string, + windowid : string, + remote : RemotePtrType, +}; + type FeCmdPacketType = { type : string, metacmd : string, metasubcmd? : string, args : string[], kwargs : Record; + uicontext : UIContextType, }; type WatchScreenPacketType = { @@ -207,6 +215,11 @@ type ModelUpdateType = { info? : InfoType, cmdline? : CmdLineUpdateType, remote? : RemoteType, + history? : HistoryInfoType, +}; + +type HistoryInfoType = { + items : HistoryItemType[], }; type CmdLineUpdateType = { @@ -226,4 +239,4 @@ type InfoType = { type UpdateMessage = PtyDataUpdateType | ModelUpdateType; -export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, WindowDataType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDonePacketType, CmdDataType, ScreenDataType, ScreenOptsType, ScreenWindowType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType}; +export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, WindowDataType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDonePacketType, CmdDataType, ScreenDataType, ScreenOptsType, ScreenWindowType, LayoutType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType};