From 46944de6501de5e3643ad1eb8ed67196689745d9 Mon Sep 17 00:00:00 2001 From: david yang Date: Tue, 2 Jan 2024 11:37:29 -0500 Subject: [PATCH 1/5] Support for showing history in a preview window to better search for clips --- package.json | 5 +++ src/commads/common.ts | 1 + src/commads/showClipboardHistory.ts | 61 +++++++++++++++++++++++++++++ src/extension.ts | 12 ++++++ 4 files changed, 79 insertions(+) create mode 100644 src/commads/showClipboardHistory.ts diff --git a/package.json b/package.json index 63684b4..9dd3dfc 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,11 @@ "dark": "resources/dark/remove.svg", "light": "resources/light/remove.svg" } + }, + { + "command": "clipboard-manager.history.show-buffer", + "title": "Show History in Buffer", + "category": "Clipboard Manager" } ], "menus": { diff --git a/src/commads/common.ts b/src/commads/common.ts index 82289a9..fff368d 100644 --- a/src/commads/common.ts +++ b/src/commads/common.ts @@ -7,4 +7,5 @@ export enum commandList { removeClipboardHistory = "clipboard-manager.history.remove", setClipboardValue = "clipboard-manager.setClipboardValue", showClipboardInFile = "clipboard-manager.editor.showClipboardInFile", + showClipboardHistory = "clipboard-manager.history.show-buffer", } diff --git a/src/commads/showClipboardHistory.ts b/src/commads/showClipboardHistory.ts new file mode 100644 index 0000000..e532da1 --- /dev/null +++ b/src/commads/showClipboardHistory.ts @@ -0,0 +1,61 @@ +import * as vscode from "vscode"; +import { ClipboardManager, IClipboardItem } from "../manager"; +import { ClipHistoryItem } from "../tree/history"; +import { commandList } from "./common"; + + +export class ClipboardHistoryProvider implements vscode.TextDocumentContentProvider { + constructor(protected _manager: ClipboardManager) { + } + + protected createClipsString(clips: IClipboardItem[]): string { + return clips + .map((clip) => { + const createdAt = new Date(clip.createdAt).toLocaleString(); + const language = clip.language ? `${clip.language}` : ''; + const statusLine = `${createdAt} - ${language} - ${clip.createdLocation?.uri.toString()}`; + const clipText = clip.value.trim(); + const dashLine = "-".repeat(statusLine.length); + return `${statusLine}\n${dashLine}\n${clipText}`; + }) + .join('\n\n'); + } + + public provideTextDocumentContent(uri: vscode.Uri): string { + // You would normally fetch the clip data associated with this specific uri + // but since we're demonstrating, let's just return a static string. + return this.createClipsString(this._manager.clips); + } +} + + +export class ShowClipboardHistory implements vscode.Disposable { + private _disposable: vscode.Disposable[] = []; + + constructor(protected _manager: ClipboardManager) { + this._disposable.push( + vscode.commands.registerCommand( + commandList.showClipboardHistory, + this.execute, + this + ) + ); + } + + protected async execute(item: ClipHistoryItem) { + // const clipsString = this.createClipsString(this._manager.clips); + const uri = vscode.Uri.parse('clipboard-history://history/clipboard-buffer.txt'); + + const document = await vscode.workspace.openTextDocument(uri); + + await vscode.window.showTextDocument(document, { + preview: true, + viewColumn: vscode.ViewColumn.Active + }); + + } + + public dispose() { + this._disposable.forEach(d => d.dispose()); + } +} diff --git a/src/extension.ts b/src/extension.ts index 63f30c5..da8e136 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -13,6 +13,7 @@ import { ClipboardManager } from "./manager"; import { Monitor } from "./monitor"; import { ClipboardTreeDataProvider } from "./tree/history"; import { CopyToHistoryCommand } from "./commads/copyToHistory"; +import { ShowClipboardHistory, ClipboardHistoryProvider } from "./commads/showClipboardHistory"; let manager: ClipboardManager; @@ -60,6 +61,8 @@ export async function activate(context: vscode.ExtensionContext) { disposable.push(new ShowClipboardInFile(manager)); disposable.push(new ClearClipboardHistory(manager)); disposable.push(new CopyToHistoryCommand(monitor)); + disposable.push(new ShowClipboardHistory(manager)); + const completion = new ClipboardCompletion(manager); // disposable.push(completion); @@ -87,6 +90,15 @@ export async function activate(context: vscode.ExtensionContext) { const clipboardTreeDataProvider = new ClipboardTreeDataProvider(manager); disposable.push(clipboardTreeDataProvider); + + + + const clipboardHistoryProvider = new ClipboardHistoryProvider(manager); + disposable.push(vscode.workspace.registerTextDocumentContentProvider( + 'clipboard-history', + clipboardHistoryProvider + )); + disposable.push( vscode.window.registerTreeDataProvider( "clipboardHistory", From ac7e3c7b8e024741da5fc031a5a0acb28239321a Mon Sep 17 00:00:00 2001 From: david yang Date: Tue, 2 Jan 2024 11:56:31 -0500 Subject: [PATCH 2/5] cleanup and cache buster --- src/commads/showClipboardHistory.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/commads/showClipboardHistory.ts b/src/commads/showClipboardHistory.ts index e532da1..f313aa1 100644 --- a/src/commads/showClipboardHistory.ts +++ b/src/commads/showClipboardHistory.ts @@ -22,8 +22,6 @@ export class ClipboardHistoryProvider implements vscode.TextDocumentContentProvi } public provideTextDocumentContent(uri: vscode.Uri): string { - // You would normally fetch the clip data associated with this specific uri - // but since we're demonstrating, let's just return a static string. return this.createClipsString(this._manager.clips); } } @@ -43,8 +41,8 @@ export class ShowClipboardHistory implements vscode.Disposable { } protected async execute(item: ClipHistoryItem) { - // const clipsString = this.createClipsString(this._manager.clips); - const uri = vscode.Uri.parse('clipboard-history://history/clipboard-buffer.txt'); + const timestamp = Date.now(); + const uri = vscode.Uri.parse(`clipboard-history://history/clipboard-buffer.txt?${timestamp}`); const document = await vscode.workspace.openTextDocument(uri); From bf48d3111d737e5ac21d1be22dc51c88aabf1547 Mon Sep 17 00:00:00 2001 From: david yang Date: Thu, 4 Jan 2024 15:26:28 -0500 Subject: [PATCH 3/5] fix lint issues --- src/commads/showClipboardHistory.ts | 16 ++++++++-------- src/extension.ts | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/commads/showClipboardHistory.ts b/src/commads/showClipboardHistory.ts index f313aa1..3bada7c 100644 --- a/src/commads/showClipboardHistory.ts +++ b/src/commads/showClipboardHistory.ts @@ -1,16 +1,15 @@ import * as vscode from "vscode"; import { ClipboardManager, IClipboardItem } from "../manager"; -import { ClipHistoryItem } from "../tree/history"; import { commandList } from "./common"; - - -export class ClipboardHistoryProvider implements vscode.TextDocumentContentProvider { +export class ClipboardHistoryProvider + implements vscode.TextDocumentContentProvider +{ constructor(protected _manager: ClipboardManager) { } protected createClipsString(clips: IClipboardItem[]): string { return clips - .map((clip) => { + .map(clip => { const createdAt = new Date(clip.createdAt).toLocaleString(); const language = clip.language ? `${clip.language}` : ''; const statusLine = `${createdAt} - ${language} - ${clip.createdLocation?.uri.toString()}`; @@ -21,7 +20,7 @@ export class ClipboardHistoryProvider implements vscode.TextDocumentContentProvi .join('\n\n'); } - public provideTextDocumentContent(uri: vscode.Uri): string { + public provideTextDocumentContent(_uri: vscode.Uri): string { return this.createClipsString(this._manager.clips); } } @@ -40,9 +39,10 @@ export class ShowClipboardHistory implements vscode.Disposable { ); } - protected async execute(item: ClipHistoryItem) { + protected async execute() { const timestamp = Date.now(); - const uri = vscode.Uri.parse(`clipboard-history://history/clipboard-buffer.txt?${timestamp}`); + const uri = vscode.Uri.parse( + `clipboard-history://history/clipboard-buffer.txt?${timestamp}`); const document = await vscode.workspace.openTextDocument(uri); diff --git a/src/extension.ts b/src/extension.ts index da8e136..5c81b60 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -13,7 +13,10 @@ import { ClipboardManager } from "./manager"; import { Monitor } from "./monitor"; import { ClipboardTreeDataProvider } from "./tree/history"; import { CopyToHistoryCommand } from "./commads/copyToHistory"; -import { ShowClipboardHistory, ClipboardHistoryProvider } from "./commads/showClipboardHistory"; +import { + ShowClipboardHistory, + ClipboardHistoryProvider, +} from "./commads/showClipboardHistory"; let manager: ClipboardManager; @@ -63,7 +66,6 @@ export async function activate(context: vscode.ExtensionContext) { disposable.push(new CopyToHistoryCommand(monitor)); disposable.push(new ShowClipboardHistory(manager)); - const completion = new ClipboardCompletion(manager); // disposable.push(completion); @@ -90,14 +92,13 @@ export async function activate(context: vscode.ExtensionContext) { const clipboardTreeDataProvider = new ClipboardTreeDataProvider(manager); disposable.push(clipboardTreeDataProvider); - - - const clipboardHistoryProvider = new ClipboardHistoryProvider(manager); - disposable.push(vscode.workspace.registerTextDocumentContentProvider( - 'clipboard-history', - clipboardHistoryProvider - )); + disposable.push( + vscode.workspace.registerTextDocumentContentProvider( + "clipboard-history", + clipboardHistoryProvider + ) + ); disposable.push( vscode.window.registerTreeDataProvider( From 9171524afd9288891a7cb81ced54fa7ea2313580 Mon Sep 17 00:00:00 2001 From: david yang Date: Thu, 4 Jan 2024 15:27:55 -0500 Subject: [PATCH 4/5] more lint fixes --- src/commads/showClipboardHistory.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/commads/showClipboardHistory.ts b/src/commads/showClipboardHistory.ts index 3bada7c..f9b4c01 100644 --- a/src/commads/showClipboardHistory.ts +++ b/src/commads/showClipboardHistory.ts @@ -4,20 +4,19 @@ import { commandList } from "./common"; export class ClipboardHistoryProvider implements vscode.TextDocumentContentProvider { - constructor(protected _manager: ClipboardManager) { - } + constructor(protected _manager: ClipboardManager) {} - protected createClipsString(clips: IClipboardItem[]): string { + protected createClipsString(clips: IClipboardItem[]): string { return clips .map(clip => { const createdAt = new Date(clip.createdAt).toLocaleString(); - const language = clip.language ? `${clip.language}` : ''; + const language = clip.language ? `${clip.language}` : ""; const statusLine = `${createdAt} - ${language} - ${clip.createdLocation?.uri.toString()}`; const clipText = clip.value.trim(); const dashLine = "-".repeat(statusLine.length); return `${statusLine}\n${dashLine}\n${clipText}`; }) - .join('\n\n'); + .join("\n\n"); } public provideTextDocumentContent(_uri: vscode.Uri): string { @@ -25,7 +24,6 @@ export class ClipboardHistoryProvider } } - export class ShowClipboardHistory implements vscode.Disposable { private _disposable: vscode.Disposable[] = []; @@ -42,15 +40,15 @@ export class ShowClipboardHistory implements vscode.Disposable { protected async execute() { const timestamp = Date.now(); const uri = vscode.Uri.parse( - `clipboard-history://history/clipboard-buffer.txt?${timestamp}`); + `clipboard-history://history/clipboard-buffer.txt?${timestamp}` + ); const document = await vscode.workspace.openTextDocument(uri); await vscode.window.showTextDocument(document, { preview: true, - viewColumn: vscode.ViewColumn.Active + viewColumn: vscode.ViewColumn.Active, }); - } public dispose() { From 5c5dc851ac1f2f98dd7bde63b891809a611f74a7 Mon Sep 17 00:00:00 2001 From: david yang Date: Thu, 4 Jan 2024 15:41:40 -0500 Subject: [PATCH 5/5] test --- src/test/showClipboardHistory.test.ts | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/test/showClipboardHistory.test.ts diff --git a/src/test/showClipboardHistory.test.ts b/src/test/showClipboardHistory.test.ts new file mode 100644 index 0000000..19c7df3 --- /dev/null +++ b/src/test/showClipboardHistory.test.ts @@ -0,0 +1,41 @@ +import * as assert from "assert"; +import * as sinon from "sinon"; +import * as vscode from "vscode"; +import { ClipboardManager } from "../manager"; +import { ShowClipboardHistory } from "../commads/showClipboardHistory"; +import { activateExtension, getExtension } from "./common"; + +suite("Show Clipboard History Tests", function () { + let sandbox: sinon.SinonSandbox; + let clipboardManager: ClipboardManager | undefined; + let showClipboardHistory: ShowClipboardHistory; + + suiteSetup(async function () { + if (!(await activateExtension())) { + this.skip(); + } + }); + + setup(function () { + sandbox = sinon.createSandbox(); + clipboardManager = getExtension()?.exports.manager; + if(clipboardManager) { + showClipboardHistory = new ShowClipboardHistory(clipboardManager); + } + }); + + teardown(function () { + sandbox.restore(); + showClipboardHistory.dispose(); + }); + + test("Show Clipboard History Command Execution", async function () { + const showTextDocumentStub = sandbox.stub(vscode.window, "showTextDocument"); + const openTextDocumentStub = sandbox.stub(vscode.workspace, "openTextDocument"); + + await vscode.commands.executeCommand("clipboard-manager.history.show-buffer"); + + assert.ok(openTextDocumentStub.calledOnce, "openTextDocument should be called once"); + assert.ok(showTextDocumentStub.calledOnce, "showTextDocument should be called once"); + }); +}); \ No newline at end of file