Skip to content

Commit 2c2de3a

Browse files
jsonifyclaude
andauthored
Build AI template creator with description input (#89)
* fix(templates): prevent save dialog for AI template preview - Changed preview mode from false to true to avoid save prompts - Use revertAndCloseActiveEditor to close preview without save dialog - Templates are automatically saved to .templates folder via saveTemplateAsJSON - Fixes issue where preview document prompted for save with "# 📄 Template Preview/ " filename - Applied fix to both showTemplatePreview and showTemplateEnhancementPreview functions * refactor: address code review feedback Performance optimization: - Move TEMPLATE_NAME_MAP to static readonly property in TemplatesTreeProvider - Avoids re-creating nameMap object on every getTemplateFriendlyName() call Preview close robustness: - Check if document is closed before attempting to close it - Reactivate preview document before closing to ensure correct editor is closed - Use preserveFocus: false to make preview active before closing - Prevents accidentally closing wrong editor if user switches away during preview * fix(templates): refresh Templates panel after browser operations Problem: - Deleting/duplicating templates in Template Browser updated the webview - But didn't refresh the Templates sidebar tree panel - Templates panel showed stale data until manual refresh Solution: - Pass templatesProvider to showTemplateBrowser() - Store module-level reference for message handlers - Call templatesProvider.refresh() after delete/duplicate operations - Now both webview and sidebar stay in sync Files changed: - templateBrowserView.ts: Add provider param, refresh after operations - extension.ts: Pass templatesProvider to showTemplateBrowser() --------- Co-authored-by: Claude <[email protected]>
1 parent d028e59 commit 2c2de3a

File tree

4 files changed

+29
-23
lines changed

4 files changed

+29
-23
lines changed

src/commands/templateCommands.ts

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ async function showTemplatePreview(template: Template): Promise<boolean> {
205205
});
206206

207207
const editor = await vscode.window.showTextDocument(doc, {
208-
preview: false, // Don't use preview mode to avoid save prompts
208+
preview: true, // Use preview mode to avoid save prompts
209209
viewColumn: vscode.ViewColumn.Beside
210210
});
211211

@@ -229,15 +229,14 @@ async function showTemplatePreview(template: Template): Promise<boolean> {
229229
}
230230

231231
// Close the preview document without save prompt
232-
const uri = editor.document.uri;
233-
await vscode.window.showTextDocument(editor.document, { preview: true }); // Switch to preview mode
234-
await vscode.commands.executeCommand('workbench.action.closeActiveEditor');
235-
236-
// Delete from workspace if it's an untitled document
237-
try {
238-
await vscode.workspace.fs.delete(uri, { useTrash: false });
239-
} catch {
240-
// Ignore errors - untitled documents don't need deletion
232+
// Ensure we're closing the correct document even if user switched editors
233+
if (!doc.isClosed) {
234+
await vscode.window.showTextDocument(doc, {
235+
preview: true,
236+
viewColumn: editor.viewColumn,
237+
preserveFocus: false
238+
});
239+
await vscode.commands.executeCommand('workbench.action.revertAndCloseActiveEditor');
241240
}
242241

243242
return result === 'Accept & Save';
@@ -259,7 +258,7 @@ async function showTemplateEnhancementPreview(
259258
});
260259

261260
const editor = await vscode.window.showTextDocument(doc, {
262-
preview: false, // Don't use preview mode to avoid save prompts
261+
preview: true, // Use preview mode to avoid save prompts
263262
viewColumn: vscode.ViewColumn.Beside
264263
});
265264

@@ -283,15 +282,14 @@ async function showTemplateEnhancementPreview(
283282
}
284283

285284
// Close the preview document without save prompt
286-
const uri = editor.document.uri;
287-
await vscode.window.showTextDocument(editor.document, { preview: true }); // Switch to preview mode
288-
await vscode.commands.executeCommand('workbench.action.closeActiveEditor');
289-
290-
// Delete from workspace if it's an untitled document
291-
try {
292-
await vscode.workspace.fs.delete(uri, { useTrash: false });
293-
} catch {
294-
// Ignore errors - untitled documents don't need deletion
285+
// Ensure we're closing the correct document even if user switched editors
286+
if (!doc.isClosed) {
287+
await vscode.window.showTextDocument(doc, {
288+
preview: true,
289+
viewColumn: editor.viewColumn,
290+
preserveFocus: false
291+
});
292+
await vscode.commands.executeCommand('workbench.action.revertAndCloseActiveEditor');
295293
}
296294

297295
return result === 'Accept & Save';

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1808,7 +1808,7 @@ export function activate(context: vscode.ExtensionContext) {
18081808

18091809
// Phase 4: Template Browser UI
18101810
let showTemplateBrowserCmd = vscode.commands.registerCommand('noted.showTemplateBrowser', async () => {
1811-
await showTemplateBrowser(context);
1811+
await showTemplateBrowser(context, templatesProvider);
18121812
});
18131813

18141814
// Command to setup custom folder

src/providers/templatesTreeProvider.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,5 +259,4 @@ export class TemplatesTreeProvider implements vscode.TreeDataProvider<TreeItem>
259259
return item;
260260
});
261261
}
262-
263262
}

src/templates/templateBrowserView.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import { getTemplatesPath, getFileFormat } from '../services/configService';
44
import { pathExists, readFile, readDirectory, writeFile } from '../services/fileSystemService';
55
import { Template } from './TemplateTypes';
66
import { BUILT_IN_TEMPLATES } from '../constants';
7+
import { TemplatesTreeProvider } from '../providers/templatesTreeProvider';
8+
9+
// Module-level reference to templates tree provider for refreshing
10+
let templatesProvider: TemplatesTreeProvider | undefined;
711

812
/**
913
* Template display info for the browser
@@ -26,7 +30,10 @@ interface TemplateDisplayInfo {
2630
/**
2731
* Show the template browser webview
2832
*/
29-
export async function showTemplateBrowser(context: vscode.ExtensionContext): Promise<void> {
33+
export async function showTemplateBrowser(context: vscode.ExtensionContext, provider?: TemplatesTreeProvider): Promise<void> {
34+
// Store reference to templates provider for refreshing after operations
35+
templatesProvider = provider;
36+
3037
const templatesPath = getTemplatesPath();
3138

3239
const panel = vscode.window.createWebviewPanel(
@@ -69,11 +76,13 @@ export async function showTemplateBrowser(context: vscode.ExtensionContext): Pro
6976
case 'deleteTemplate':
7077
await handleDeleteTemplate(message.templateId);
7178
await refreshWebviewTemplates();
79+
templatesProvider?.refresh(); // Refresh sidebar tree view
7280
break;
7381

7482
case 'duplicateTemplate':
7583
await handleDuplicateTemplate(message.templateId);
7684
await refreshWebviewTemplates();
85+
templatesProvider?.refresh(); // Refresh sidebar tree view
7786
break;
7887

7988
case 'exportTemplate':

0 commit comments

Comments
 (0)