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') {