完全指南:跨项目分类、筛选与虚拟标签机制)
Super Productivity 标签视图Tag View完全指南跨项目分类、筛选与虚拟标签机制【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivity标签Tag是 Super Productivity 中用于跨项目灵活分类的核心轻量级机制每个任务必须归属于恰好一个项目Project但可以携带零个、一个或多个标签。本篇指南以官方 wiki 的 Tag View 文档为骨架结合仓库源码src/app/features/tag/与src/app/features/tasks/深入讲解标签的定位、创建方式、筛选逻辑以及 “Today” 虚拟标签的底层实现读完后你将掌握完整的标签使用与扩展能力。标签解决什么问题项目的结构性 vs 标签的横切性Super Productivity 中每个任务都必须且只能属于一个项目Project项目提供的是结构性组织backlog、备注、主题、集成等一整套工作上下文。这种强约束保证了任务归属清晰但无法表达跨项目的共同属性——比如一个任务属于 Backend API 项目同时又带有#urgent、#bug、#needs-review这类横切属性。标签正是为此设计的它允许你在不改变项目结构的前提下从多个维度对任务打标实现多维分类用项目做结构组织每个任务恰好一个用标签做横切组织每个任务零到多个灵活筛选跨项目查看所有 urgent 任务、所有 bug 任务而不必关心它们各自属于哪个项目轻量管理标签就是简单的标签——没有 backlog、备注、主题等复杂配置创建和使用成本极低。标签 vs 项目对比维度标签Tags项目Projects与任务的关系每个任务零个或多个可选每个任务恰好一个必填用途跨项目灵活分类的横切标签主要的结构性组织单元功能特性简单的筛选与分组标签Backlog、备注、主题、集成等完整工作上下文在数据模型上这种区别体现在源码中标签实体Tag继承自WorkContextCommon与项目共享工作上下文公共字段并通过Task.tagIds: string[]与任务建立多对多关联而项目通过Task.projectId与任务建立一对多关联。相关模型定义见 tag.model.ts。多标签为一个任务打上多个标签任务可以携带多个标签主要途径有三种任务标题短语法Short Syntax在标题中直接输入#tagname例如Fix login bug #urgent #bug #backend添加任务栏Add Task Bar通过复选框一次勾选多个标签标签编辑对话框在编辑任务时添加或移除多个标签。这样你就能按紧迫度、类型、领域或任何适合自己工作流的维度对任务进行多维分类。底层实现短语法标签解析短语法#tagname的解析实现在 short-syntax.ts 中。其核心正则如下const CH_TAG #; const ALL_SPECIAL (\\${CH_PRO}|\\${CH_TAG}|\\${CH_DUE}|\\${CH_DEADLINE}); const SHORT_SYNTAX_TAGS_REG_EX new RegExp(\\${CH_TAG}[^${ALL_SPECIAL}|\\s], gi);也就是说#后跟任意非空白、非特殊符号、#、、!、|的连续字符会被识别为一个标签 token。解析器parseTagChanges随后会大小写不敏感匹配将输入标签与现有标签做newTagTitle.toLowerCase() tag.title.toLowerCase()匹配命中则复用已有标签 ID自动创建新标签未匹配到的标签名进入newTagTitlesToCreate列表由后续逻辑自动创建从标题中剥离被识别的标签 token 会从任务标题中移除确保最终标题干净只保留语义文本。一个值得注意的细节是Fun title#blu不会被当作标签——解析器会检查#前一个字符若它不是空格则拒绝解析避免把普通文本误识别为标签。此外纯数字标签如#123在标题开头以及 issue 任务上会被屏蔽相关规则见parseTagChanges中的isNumericOnly判断。在添加任务栏中与语法联动添加任务栏的实时解析由 add-task-bar-parser.service.ts 完成。当你输入#tag时解析器会维护tagIds与newTagTitles两个状态并在你通过控件勾选标签时通过removeShortSyntaxFromInput(tags, specificTag)精确移除输入文本中对应的#tag片段——这里采用解析器记录的 token 范围_lastParsedRanges而非简单的正则替换避免多词 token 被截断。按标签筛选跨项目查看任务你可以按标签筛选任务查看所有项目中带有特定标签的任务。筛选能力包括标签名搜索输入标签名的部分内容即可匹配大小写不敏感无标签筛选筛出所有未打任何标签的任务。查看某个标签时你会看到来自多个项目的任务每个任务以项目徽章badge形式展示其所属项目便于一眼确认来源。底层实现标签成员关系的单一事实源从源码看标签与任务的关系采用“hybrid pattern”设计见 tag.reducer.ts 中的computeOrderedTaskIdsForTag成员关系以task.tagIds为单一事实源single source of truth只要任务的tagIds包含该标签 ID任务就属于该标签排序保持tag.taskIds仅用于保存用户自定义的排序不参与成员判定自愈能力tag.taskIds中的过期任务 ID 会被自动过滤而带标签但未出现在排序列表中的任务会被自动追加到末尾。这种设计让成员关系始终正确同时保留用户拖拽排序的能力。筛选“无标签任务”正是基于task.tagIds为空数组这一事实实现的。特殊场景Today 虚拟标签Today今日视图使用一种特殊的虚拟标签virtual tag模式。其成员关系不是从任务的标签列表中读取 Today 值而是由任务的到期日due day或到期时间due time结合配置的逻辑日边界logical-day boundary实时计算得出。这种设计的意义在于Today 视图专注于基于时间的组织而标签保持基于分类的组织两者职责分离、互不干扰。Today 视图的详细工作方式见 4.01-The-Today-View。底层实现TODAY_TAG 的虚拟性TODAY_TAG的定义与设计约束见 tag.const.ts其注释明确列出了三条规则不应出现在task.tagIds中——成员关系由task.dueDay决定TODAY_TAG.taskIds仅存储今日任务的排序移动操作拖拽、Ctrl↑/↓通过tag.reducer.ts对包括 TODAY 在内的所有标签统一生效。export const TODAY_TAG: Tag { color: null, created: Date.now(), ...WORK_CONTEXT_DEFAULT_COMMON, icon: wb_sunny, title: Today, id: TODAY, theme: { ...WORK_CONTEXT_DEFAULT_THEME, isAutoContrast: true, huePrimary: 400, hueAccent: 500, hueWarn: 500, primary: DEFAULT_TODAY_TAG_COLOR, isDisableBackgroundTint: true, }, };对应地reducer 顶部同样以注释强调“TODAY_TAG (ID: TODAY) 是虚拟标签绝不应出现在 task.tagIds 中成员关系由 task.dueDay 决定”。同时tag.reducer.ts中保留了selectTodayTagTaskIds选择器标注deprecated并建议改用work-context.selectors.ts中的selectTodayTaskIds——后者直接从task.dueDay计算成员关系具备自愈能力。这正印证了文档中“成员由到期日计算、而非标签列表”的描述。标签的扩展用法wiki 提供了两套基于标签的成熟工作流4.07a-Tags_Eat-the-Frog —— 基于优先级的 A/B/C/D 打标法吃青蛙法4.07b-Tags_Ordinal-Priorities —— 用标签近似表达优先级顺序。这两篇文章都依赖本文的“多标签 标签筛选”能力来实现先创建代表优先级的标签如#a、#b再通过给任务打标并在 Tag View 中筛选即可获得跨项目的优先级视图。标签的高级数据特性除了文档中的基础能力仓库源码还揭示了标签模型更丰富的维度tag.model.ts、tag.service.ts主题与颜色每个标签都可以配置主题theme.primary、huePrimary、hueAccent等或直接指定color并通过TagComponent见 tag/tag.component.ts渲染为带颜色的徽章同时支持 emoji 图标isSingleEmoji判断系统标签排除SYSTEM_TAG_IDSTODAY、EM_URGENT、EM_IMPORTANT、KANBAN_IN_PROGRESS用于在统计用户自建标签时排除系统自动创建的标签按标签统计时间tasks-by-tag.component.ts 会汇总每个标签下任务当日或含昨日的timeSpentOnDay并按耗时降序排列让你直观看到每个标签消耗了多少时间排序管理通过updateOrder/updateTagOrderaction 持久化标签在菜单中的树形排序buildTagListInTreeOrder。相关阅读4.06-Project-View —— 项目如何提供结构性组织必填vs 标签可选4.05-Board-View —— 看板视图可基于标签进行筛选与列组织4.01-The-Today-View —— 基于时间的 Today 视图使用虚拟标签模式3.04-Short-Syntax —— 完整的短语法参考包括#tagname标签语法及其他 token。【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考