From 1eaa9ced796910b59a13b14fba3c71af70527dc7 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Thu, 5 Nov 2026 21:21:31 -0800 Subject: [PATCH] feat(block-kit): add table block example --- block-kit/README.md | 1 + block-kit/src/main/java/blocks/Table.java | 41 +++++++++ block-kit/src/test/java/blocks/TableTest.java | 84 +++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 block-kit/src/main/java/blocks/Table.java create mode 100644 block-kit/src/test/java/blocks/TableTest.java diff --git a/block-kit/README.md b/block-kit/README.md index 4e54988..f00c54a 100644 --- a/block-kit/README.md +++ b/block-kit/README.md @@ -21,6 +21,7 @@ Read the [docs](https://docs.slack.dev/block-kit/) to learn concepts behind thes - **[Input](https://docs.slack.dev/reference/block-kit/blocks/input-block)**: Collects information from users via elements. [Implementation](./src/main/java/blocks/Input.java). - **[Markdown](https://docs.slack.dev/reference/block-kit/blocks/markdown-block)**: Displays formatted markdown. [Implementation](./src/main/java/blocks/Markdown.java). - **[Section](https://docs.slack.dev/reference/block-kit/blocks/section-block)**: Displays text, possibly alongside elements. [Implementation](./src/main/java/blocks/Section.java). +- **[Table](https://docs.slack.dev/reference/block-kit/blocks/table-block)**: Displays structured information in a table. [Implementation](./src/main/java/blocks/Table.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/Table.java b/block-kit/src/main/java/blocks/Table.java new file mode 100644 index 0000000..95aa01e --- /dev/null +++ b/block-kit/src/main/java/blocks/Table.java @@ -0,0 +1,41 @@ +package blocks; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.TableBlock; +import com.slack.api.model.block.composition.BlockCompositions; +import com.slack.api.model.block.element.RichTextSectionElement; +import java.util.List; + +/** + * Displays structured information in a table. + * {@link https://docs.slack.dev/reference/block-kit/blocks/table-block/} + */ +public class Table { + /** + * A table with the first column wrapped and the second column right aligned. + */ + public static TableBlock example01() { + TableBlock block = Blocks.table(t -> t.columnSettings(List.of( + TableBlock.ColumnSetting.builder().isWrapped(true).build(), + TableBlock.ColumnSetting.builder().align("right").build())) + .rows(List.of( + List.of(BlockCompositions.rawText("Header A"), BlockCompositions.rawText("Header B")), + List.of( + BlockCompositions.rawText("Data 1A"), + Blocks.richText(rt -> rt.elements(List.of(RichTextSectionElement.builder() + .elements(List.of(RichTextSectionElement.Link.builder() + .text("Data 1B") + .url("https://slack.com") + .build())) + .build())))), + List.of( + BlockCompositions.rawText("Data 2A"), + Blocks.richText(rt -> rt.elements(List.of(RichTextSectionElement.builder() + .elements(List.of(RichTextSectionElement.Link.builder() + .text("Data 2B") + .url("https://slack.com") + .build())) + .build()))))))); + return block; + } +} diff --git a/block-kit/src/test/java/blocks/TableTest.java b/block-kit/src/test/java/blocks/TableTest.java new file mode 100644 index 0000000..491e26a --- /dev/null +++ b/block-kit/src/test/java/blocks/TableTest.java @@ -0,0 +1,84 @@ +package blocks; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.TableBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class TableTest { + @Test + public void testExample01() { + TableBlock block = Table.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "table", + "column_settings": [ + { + "is_wrapped": true + }, + { + "align": "right" + } + ], + "rows": [ + [ + { + "type": "raw_text", + "text": "Header A" + }, + { + "type": "raw_text", + "text": "Header B" + } + ], + [ + { + "type": "raw_text", + "text": "Data 1A" + }, + { + "type": "rich_text", + "elements": [ + { + "type": "rich_text_section", + "elements": [ + { + "text": "Data 1B", + "type": "link", + "url": "https://slack.com" + } + ] + } + ] + } + ], + [ + { + "type": "raw_text", + "text": "Data 2A" + }, + { + "type": "rich_text", + "elements": [ + { + "type": "rich_text_section", + "elements": [ + { + "text": "Data 2B", + "type": "link", + "url": "https://slack.com" + } + ] + } + ] + } + ] + ] + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +}