From 68430d33a1164cb894afefd3909c2a23cd7527f2 Mon Sep 17 00:00:00 2001 From: sawka Date: Fri, 3 Mar 2023 12:38:55 -0800 Subject: [PATCH] implement alert/confirm modal. some more history view cleanup --- src/history.tsx | 14 ++++++++++++- src/main.tsx | 29 +++++++++++++++++--------- src/model.ts | 54 +++++++++++++++++++++++++++++++++++++++++++++++-- src/sh2.less | 42 ++++++++++++++++++++++++++++++++++++++ src/types.ts | 1 + 5 files changed, 128 insertions(+), 12 deletions(-) diff --git a/src/history.tsx b/src/history.tsx index 3aa7413f4..e6adcd3c9 100644 --- a/src/history.tsx +++ b/src/history.tsx @@ -222,7 +222,7 @@ class HistoryView extends React.Component<{}, {}> { -
+
@@ -273,6 +273,18 @@ class HistoryView extends React.Component<{}, {}> { +
+
+
Showing {offset+1}-{offset+items.length}
+
+
+
+
+ +
+
No History Items Found
+
+
[Esc] to Close
diff --git a/src/main.tsx b/src/main.tsx index f45317e0b..67c73c60b 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2496,10 +2496,14 @@ class LoadingSpinner extends React.Component<{}, {}> { @mobxReact.observer class AlertModal extends React.Component<{}, {}> { + @boundMethod closeModal() : void { - mobx.action(() => { - GlobalModel.alertMessage.set(null); - })(); + GlobalModel.cancelAlert(); + } + + @boundMethod + handleOK() : void { + GlobalModel.confirmAlert(); } render() { @@ -2508,22 +2512,29 @@ class AlertModal extends React.Component<{}, {}> { return null; } let title = message.title ?? "Alert"; + let isConfirm = message.confirm; return ( -
+
-
-

{title}

- +
+

{title}

+

{message.message}

- + + + + + + +
- +
); } diff --git a/src/model.ts b/src/model.ts index 653f7fe7b..3013872ce 100644 --- a/src/model.ts +++ b/src/model.ts @@ -1847,7 +1847,19 @@ class HistoryViewModel { setTimeout(this.clearActiveDelete, 2000); return; } - GlobalModel.showAlert({message: "DELETE!"}); + let prtn = GlobalModel.showAlert({message: "Deleting these lines from history will also delete their content from your sessions as well.", confirm: true}); + prtn.then((result) => { + if (!result) { + return; + } + if (result) { + this._deleteSelected(); + } + }); + } + + _deleteSelected() : void { + GlobalCommandRunner.historyView({offset: offset, searchText: this.activeSearchText}); } @boundMethod @@ -2141,6 +2153,7 @@ class Model { activeMainView : OV<"session" | "history" | "bookmarks"> = mobx.observable.box("session", {name: "activeMainView"}); termFontSize : CV; alertMessage : OV = mobx.observable.box(null, {name: "alertMessage"}); + alertPromiseResolver : (result : boolean) => void; inputModel : InputModel; bookmarksModel : BookmarksModel; @@ -2188,10 +2201,34 @@ class Model { setTimeout(() => this.getClientData(), 10); } - showAlert(alertMessage : AlertMessageType) : void { + showAlert(alertMessage : AlertMessageType) : Promise { mobx.action(() => { this.alertMessage.set(alertMessage); })(); + let prtn = new Promise((resolve, reject) => { + this.alertPromiseResolver = resolve; + }); + return prtn; + } + + cancelAlert() : void { + mobx.action(() => { + this.alertMessage.set(null); + })(); + if (this.alertPromiseResolver != null) { + this.alertPromiseResolver(false); + this.alertPromiseResolver = null; + } + } + + confirmAlert() : void { + mobx.action(() => { + this.alertMessage.set(null); + })(); + if (this.alertPromiseResolver != null) { + this.alertPromiseResolver(true); + this.alertPromiseResolver = null; + } } getBaseHostPort() : string { @@ -2234,6 +2271,19 @@ class Model { if (isModKeyPress(e)) { return; } + if (this.alertMessage.get() != null) { + if (e.code == "Escape") { + e.preventDefault(); + this.cancelAlert(); + return; + } + if (e.code == "Enter") { + e.preventDefault(); + this.confirmAlert(); + return; + } + return; + } if (this.activeMainView.get() == "bookmarks") { this.bookmarksModel.handleDocKeyDown(e); return; diff --git a/src/sh2.less b/src/sh2.less index 63a9ec5a8..829d01d04 100644 --- a/src/sh2.less +++ b/src/sh2.less @@ -239,6 +239,10 @@ body::-webkit-scrollbar { margin-left: 10px; align-items: center; + .is-hidden { + display: none; + } + .control-checkbox { cursor: pointer; color: #777; @@ -299,6 +303,17 @@ body::-webkit-scrollbar { width: 10px; } } + + .no-items { + display: flex; + flex-direction: row; + justify-content: center; + .mono-font(14px); + padding: 30px 0 30px 0; + border: 1px solid white; + border-radius: 3px; + margin: 20px 50px 20px 20px; + } .history-table { margin: 0px 10px 10px 10px; @@ -2363,3 +2378,30 @@ input[type=checkbox] { white-space: pre; } } + +.modal.alert-modal { + + .modal-card { + min-width: 350px; + max-width: 640px; + width: auto; + + header { + padding: 10px; + font-size: 1.5rem; + } + + footer { + padding: 10px; + justify-content: center; + } + + .modal-card-body { + padding: 10px; + + p { + text-align: center; + } + } + } +} diff --git a/src/types.ts b/src/types.ts index 33338def3..9d466bf79 100644 --- a/src/types.ts +++ b/src/types.ts @@ -423,6 +423,7 @@ type PlaybookEntryType = { type AlertMessageType = { title : string, message : string, + confirm? : boolean, }; type RenderModeType = "normal" | "collapsed";