任务标签
给一张任务卡片贴上短标签,用来在列表里认出来,也可以按一个标签筛选。Hub 0.9.0-preview.68 起可以保存。客户端从 0.2.151 起有界面。更早的 Hub 没有 tags 字段时,详情里不提供输入,并提示升级,不会把标签假装存上。
字段和错误以 需求池 / 任务看板 为准。
在客户端里
在详情里输入一个新标签,或从已有标签里点一个。点标签上的 × 去掉。看板卡片和列表的标题下面会显示这些标签。
桌面在左侧按标签筛选,手机在顶栏。一次只选一个,必须和标签全文一致,并与状态、项目等其他筛选同时生效。筛选项来自当前列表里已经载入的卡片。换网络后筛选回到「全部」。
iOS 仍走 TestFlight,公开链接还没开。
保存规则
tags 是字符串数组。
- 最多 10 个。每个最多 20 个字,按 Unicode 码位计数,不是 UTF-16。
- 去掉首尾空格。重复的只留第一次。空字符串和控制字符会被拒绝。
- 不合法时返回 400
invalid_tags,原来的标签不变。 - 新建时不带
tags,就是空数组。 - 修改时不带
tags,保持原样。带上[]会清空。
节点令牌可以在它绑定的网络里读写任务上的标签。viewer 只能看,不能改。
GET /api/requirements/tags 返回当前网络里出现过的标签,去重后排序,归档任务上的也算。详情里的候选列表用的就是它。别的网络看不到。
管理标签
Hub 在列表响应的 capabilities 里带 tag_ops 时,可以整网改名、合并、删除标签,或给标签设颜色。客户端在侧栏标签组底部放「管理标签」,旧 Hub 上不显示这个入口。
GET /api/requirements/tags 在 tags 之外还返回:
counts:每个标签用在几张卡上(调用者看得见的卡,含归档的)。colors:设过颜色的标签,{"标签": "#rrggbb"}。没设过的不出现,客户端用默认色。can_manage:这个调用者能不能管理标签。
旧客户端只读 tags,其余字段忽略。
POST /api/requirements/tags/ops,请求体是下面之一:
op | 其余字段 | 做什么 |
|---|---|---|
rename | from、to | 每张带 from 的卡改成 to,位置不变。to 已经在卡上就只留一个,等于合并 |
merge | from(1–50 个)、to | 每张带任一来源的卡,来源换成一个 to |
delete | tag | 从每张卡上拿掉这个标签,卡本身保留 |
color | tag、color(#rrggbb 或 null 清除) | 只改颜色,不动卡 |
- 网络里所有匹配的卡在一个事务里改写,含归档的。中途失败时一张都不改。
- 改过的卡
updated_at前移,updated_by记调用者,updated_since同步得到。 - 改名、合并时,目标没有颜色就继承第一个有颜色的来源。来源的颜色和被删标签的颜色一起删掉。
- 返回
{ok, op, affected},affected是改了几张卡。 - 标签名规则同上。不合法返回 400
invalid_tag、invalid_tag_color或invalid_tag_op。来源和目标相同返回 400same_tag。网络里没有这个标签返回 404tag_not_found。 - 每次成功都写审计
requirement_tag_rename/_merge/_delete/_color,详情里带affected。
谁能用:和管理项目一样,只有网络 owner、Hub 管理员和任务范围为「全部任务」的成员。只看相关任务的成员(task_access = scoped)一律 403 permission_denied,viewer 也是。节点令牌返回 403 user_token_required。
scoped 成员被整个拒绝,而不是只改他看得见的那几张。原因有两个:一个标签会被拆成新旧两半;返回的 affected 也会透露他看不见的卡有几张。scoped 成员拿到的 counts 和 colors 也只包含他看得见的卡上的标签。