From 35cb6888f943c3489f3e71617e1fdf5cd4f903e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 27 Jul 2026 16:43:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E7=90=86=E7=B4=A0=E6=9D=90=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E9=80=89=E6=8B=A9=E9=94=9A=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 全选或取消全选前清空上次单项选择锚点 覆盖全选清空后 Shift 点击不扩展旧范围的回归场景 --- .../useImageCanvasAssetLibrary.test.tsx | 37 ++++++++++++++++++- .../useImageCanvasAssetLibrary.ts | 1 + 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/components/image-editor/useImageCanvasAssetLibrary.test.tsx b/src/components/image-editor/useImageCanvasAssetLibrary.test.tsx index 2888206db..3642649b6 100644 --- a/src/components/image-editor/useImageCanvasAssetLibrary.test.tsx +++ b/src/components/image-editor/useImageCanvasAssetLibrary.test.tsx @@ -1,6 +1,12 @@ /* @vitest-environment jsdom */ -import { act, render, screen, waitFor } from '@testing-library/react'; +import { + act, + fireEvent, + render, + screen, + waitFor, +} from '@testing-library/react'; import { useRef } from 'react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; @@ -483,6 +489,35 @@ describe('useImageCanvasAssetLibrary', () => { expect(screen.getByTestId('selected-assets').textContent).toBe(''); }); + it('clears the range anchor when toggling all visible assets', async () => { + loadEditorAssetLibraryMock.mockResolvedValueOnce({ + folders: [ + { + folderId: 'project', + label: '项目素材', + sortOrder: 0, + collapsed: false, + systemDefault: true, + }, + ], + assets: [ + createAssetSnapshot({ assetId: 'asset-a', label: '素材A' }), + createAssetSnapshot({ assetId: 'asset-b', label: '素材B' }), + createAssetSnapshot({ assetId: 'asset-c', label: '素材C' }), + ], + }); + render(); + + fireEvent.click(await screen.findByRole('button', { name: '素材A' })); + fireEvent.click(screen.getByRole('button', { name: 'toggle all' })); + fireEvent.click(screen.getByRole('button', { name: 'toggle all' })); + fireEvent.click(screen.getByRole('button', { name: '素材C' }), { + shiftKey: true, + }); + + expect(screen.getByTestId('selected-assets').textContent).toBe('asset-c'); + }); + it('submits a generated asset to showcase review', async () => { loadEditorAssetLibraryMock.mockResolvedValueOnce({ folders: [ diff --git a/src/components/image-editor/useImageCanvasAssetLibrary.ts b/src/components/image-editor/useImageCanvasAssetLibrary.ts index ad7db3236..63f02a52c 100644 --- a/src/components/image-editor/useImageCanvasAssetLibrary.ts +++ b/src/components/image-editor/useImageCanvasAssetLibrary.ts @@ -500,6 +500,7 @@ export function useImageCanvasAssetLibrary({ ); const toggleAllAssetsSelected = useCallback((visibleAssetIds: string[]) => { + assetSelectionAnchorRef.current = null; setSelectedAssetIds((currentIds) => resolveVisibleAssetSelectionToggle({ selectedAssetIds: currentIds,