implement branch/venv in prompt

This commit is contained in:
sawka
2023-04-11 23:50:42 -07:00
parent 810baa0dfb
commit 88cc9f3096
5 changed files with 87 additions and 50 deletions
+31 -5
View File
@@ -8,7 +8,7 @@ import localizedFormat from 'dayjs/plugin/localizedFormat';
import {If, For, When, Otherwise, Choose} from "tsx-control-statements/components";
import {GlobalModel, GlobalCommandRunner, Session, Cmd, ScreenLines, Screen, getTermPtyData} from "./model";
import {windowWidthToCols, windowHeightToRows, termHeightFromRows, termWidthFromCols} from "./textmeasure";
import type {LineType, CmdDataType, FeStateType, RemoteType, RemotePtrType, RenderModeType, RendererContext, RendererOpts, SimpleBlobRendererComponent, RendererPluginType, LineHeightChangeCallbackType, RendererModelInitializeParams, RendererModel} from "./types";
import type {LineType, CmdDataType, RemoteType, RemotePtrType, RenderModeType, RendererContext, RendererOpts, SimpleBlobRendererComponent, RendererPluginType, LineHeightChangeCallbackType, RendererModelInitializeParams, RendererModel} from "./types";
import cn from "classnames";
import {TermWrap} from "./term";
import type {LineContainerModel} from "./model";
@@ -27,6 +27,17 @@ type OMap<K,V> = mobx.ObservableMap<K,V>;
type RendererComponentProps = {screen : LineContainerModel, line : LineType, width : number, staticRender : boolean, visible : OV<boolean>, onHeightChange : LineHeightChangeCallbackType, collapsed : boolean};
type RendererComponentType = { new(props : RendererComponentProps) : React.Component<RendererComponentProps, {}> };
function getShortVEnv(venvDir : string) : string {
if (isBlank(venvDir)) {
return "";
}
let lastSlash = venvDir.lastIndexOf("/");
if (lastSlash == -1) {
return venvDir;
}
return venvDir.substr(lastSlash+1);
}
function makeFullRemoteRef(ownerName : string, remoteRef : string, name : string) : string {
if (isBlank(ownerName) && isBlank(name)) {
return remoteRef;
@@ -60,7 +71,7 @@ function replaceHomePath(path : string, homeDir : string) : string {
return path;
}
function getCwdStr(remote : RemoteType, state : FeStateType) : string {
function getCwdStr(remote : RemoteType, state : Record<string, string>) : string {
if (state == null || isBlank(state.cwd)) {
return "~";
}
@@ -594,7 +605,7 @@ class Line extends React.Component<{screen : LineContainerModel, line : LineType
}
@mobxReact.observer
class Prompt extends React.Component<{rptr : RemotePtrType, festate : FeStateType}, {}> {
class Prompt extends React.Component<{rptr : RemotePtrType, festate : Record<string, string>}, {}> {
render() {
let rptr = this.props.rptr;
if (rptr == null || isBlank(rptr.remoteid)) {
@@ -602,7 +613,8 @@ class Prompt extends React.Component<{rptr : RemotePtrType, festate : FeStateTyp
}
let remote = GlobalModel.getRemote(this.props.rptr.remoteid);
let remoteStr = getRemoteStr(rptr);
let cwd = getCwdStr(remote, this.props.festate);
let festate = this.props.festate ?? {};
let cwd = getCwdStr(remote, festate);
let isRoot = false;
if (remote && remote.remotevars) {
if (remote.remotevars["sudo"] || remote.remotevars["bestuser"] == "root") {
@@ -621,8 +633,22 @@ class Prompt extends React.Component<{rptr : RemotePtrType, festate : FeStateTyp
if (remote && remote.remotecanonicalname) {
remoteTitle = "connected to " + remote.remotecanonicalname;
}
let cwdElem = (<span title="current directory" className="term-prompt-cwd">{cwd}</span>);
let remoteElem = (<span title={remoteTitle} className={cn("term-prompt-remote", remoteColorClass)}>[{remoteStr}]</span>);
let rootIndicatorElem = (<span className="term-prompt-end">{isRoot ? "#" : "$"}</span>);
let branchElem = null;
let pythonElem = null;
if (!isBlank(festate["PROMPTVAR_GITBRANCH"])) {
let branchName = festate["PROMPTVAR_GITBRANCH"];
branchElem = (<span title="current git branch" className="term-prompt-branch"><i className="fa-sharp fa-solid fa-code-branch"/>{branchName} </span>);
}
if (!isBlank(festate["VIRTUAL_ENV"])) {
let venvDir = festate["VIRTUAL_ENV"];
let venv = getShortVEnv(venvDir);
pythonElem = (<span title="python venv" className="term-prompt-python"><i className="fa-brands fa-python"/>{venv} </span>);
}
return (
<span className="term-prompt"><span title={remoteTitle} className={cn("term-prompt-remote", remoteColorClass)}>[{remoteStr}]</span> <span className="term-prompt-cwd">{cwd}</span> <span className="term-prompt-end">{isRoot ? "#" : "$"}</span></span>
<span className="term-prompt">{remoteElem} {pythonElem}{branchElem}{cwdElem} {rootIndicatorElem}</span>
);
}
}
+4 -4
View File
@@ -8,7 +8,7 @@ import cn from "classnames";
import {debounce, throttle} from "throttle-debounce";
import {v4 as uuidv4} from "uuid";
import dayjs from "dayjs";
import type {SessionDataType, LineType, CmdDataType, RemoteType, RemoteStateType, RemoteInstanceType, RemotePtrType, HistoryItem, HistoryQueryOpts, RemoteEditType, FeStateType, ContextMenuOpts, BookmarkType, RenderModeType, ClientMigrationInfo, LineFactoryProps} from "./types";
import type {SessionDataType, LineType, CmdDataType, RemoteType, RemoteStateType, RemoteInstanceType, RemotePtrType, HistoryItem, HistoryQueryOpts, RemoteEditType, ContextMenuOpts, BookmarkType, RenderModeType, ClientMigrationInfo, LineFactoryProps} from "./types";
import type * as T from "./types";
import localizedFormat from 'dayjs/plugin/localizedFormat';
import {GlobalModel, GlobalCommandRunner, Session, Cmd, ScreenLines, Screen, riToRPtr, TabColors, RemoteColors} from "./model";
@@ -907,10 +907,10 @@ class CmdInput extends React.Component<{}, {}> {
rptr = screen.curRemote.get();
}
let remote : RemoteType = null;
let remoteState : FeStateType = null;
let feState : Record<string, string> = null;
if (ri != null) {
remote = GlobalModel.getRemote(ri.remoteid);
remoteState = ri.festate;
feState = ri.festate;
}
let infoShow = inputModel.infoShow.get();
let historyShow = !infoShow && inputModel.historyShow.get();
@@ -942,7 +942,7 @@ class CmdInput extends React.Component<{}, {}> {
</If>
<div key="prompt" className="cmd-input-context">
<div className="has-text-white">
<Prompt rptr={rptr} festate={remoteState}/>
<Prompt rptr={rptr} festate={feState}/>
</div>
</div>
<div key="input" className={cn("cmd-input-field field has-addons", (inputMode != null ? "inputmode-" + inputMode : null))}>
+2 -2
View File
@@ -5,7 +5,7 @@ import {debounce} from "throttle-debounce";
import {handleJsonFetchResponse, base64ToArray, genMergeData, genMergeDataMap, genMergeSimpleData, boundInt, isModKeyPress} from "./util";
import {TermWrap} from "./term";
import {v4 as uuidv4} from "uuid";
import type {SessionDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, FeStateType, ContextMenuOpts, RendererContext, RendererModel, PtyDataType, BookmarkType, ClientDataType, HistoryViewDataType, AlertMessageType, HistorySearchParams, FocusTypeStrs, ScreenLinesType, HistoryTypeStrs, RendererPluginType, WindowSize, ClientMigrationInfo, WebShareOpts, TermContextUnion, RemoteEditType, RemoteViewType, CommandRtnType} from "./types";
import type {SessionDataType, LineType, RemoteType, HistoryItem, RemoteInstanceType, RemotePtrType, CmdDataType, FeCmdPacketType, TermOptsType, RemoteStateType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, UIContextType, HistoryInfoType, HistoryQueryOpts, FeInputPacketType, TermWinSize, RemoteInputPacketType, ContextMenuOpts, RendererContext, RendererModel, PtyDataType, BookmarkType, ClientDataType, HistoryViewDataType, AlertMessageType, HistorySearchParams, FocusTypeStrs, ScreenLinesType, HistoryTypeStrs, RendererPluginType, WindowSize, ClientMigrationInfo, WebShareOpts, TermContextUnion, RemoteEditType, RemoteViewType, CommandRtnType} from "./types";
import {WSControl} from "./ws";
import {measureText, getMonoFontSize, windowWidthToCols, windowHeightToRows, termWidthFromCols, termHeightFromRows} from "./textmeasure";
import dayjs from "dayjs";
@@ -176,7 +176,7 @@ class Cmd {
return this.data.get().cmdstr;
}
getRemoteFeState() : FeStateType {
getRemoteFeState() : Record<string, string> {
return this.data.get().festate;
}
+45 -30
View File
@@ -2352,50 +2352,65 @@ input[type=checkbox] {
color: @term-bright-red;
}
#main .term-prompt-remote {
color: @term-bright-green;
&.color-green {
color: @term-bright-green;
#main .term-prompt {
i {
font-size: 12px;
margin-right: 3px;
}
&.color-red {
color: @term-bright-red;
.term-prompt-branch {
color: @term-white;
}
&.color-blue {
color: @term-bright-blue;
}
&.color-yellow {
color: @term-bright-yellow;
}
&.color-magenta {
.term-prompt-python {
color: @term-bright-magenta;
}
&.color-cyan {
color: @term-bright-cyan;
.term-prompt-remote {
color: @term-bright-green;
&.color-green {
color: @term-bright-green;
}
&.color-red {
color: @term-bright-red;
}
&.color-blue {
color: @term-bright-blue;
}
&.color-yellow {
color: @term-bright-yellow;
}
&.color-magenta {
color: @term-bright-magenta;
}
&.color-cyan {
color: @term-bright-cyan;
}
&.color-white {
color: @term-bright-white;
}
&.color-orange {
color: @tab-orange;
}
}
&.color-white {
color: @term-bright-white;
.term-prompt-cwd {
color: @term-bright-green;
}
&.color-orange {
color: @tab-orange;
.term-prompt-end {
color: @term-bright-green;
}
}
#main .term-prompt-cwd {
color: @term-bright-green;
}
#main .term-prompt-end {
color: @term-bright-green;
}
#main .screen-tabs .screen-tab {
&.color-green {
color: @tab-black-text;
+5 -9
View File
@@ -89,7 +89,7 @@ type RemoteType = {
errorstr : string,
installstatus : string,
installerrorstr : string,
defaultfestate : FeStateType,
defaultfestate : Record<string, string>,
connectmode : string,
autoinstall : boolean,
remoteidx : number,
@@ -117,15 +117,11 @@ type RemoteInstanceType = {
screenid : string,
remoteownerid : string,
remoteid : string,
festate : FeStateType,
festate : Record<string, string>,
remove? : boolean,
}
type FeStateType = {
cwd : string,
};
type RemotePtrType = {
remoteid : string,
ownerid? : string,
@@ -230,7 +226,7 @@ type CmdDataType = {
cmdid : string,
remote : RemotePtrType,
cmdstr : string,
festate : FeStateType,
festate : Record<string, string>,
termopts : TermOptsType,
origtermopts : TermOptsType,
status : string,
@@ -533,7 +529,7 @@ type WebCmd = {
remote : WebRemote,
cmdstr : string,
rawcmdstr : string,
festate : FeStateType,
festate : Record<string, string>,
termopts : TermOptsType,
status : string,
startpk : CmdStartPacketType,
@@ -595,4 +591,4 @@ type CommandRtnType = {
type LineHeightChangeCallbackType = (lineNum : number, newHeight : number, oldHeight : number) => void;
export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, FeStateType, ContextMenuOpts, RendererContext, WindowSize, RendererModel, PtyDataType, BookmarkType, ClientDataType, PlaybookType, PlaybookEntryType, HistoryViewDataType, RenderModeType, AlertMessageType, HistorySearchParams, ScreenLinesType, FocusTypeStrs, HistoryTypeStrs, RendererOpts, RendererPluginType, SimpleBlobRendererComponent, RendererModelContainerApi, RendererModelInitializeParams, RendererOptsUpdate, ClientMigrationInfo, WebShareOpts, RemoteStatusTypeStrs, WebFullScreen, WebScreen, WebLine, WebCmd, RemoteTermContext, TermContextUnion, WebRemote, PtyDataUpdate, WebShareWSMessage, LineHeightChangeCallbackType, LineFactoryProps, LineInterface, RendererContainerType, RemoteViewType, CommandRtnType};
export type {SessionDataType, LineType, RemoteType, RemoteStateType, RemoteInstanceType, HistoryItem, CmdRemoteStateType, FeCmdPacketType, TermOptsType, CmdStartPacketType, CmdDataType, ScreenDataType, ScreenOptsType, PtyDataUpdateType, ModelUpdateType, UpdateMessage, InfoType, CmdLineUpdateType, RemotePtrType, UIContextType, HistoryInfoType, HistoryQueryOpts, WatchScreenPacketType, TermWinSize, FeInputPacketType, RemoteInputPacketType, RemoteEditType, ContextMenuOpts, RendererContext, WindowSize, RendererModel, PtyDataType, BookmarkType, ClientDataType, PlaybookType, PlaybookEntryType, HistoryViewDataType, RenderModeType, AlertMessageType, HistorySearchParams, ScreenLinesType, FocusTypeStrs, HistoryTypeStrs, RendererOpts, RendererPluginType, SimpleBlobRendererComponent, RendererModelContainerApi, RendererModelInitializeParams, RendererOptsUpdate, ClientMigrationInfo, WebShareOpts, RemoteStatusTypeStrs, WebFullScreen, WebScreen, WebLine, WebCmd, RemoteTermContext, TermContextUnion, WebRemote, PtyDataUpdate, WebShareWSMessage, LineHeightChangeCallbackType, LineFactoryProps, LineInterface, RendererContainerType, RemoteViewType, CommandRtnType};