AAswordman / AAswordman/Operit

[专题] 侧边栏目录结构与交互(域总跟踪):文件夹嵌套/独立排序/平板侧滑

Open
#710 5 comments 0 reactions 2 assignees View on GitHub

@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,用户无法直接拖拽一个文件夹来调整它在列表中的位置——只能通过调整文件夹内部对话的顺序来间接影响。文件夹一多,这个限制就变得很麻烦。


期望行为
  1. 文件夹嵌套:支持创建多层级的文件夹结构,用户可以在文件夹内创建子文件夹
  2. 文件夹独立排序:文件夹有独立的排序,用户可以拖拽文件夹本身来调整它在列表中的位置
  3. 对话跨文件夹拖拽:对话可以在不同文件夹之间拖拽移动,改变归属
  4. 文件夹折叠/展开:每层文件夹支持折叠/展开(当前已有此功能,嵌套后应保持)
  5. 搜索适配:搜索时匹配所有层级的文件夹名,匹配到的对话显示完整路径上下文

当前实现现状

代码层面,目前的分组功能基于 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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.