diff --git a/web/src/components/organisms/files/FileRow.vue b/web/src/components/organisms/files/FileRow.vue index c1bebd2..c0a1f38 100644 --- a/web/src/components/organisms/files/FileRow.vue +++ b/web/src/components/organisms/files/FileRow.vue @@ -123,7 +123,7 @@ const isTempRow = (item: ContentItem): item is FolderItem => :aria-label="item.isStarred ? t('files.table.aria.unstar') : t('files.table.aria.star')" @click.stop="emit('toggleStar', item)" > - + @@ -217,6 +217,7 @@ const isTempRow = (item: ContentItem): item is FolderItem => color: var(--text-dim); cursor: pointer; padding: 0; + flex-shrink: 0; } .row__star--on { color: var(--ac); } .row__star:hover { color: var(--ac); } diff --git a/web/src/components/organisms/files/FileTable.vue b/web/src/components/organisms/files/FileTable.vue index 91345be..b6530dc 100644 --- a/web/src/components/organisms/files/FileTable.vue +++ b/web/src/components/organisms/files/FileTable.vue @@ -160,7 +160,7 @@ const isTempFolder = (item: ContentItem): item is FolderItem => @click.stop="emit('toggleStar', item)" :aria-label="item.isStarred ? t('files.table.aria.unstar') : t('files.table.aria.star')" > - + color: var(--text-dim); cursor: pointer; padding: 0; + flex-shrink: 0; } .card__star--on { color: var(--ac); } -.card__icon { width: 48px; height: 48px; } +.card__icon { width: 48px; height: 48px; flex-shrink: 0; } .card__name { width: 100%; text-align: center; diff --git a/web/src/components/organisms/shell/LeftSidebar.vue b/web/src/components/organisms/shell/LeftSidebar.vue index f78a92f..e381863 100644 --- a/web/src/components/organisms/shell/LeftSidebar.vue +++ b/web/src/components/organisms/shell/LeftSidebar.vue @@ -242,6 +242,9 @@ onUnmounted(() => { eventBus.off('refresh-file-tree', refreshAllTrees); }); cursor: pointer; text-align: left; } +.starred-row > :first-child { + flex-shrink: 0; +} .starred-row:hover { background: var(--surface-inset); color: var(--text-primary); diff --git a/web/src/composables/useFileActions.spec.ts b/web/src/composables/useFileActions.spec.ts index 1a02c45..edbfec0 100644 --- a/web/src/composables/useFileActions.spec.ts +++ b/web/src/composables/useFileActions.spec.ts @@ -68,39 +68,39 @@ vi.mock('../store/locale', () => ({ })); vi.mock('../api/folder', () => ({ - createFolder: (...args: unknown[]) => createFolderMock(...args), - deleteFolder: (...args: unknown[]) => deleteFolderMock(...args), - renameFolder: (...args: unknown[]) => renameFolderMock(...args), + createFolder: createFolderMock, + deleteFolder: deleteFolderMock, + renameFolder: renameFolderMock, })); vi.mock('../api/file', () => ({ - batchFiles: (...args: unknown[]) => batchFilesMock(...args), - deleteFile: (...args: unknown[]) => deleteFileMock(...args), - downloadFile: (...args: unknown[]) => downloadFileMock(...args), - renameFile: (...args: unknown[]) => renameFileMock(...args), + batchFiles: batchFilesMock, + deleteFile: deleteFileMock, + downloadFile: downloadFileMock, + renameFile: renameFileMock, })); vi.mock('../api/share', () => ({ - getShares: (...args: unknown[]) => getSharesMock(...args), + getShares: getSharesMock, })); vi.mock('../utils/eventBus', () => ({ eventBus: { - emit: (...args: unknown[]) => eventEmitMock(...args), + emit: eventEmitMock, }, })); vi.mock('../utils/ui', () => ({ ui: { - toast: (...args: unknown[]) => toastMock(...args), - confirm: (...args: unknown[]) => confirmMock(...args), + toast: toastMock, + confirm: confirmMock, }, })); vi.mock('./useNewFolderCancel', () => ({ useNewFolderCancel: () => ({ - install: (...args: unknown[]) => newFolderCancelInstallMock(...args), - uninstall: (...args: unknown[]) => newFolderCancelUninstallMock(...args), + install: newFolderCancelInstallMock, + uninstall: newFolderCancelUninstallMock, }), })); diff --git a/web/src/composables/useFileActions.ts b/web/src/composables/useFileActions.ts index 5efa939..18caaa2 100644 --- a/web/src/composables/useFileActions.ts +++ b/web/src/composables/useFileActions.ts @@ -58,6 +58,12 @@ export function useFileActions(currentFolderId: Ref) { const registerRenameInput = (itemId: string, el: HTMLInputElement | null) => { if (renamingItemId.value !== itemId) return; renameInput.value = el; + if (el) { + void nextTick().then(() => { + el.focus(); + el.select(); + }); + } }; const startRename = async (item: ContentItem) => { @@ -65,8 +71,6 @@ export function useFileActions(currentFolderId: Ref) { renameInputValue.value = item.name; renameInput.value = null; await nextTick(); - renameInput.value?.focus(); - renameInput.value?.select(); }; const cancelRename = () => { diff --git a/web/src/pages/agent/workspace/AgentWorkspace.vue b/web/src/pages/agent/workspace/AgentWorkspace.vue index 1c903e8..5fc04a9 100644 --- a/web/src/pages/agent/workspace/AgentWorkspace.vue +++ b/web/src/pages/agent/workspace/AgentWorkspace.vue @@ -1,34 +1,20 @@