diff --git a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx index c693ed66..5347dca5 100644 --- a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx +++ b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx @@ -103,21 +103,25 @@ describe('BomCostingWorkbenchClient', () => { expect(screen.queryByText('成本构成')).not.toBeInTheDocument() }) - it('左侧图片按主图、当前 SKU 图和详情图分组切换', async () => { + it('主图在左、SKU 图在右、详情图在下并共同切换中间动态图片', async () => { mockCaseResponse(detail()) render() await screen.findByText('约 ¥1,350.00') - expect(screen.getByRole('tab', { name: '主图 1' })).toBeInTheDocument() - expect(screen.getByRole('tab', { name: '当前 SKU 图 1' })).toHaveAttribute('aria-selected', 'true') - expect(screen.getByRole('tab', { name: '详情图 1' })).toBeInTheDocument() + expect(screen.getByLabelText('主图缩略图')).toBeInTheDocument() + expect(screen.getByLabelText('当前 SKU 图缩略图')).toBeInTheDocument() + expect(screen.getByLabelText('详情图缩略图')).toBeInTheDocument() + expect(screen.queryByRole('tab')).not.toBeInTheDocument() expect(screen.getByRole('img', { name: '黑胡桃色 120cm SKU 图' })).toBeInTheDocument() - fireEvent.click(screen.getByRole('tab', { name: '主图 1' })) + fireEvent.click(screen.getByRole('button', { name: '查看主图 1' })) expect(screen.getByRole('img', { name: '商品主图' })).toBeInTheDocument() - fireEvent.click(screen.getByRole('tab', { name: '详情图 1' })) + fireEvent.click(screen.getByRole('button', { name: '查看详情图 1' })) expect(screen.getByRole('img', { name: '商品详情图 1' })).toBeInTheDocument() + + fireEvent.click(screen.getByRole('button', { name: '查看当前 SKU 图 1' })) + expect(screen.getByRole('img', { name: '黑胡桃色 120cm SKU 图' })).toBeInTheDocument() }) it('整件临时价的详情只展示结构事实,不展示另一套结构金额', async () => { diff --git a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx index d3675fe4..7a5e457d 100644 --- a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx +++ b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx @@ -54,10 +54,9 @@ type RecalculationMode = type ProductImageKind = BomCostingSourceAssetDetail['kind'] -const PRODUCT_IMAGE_KINDS: ProductImageKind[] = ['MAIN', 'SKU', 'DETAIL'] const PRODUCT_IMAGE_KIND_LABELS: Record = { MAIN: '主图', - SKU: '当前 SKU 图', + SKU: 'SKU 图', DETAIL: '详情图', } @@ -477,16 +476,16 @@ function ResultCanvas({ SKU: skuAssets, DETAIL: detailAssets, } - const [preferredImageKind, setPreferredImageKind] = useState('SKU') - const activeImageKind = imageGroups[preferredImageKind].length > 0 - ? preferredImageKind - : PRODUCT_IMAGE_KINDS.find((kind) => imageGroups[kind].length > 0) ?? preferredImageKind - const galleryAssets = imageGroups[activeImageKind] - const [selectedAssetId, setSelectedAssetId] = useState('') - const selectedAsset = galleryAssets.find((asset) => asset.id === selectedAssetId) ?? - galleryAssets[0] ?? null + const displayAssets = [...skuAssets, ...mainAssets, ...detailAssets] + const [selectedAssetSelection, setSelectedAssetSelection] = useState({ skuId: '', assetId: '' }) + const selectedAssetId = selectedAssetSelection.skuId === selectedSku.id + ? selectedAssetSelection.assetId + : '' + const selectedAsset = displayAssets.find((asset) => asset.id === selectedAssetId) ?? + skuAssets[0] ?? mainAssets[0] ?? detailAssets[0] ?? null + const selectedAssetGroup = selectedAsset ? imageGroups[selectedAsset.kind] : [] const selectedAssetIndex = selectedAsset - ? galleryAssets.findIndex((asset) => asset.id === selectedAsset.id) + ? selectedAssetGroup.findIndex((asset) => asset.id === selectedAsset.id) : -1 const [detailsOpen, setDetailsOpen] = useState(false) const [advancedOpen, setAdvancedOpen] = useState(false) @@ -517,6 +516,9 @@ function ResultCanvas({ const latestRun = detail.analysisRuns?.[0] ?? null const canResume = latestRun?.revision > 1 && latestRun.status === 'FAILED' const selectedAssetIdSet = new Set(selectedAssetIds) + const selectDisplayedAsset = (assetId: string) => { + setSelectedAssetSelection({ skuId: selectedSku.id, assetId }) + } const toggleAsset = (assetId: string) => { setSelectedAssetIds((current) => current.includes(assetId) @@ -573,86 +575,107 @@ function ResultCanvas({ ) : null}
-