- 移除 TodoItem 中的 priority、created_at 和 updated_at 字段 - 强制每个任务都必须有唯一 id,且由用户负责生成 - 修改合并模式逻辑,merge=true 下保留未提及的旧任务 - 支持已完成和已取消任务重新激活(状态改回 pending 或 in_progress) - 禁止 in_progress 状态退回到 pending,必须标记为 completed 或 cancelled - 优化状态转换校验,允许特定状态间合法切换 - 简化任务变更消息,移除详细的新增/更新/移除统计 - 更新文档和示例,明确 id 必须由用户生成和使用 - 修复和补充测试,增强状态转换和合并模式验证 - 调整任务时间戳生成逻辑,统一使用当前时间及索引 - 该变更提供更合理的任务状态机械及管理模式,提升稳定性和易用性
360 lines
9.3 KiB
Markdown
360 lines
9.3 KiB
Markdown
# OKR ContentBlock 富文本格式
|
||
|
||
OKR 的 Objective、KeyResult 中的 content/notes 字段使用 `ContentBlock` 富文本格式。本文档描述其结构和使用方式。
|
||
|
||
## ContentBlock 结构概览
|
||
|
||
```json
|
||
{
|
||
"blocks": [
|
||
{
|
||
"block_element_type": "paragraph",
|
||
"paragraph": {
|
||
"style": {
|
||
"list": {
|
||
"list_type": "bullet",
|
||
"indent_level": 0,
|
||
"number": 1
|
||
}
|
||
},
|
||
"elements": [
|
||
{
|
||
"paragraph_element_type": "textRun",
|
||
"text_run": {
|
||
"text": "Hello World",
|
||
"style": {
|
||
"bold": true,
|
||
"strike_through": false,
|
||
"back_color": {
|
||
"red": 255,
|
||
"green": 0,
|
||
"blue": 0,
|
||
"alpha": 1
|
||
},
|
||
"text_color": {
|
||
"red": 0,
|
||
"green": 255,
|
||
"blue": 0,
|
||
"alpha": 1
|
||
},
|
||
"link": {
|
||
"url": "https://example.com"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"paragraph_element_type": "docsLink",
|
||
"docs_link": {
|
||
"url": "https://larkoffice.com/docx/xxx",
|
||
"title": "Lark Document"
|
||
}
|
||
},
|
||
{
|
||
"paragraph_element_type": "mention",
|
||
"mention": {
|
||
"user_id": "ou_xxx"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"block_element_type": "gallery",
|
||
"gallery": {
|
||
"images": [
|
||
{
|
||
"file_token": "file_xxx",
|
||
"src": "https://...",
|
||
"width": 800,
|
||
"height": 600
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 类型定义
|
||
|
||
### ContentBlock
|
||
|
||
根级别内容块。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|----------|-------------------------|---------|
|
||
| `blocks` | `ContentBlockElement[]` | 内容块元素数组 |
|
||
|
||
### ContentBlockElement
|
||
|
||
内容块元素,支持段落或图库。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|----------------------|--------------------|--------------------------------------------|
|
||
| `block_element_type` | `BlockElementType` | 块类型:`paragraph` \| `gallery` |
|
||
| `paragraph` | `ContentParagraph` | 段落内容(当 `block_element_type="paragraph"` 时) |
|
||
| `gallery` | `ContentGallery` | 图库内容(当 `block_element_type="gallery"` 时) |
|
||
|
||
### ContentParagraph
|
||
|
||
段落内容。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------------|-----------------------------|-------------|
|
||
| `style` | `ContentParagraphStyle` | 段落样式(列表类型等) |
|
||
| `elements` | `ContentParagraphElement[]` | 段落内元素数组 |
|
||
|
||
### ContentParagraphElement
|
||
|
||
段落内元素,支持文本、文档链接、提及。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|--------------------------|------------------------|-------------------------------------------|
|
||
| `paragraph_element_type` | `ParagraphElementType` | 元素类型:`textRun` \| `docsLink` \| `mention` |
|
||
| `text_run` | `ContentTextRun` | 文本内容 |
|
||
| `docs_link` | `ContentDocsLink` | 飞书文档链接 |
|
||
| `mention` | `ContentMention` | 用户提及 |
|
||
|
||
### ContentTextRun
|
||
|
||
文本块。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---------|--------------------|------|
|
||
| `text` | `string` | 文本内容 |
|
||
| `style` | `ContentTextStyle` | 文本样式 |
|
||
|
||
### ContentTextStyle
|
||
|
||
文本样式。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------------------|----------------|-------|
|
||
| `bold` | `boolean` | 是否粗体 |
|
||
| `strike_through` | `boolean` | 是否删除线 |
|
||
| `back_color` | `ContentColor` | 背景颜色 |
|
||
| `text_color` | `ContentColor` | 文字颜色 |
|
||
| `link` | `ContentLink` | 链接 |
|
||
|
||
### ContentColor
|
||
|
||
颜色。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---------|-----------|--------------|
|
||
| `red` | `int32` | 红色通道 (0-255) |
|
||
| `green` | `int32` | 绿色通道 (0-255) |
|
||
| `blue` | `int32` | 蓝色通道 (0-255) |
|
||
| `alpha` | `float64` | 透明度 (0-1) |
|
||
|
||
### ContentParagraphStyle
|
||
|
||
段落样式。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|--------|---------------|------|
|
||
| `list` | `ContentList` | 列表样式 |
|
||
|
||
### ContentList
|
||
|
||
列表样式。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|----------------|------------|---------------------------------------------------------------------|
|
||
| `list_type` | `ListType` | 列表类型:`bullet` \| `number` \| `checkBox` \| `checkedBox` \| `indent` |
|
||
| `indent_level` | `int32` | 缩进层级 |
|
||
| `number` | `int32` | 序号(当 `list_type="number"` 时) |
|
||
|
||
### ContentGallery
|
||
|
||
图片块。目前仅有进展记录中的富文本支持展示图片。
|
||
|
||
由于 OKR 应用中进展页面的布局排版限制,一个 ContentGallery 元素中**仅可放置一个图片元素**,需要插入多张图片时需使用多个 ContentGallery 元素
|
||
(同一个 ContentGallery 中添加多个 image 会导致这些图片在狭窄的横向排版空间中互相挤占,效果很差)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|----------|----------------------|-------|
|
||
| `images` | `ContentImageItem[]` | 图片项数组 |
|
||
|
||
### ContentImageItem
|
||
|
||
图片项。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|--------------|-----------|----------|
|
||
| `file_token` | `string` | 文件 token |
|
||
| `src` | `string` | 图片 URL |
|
||
| `width` | `float64` | 宽度 |
|
||
| `height` | `float64` | 高度 |
|
||
|
||
> **如何获取 `file_token`?** 使用 [`+upload-image`](lark-okr-image-upload.md) 命令上传本地图片,返回的 `file_token` 可用于构建 `ContentGallery` 图片块。
|
||
|
||
### ContentDocsLink
|
||
|
||
飞书文档链接。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---------|----------|--------|
|
||
| `url` | `string` | 链接 URL |
|
||
| `title` | `string` | 链接标题 |
|
||
|
||
### ContentMention
|
||
|
||
提及。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|-----------|----------|-------|
|
||
| `user_id` | `string` | 用户 ID |
|
||
|
||
### ContentLink
|
||
|
||
链接。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|-------|----------|--------|
|
||
| `url` | `string` | 链接 URL |
|
||
|
||
## 使用示例
|
||
|
||
### 示例 1:简单文本段落
|
||
|
||
```json
|
||
{
|
||
"blocks": [
|
||
{
|
||
"block_element_type": "paragraph",
|
||
"paragraph": {
|
||
"elements": [
|
||
{
|
||
"paragraph_element_type": "textRun",
|
||
"text_run": {
|
||
"text": "提升用户满意度"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 示例 2:带格式的文本段落
|
||
|
||
```json
|
||
{
|
||
"blocks": [
|
||
{
|
||
"block_element_type": "paragraph",
|
||
"paragraph": {
|
||
"elements": [
|
||
{
|
||
"paragraph_element_type": "textRun",
|
||
"text_run": {
|
||
"text": "Q2 目标",
|
||
"style": {
|
||
"bold": true
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"paragraph_element_type": "textRun",
|
||
"text_run": {
|
||
"text": " - 提升产品质量"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 示例 3:带列表的段落
|
||
|
||
```json
|
||
{
|
||
"blocks": [
|
||
{
|
||
"block_element_type": "paragraph",
|
||
"paragraph": {
|
||
"style": {
|
||
"list": {
|
||
"list_type": "bullet",
|
||
"indent_level": 0
|
||
}
|
||
},
|
||
"elements": [
|
||
{
|
||
"paragraph_element_type": "textRun",
|
||
"text_run": {
|
||
"text": "完成功能开发"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"block_element_type": "paragraph",
|
||
"paragraph": {
|
||
"style": {
|
||
"list": {
|
||
"list_type": "bullet",
|
||
"indent_level": 0
|
||
}
|
||
},
|
||
"elements": [
|
||
{
|
||
"paragraph_element_type": "textRun",
|
||
"text_run": {
|
||
"text": "进行用户测试"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 示例 4:带用户提及和图片(仅进展记录支持)的段落
|
||
|
||
```json
|
||
{
|
||
"blocks": [
|
||
{
|
||
"block_element_type": "paragraph",
|
||
"paragraph": {
|
||
"elements": [
|
||
{
|
||
"paragraph_element_type": "mention",
|
||
"mention": {
|
||
"user_id": "ou_example_user"
|
||
}
|
||
},
|
||
{
|
||
"paragraph_element_type": "textRun",
|
||
"text_run": {
|
||
"text": " 请关注此进度并查看以下图片"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
},
|
||
{
|
||
"block_element_type": "gallery",
|
||
"gallery": {
|
||
"images": [
|
||
{
|
||
"file_token": "img_example_token",
|
||
"src": "https://example.com/image.png",
|
||
"width": 800,
|
||
"height": 600
|
||
}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|