AAswordman / AAswordman/Operit
[专题] 侧边栏目录结构与交互(域总跟踪):文件夹嵌套/独立排序/平板侧滑
Open
@luojiaping is already working on this.
Since Sep 4, 2026.
Already-plan
area:ui-layout
feature-request
UI-UX
- Dominant language
- Kotlin
- Stars
- 7.9k
- Forks
- 651
- Avg merge
- 1d 9h
- Merged PRs (30d)
- 70
Description
问题描述
当前对话历史侧边栏的分组功能存在两个核心限制,在对话数量较多时尤为突出:
1. 文件夹不支持嵌套
分组是单层扁平结构。当对话累积到几百个时,所有分组都堆在同一层,无法按层级组织。例如:
工作/项目A/Operit ← 想这样,但做不到
工作/项目A/其他项目
工作/项目B
个人/学习
个人/日常
只能靠命名约定来假装层级:
工作-项目A-Operit ← 用命名前缀区分,文件夹列表越来越长
工作-项目A-其他项目
工作-项目B
个人-学习
个人-日常
2. 文件夹不支持独立排序
文件夹没有独立的排序能力。文件夹的显示顺序取决于其内部第一个对话的 displayOrder,用户无法直接拖拽一个文件夹来调整它在列表中的位置——只能通过调整文件夹内部对话的顺序来间接影响。文件夹一多,这个限制就变得很麻烦。
期望行为
- 文件夹嵌套:支持创建多层级的文件夹结构,用户可以在文件夹内创建子文件夹
- 文件夹独立排序:文件夹有独立的排序,用户可以拖拽文件夹本身来调整它在列表中的位置
- 对话跨文件夹拖拽:对话可以在不同文件夹之间拖拽移动,改变归属
- 文件夹折叠/展开:每层文件夹支持折叠/展开(当前已有此功能,嵌套后应保持)
- 搜索适配:搜索时匹配所有层级的文件夹名,匹配到的对话显示完整路径上下文
当前实现现状
代码层面,目前的分组功能基于 chats 表的 group 字段(String? 类型),是一个纯文本标签。文件夹没有独立的数据实体,也没有排序字段——文件夹仅作为 chat 记录上的分组标签存在。
UI 层通过 groupBy { it.group } 产生单层分组,HistoryListItem 只有三种类型(CharacterHeader、Header、Item),没有嵌套层级的概念。
使用场景
- 400+ 对话需要按"工作/个人"分类,各分类下再按项目分层
- 开发者使用 Operit 管理多个项目,每个项目有"讨论"、"代码审查"、"Bug 跟踪"等子分类
- 同一个项目下不同模块的对话需要分开管理,但又不希望它们散落在扁平列表里
注意事项
- 与现有的角色卡绑定模式(BY_CHARACTER_CARD)兼容——文件夹应在角色卡绑定上下文中工作
- 对话分支功能(parentChatId)不受影响——这是独立的对话版本管理机制
- 现有备份/导出功能需要考虑文件夹层级信息的保存和恢复
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.