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