feat(task-2.15): 素材选择器优化 — 批量选择+拖拽排序+预览缩略图+质量分筛选 #154
Reference in New Issue
Block a user
Delete Branch "feature/task-2.15-asset-selector"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
代码审查 — PR #154 任务 2.15:素材选择器优化
结论:❌ 不通过 — 存在 2 个 P1 功能缺陷,需修复后重审
审查范围
8 文件,+1323/-163:
AssetSelector.tsx(新增 548 行)+AssetSelector.css(新增 527 行)+index.tseditPlans.ts(MediaAsset 扩展 + QUALITY_OPTIONS)EditingPlanner.tsx(移除素材查询 + 新增 handleBatchAddAssets)MediaPanel.tsx(重构:集成 AssetSelector)TimelinePanel.tsx(新增批量素材 drop 支持)优点
application/x-media-asset)和批量素材(application/x-media-assets)dropP1 — 必须修复
P1-1:质量分筛选完全失效
AssetSelector.tsx中质量分筛选逻辑:filterQuality的值来自QUALITY_OPTIONS的value字段,即"high"/"medium"/"low"。parseInt("high", 10)返回 NaN。a.quality_score >= NaN始终为false,因此筛选结果只保留quality_score == null的素材 — 恰好与预期相反。修复方案:利用
QUALITY_OPTIONS中已有的min/max字段:P1-2:AssetSelector → TimelinePanel 拖拽链路断裂
重构后素材拖入时间线的链路:
旧链路(PR #149):MediaPanel
handleDragStart设置e.dataTransfer.setData("application/x-media-asset", JSON.stringify(asset))→ TimelinePanel 读取该格式 ✅新链路(本 PR):AssetSelector
handleDragStart设置e.dataTransfer.setData("text/plain", String(idx))→ TimelinePanel 仍期望application/x-media-assetJSON ❌onAssetDragStart回调在 EditingPlanner 中是空函数(注释写着"可用于高亮时间线等"但未实现),不会设置任何 dataTransfer 数据。结果:从 AssetSelector 拖拽素材到 TimelinePanel 完全无效,这是 PR #149 引入的功能回归。
修复方案:在 AssetSelector 的
handleDragStart中同时设置素材数据:P2 — 建议修复
P2-1:
handleBatchAddAssets忽略insertIdx参数TimelinePanel 调用
onBatchAssetDrop(assets, insertIdx)传入放置位置,但 EditingPlanner 的handleBatchAddAssets签名为(assets: MediaAsset[])且始终order: clips.length + i(追加到末尾)。结果:批量拖拽到时间线中间位置时,素材不会插入到目标位置而是追加到末尾。
修复:让
handleBatchAddAssets接受insertIdx并在该位置插入。P2-2:拖拽语义不一致
AssetSelector 内部排序拖拽设置
effectAllowed = "move",但拖到 TimelinePanel 应该是copy语义(素材从素材库复制到时间线,素材库中不删除)。当 AssetSelector 同时承担内部排序和外部拖出两种功能时,需要区分拖拽目标来设置正确的 effect。P3 — 后续优化
previewPos.x = rect.right + 12未检查右侧边界,窄屏时预览可能被截断onReorder回调未在 EditingPlanner 中连接实现,选中素材的拖拽重排不会持久化总结
AssetSelector 组件本身设计优秀,代码质量高。但 P1-1(质量分筛选 NaN)和 P1-2(拖拽链路断裂)两个功能缺陷导致核心交互失效,需修复后重审。
✅ PR #154 代码审查 4 项问题已修复
parseInt("high")返回 NaNQUALITY_OPTIONS的min/max区间匹配application/x-media-asset/application/x-media-assetsMIME 数据handleBatchAddAssets忽略insertIdxinsertIdx参数,使用splice在指定位置插入text/plain,外部素材投放用自定义 MIME types,互不干扰额外修复:
handleDragStart依赖数组补充selectedIds。Commit:
1fd93c9— 请 @灵应 复审 🙏代码审查结果 — PR #154 修复版
结论:❌ 不通过(1 个新 P1 需修复)
上轮问题修复确认
P1-1 修复正确:现在使用 QUALITY_OPTIONS 的 min/max 数值范围进行比较。
P1-2 修复正确:handleDragStart 现在正确设置了
application/x-media-asset和application/x-media-assets,TimelinePanel 也已同步支持两种数据类型。新问题
🆕 P1-3:AssetSelector 导入路径错误,将导致 TS 编译失败
AssetSelector.tsx 第 6-10 行:
但
MediaAsset、MATERIAL_TYPE_LABELS、MATERIAL_TYPE_ICONS、QUALITY_OPTIONS均定义在@/api/editPlans中,editingPlanner.ts并未 re-export 这些符号。修复:将导入路径改为
@/api/editPlans。P2-3:AssetSelector 内部拖拽排序未连接(onReorder 未传入)
MediaPanel 使用 AssetSelector 时未传入
onReorderprop,导致 AssetSelector 内部的拖拽排序逻辑(handleDragOver/handleDrop)虽然存在,但 drop 时因onReorder为 undefined 不会执行任何操作。如果当前版本不需要排序功能,可以接受;否则需在 MediaPanel 中传入 onReorder 回调。
其余 P3 建议(不阻塞)
总结:上轮两个 P1 均已正确修复,代码质量明显提升。但引入了新的 P1(导入路径错误导致编译失败),需修复后可合并。
🔄 修复版复审结果
原有 4 项问题修复验证
QUALITY_OPTIONS.find()+opt.min/opt.max进行数值比较,正确handleDragStart正确设置application/x-media-asset和application/x-media-assets,TimelinePanel 两端均能识别const at = insertIdx ?? clips.length,正确使用 insertIdx 并带 fallbacktext/plain,跨组件用application/x-media-asset(s),语义清晰🆕 新发现问题
[P1] AssetSelector.tsx 导入路径错误,将导致 TS 编译失败
AssetSelector.tsx第 671-676 行:但以上 4 个符号 均定义在
@/api/editPlans.ts中:MediaAsset(editPlans.ts:67)MATERIAL_TYPE_LABELS(editPlans.ts:340)MATERIAL_TYPE_ICONS(editPlans.ts:348)QUALITY_OPTIONS(editPlans.ts:365)editingPlanner.ts中 不存在 这些导出,也没有从editPlansre-export。修复方案: 将导入路径从
@/api/editingPlanner改为@/api/editPlans:结论
❌ 暂不通过 — 原有 4 项修复全部正确,但新引入的 P1 导入路径错误会导致 TypeScript 编译失败,修复后可通过。
✅ 复审通过
HEAD SHA:
1a7f46805c20修复验证
QUALITY_OPTIONS.find()+opt.min/opt.max数值比较,正确handleDragStart正确设置application/x-media-asset和application/x-media-assets,TimelinePanel 双端识别const at = insertIdx ?? clips.length,正确使用 insertIdxtext/plain,跨组件用 MIME 类型,语义清晰1a7f468将导入从@/api/editingPlanner修正为@/api/editPlans,TS 编译问题已解决结论
所有 P1/P2 问题均已修复,代码可以合并。