修复 PR #316 review(前端 TS/TSX):图片编辑器素材弹窗
- ImageCanvasProjectAssetPickerDialog.tsx:打开时的重置 effect 只依赖 `open`,父级每次渲染重建 `selectedAssetIds` 不再清空进行中的搜索 / 筛选 / 选择 - ImageCanvasProjectAssetPickerDialog.tsx:素材卡媒体渲染抽成 `AssetCardMedia`,顺带去掉该处嵌套三元 - projectAssetReferencePickerModel.ts:`image-sequence` 单列一类(新增「序列帧」页签),不再混进「图片」——参考图链路只接受 `mediaType === 'image'`,混进去就是「按图片选中、按图片文案拒掉」;缩略图口径由 `projectAssetPickerUsesThumbnail` 收口 - 用例:父级重渲染不清空在选状态;序列帧分类归属与其被参考图链路过滤掉的事实
This commit is contained in:
@@ -5,12 +5,16 @@ import type {
|
||||
GenerateDialogState,
|
||||
} from './ImageCanvasEditorTypes';
|
||||
import { replaceProjectAssetPickerReferences } from './ImageCanvasGenerationDialogModel';
|
||||
import { createGenerationInputReference } from './ImageCanvasGenerationModel';
|
||||
import {
|
||||
appendLimitedImageReferences,
|
||||
createGenerationInputReference,
|
||||
} from './ImageCanvasGenerationModel';
|
||||
import {
|
||||
PROJECT_ASSET_PICKER_CATEGORY_OPTIONS,
|
||||
projectAssetMatchesPickerFilter,
|
||||
projectAssetPickerCategory,
|
||||
projectAssetPickerReferences,
|
||||
projectAssetPickerUsesThumbnail,
|
||||
} from './projectAssetReferencePickerModel';
|
||||
|
||||
function createAsset(overrides: Partial<EditorAsset>): EditorAsset {
|
||||
@@ -35,9 +39,54 @@ describe('参考图弹窗素材筛选与快照', () => {
|
||||
expect(projectAssetPickerCategory({ mediaType: 'video' })).toBe('video');
|
||||
expect(projectAssetPickerCategory({ mediaType: 'audio' })).toBe('audio');
|
||||
expect(projectAssetPickerCategory({})).toBe('image');
|
||||
// 序列帧单列一类:它不是静态图片,参考图链路也不接受它(见下一条用例)。
|
||||
expect(projectAssetPickerCategory({ mediaType: 'image-sequence' })).toBe(
|
||||
'image-sequence',
|
||||
);
|
||||
expect(
|
||||
PROJECT_ASSET_PICKER_CATEGORY_OPTIONS.map((item) => item.id),
|
||||
).toEqual(['all', 'image', 'video', 'audio']);
|
||||
).toEqual(['all', 'image', 'video', 'audio', 'image-sequence']);
|
||||
});
|
||||
|
||||
it('keeps image-sequence assets out of the image category', () => {
|
||||
const sequence = createAsset({ mediaType: 'image-sequence' });
|
||||
|
||||
expect(
|
||||
projectAssetMatchesPickerFilter(sequence, {
|
||||
category: 'image',
|
||||
query: '',
|
||||
}),
|
||||
).toBe(false);
|
||||
expect(
|
||||
projectAssetMatchesPickerFilter(sequence, {
|
||||
category: 'image-sequence',
|
||||
query: '',
|
||||
}),
|
||||
).toBe(true);
|
||||
expect(
|
||||
projectAssetMatchesPickerFilter(sequence, { category: 'all', query: '' }),
|
||||
).toBe(true);
|
||||
// 缩略图口径跟分类走:序列帧的 src 也是图片字节,照旧画出来。
|
||||
expect(projectAssetPickerUsesThumbnail('image-sequence')).toBe(true);
|
||||
expect(projectAssetPickerUsesThumbnail('image')).toBe(true);
|
||||
expect(projectAssetPickerUsesThumbnail('video')).toBe(false);
|
||||
expect(projectAssetPickerUsesThumbnail('audio')).toBe(false);
|
||||
});
|
||||
|
||||
it('参考图链路只接受图片:序列帧引用会被 appendLimitedImageReferences 过滤掉', () => {
|
||||
// 这条用例把「分类展示」与「参考图接受口径」的边界显式钉住:序列帧可以看见、
|
||||
// 可以选中(与音频 / 视频一致),但不会作为参考图进入提交数据。
|
||||
const sequence = createAsset({
|
||||
id: 'asset-sequence',
|
||||
mediaType: 'image-sequence',
|
||||
label: '勇者挥手',
|
||||
});
|
||||
const references = projectAssetPickerReferences(
|
||||
[sequence],
|
||||
['asset-sequence'],
|
||||
);
|
||||
expect(references[0]?.mediaType).toBe('image-sequence');
|
||||
expect(appendLimitedImageReferences(undefined, references, 4)).toEqual([]);
|
||||
});
|
||||
|
||||
it('stacks the category filter with the search query', () => {
|
||||
|
||||
Reference in New Issue
Block a user