E3.14.2both transfer columns need search and bulk设计
两侧列表都需要独立的搜索与批量操作
别名: 穿梭框搜索 · dual list search · 两侧批量
概念解释
左右两列是两份独立的名单,搜索和全选/清空必须各做一套,不能共用一个框去过滤「整张穿梭」。左边搜的是还能加入的对象,右边搜的是已经在子集里、准备移出的对象。批量同样:全选左边是「把当前可见候选一起加入」,全选右边是「把当前已选一起移出」。一套工具挂在控件顶端、作用域却含糊,会把加和删做成同一按钮下的意外。
独立不是视觉装饰两条搜索框,而是过滤状态、批量范围、空结果提示都不串台。
机制
两列的任务方向相反。人在左边是在源里找;人在右边是在目标里核对或剔除。一个关键字对源是命中候选,对目标可能是「确认它在不在已选」。共用过滤会让一列被另一列的查询掏空:搜角色名时右边暂时变空,用户以为授权丢了。批量范围若跟着共用过滤走,更容易把「当前关键字下的左边」做成「把所有已选清掉」。
独立还让空结果可解释:左边空是「没有可加入的匹配」,右边空是「已选里没有这个名字」。同一句「无结果」无法区分这两种空。
边界
两列都很短时,搜索可以都不出现,但一旦出现就必须成对、作用域写清。全选的范围仍是「当前过滤结果」还是「该列全集」,要在按钮上写明,且两列可以不同(左边全选当前搜索,右边清空全部已选)。把一项从左搬到右之后,它应从小的过滤结果里消失、出现在右列——即使右列当前过滤并不匹配这个名字,也应在右列有落点或提示「已加入但不在当前过滤中」。键盘应能在两列之间移动焦点,批量快捷键必须带列上下文,不能全局 Ctrl+A 两列一起亮。
怎么落地
- 每列各自一条搜索、各自的全选与清空,标题或按钮写明作用列。
- 过滤状态互不清除;清空左列搜索不应动右列的关键字。
- 搬动后对象从源列的当前视图离开,进入目标列;目标列过滤挡着时给出落点说明。
- 验证:在左列搜一个词、右列搜另一个词,分别全选。被搬动的必须只来自该列当前命中。串台就是作用域没独立。