From 778d801b8879240908f3fb5c26914590ad371794 Mon Sep 17 00:00:00 2001 From: sawka Date: Sun, 5 Mar 2023 13:24:29 -0800 Subject: [PATCH] copy to clipboard as keyboard command as well --- src/bookmarks.tsx | 21 +++++---------- src/model.ts | 67 +++++++++++++++++++++++++++++++++++++++++------ src/types.ts | 6 ++--- 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/src/bookmarks.tsx b/src/bookmarks.tsx index 354f9a075..bb618c9d3 100644 --- a/src/bookmarks.tsx +++ b/src/bookmarks.tsx @@ -31,8 +31,6 @@ function CodeRenderer(props : any) : any { @mobxReact.observer class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> { - copiedIndicator : OV = mobx.observable.box(false, {name: "copiedIndicator"}); - @boundMethod handleDeleteClick() : void { let {bookmark} = this.props; @@ -56,7 +54,7 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> { @boundMethod handleEditUpdate() : void { - let model = GlobalModel.bookmarksModel;opie + let model = GlobalModel.bookmarksModel; model.confirmEdit(); return; } @@ -93,16 +91,9 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> { @boundMethod clickCopy() : void { - let bm = this.props.bookmark - navigator.clipboard.writeText(bm.cmdstr); - mobx.action(() => { - this.copiedIndicator.set(true); - })(); - setTimeout(() => { - mobx.action(() => { - this.copiedIndicator.set(false); - })(); - }, 600) + let bm = this.props.bookmark; + let model = GlobalModel.bookmarksModel; + model.handleCopyBookmark(bm.bookmarkid); } render() { @@ -122,6 +113,7 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> { }; let hasDesc = markdown != ""; let isEditing = (model.editingBookmark.get() == bm.bookmarkid); + let isCopied = mobx.computed(() => (model.copiedIndicator.get() == bm.bookmarkid)).get(); if (isEditing) { return (
@@ -153,7 +145,7 @@ class Bookmark extends React.Component<{bookmark : BookmarkType}, {}> { } return (
- +
copied
@@ -225,6 +217,7 @@ class BookmarksView extends React.Component<{}, {}> { [Backspace/Delete]x2 or to Delete
[Arrow Up]/[Arrow Down]/[PageUp]/[PageDown] to Move in List
[e] or to Edit
+ [c] or to Copy
diff --git a/src/model.ts b/src/model.ts index bd09f1bba..17f8f035d 100644 --- a/src/model.ts +++ b/src/model.ts @@ -690,6 +690,28 @@ class ScreenWindow { getWindow() : Window { return GlobalModel.getWindowById(this.sessionId, this.windowId); } + + giveFocus() : void { + if (!this.isActive()) { + return; + } + let ftype = this.focusType.get(); + if (ftype == "input") { + GlobalModel.inputModel.giveFocus(); + } + else { + let sline : LineType = null; + if (this.selectedLine.get() != 0) { + sline = this.getLineByNum(this.selectedLine.get()); + } + if (sline != null) { + let termWrap = this.getRenderer(sline.cmdid); + if (termWrap != null) { + termWrap.giveFocus(); + } + } + } + } } class Window { @@ -1784,9 +1806,8 @@ class HistoryViewModel { } closeView() : void { - mobx.action(() => { - GlobalModel.activeMainView.set("session"); - })(); + GlobalModel.showSessionView(); + setTimeout(() => GlobalModel.inputModel.giveFocus(), 50); } getLineById(lineId : string) : LineType { @@ -1886,7 +1907,7 @@ class HistoryViewModel { _getSearchParams(newOffset? : number) : HistorySearchParams { let offset = (newOffset != null ? newOffset : this.offset.get()); - let opts : HistorySearchParms = { + let opts : HistorySearchParams = { offset: offset, searchText: this.activeSearchText, searchSessionId: this.searchSessionId.get(), @@ -1980,6 +2001,7 @@ class BookmarksModel { activeBookmark : OV = mobx.observable.box(null, {name: "activeBookmark"}); editingBookmark : OV = mobx.observable.box(null, {name: "editingBookmark"}); pendingDelete : OV = mobx.observable.box(null, {name: "pendingDelete"}); + copiedIndicator : OV = mobx.observable.box(null, {name: "copiedIndicator"}); tempDesc : OV = mobx.observable.box("", {name: "bookmarkEdit-tempDesc"}); tempCmd : OV = mobx.observable.box("", {name: "bookmarkEdit-tempCmd"}); @@ -2008,9 +2030,8 @@ class BookmarksModel { } closeView() : void { - mobx.action(() => { - GlobalModel.activeMainView.set("session"); - })(); + GlobalModel.showSessionView(); + setTimeout(() => GlobalModel.inputModel.giveFocus(), 50); } @boundMethod @@ -2025,7 +2046,7 @@ class BookmarksModel { } mobx.action(() => { this.reset(); - GlobalModel.activeMainView.set("session"); + GlobalModel.showSessionView(); GlobalModel.inputModel.setCurLine(bm.cmdstr); setTimeout(() => GlobalModel.inputModel.giveFocus(), 50); })(); @@ -2124,6 +2145,22 @@ class BookmarksModel { })(); } + handleCopyBookmark(bookmarkId : string) : void { + let bm = this.getBookmark(bookmarkId); + if (bm == null) { + return; + } + navigator.clipboard.writeText(bm.cmdstr); + mobx.action(() => { + this.copiedIndicator.set(bm.bookmarkid); + })(); + setTimeout(() => { + mobx.action(() => { + this.copiedIndicator.set(null); + })(); + }, 600) + } + mergeBookmarks(bmArr : BookmarkType[]) : void { mobx.action(() => { genMergeSimpleData(this.bookmarks, bmArr, (bm : BookmarkType) => bm.bookmarkid, (bm : BookmarkType) => sprintf("%05d", bm.orderidx)); @@ -2190,6 +2227,14 @@ class BookmarksModel { this.handleEditBookmark(this.activeBookmark.get()); return; } + if (e.code == "KeyC") { + if (this.activeBookmark.get() == null) { + return; + } + e.preventDefault(); + this.handleCopyBookmark(this.activeBookmark.get()); + return; + } } return; } @@ -2290,6 +2335,12 @@ class Model { } } + showSessionView() : void { + mobx.action(() => { + this.activeMainView.set("session"); + })(); + } + getBaseHostPort() : string { if (this.isDev) { return DevServerEndpoint; diff --git a/src/types.ts b/src/types.ts index 64f87d0d8..62e824f22 100644 --- a/src/types.ts +++ b/src/types.ts @@ -134,9 +134,9 @@ type FeStateType = { }; type RemotePtrType = { - ownerid : string, remoteid : string, - name : string, + ownerid? : string, + name? : string, }; type WindowDataType = { @@ -432,7 +432,7 @@ type HistorySearchParams = { searchText? : string, searchSessionId? : string, searchRemoteId? : string, - fromts? : number, + fromTs? : number, noMeta? : boolean, };