diff --git a/src/panels/helpers/contextHelper.ts b/src/panels/helpers/contextHelper.ts index 96cb569..b11a20f 100644 --- a/src/panels/helpers/contextHelper.ts +++ b/src/panels/helpers/contextHelper.ts @@ -198,3 +198,16 @@ export function deleteDocumentSet(id: string, panel: vscode.WebviewPanel) { documentSets: documentSets, }); } + +export function changeDocumentSetName(id: string, newName: string, panel: vscode.WebviewPanel) { + const docSet = documentSets.find(ds => ds.id === id); + if (docSet) { + docSet.name = newName; + docSet.updatedAt = new Date().toISOString(); + persistDocumentSets(); + panel.webview.postMessage({ + command: "documentSetSaved", + documentSets: documentSets, + }); + } +} diff --git a/src/panels/helpers/messageRouter.ts b/src/panels/helpers/messageRouter.ts index cdd298c..0bbc92c 100644 --- a/src/panels/helpers/messageRouter.ts +++ b/src/panels/helpers/messageRouter.ts @@ -382,6 +382,11 @@ export async function handleWebviewMessage( deleteDocumentSet(message.id, panel); break; + case "changeDocumentSetName": + const { changeDocumentSetName } = await import("./contextHelper"); + changeDocumentSetName(message.id, message.newName, panel); + break; + case "openContextSettings": panel.webview.postMessage({ command: "openSettingsTab", diff --git a/src/views/docsetDialog.ts b/src/views/docsetDialog.ts index 7c33ddf..2d36df8 100644 --- a/src/views/docsetDialog.ts +++ b/src/views/docsetDialog.ts @@ -48,6 +48,16 @@ export function getDocsetDialogContent(): string { +
+
+
修改名称
+ +
+ + +
+
+
`; } @@ -209,7 +219,7 @@ export function getDocsetDialogStyles(): string { background: var(--vscode-button-hoverBackground); } - .docset-delete-btn { + .docset-delete-btn, .docset-change-btn { position: relative; background: transparent; border: none; @@ -219,11 +229,11 @@ export function getDocsetDialogStyles(): string { opacity: 0.6; } - .docset-delete-btn:hover { + .docset-delete-btn:hover, .docset-change-btn:hover { opacity: 1; } - .docset-delete-btn:hover::after { + .docset-delete-btn:hover::after, .docset-change-btn:hover::after { content: attr(data-tooltip); position: absolute; bottom: 100%; @@ -291,6 +301,64 @@ export function getDocsetDialogStyles(): string { cursor: pointer; font-size: 13px; } + + .rename-dialog { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.4); + z-index: 10000; + align-items: center; + justify-content: center; + } + + .rename-dialog.active { + display: flex; + } + + .rename-content { + background: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 6px; + padding: 20px; + min-width: 300px; + max-width: 400px; + } + + .rename-title { + font-size: 14px; + font-weight: 600; + margin-bottom: 12px; + } + + .rename-input { + width: 100%; + padding: 8px 12px; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + color: var(--vscode-input-foreground); + font-size: 13px; + box-sizing: border-box; + margin-bottom: 16px; + } + + .rename-actions { + display: flex; + justify-content: flex-end; + gap: 8px; + } + + .rename-actions button { + padding: 6px 16px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 13px; + } `; } @@ -392,16 +460,23 @@ export function getDocsetDialogScript(): string {
\${ds.name}
更新于 \${new Date(ds.updatedAt).toLocaleString('zh-CN')}
+ +
\`).join(''); } let deleteTargetId = null; + let renameTargetId = null; + let renameOriginalName = null; window.showDeleteConfirm = function(id, name) { deleteTargetId = id; @@ -409,11 +484,25 @@ export function getDocsetDialogScript(): string { document.getElementById('deleteConfirmDialog').classList.add('active'); }; + window.changeDocsetName = function(id, name) { + renameTargetId = id; + renameOriginalName = name; + document.getElementById('renameInput').value = name; + document.getElementById('renameDialog').classList.add('active'); + setTimeout(() => document.getElementById('renameInput').focus(), 100); + }; + window.closeDeleteConfirm = function() { document.getElementById('deleteConfirmDialog').classList.remove('active'); deleteTargetId = null; }; + window.closeRenameDialog = function() { + document.getElementById('renameDialog').classList.remove('active'); + renameTargetId = null; + renameOriginalName = null; + }; + window.confirmDelete = function() { if (deleteTargetId) { vscode.postMessage({ command: 'deleteDocumentSet', id: deleteTargetId }); @@ -421,6 +510,18 @@ export function getDocsetDialogScript(): string { } }; + window.confirmRename = function() { + const newName = document.getElementById('renameInput').value.trim(); + if (!newName) { + alert('请输入名称'); + return; + } + if (newName !== renameOriginalName) { + vscode.postMessage({ command: 'changeDocumentSetName', id: renameTargetId, newName: newName }); + } + closeRenameDialog(); + }; + window.addEventListener('message', event => { const message = event.data; if (message.command === 'filesSelectedForDocset') {