From 389b4b1f50e0388d54e790b56ce146b12747fd42 Mon Sep 17 00:00:00 2001 From: Ale Mercado Date: Mon, 31 Aug 2026 11:10:32 -0400 Subject: [PATCH] feat: add task card block example --- block-kit/README.md | 1 + block-kit/src/main/java/blocks/TaskCard.java | 40 +++++++++++++++ .../src/test/java/blocks/TaskCardTest.java | 51 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 block-kit/src/main/java/blocks/TaskCard.java create mode 100644 block-kit/src/test/java/blocks/TaskCardTest.java diff --git a/block-kit/README.md b/block-kit/README.md index 3cd3768..1fe9cd2 100644 --- a/block-kit/README.md +++ b/block-kit/README.md @@ -18,5 +18,6 @@ Read the [docs](https://docs.slack.dev/block-kit/) to learn concepts behind thes - **[Markdown](https://docs.slack.dev/reference/block-kit/blocks/markdown-block)**: Displays formatted markdown. [Implementation](./src/main/java/blocks/Markdown.java). - **[Rich text](https://docs.slack.dev/reference/block-kit/blocks/rich-text-block)**: Displays formatted, structured representation of text. [Implementation](./src/main/java/blocks/RichText.java). - **[Section](https://docs.slack.dev/reference/block-kit/blocks/section-block)**: Displays text, possibly alongside elements. [Implementation](./src/main/java/blocks/Section.java). +- **[Task card](https://docs.slack.dev/reference/block-kit/blocks/task-card-block)**: Displays a single task, representing a single action. [Implementation](./src/main/java/blocks/TaskCard.java). - **[Video](https://docs.slack.dev/reference/block-kit/blocks/video-block)**: Displays an embedded video player. [Implementation](./src/main/java/blocks/Video.java). diff --git a/block-kit/src/main/java/blocks/TaskCard.java b/block-kit/src/main/java/blocks/TaskCard.java new file mode 100644 index 0000000..f0b305e --- /dev/null +++ b/block-kit/src/main/java/blocks/TaskCard.java @@ -0,0 +1,40 @@ +package blocks; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.RichTextBlock; +import com.slack.api.model.block.TaskCardBlock; +import com.slack.api.model.block.element.RichTextSectionElement; +import com.slack.api.model.block.element.UrlSourceElement; +import java.util.List; + +/** + * Displays a single task, representing a single action. + * {@link https://docs.slack.dev/reference/block-kit/blocks/task-card-block/} + */ +public class TaskCard { + /** + * A task card with output and sources. + */ + public static TaskCardBlock example01() { + TaskCardBlock block = Blocks.taskCard(t -> t.taskId("task_1") + .title("Fetching weather data") + .status("in_progress") + .output(RichTextBlock.builder() + .elements(List.of(RichTextSectionElement.builder() + .elements(List.of(RichTextSectionElement.Text.builder() + .text("Found weather data for Chicago from 2 sources") + .build())) + .build())) + .build()) + .sources(List.of( + UrlSourceElement.builder() + .url("https://weather.com/") + .text("weather.com") + .build(), + UrlSourceElement.builder() + .url("https://www.accuweather.com/") + .text("accuweather.com") + .build()))); + return block; + } +} diff --git a/block-kit/src/test/java/blocks/TaskCardTest.java b/block-kit/src/test/java/blocks/TaskCardTest.java new file mode 100644 index 0000000..96a590c --- /dev/null +++ b/block-kit/src/test/java/blocks/TaskCardTest.java @@ -0,0 +1,51 @@ +package blocks; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.TaskCardBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class TaskCardTest { + @Test + public void testExample01() { + TaskCardBlock block = TaskCard.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "task_card", + "task_id": "task_1", + "title": "Fetching weather data", + "status": "in_progress", + "output": { + "type": "rich_text", + "elements": [ + { + "type": "rich_text_section", + "elements": [ + { + "type": "text", + "text": "Found weather data for Chicago from 2 sources" + } + ] + } + ] + }, + "sources": [ + { + "type": "url", + "url": "https://weather.com/", + "text": "weather.com" + }, + { + "type": "url", + "url": "https://www.accuweather.com/", + "text": "accuweather.com" + } + ] + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +}