diff --git a/frontend/src/views/host/file-management/index.vue b/frontend/src/views/host/file-management/index.vue
index a797e16eef02..89b0e9697816 100644
--- a/frontend/src/views/host/file-management/index.vue
+++ b/frontend/src/views/host/file-management/index.vue
@@ -547,13 +547,20 @@
@@ -867,7 +874,10 @@ const fileEdit = reactive<{
const filePreview = reactive({ path: '', name: '', extension: '', fileType: '', imageFiles: [], currentNode: '' });
const codeReq = reactive({ path: '', expand: false, page: 1, pageSize: 100, isDetail: false });
const fileUpload = reactive({ path: '', isAppendOnly: false });
-const fileRename = reactive({ path: '', oldName: '', newName: '' });
+const fileRename = reactive({ path: '', oldPath: '', oldName: '', newName: '', tabId: '' });
+const renameSubmitting = ref(false);
+const renameComposing = ref(false);
+let renameBlurPending = false;
const fileWget = reactive({ path: '', isAppendOnly: false });
const fileMove = reactive({ oldPaths: [''], allNames: [''], type: '', path: '', name: '', count: 0, isDir: false });
const fileConvert = reactive<{
@@ -1728,21 +1738,47 @@ const getWgetProcess = async () => {
};
const openRename = (item: File.File, source: string) => {
- fileRename.path = req.path;
- fileRename.oldName = item.name;
+ if (renameSubmitting.value) return;
+ fileRename.path = item.path.substring(0, item.path.lastIndexOf('/')) || '/';
+ fileRename.oldPath = item.path;
+ fileRename.oldName = item.path.substring(item.path.lastIndexOf('/') + 1);
+ fileRename.newName = fileRename.oldName;
+ fileRename.tabId = editableTabsKey.value;
+ renameComposing.value = false;
+ renameBlurPending = false;
if (source === 'right') {
- fileRename.newName = item.name;
isEdit.value = true;
nextTick(() => {
- getCurrentRename().focus();
+ getCurrentRename()?.focus();
});
hideRightMenu();
} else {
+ isEdit.value = false;
renameRef.value.acceptParams(fileRename);
}
};
-const onRenameBlur = (e: FocusEvent, row: File.File) => {
+const isCurrentRename = (row: File.File) =>
+ isEdit.value && fileRename.oldPath === row.path && fileRename.tabId === editableTabsKey.value;
+
+const onRenameEnter = (event: KeyboardEvent, row: File.File) => {
+ if (event.isComposing || event.keyCode === 229 || renameComposing.value || event.repeat) return;
+ event.preventDefault();
+ return handleRename(row);
+};
+
+const onRenameCompositionEnd = (event: CompositionEvent, row: File.File) => {
+ if (!isCurrentRename(row)) return;
+ fileRename.newName = (event.target as HTMLInputElement).value.trim();
+ renameComposing.value = false;
+ if (renameBlurPending) {
+ renameBlurPending = false;
+ return handleRename(row);
+ }
+};
+
+const onRenameBlur = async (e: FocusEvent, row: File.File) => {
+ if (!isCurrentRename(row) || renameSubmitting.value) return;
const related = e.relatedTarget as HTMLElement | null;
if (
related &&
@@ -1753,36 +1789,54 @@ const onRenameBlur = (e: FocusEvent, row: File.File) => {
}, 0);
return;
}
- handleRename(row);
+ if (renameComposing.value) {
+ renameBlurPending = true;
+ return;
+ }
+ await nextTick();
+ return handleRename(row);
};
const handleRename = async (row: File.File): Promise => {
- if (fileRename.newName === fileRename.oldName) {
+ if (!isCurrentRename(row) || renameSubmitting.value || renameComposing.value) return;
+ const newName = fileRename.newName.trim();
+ if (!newName) {
+ MsgWarning(i18n.global.t('commons.rule.requiredInput'));
+ getCurrentRename()?.focus();
+ return;
+ }
+ if (newName === fileRename.oldName) {
isEdit.value = false;
fileRename.oldName = '';
return;
}
const addItem: File.FileRename = {
- oldName: getPath(fileRename.path, fileRename.oldName),
- newName: getPath(fileRename.path, fileRename.newName),
+ oldName: fileRename.oldPath,
+ newName: getPath(fileRename.path, newName),
};
+ const namePrefix = row.name.substring(0, row.name.lastIndexOf('/') + 1);
+ renameSubmitting.value = true;
loading.value = true;
try {
await renameRile(addItem);
MsgSuccess(i18n.global.t('commons.msg.updateSuccess'));
- row.name = fileRename.newName;
- row.path = getPath(req.path, fileRename.newName);
+ isEdit.value = false;
+ fileRename.oldName = '';
+ row.name = namePrefix + newName;
+ row.path = addItem.newName;
} catch (error) {
console.error(error);
+ nextTick(() => {
+ if (isCurrentRename(row)) getCurrentRename()?.focus();
+ });
} finally {
loading.value = false;
- isEdit.value = false;
- fileRename.oldName = '';
+ renameSubmitting.value = false;
}
};
const getPath = (path: string, name: string) => {
- return path + '/' + name;
+ return path === '/' ? path + name : path + '/' + name;
};
const openMove = (type: string) => {