diff --git a/src/main.tsx b/src/main.tsx index ca9f1a0b..2b915d9f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -19,6 +19,7 @@ const CellHeightPx = 16; const CellWidthPx = 8; const RemotePtyRows = 8; const RemotePtyCols = 80; +const PasswordUnchangedSentinel = "--unchanged--"; const RemoteColors = ["red", "green", "yellow", "blue", "magenta", "cyan", "white", "orange"]; @@ -916,52 +917,103 @@ class InfoRemoteEdit extends React.Component<{}, {}> { connectMode : mobx.IObservableValue; sudoBool : mobx.IObservableValue; autoInstallBool : mobx.IObservableValue; + authMode : mobx.IObservableValue; constructor(props) { super(props); this.resetForm(); } + getEditAuthMode(redit : RemoteEditType) : string { + if (!isBlank(redit.keystr) && redit.haspassword) { + return "key+pw"; + } + else if (!isBlank(redit.keystr)) { + return "key"; + } + else if (redit.haspassword) { + return "pw"; + } + else { + return "none"; + } + } + resetForm() { - this.alias = mobx.observable.box(""); + let redit = this.getRemoteEdit(); + let remote = this.getEditingRemote(); + if (redit == null) { + return; + } + let isEditMode = !isBlank(redit.remoteid); + if (isEditMode && remote == null) { + return; + } + + // not editable this.hostName = mobx.observable.box(""); - this.keyStr = mobx.observable.box(""); this.portStr = mobx.observable.box(""); - this.passwordStr = mobx.observable.box(""); - this.colorStr = mobx.observable.box(""); - this.connectMode = mobx.observable.box("startup"); this.sudoBool = mobx.observable.box(false); - this.autoInstallBool = mobx.observable.box(true); + + // editable + if (isEditMode) { + this.authMode = mobx.observable.box(this.getEditAuthMode(redit)); + this.alias = mobx.observable.box(remote.remotealias ?? ""); + this.passwordStr = mobx.observable.box(redit.haspassword ? PasswordUnchangedSentinel : ""); + this.keyStr = mobx.observable.box(redit.keystr ?? ""); + this.colorStr = mobx.observable.box(remote.remotevars["color"] ?? ""); + this.connectMode = mobx.observable.box(remote.connectmode); + this.autoInstallBool = mobx.observable.box(remote.autoinstall); + } + else { + this.authMode = mobx.observable.box("none"); + this.alias = mobx.observable.box(""); + this.passwordStr = mobx.observable.box(""); + this.keyStr = mobx.observable.box(""); + this.colorStr = mobx.observable.box(""); + this.connectMode = mobx.observable.box("startup"); + this.autoInstallBool = mobx.observable.box(true); + } } @boundMethod - doCreateRemote() { + doSubmitRemote() { + let redit = this.getRemoteEdit(); + let isEditing = !isBlank(redit.remoteid); let cname = this.hostName.get(); let kwargs : Record = {}; - if (this.alias.get() != "") { - kwargs["alias"] = this.alias.get(); + let authMode = this.authMode.get(); + if (!isEditing) { + if (this.sudoBool.get()) { + kwargs["sudo"] = "1"; + } } - if (this.sudoBool.get()) { - kwargs["sudo"] = "1"; - } - if (this.colorStr.get() != "") { - kwargs["color"] = this.colorStr.get(); - } - if (this.keyStr.get() != "") { + kwargs["alias"] = this.alias.get(); + kwargs["color"] = this.colorStr.get(); + if (authMode == "key" || authMode == "key+pw") { kwargs["key"] = this.keyStr.get(); } - if (this.passwordStr.get() != "") { + else { + kwargs["key"] = ""; + } + if (authMode == "pw" || authMode == "key+pw") { kwargs["password"] = this.passwordStr.get(); } - kwargs["connectmode"] = this.connectMode.get(); - if (!this.autoInstallBool.get()) { - kwargs["autoinstall"] = "0"; + else { + kwargs["password"] = "" } + kwargs["connectmode"] = this.connectMode.get(); + kwargs["autoinstall"] = (this.autoInstallBool.get() ? "1" : "0"); kwargs["visual"] = "1"; kwargs["submit"] = "1"; - console.log("create remote", cname, kwargs); + console.log("submit remote", (isEditing ? redit.remoteid : cname), kwargs); mobx.action(() => { - GlobalCommandRunner.createRemote(cname, kwargs); + if (isEditing) { + GlobalCommandRunner.editRemote(redit.remoteid, kwargs); + } + else { + GlobalCommandRunner.createRemote(cname, kwargs); + } })(); } @@ -976,7 +1028,7 @@ class InfoRemoteEdit extends React.Component<{}, {}> { @boundMethod keyDownCreateRemote(e : any) { if (e.code == "Enter") { - this.doCreateRemote(); + this.doSubmitRemote(); } } @@ -1022,6 +1074,13 @@ class InfoRemoteEdit extends React.Component<{}, {}> { })(); } + @boundMethod + onFocusPasswordStr(e : any) { + if (this.passwordStr.get() == PasswordUnchangedSentinel) { + e.target.select(); + } + } + @boundMethod onChangeColorStr(e : any) { mobx.action(() => { @@ -1036,6 +1095,13 @@ class InfoRemoteEdit extends React.Component<{}, {}> { })(); } + @boundMethod + onChangeAuthMode(e : any) { + mobx.action(() => { + this.authMode.set(e.target.value); + })(); + } + @boundMethod onChangeSudo(e : any) { mobx.action(() => { @@ -1110,15 +1176,15 @@ class InfoRemoteEdit extends React.Component<{}, {}> { } let isEditMode = !isBlank(redit.remoteid); let remote = this.getEditingRemote(); - let colorStr : string = null; if (isEditMode && remote == null) { return (
cannot edit, remote {redit.remoteid} not found
); } + let colorStr : string = null; return (
-
+
add new remote '{this.remoteCName()}' @@ -1126,21 +1192,20 @@ class InfoRemoteEdit extends React.Component<{}, {}> { edit remote '{this.remoteCName()}'
-
+
type
ssh
-
- +
user@host
- +
-
+
port
@@ -1148,41 +1213,56 @@ class InfoRemoteEdit extends React.Component<{}, {}> {
-
+
user@host
{remote.remotecanonicalname} -  (port {remote.remotevars.port}) +  (port {remote.remotevars.port})
-
+
alias
- +
-
-
ssh keyfile
-
- +
+
authmode
+
+
-
-
ssh password
-
- + +
+
ssh keyfile
+
+ +
-
-
+ + +
+
ssh password
+
+ +
+
+
+
sudo
-
+
connectmode
-
+
autoinstall
-
+
color