From 9f8fd042dc67aa33ecd1cb2dcfc4fd0a5524998f Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Thu, 27 Aug 2026 22:51:47 -0700 Subject: [PATCH 1/9] feat(block-kit): add composition object examples Add composition object examples to the block-kit showcase, mirroring the block element examples: one exampleNN() per documented reference payload, each returning the full host block/view so the reference JSON round-trips verbatim, with tests asserting the complete serialized payload. Ships 9 of the 10 documented composition objects (text, option, option-group, confirmation-dialog, dispatch-action-configuration, conversation-filter, slack-file, trigger, workflow). The slack-icon object is deferred: it is a card-block sub-object and the card block is absent from the SDK, so no example payload can be produced. Co-Authored-By: Claude --- block-kit/README.md | 12 +++ .../ConfirmationDialog.java | 37 ++++++++ .../ConversationFilter.java | 52 +++++++++++ .../DispatchActionConfiguration.java | 29 ++++++ .../main/java/compositionobjects/Option.java | 58 ++++++++++++ .../java/compositionobjects/OptionGroup.java | 56 +++++++++++ .../java/compositionobjects/SlackFile.java | 37 ++++++++ .../main/java/compositionobjects/Text.java | 21 +++++ .../main/java/compositionobjects/Trigger.java | 41 ++++++++ .../java/compositionobjects/Workflow.java | 41 ++++++++ .../ConfirmationDialogTest.java | 62 +++++++++++++ .../ConversationFilterTest.java | 63 +++++++++++++ .../DispatchActionConfigurationTest.java | 38 ++++++++ .../compositionobjects/OptionGroupTest.java | 93 +++++++++++++++++++ .../java/compositionobjects/OptionTest.java | 91 ++++++++++++++++++ .../compositionobjects/SlackFileTest.java | 52 +++++++++++ .../java/compositionobjects/TextTest.java | 26 ++++++ .../java/compositionobjects/TriggerTest.java | 49 ++++++++++ .../java/compositionobjects/WorkflowTest.java | 49 ++++++++++ 19 files changed, 907 insertions(+) create mode 100644 block-kit/src/main/java/compositionobjects/ConfirmationDialog.java create mode 100644 block-kit/src/main/java/compositionobjects/ConversationFilter.java create mode 100644 block-kit/src/main/java/compositionobjects/DispatchActionConfiguration.java create mode 100644 block-kit/src/main/java/compositionobjects/Option.java create mode 100644 block-kit/src/main/java/compositionobjects/OptionGroup.java create mode 100644 block-kit/src/main/java/compositionobjects/SlackFile.java create mode 100644 block-kit/src/main/java/compositionobjects/Text.java create mode 100644 block-kit/src/main/java/compositionobjects/Trigger.java create mode 100644 block-kit/src/main/java/compositionobjects/Workflow.java create mode 100644 block-kit/src/test/java/compositionobjects/ConfirmationDialogTest.java create mode 100644 block-kit/src/test/java/compositionobjects/ConversationFilterTest.java create mode 100644 block-kit/src/test/java/compositionobjects/DispatchActionConfigurationTest.java create mode 100644 block-kit/src/test/java/compositionobjects/OptionGroupTest.java create mode 100644 block-kit/src/test/java/compositionobjects/OptionTest.java create mode 100644 block-kit/src/test/java/compositionobjects/SlackFileTest.java create mode 100644 block-kit/src/test/java/compositionobjects/TextTest.java create mode 100644 block-kit/src/test/java/compositionobjects/TriggerTest.java create mode 100644 block-kit/src/test/java/compositionobjects/WorkflowTest.java diff --git a/block-kit/README.md b/block-kit/README.md index 3cd3768..e916f8d 100644 --- a/block-kit/README.md +++ b/block-kit/README.md @@ -20,3 +20,15 @@ Read the [docs](https://docs.slack.dev/block-kit/) to learn concepts behind thes - **[Section](https://docs.slack.dev/reference/block-kit/blocks/section-block)**: Displays text, possibly alongside elements. [Implementation](./src/main/java/blocks/Section.java). - **[Video](https://docs.slack.dev/reference/block-kit/blocks/video-block)**: Displays an embedded video player. [Implementation](./src/main/java/blocks/Video.java). +### Composition objects + +- **[Confirmation dialog](https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object)**: Defines a dialog that adds a confirmation step to interactive elements. [Implementation](./src/main/java/compositionobjects/ConfirmationDialog.java). +- **[Conversation filter](https://docs.slack.dev/reference/block-kit/composition-objects/conversation-filter-object)**: Defines a filter for the list of options in a conversation selector menu. [Implementation](./src/main/java/compositionobjects/ConversationFilter.java). +- **[Dispatch action configuration](https://docs.slack.dev/reference/block-kit/composition-objects/dispatch-action-configuration-object)**: Defines when a plain-text input element will return a `block_actions` interaction payload. [Implementation](./src/main/java/compositionobjects/DispatchActionConfiguration.java). +- **[Option](https://docs.slack.dev/reference/block-kit/composition-objects/option-object)**: Defines a single item in a number of item selection elements. [Implementation](./src/main/java/compositionobjects/Option.java). +- **[Option group](https://docs.slack.dev/reference/block-kit/composition-objects/option-group-object)**: Defines a way to group options in a menu. [Implementation](./src/main/java/compositionobjects/OptionGroup.java). +- **[Slack file](https://docs.slack.dev/reference/block-kit/composition-objects/slack-file-object)**: Defines an object containing Slack file information to be used in an image block or image element. [Implementation](./src/main/java/compositionobjects/SlackFile.java). +- **[Text](https://docs.slack.dev/reference/block-kit/composition-objects/text-object)**: Defines an object containing some text. [Implementation](./src/main/java/compositionobjects/Text.java). +- **[Trigger](https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object)**: Defines an object containing trigger information. [Implementation](./src/main/java/compositionobjects/Trigger.java). +- **[Workflow](https://docs.slack.dev/reference/block-kit/composition-objects/workflow-object)**: Defines an object containing workflow information. [Implementation](./src/main/java/compositionobjects/Workflow.java). + diff --git a/block-kit/src/main/java/compositionobjects/ConfirmationDialog.java b/block-kit/src/main/java/compositionobjects/ConfirmationDialog.java new file mode 100644 index 0000000..b8946bd --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/ConfirmationDialog.java @@ -0,0 +1,37 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.markdownText; +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.ActionsBlock; +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.composition.ConfirmationDialogObject; +import com.slack.api.model.block.element.BlockElements; +import java.util.List; + +/** + * Defines a dialog that adds a confirmation step to interactive elements. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object/} + */ +public class ConfirmationDialog { + /** + * An actions block with a button carrying a confirmation dialog. + */ + public static ActionsBlock example01() { + ActionsBlock block = Blocks.actions(a -> a.elements(List.of( + BlockElements.button( + b -> b.text(plainText(pt -> pt.text("Approve").emoji(true))) + .confirm(ConfirmationDialogObject.builder() + .title(plainText("Are you sure?")) + .text(markdownText("Would you not prefer a good game of _chess_?")) + .confirm(plainText("Do it")) + .deny(plainText("Stop, I changed my mind!")) + .build()) + .style("primary") + .value("click_me_123")), + BlockElements.button(b -> b.text(plainText(pt -> pt.text("Deny").emoji(true))) + .style("danger") + .value("click_me_123"))))); + return block; + } +} diff --git a/block-kit/src/main/java/compositionobjects/ConversationFilter.java b/block-kit/src/main/java/compositionobjects/ConversationFilter.java new file mode 100644 index 0000000..d063bbc --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/ConversationFilter.java @@ -0,0 +1,52 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.element.BlockElements; +import com.slack.api.model.block.element.ConversationsFilter; +import com.slack.api.model.view.View; +import com.slack.api.model.view.ViewClose; +import com.slack.api.model.view.ViewSubmit; +import com.slack.api.model.view.ViewTitle; +import java.util.List; + +/** + * Defines a filter for the list of options in a conversation selector menu. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/conversation-filter-object/} + */ +public class ConversationFilter { + /** + * A modal view with a conversations select input carrying a filter. + */ + public static View example01() { + View view = View.builder() + .type("modal") + .title(ViewTitle.builder() + .type("plain_text") + .text("My App") + .emoji(true) + .build()) + .submit(ViewSubmit.builder() + .type("plain_text") + .text("Submit") + .emoji(true) + .build()) + .close(ViewClose.builder() + .type("plain_text") + .text("Cancel") + .emoji(true) + .build()) + .blocks(List.of( + Blocks.input(i -> i.element(BlockElements.conversationsSelect(c -> c.placeholder(plainText(pt -> + pt.text("Select a conversation").emoji(true))) + .filter(ConversationsFilter.builder() + .include(List.of("public", "mpim")) + .excludeBotUsers(true) + .build()))) + .label(plainText(l -> l.text("Choose the conversation to publish your result to:") + .emoji(true)))))) + .build(); + return view; + } +} diff --git a/block-kit/src/main/java/compositionobjects/DispatchActionConfiguration.java b/block-kit/src/main/java/compositionobjects/DispatchActionConfiguration.java new file mode 100644 index 0000000..460b785 --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/DispatchActionConfiguration.java @@ -0,0 +1,29 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.InputBlock; +import com.slack.api.model.block.composition.DispatchActionConfig; +import com.slack.api.model.block.element.BlockElements; +import java.util.List; + +/** + * Defines when a plain-text input element will return a block_actions interaction payload. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/dispatch-action-configuration-object/} + */ +public class DispatchActionConfiguration { + /** + * An input block with a multiline plain-text input carrying a dispatch action configuration. + */ + public static InputBlock example01() { + InputBlock block = Blocks.input(i -> i.dispatchAction(true) + .element(BlockElements.plainTextInput(pt -> pt.multiline(true) + .dispatchActionConfig(DispatchActionConfig.builder() + .triggerActionsOn(List.of("on_character_entered")) + .build()))) + .label(plainText( + l -> l.text("This is a multiline plain-text input").emoji(true)))); + return block; + } +} diff --git a/block-kit/src/main/java/compositionobjects/Option.java b/block-kit/src/main/java/compositionobjects/Option.java new file mode 100644 index 0000000..8099958 --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/Option.java @@ -0,0 +1,58 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.markdownText; +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.LayoutBlock; +import com.slack.api.model.block.composition.OptionObject; +import com.slack.api.model.block.element.BlockElements; +import java.util.List; + +/** + * Defines a single item in a number of item selection elements. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/option-object/} + */ +public class Option { + /** + * A single option object. + */ + public static OptionObject example01() { + OptionObject option = OptionObject.builder() + .text(plainText(pt -> pt.text("Save it").emoji(true))) + .value("value-2") + .build(); + return option; + } + + /** + * Options hosted in a static select menu across several blocks. + */ + public static List example02() { + List blocks = List.of( + Blocks.section(s -> s.text(markdownText(":mag: Search results for *Cata*"))), + Blocks.divider(), + Blocks.section(s -> s.text( + markdownText( + "**\nUse Case Catalogue for the following departments/roles...")) + .accessory(BlockElements.staticSelect(m -> m.placeholder( + plainText(pt -> pt.text("Manage").emoji(true))) + .options(List.of( + OptionObject.builder() + .text(plainText( + pt -> pt.text("Edit it").emoji(true))) + .value("value-0") + .build(), + OptionObject.builder() + .text(plainText( + pt -> pt.text("Read it").emoji(true))) + .value("value-1") + .build(), + OptionObject.builder() + .text(plainText( + pt -> pt.text("Save it").emoji(true))) + .value("value-2") + .build())))))); + return blocks; + } +} diff --git a/block-kit/src/main/java/compositionobjects/OptionGroup.java b/block-kit/src/main/java/compositionobjects/OptionGroup.java new file mode 100644 index 0000000..9aedfcc --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/OptionGroup.java @@ -0,0 +1,56 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.markdownText; +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.LayoutBlock; +import com.slack.api.model.block.composition.OptionGroupObject; +import com.slack.api.model.block.composition.OptionObject; +import com.slack.api.model.block.element.BlockElements; +import java.util.List; + +/** + * Defines a way to group options in a menu. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/option-group-object/} + */ +public class OptionGroup { + /** + * Option groups hosted in a static select menu across several blocks. + */ + public static List example01() { + List blocks = List.of( + Blocks.section(s -> s.text(markdownText(":mag: Search results for *Cata*"))), + Blocks.divider(), + Blocks.section(s -> s.text( + markdownText( + "**\nUse Case Catalogue for the following departments/roles...")) + .accessory(BlockElements.staticSelect(m -> m.placeholder( + plainText(pt -> pt.text("Manage").emoji(true))) + .optionGroups(List.of( + OptionGroupObject.builder() + .label(plainText("Group 1")) + .options(List.of( + OptionObject.builder() + .text(plainText("*this is plain_text text*")) + .value("value-0") + .build(), + OptionObject.builder() + .text(plainText("*this is plain_text text*")) + .value("value-1") + .build(), + OptionObject.builder() + .text(plainText("*this is plain_text text*")) + .value("value-2") + .build())) + .build(), + OptionGroupObject.builder() + .label(plainText("Group 2")) + .options(List.of(OptionObject.builder() + .text(plainText("*this is plain_text text*")) + .value("value-3") + .build())) + .build())))))); + return blocks; + } +} diff --git a/block-kit/src/main/java/compositionobjects/SlackFile.java b/block-kit/src/main/java/compositionobjects/SlackFile.java new file mode 100644 index 0000000..7899b9f --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/SlackFile.java @@ -0,0 +1,37 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.ImageBlock; +import com.slack.api.model.block.composition.SlackFileObject; + +/** + * Defines an object containing Slack file information to be used in an image block or image element. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/slack-file-object/} + */ +public class SlackFile { + /** + * An image block referencing a Slack file by url. + */ + public static ImageBlock example01() { + ImageBlock block = Blocks.image(i -> i.title(plainText("Please enjoy this photo of a kitten")) + .blockId("image4") + .slackFile(SlackFileObject.builder() + .url("https://files.slack.com/files-pri/T0123456-F0123456/xyz.png") + .build()) + .altText("An incredibly cute kitten.")); + return block; + } + + /** + * An image block referencing a Slack file by id. + */ + public static ImageBlock example02() { + ImageBlock block = Blocks.image(i -> i.title(plainText("Please enjoy this photo of a kitten")) + .blockId("image4") + .slackFile(SlackFileObject.builder().id("F0123456").build()) + .altText("An incredibly cute kitten.")); + return block; + } +} diff --git a/block-kit/src/main/java/compositionobjects/Text.java b/block-kit/src/main/java/compositionobjects/Text.java new file mode 100644 index 0000000..a02b1b2 --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/Text.java @@ -0,0 +1,21 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.markdownText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.SectionBlock; + +/** + * Defines an object containing some text. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/text-object/} + */ +public class Text { + /** + * A section block hosting an mrkdwn text object. + */ + public static SectionBlock example01() { + SectionBlock block = Blocks.section( + s -> s.text(markdownText("A message *with some bold text* and _some italicized text_."))); + return block; + } +} diff --git a/block-kit/src/main/java/compositionobjects/Trigger.java b/block-kit/src/main/java/compositionobjects/Trigger.java new file mode 100644 index 0000000..b03c8ab --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/Trigger.java @@ -0,0 +1,41 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.markdownText; +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.SectionBlock; +import com.slack.api.model.block.composition.WorkflowObject; +import com.slack.api.model.block.element.BlockElements; +import java.util.List; + +/** + * Defines an object containing trigger information. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object/} + */ +public class Trigger { + /** + * A section block with a workflow button whose trigger carries customizable input parameters. + */ + public static SectionBlock example01() { + SectionBlock block = + Blocks.section(s -> s.text(markdownText("A message *with some bold text* and _some italicized text_.")) + .accessory(BlockElements.workflowButton(w -> w.text(plainText("Run Workflow")) + .actionId("workflowbutton123") + .workflow(WorkflowObject.builder() + .trigger(WorkflowObject.Trigger.builder() + .url("https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx") + .customizableInputParameters(List.of( + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_a") + .value("Value for input param A") + .build(), + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_b") + .value("Value for input param B") + .build())) + .build()) + .build())))); + return block; + } +} diff --git a/block-kit/src/main/java/compositionobjects/Workflow.java b/block-kit/src/main/java/compositionobjects/Workflow.java new file mode 100644 index 0000000..36f8187 --- /dev/null +++ b/block-kit/src/main/java/compositionobjects/Workflow.java @@ -0,0 +1,41 @@ +package compositionobjects; + +import static com.slack.api.model.block.composition.BlockCompositions.markdownText; +import static com.slack.api.model.block.composition.BlockCompositions.plainText; + +import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.SectionBlock; +import com.slack.api.model.block.composition.WorkflowObject; +import com.slack.api.model.block.element.BlockElements; +import java.util.List; + +/** + * Defines an object containing workflow information. + * {@link https://docs.slack.dev/reference/block-kit/composition-objects/workflow-object/} + */ +public class Workflow { + /** + * A section block with a workflow button whose workflow carries a trigger. + */ + public static SectionBlock example01() { + SectionBlock block = + Blocks.section(s -> s.text(markdownText("A message *with some bold text* and _some italicized text_.")) + .accessory(BlockElements.workflowButton(w -> w.text(plainText("Run Workflow")) + .actionId("workflowbutton123") + .workflow(WorkflowObject.builder() + .trigger(WorkflowObject.Trigger.builder() + .url("https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx") + .customizableInputParameters(List.of( + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_a") + .value("Value for input param A") + .build(), + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_b") + .value("Value for input param B") + .build())) + .build()) + .build())))); + return block; + } +} diff --git a/block-kit/src/test/java/compositionobjects/ConfirmationDialogTest.java b/block-kit/src/test/java/compositionobjects/ConfirmationDialogTest.java new file mode 100644 index 0000000..c6d9070 --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/ConfirmationDialogTest.java @@ -0,0 +1,62 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.ActionsBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class ConfirmationDialogTest { + @Test + public void testExample01() { + ActionsBlock block = ConfirmationDialog.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "emoji": true, + "text": "Approve" + }, + "confirm": { + "title": { + "type": "plain_text", + "text": "Are you sure?" + }, + "text": { + "type": "mrkdwn", + "text": "Would you not prefer a good game of _chess_?" + }, + "confirm": { + "type": "plain_text", + "text": "Do it" + }, + "deny": { + "type": "plain_text", + "text": "Stop, I changed my mind!" + } + }, + "style": "primary", + "value": "click_me_123" + }, + { + "type": "button", + "text": { + "type": "plain_text", + "emoji": true, + "text": "Deny" + }, + "style": "danger", + "value": "click_me_123" + } + ] + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/ConversationFilterTest.java b/block-kit/src/test/java/compositionobjects/ConversationFilterTest.java new file mode 100644 index 0000000..048564f --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/ConversationFilterTest.java @@ -0,0 +1,63 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.view.View; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class ConversationFilterTest { + @Test + public void testExample01() { + View view = ConversationFilter.example01(); + String actual = GsonFactory.createSnakeCase().toJson(view); + String expected = """ + { + "title": { + "type": "plain_text", + "text": "My App", + "emoji": true + }, + "submit": { + "type": "plain_text", + "text": "Submit", + "emoji": true + }, + "type": "modal", + "close": { + "type": "plain_text", + "text": "Cancel", + "emoji": true + }, + "blocks": [ + { + "type": "input", + "element": { + "type": "conversations_select", + "placeholder": { + "type": "plain_text", + "text": "Select a conversation", + "emoji": true + }, + "filter": { + "include": [ + "public", + "mpim" + ], + "exclude_bot_users": true + } + }, + "label": { + "type": "plain_text", + "text": "Choose the conversation to publish your result to:", + "emoji": true + }, + "optional": false + } + ] + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/DispatchActionConfigurationTest.java b/block-kit/src/test/java/compositionobjects/DispatchActionConfigurationTest.java new file mode 100644 index 0000000..817208b --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/DispatchActionConfigurationTest.java @@ -0,0 +1,38 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.InputBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class DispatchActionConfigurationTest { + @Test + public void testExample01() { + InputBlock block = DispatchActionConfiguration.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "input", + "dispatch_action": true, + "element": { + "type": "plain_text_input", + "multiline": true, + "dispatch_action_config": { + "trigger_actions_on": [ + "on_character_entered" + ] + } + }, + "label": { + "type": "plain_text", + "text": "This is a multiline plain-text input", + "emoji": true + }, + "optional": false + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/OptionGroupTest.java b/block-kit/src/test/java/compositionobjects/OptionGroupTest.java new file mode 100644 index 0000000..36b06e0 --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/OptionGroupTest.java @@ -0,0 +1,93 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.LayoutBlock; +import com.slack.api.util.json.GsonFactory; +import java.util.List; +import org.junit.jupiter.api.Test; + +public class OptionGroupTest { + @Test + public void testExample01() { + List blocks = OptionGroup.example01(); + String actual = GsonFactory.createSnakeCase().toJson(blocks); + String expected = """ + [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ":mag: Search results for *Cata*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "**\\nUse Case Catalogue for the following departments/roles..." + }, + "accessory": { + "type": "static_select", + "placeholder": { + "type": "plain_text", + "emoji": true, + "text": "Manage" + }, + "option_groups": [ + { + "label": { + "type": "plain_text", + "text": "Group 1" + }, + "options": [ + { + "text": { + "type": "plain_text", + "text": "*this is plain_text text*" + }, + "value": "value-0" + }, + { + "text": { + "type": "plain_text", + "text": "*this is plain_text text*" + }, + "value": "value-1" + }, + { + "text": { + "type": "plain_text", + "text": "*this is plain_text text*" + }, + "value": "value-2" + } + ] + }, + { + "label": { + "type": "plain_text", + "text": "Group 2" + }, + "options": [ + { + "text": { + "type": "plain_text", + "text": "*this is plain_text text*" + }, + "value": "value-3" + } + ] + } + ] + } + } + ] + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/OptionTest.java b/block-kit/src/test/java/compositionobjects/OptionTest.java new file mode 100644 index 0000000..b612ae8 --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/OptionTest.java @@ -0,0 +1,91 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.LayoutBlock; +import com.slack.api.model.block.composition.OptionObject; +import com.slack.api.util.json.GsonFactory; +import java.util.List; +import org.junit.jupiter.api.Test; + +public class OptionTest { + @Test + public void testExample01() { + OptionObject option = Option.example01(); + String actual = GsonFactory.createSnakeCase().toJson(option); + String expected = """ + { + "text": { + "type": "plain_text", + "emoji": true, + "text": "Save it" + }, + "value": "value-2" + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } + + @Test + public void testExample02() { + List blocks = Option.example02(); + String actual = GsonFactory.createSnakeCase().toJson(blocks); + String expected = """ + [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ":mag: Search results for *Cata*" + } + }, + { + "type": "divider" + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "**\\nUse Case Catalogue for the following departments/roles..." + }, + "accessory": { + "type": "static_select", + "placeholder": { + "type": "plain_text", + "emoji": true, + "text": "Manage" + }, + "options": [ + { + "text": { + "type": "plain_text", + "emoji": true, + "text": "Edit it" + }, + "value": "value-0" + }, + { + "text": { + "type": "plain_text", + "emoji": true, + "text": "Read it" + }, + "value": "value-1" + }, + { + "text": { + "type": "plain_text", + "emoji": true, + "text": "Save it" + }, + "value": "value-2" + } + ] + } + } + ] + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/SlackFileTest.java b/block-kit/src/test/java/compositionobjects/SlackFileTest.java new file mode 100644 index 0000000..a88b1fc --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/SlackFileTest.java @@ -0,0 +1,52 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.ImageBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class SlackFileTest { + @Test + public void testExample01() { + ImageBlock block = SlackFile.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "image", + "title": { + "type": "plain_text", + "text": "Please enjoy this photo of a kitten" + }, + "block_id": "image4", + "slack_file": { + "url": "https://files.slack.com/files-pri/T0123456-F0123456/xyz.png" + }, + "alt_text": "An incredibly cute kitten." + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } + + @Test + public void testExample02() { + ImageBlock block = SlackFile.example02(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "image", + "title": { + "type": "plain_text", + "text": "Please enjoy this photo of a kitten" + }, + "block_id": "image4", + "slack_file": { + "id": "F0123456" + }, + "alt_text": "An incredibly cute kitten." + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/TextTest.java b/block-kit/src/test/java/compositionobjects/TextTest.java new file mode 100644 index 0000000..e94912a --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/TextTest.java @@ -0,0 +1,26 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.SectionBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class TextTest { + @Test + public void testExample01() { + SectionBlock block = Text.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "A message *with some bold text* and _some italicized text_." + } + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/TriggerTest.java b/block-kit/src/test/java/compositionobjects/TriggerTest.java new file mode 100644 index 0000000..82b3aac --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/TriggerTest.java @@ -0,0 +1,49 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.SectionBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class TriggerTest { + @Test + public void testExample01() { + SectionBlock block = Trigger.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "section", + "text": { + "text": "A message *with some bold text* and _some italicized text_.", + "type": "mrkdwn" + }, + "accessory": { + "type": "workflow_button", + "text": { + "type": "plain_text", + "text": "Run Workflow" + }, + "action_id": "workflowbutton123", + "workflow": { + "trigger": { + "url": "https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx", + "customizable_input_parameters": [ + { + "name": "input_parameter_a", + "value": "Value for input param A" + }, + { + "name": "input_parameter_b", + "value": "Value for input param B" + } + ] + } + } + } + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} diff --git a/block-kit/src/test/java/compositionobjects/WorkflowTest.java b/block-kit/src/test/java/compositionobjects/WorkflowTest.java new file mode 100644 index 0000000..51f3988 --- /dev/null +++ b/block-kit/src/test/java/compositionobjects/WorkflowTest.java @@ -0,0 +1,49 @@ +package compositionobjects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.JsonParser; +import com.slack.api.model.block.SectionBlock; +import com.slack.api.util.json.GsonFactory; +import org.junit.jupiter.api.Test; + +public class WorkflowTest { + @Test + public void testExample01() { + SectionBlock block = Workflow.example01(); + String actual = GsonFactory.createSnakeCase().toJson(block); + String expected = """ + { + "type": "section", + "text": { + "text": "A message *with some bold text* and _some italicized text_.", + "type": "mrkdwn" + }, + "accessory": { + "type": "workflow_button", + "text": { + "type": "plain_text", + "text": "Run Workflow" + }, + "action_id": "workflowbutton123", + "workflow": { + "trigger": { + "url": "https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx", + "customizable_input_parameters": [ + { + "name": "input_parameter_a", + "value": "Value for input param A" + }, + { + "name": "input_parameter_b", + "value": "Value for input param B" + } + ] + } + } + } + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +} From 053df216effae71868a3bdb8b0608aa14891961c Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 00:06:08 -0700 Subject: [PATCH 2/9] refactor(block-kit): rename composition-object examples to compositions/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renames the composition-object example directory from composition_objects/ (compositionobjects/ in Java) to compositions/, matching the shorter path. Directory + all references (test imports, README impl links, Java package declarations) updated together via git mv so history is preserved. Canonical docs.slack.dev/reference/block-kit/composition-objects/ URLs are left untouched (hyphenated, never the underscore token) — only local relative implementation-link paths changed. Co-Authored-By: Claude --- block-kit/README.md | 18 +++++++++--------- .../ConfirmationDialog.java | 2 +- .../ConversationFilter.java | 2 +- .../DispatchActionConfiguration.java | 2 +- .../Option.java | 2 +- .../OptionGroup.java | 2 +- .../SlackFile.java | 2 +- .../Text.java | 2 +- .../Trigger.java | 2 +- .../Workflow.java | 2 +- .../ConfirmationDialogTest.java | 2 +- .../ConversationFilterTest.java | 2 +- .../DispatchActionConfigurationTest.java | 2 +- .../OptionGroupTest.java | 2 +- .../OptionTest.java | 2 +- .../SlackFileTest.java | 2 +- .../TextTest.java | 2 +- .../TriggerTest.java | 2 +- .../WorkflowTest.java | 2 +- 19 files changed, 27 insertions(+), 27 deletions(-) rename block-kit/src/main/java/{compositionobjects => compositions}/ConfirmationDialog.java (98%) rename block-kit/src/main/java/{compositionobjects => compositions}/ConversationFilter.java (98%) rename block-kit/src/main/java/{compositionobjects => compositions}/DispatchActionConfiguration.java (97%) rename block-kit/src/main/java/{compositionobjects => compositions}/Option.java (98%) rename block-kit/src/main/java/{compositionobjects => compositions}/OptionGroup.java (99%) rename block-kit/src/main/java/{compositionobjects => compositions}/SlackFile.java (98%) rename block-kit/src/main/java/{compositionobjects => compositions}/Text.java (95%) rename block-kit/src/main/java/{compositionobjects => compositions}/Trigger.java (98%) rename block-kit/src/main/java/{compositionobjects => compositions}/Workflow.java (98%) rename block-kit/src/test/java/{compositionobjects => compositions}/ConfirmationDialogTest.java (98%) rename block-kit/src/test/java/{compositionobjects => compositions}/ConversationFilterTest.java (98%) rename block-kit/src/test/java/{compositionobjects => compositions}/DispatchActionConfigurationTest.java (97%) rename block-kit/src/test/java/{compositionobjects => compositions}/OptionGroupTest.java (99%) rename block-kit/src/test/java/{compositionobjects => compositions}/OptionTest.java (99%) rename block-kit/src/test/java/{compositionobjects => compositions}/SlackFileTest.java (98%) rename block-kit/src/test/java/{compositionobjects => compositions}/TextTest.java (96%) rename block-kit/src/test/java/{compositionobjects => compositions}/TriggerTest.java (98%) rename block-kit/src/test/java/{compositionobjects => compositions}/WorkflowTest.java (98%) diff --git a/block-kit/README.md b/block-kit/README.md index e916f8d..4a11ef2 100644 --- a/block-kit/README.md +++ b/block-kit/README.md @@ -22,13 +22,13 @@ Read the [docs](https://docs.slack.dev/block-kit/) to learn concepts behind thes ### Composition objects -- **[Confirmation dialog](https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object)**: Defines a dialog that adds a confirmation step to interactive elements. [Implementation](./src/main/java/compositionobjects/ConfirmationDialog.java). -- **[Conversation filter](https://docs.slack.dev/reference/block-kit/composition-objects/conversation-filter-object)**: Defines a filter for the list of options in a conversation selector menu. [Implementation](./src/main/java/compositionobjects/ConversationFilter.java). -- **[Dispatch action configuration](https://docs.slack.dev/reference/block-kit/composition-objects/dispatch-action-configuration-object)**: Defines when a plain-text input element will return a `block_actions` interaction payload. [Implementation](./src/main/java/compositionobjects/DispatchActionConfiguration.java). -- **[Option](https://docs.slack.dev/reference/block-kit/composition-objects/option-object)**: Defines a single item in a number of item selection elements. [Implementation](./src/main/java/compositionobjects/Option.java). -- **[Option group](https://docs.slack.dev/reference/block-kit/composition-objects/option-group-object)**: Defines a way to group options in a menu. [Implementation](./src/main/java/compositionobjects/OptionGroup.java). -- **[Slack file](https://docs.slack.dev/reference/block-kit/composition-objects/slack-file-object)**: Defines an object containing Slack file information to be used in an image block or image element. [Implementation](./src/main/java/compositionobjects/SlackFile.java). -- **[Text](https://docs.slack.dev/reference/block-kit/composition-objects/text-object)**: Defines an object containing some text. [Implementation](./src/main/java/compositionobjects/Text.java). -- **[Trigger](https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object)**: Defines an object containing trigger information. [Implementation](./src/main/java/compositionobjects/Trigger.java). -- **[Workflow](https://docs.slack.dev/reference/block-kit/composition-objects/workflow-object)**: Defines an object containing workflow information. [Implementation](./src/main/java/compositionobjects/Workflow.java). +- **[Confirmation dialog](https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object)**: Defines a dialog that adds a confirmation step to interactive elements. [Implementation](./src/main/java/compositions/ConfirmationDialog.java). +- **[Conversation filter](https://docs.slack.dev/reference/block-kit/composition-objects/conversation-filter-object)**: Defines a filter for the list of options in a conversation selector menu. [Implementation](./src/main/java/compositions/ConversationFilter.java). +- **[Dispatch action configuration](https://docs.slack.dev/reference/block-kit/composition-objects/dispatch-action-configuration-object)**: Defines when a plain-text input element will return a `block_actions` interaction payload. [Implementation](./src/main/java/compositions/DispatchActionConfiguration.java). +- **[Option](https://docs.slack.dev/reference/block-kit/composition-objects/option-object)**: Defines a single item in a number of item selection elements. [Implementation](./src/main/java/compositions/Option.java). +- **[Option group](https://docs.slack.dev/reference/block-kit/composition-objects/option-group-object)**: Defines a way to group options in a menu. [Implementation](./src/main/java/compositions/OptionGroup.java). +- **[Slack file](https://docs.slack.dev/reference/block-kit/composition-objects/slack-file-object)**: Defines an object containing Slack file information to be used in an image block or image element. [Implementation](./src/main/java/compositions/SlackFile.java). +- **[Text](https://docs.slack.dev/reference/block-kit/composition-objects/text-object)**: Defines an object containing some text. [Implementation](./src/main/java/compositions/Text.java). +- **[Trigger](https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object)**: Defines an object containing trigger information. [Implementation](./src/main/java/compositions/Trigger.java). +- **[Workflow](https://docs.slack.dev/reference/block-kit/composition-objects/workflow-object)**: Defines an object containing workflow information. [Implementation](./src/main/java/compositions/Workflow.java). diff --git a/block-kit/src/main/java/compositionobjects/ConfirmationDialog.java b/block-kit/src/main/java/compositions/ConfirmationDialog.java similarity index 98% rename from block-kit/src/main/java/compositionobjects/ConfirmationDialog.java rename to block-kit/src/main/java/compositions/ConfirmationDialog.java index b8946bd..8b8aded 100644 --- a/block-kit/src/main/java/compositionobjects/ConfirmationDialog.java +++ b/block-kit/src/main/java/compositions/ConfirmationDialog.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.markdownText; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/main/java/compositionobjects/ConversationFilter.java b/block-kit/src/main/java/compositions/ConversationFilter.java similarity index 98% rename from block-kit/src/main/java/compositionobjects/ConversationFilter.java rename to block-kit/src/main/java/compositions/ConversationFilter.java index d063bbc..d61902a 100644 --- a/block-kit/src/main/java/compositionobjects/ConversationFilter.java +++ b/block-kit/src/main/java/compositions/ConversationFilter.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/main/java/compositionobjects/DispatchActionConfiguration.java b/block-kit/src/main/java/compositions/DispatchActionConfiguration.java similarity index 97% rename from block-kit/src/main/java/compositionobjects/DispatchActionConfiguration.java rename to block-kit/src/main/java/compositions/DispatchActionConfiguration.java index 460b785..df80843 100644 --- a/block-kit/src/main/java/compositionobjects/DispatchActionConfiguration.java +++ b/block-kit/src/main/java/compositions/DispatchActionConfiguration.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/main/java/compositionobjects/Option.java b/block-kit/src/main/java/compositions/Option.java similarity index 98% rename from block-kit/src/main/java/compositionobjects/Option.java rename to block-kit/src/main/java/compositions/Option.java index 8099958..92055a7 100644 --- a/block-kit/src/main/java/compositionobjects/Option.java +++ b/block-kit/src/main/java/compositions/Option.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.markdownText; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/main/java/compositionobjects/OptionGroup.java b/block-kit/src/main/java/compositions/OptionGroup.java similarity index 99% rename from block-kit/src/main/java/compositionobjects/OptionGroup.java rename to block-kit/src/main/java/compositions/OptionGroup.java index 9aedfcc..77f04f9 100644 --- a/block-kit/src/main/java/compositionobjects/OptionGroup.java +++ b/block-kit/src/main/java/compositions/OptionGroup.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.markdownText; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/main/java/compositionobjects/SlackFile.java b/block-kit/src/main/java/compositions/SlackFile.java similarity index 98% rename from block-kit/src/main/java/compositionobjects/SlackFile.java rename to block-kit/src/main/java/compositions/SlackFile.java index 7899b9f..5b4c3d1 100644 --- a/block-kit/src/main/java/compositionobjects/SlackFile.java +++ b/block-kit/src/main/java/compositions/SlackFile.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/main/java/compositionobjects/Text.java b/block-kit/src/main/java/compositions/Text.java similarity index 95% rename from block-kit/src/main/java/compositionobjects/Text.java rename to block-kit/src/main/java/compositions/Text.java index a02b1b2..1bf7454 100644 --- a/block-kit/src/main/java/compositionobjects/Text.java +++ b/block-kit/src/main/java/compositions/Text.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.markdownText; diff --git a/block-kit/src/main/java/compositionobjects/Trigger.java b/block-kit/src/main/java/compositions/Trigger.java similarity index 98% rename from block-kit/src/main/java/compositionobjects/Trigger.java rename to block-kit/src/main/java/compositions/Trigger.java index b03c8ab..90bd99f 100644 --- a/block-kit/src/main/java/compositionobjects/Trigger.java +++ b/block-kit/src/main/java/compositions/Trigger.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.markdownText; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/main/java/compositionobjects/Workflow.java b/block-kit/src/main/java/compositions/Workflow.java similarity index 98% rename from block-kit/src/main/java/compositionobjects/Workflow.java rename to block-kit/src/main/java/compositions/Workflow.java index 36f8187..c93b6ba 100644 --- a/block-kit/src/main/java/compositionobjects/Workflow.java +++ b/block-kit/src/main/java/compositions/Workflow.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static com.slack.api.model.block.composition.BlockCompositions.markdownText; import static com.slack.api.model.block.composition.BlockCompositions.plainText; diff --git a/block-kit/src/test/java/compositionobjects/ConfirmationDialogTest.java b/block-kit/src/test/java/compositions/ConfirmationDialogTest.java similarity index 98% rename from block-kit/src/test/java/compositionobjects/ConfirmationDialogTest.java rename to block-kit/src/test/java/compositions/ConfirmationDialogTest.java index c6d9070..5150b7a 100644 --- a/block-kit/src/test/java/compositionobjects/ConfirmationDialogTest.java +++ b/block-kit/src/test/java/compositions/ConfirmationDialogTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/ConversationFilterTest.java b/block-kit/src/test/java/compositions/ConversationFilterTest.java similarity index 98% rename from block-kit/src/test/java/compositionobjects/ConversationFilterTest.java rename to block-kit/src/test/java/compositions/ConversationFilterTest.java index 048564f..33236f3 100644 --- a/block-kit/src/test/java/compositionobjects/ConversationFilterTest.java +++ b/block-kit/src/test/java/compositions/ConversationFilterTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/DispatchActionConfigurationTest.java b/block-kit/src/test/java/compositions/DispatchActionConfigurationTest.java similarity index 97% rename from block-kit/src/test/java/compositionobjects/DispatchActionConfigurationTest.java rename to block-kit/src/test/java/compositions/DispatchActionConfigurationTest.java index 817208b..bc06951 100644 --- a/block-kit/src/test/java/compositionobjects/DispatchActionConfigurationTest.java +++ b/block-kit/src/test/java/compositions/DispatchActionConfigurationTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/OptionGroupTest.java b/block-kit/src/test/java/compositions/OptionGroupTest.java similarity index 99% rename from block-kit/src/test/java/compositionobjects/OptionGroupTest.java rename to block-kit/src/test/java/compositions/OptionGroupTest.java index 36b06e0..487fcfd 100644 --- a/block-kit/src/test/java/compositionobjects/OptionGroupTest.java +++ b/block-kit/src/test/java/compositions/OptionGroupTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/OptionTest.java b/block-kit/src/test/java/compositions/OptionTest.java similarity index 99% rename from block-kit/src/test/java/compositionobjects/OptionTest.java rename to block-kit/src/test/java/compositions/OptionTest.java index b612ae8..a050b3a 100644 --- a/block-kit/src/test/java/compositionobjects/OptionTest.java +++ b/block-kit/src/test/java/compositions/OptionTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/SlackFileTest.java b/block-kit/src/test/java/compositions/SlackFileTest.java similarity index 98% rename from block-kit/src/test/java/compositionobjects/SlackFileTest.java rename to block-kit/src/test/java/compositions/SlackFileTest.java index a88b1fc..bbbcc0f 100644 --- a/block-kit/src/test/java/compositionobjects/SlackFileTest.java +++ b/block-kit/src/test/java/compositions/SlackFileTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/TextTest.java b/block-kit/src/test/java/compositions/TextTest.java similarity index 96% rename from block-kit/src/test/java/compositionobjects/TextTest.java rename to block-kit/src/test/java/compositions/TextTest.java index e94912a..757ca9e 100644 --- a/block-kit/src/test/java/compositionobjects/TextTest.java +++ b/block-kit/src/test/java/compositions/TextTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/TriggerTest.java b/block-kit/src/test/java/compositions/TriggerTest.java similarity index 98% rename from block-kit/src/test/java/compositionobjects/TriggerTest.java rename to block-kit/src/test/java/compositions/TriggerTest.java index 82b3aac..f4b5230 100644 --- a/block-kit/src/test/java/compositionobjects/TriggerTest.java +++ b/block-kit/src/test/java/compositions/TriggerTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/block-kit/src/test/java/compositionobjects/WorkflowTest.java b/block-kit/src/test/java/compositions/WorkflowTest.java similarity index 98% rename from block-kit/src/test/java/compositionobjects/WorkflowTest.java rename to block-kit/src/test/java/compositions/WorkflowTest.java index 51f3988..7413349 100644 --- a/block-kit/src/test/java/compositionobjects/WorkflowTest.java +++ b/block-kit/src/test/java/compositions/WorkflowTest.java @@ -1,4 +1,4 @@ -package compositionobjects; +package compositions; import static org.junit.jupiter.api.Assertions.assertEquals; From 4c1a5e05cd75c30e1fcc911aae444dfe823aec29 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 00:44:37 -0700 Subject: [PATCH 3/9] refactor(block-kit): inline BlockCompositions calls in composition examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These examples are surfaced in docs.slack.dev as focused snippets — only the exampleNN() body is shown, so the static imports at the top of the file are invisible to the reader and a bare plainText(...)/markdownText(...) reads as an unattributed free function. Drop the static imports and qualify every call (BlockCompositions.plainText, BlockCompositions.markdownText) so each helper in the surfaced range names its class, consistent with the sibling Blocks.*/BlockElements.* calls. Co-Authored-By: Claude --- .../java/compositions/ConfirmationDialog.java | 27 ++++++------- .../java/compositions/ConversationFilter.java | 10 ++--- .../DispatchActionConfiguration.java | 5 +-- .../src/main/java/compositions/Option.java | 20 +++++----- .../main/java/compositions/OptionGroup.java | 30 ++++++++------ .../src/main/java/compositions/SlackFile.java | 7 ++-- .../src/main/java/compositions/Text.java | 7 ++-- .../src/main/java/compositions/Trigger.java | 40 +++++++++---------- .../src/main/java/compositions/Workflow.java | 40 +++++++++---------- 9 files changed, 90 insertions(+), 96 deletions(-) diff --git a/block-kit/src/main/java/compositions/ConfirmationDialog.java b/block-kit/src/main/java/compositions/ConfirmationDialog.java index 8b8aded..0800e98 100644 --- a/block-kit/src/main/java/compositions/ConfirmationDialog.java +++ b/block-kit/src/main/java/compositions/ConfirmationDialog.java @@ -1,10 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.markdownText; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.ActionsBlock; import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.composition.ConfirmationDialogObject; import com.slack.api.model.block.element.BlockElements; import java.util.List; @@ -19,17 +17,18 @@ public class ConfirmationDialog { */ public static ActionsBlock example01() { ActionsBlock block = Blocks.actions(a -> a.elements(List.of( - BlockElements.button( - b -> b.text(plainText(pt -> pt.text("Approve").emoji(true))) - .confirm(ConfirmationDialogObject.builder() - .title(plainText("Are you sure?")) - .text(markdownText("Would you not prefer a good game of _chess_?")) - .confirm(plainText("Do it")) - .deny(plainText("Stop, I changed my mind!")) - .build()) - .style("primary") - .value("click_me_123")), - BlockElements.button(b -> b.text(plainText(pt -> pt.text("Deny").emoji(true))) + BlockElements.button(b -> b.text(BlockCompositions.plainText( + pt -> pt.text("Approve").emoji(true))) + .confirm(ConfirmationDialogObject.builder() + .title(BlockCompositions.plainText("Are you sure?")) + .text(BlockCompositions.markdownText("Would you not prefer a good game of _chess_?")) + .confirm(BlockCompositions.plainText("Do it")) + .deny(BlockCompositions.plainText("Stop, I changed my mind!")) + .build()) + .style("primary") + .value("click_me_123")), + BlockElements.button(b -> b.text(BlockCompositions.plainText( + pt -> pt.text("Deny").emoji(true))) .style("danger") .value("click_me_123"))))); return block; diff --git a/block-kit/src/main/java/compositions/ConversationFilter.java b/block-kit/src/main/java/compositions/ConversationFilter.java index d61902a..8f04177 100644 --- a/block-kit/src/main/java/compositions/ConversationFilter.java +++ b/block-kit/src/main/java/compositions/ConversationFilter.java @@ -1,8 +1,7 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.Blocks; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.element.BlockElements; import com.slack.api.model.block.element.ConversationsFilter; import com.slack.api.model.view.View; @@ -37,14 +36,15 @@ public static View example01() { .text("Cancel") .emoji(true) .build()) - .blocks(List.of( - Blocks.input(i -> i.element(BlockElements.conversationsSelect(c -> c.placeholder(plainText(pt -> + .blocks(List.of(Blocks.input(i -> i.element( + BlockElements.conversationsSelect(c -> c.placeholder(BlockCompositions.plainText(pt -> pt.text("Select a conversation").emoji(true))) .filter(ConversationsFilter.builder() .include(List.of("public", "mpim")) .excludeBotUsers(true) .build()))) - .label(plainText(l -> l.text("Choose the conversation to publish your result to:") + .label(BlockCompositions.plainText( + l -> l.text("Choose the conversation to publish your result to:") .emoji(true)))))) .build(); return view; diff --git a/block-kit/src/main/java/compositions/DispatchActionConfiguration.java b/block-kit/src/main/java/compositions/DispatchActionConfiguration.java index df80843..75e4594 100644 --- a/block-kit/src/main/java/compositions/DispatchActionConfiguration.java +++ b/block-kit/src/main/java/compositions/DispatchActionConfiguration.java @@ -1,9 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.Blocks; import com.slack.api.model.block.InputBlock; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.composition.DispatchActionConfig; import com.slack.api.model.block.element.BlockElements; import java.util.List; @@ -22,7 +21,7 @@ public static InputBlock example01() { .dispatchActionConfig(DispatchActionConfig.builder() .triggerActionsOn(List.of("on_character_entered")) .build()))) - .label(plainText( + .label(BlockCompositions.plainText( l -> l.text("This is a multiline plain-text input").emoji(true)))); return block; } diff --git a/block-kit/src/main/java/compositions/Option.java b/block-kit/src/main/java/compositions/Option.java index 92055a7..802caac 100644 --- a/block-kit/src/main/java/compositions/Option.java +++ b/block-kit/src/main/java/compositions/Option.java @@ -1,10 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.markdownText; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.Blocks; import com.slack.api.model.block.LayoutBlock; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.composition.OptionObject; import com.slack.api.model.block.element.BlockElements; import java.util.List; @@ -19,7 +17,7 @@ public class Option { */ public static OptionObject example01() { OptionObject option = OptionObject.builder() - .text(plainText(pt -> pt.text("Save it").emoji(true))) + .text(BlockCompositions.plainText(pt -> pt.text("Save it").emoji(true))) .value("value-2") .build(); return option; @@ -30,26 +28,26 @@ public static OptionObject example01() { */ public static List example02() { List blocks = List.of( - Blocks.section(s -> s.text(markdownText(":mag: Search results for *Cata*"))), + Blocks.section(s -> s.text(BlockCompositions.markdownText(":mag: Search results for *Cata*"))), Blocks.divider(), Blocks.section(s -> s.text( - markdownText( + BlockCompositions.markdownText( "**\nUse Case Catalogue for the following departments/roles...")) - .accessory(BlockElements.staticSelect(m -> m.placeholder( - plainText(pt -> pt.text("Manage").emoji(true))) + .accessory(BlockElements.staticSelect(m -> m.placeholder(BlockCompositions.plainText( + pt -> pt.text("Manage").emoji(true))) .options(List.of( OptionObject.builder() - .text(plainText( + .text(BlockCompositions.plainText( pt -> pt.text("Edit it").emoji(true))) .value("value-0") .build(), OptionObject.builder() - .text(plainText( + .text(BlockCompositions.plainText( pt -> pt.text("Read it").emoji(true))) .value("value-1") .build(), OptionObject.builder() - .text(plainText( + .text(BlockCompositions.plainText( pt -> pt.text("Save it").emoji(true))) .value("value-2") .build())))))); diff --git a/block-kit/src/main/java/compositions/OptionGroup.java b/block-kit/src/main/java/compositions/OptionGroup.java index 77f04f9..f26350e 100644 --- a/block-kit/src/main/java/compositions/OptionGroup.java +++ b/block-kit/src/main/java/compositions/OptionGroup.java @@ -1,10 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.markdownText; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.Blocks; import com.slack.api.model.block.LayoutBlock; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.composition.OptionGroupObject; import com.slack.api.model.block.composition.OptionObject; import com.slack.api.model.block.element.BlockElements; @@ -20,34 +18,40 @@ public class OptionGroup { */ public static List example01() { List blocks = List.of( - Blocks.section(s -> s.text(markdownText(":mag: Search results for *Cata*"))), + Blocks.section(s -> s.text(BlockCompositions.markdownText(":mag: Search results for *Cata*"))), Blocks.divider(), Blocks.section(s -> s.text( - markdownText( + BlockCompositions.markdownText( "**\nUse Case Catalogue for the following departments/roles...")) - .accessory(BlockElements.staticSelect(m -> m.placeholder( - plainText(pt -> pt.text("Manage").emoji(true))) + .accessory(BlockElements.staticSelect(m -> m.placeholder(BlockCompositions.plainText( + pt -> pt.text("Manage").emoji(true))) .optionGroups(List.of( OptionGroupObject.builder() - .label(plainText("Group 1")) + .label(BlockCompositions.plainText("Group 1")) .options(List.of( OptionObject.builder() - .text(plainText("*this is plain_text text*")) + .text( + BlockCompositions.plainText( + "*this is plain_text text*")) .value("value-0") .build(), OptionObject.builder() - .text(plainText("*this is plain_text text*")) + .text( + BlockCompositions.plainText( + "*this is plain_text text*")) .value("value-1") .build(), OptionObject.builder() - .text(plainText("*this is plain_text text*")) + .text( + BlockCompositions.plainText( + "*this is plain_text text*")) .value("value-2") .build())) .build(), OptionGroupObject.builder() - .label(plainText("Group 2")) + .label(BlockCompositions.plainText("Group 2")) .options(List.of(OptionObject.builder() - .text(plainText("*this is plain_text text*")) + .text(BlockCompositions.plainText("*this is plain_text text*")) .value("value-3") .build())) .build())))))); diff --git a/block-kit/src/main/java/compositions/SlackFile.java b/block-kit/src/main/java/compositions/SlackFile.java index 5b4c3d1..46fcb1d 100644 --- a/block-kit/src/main/java/compositions/SlackFile.java +++ b/block-kit/src/main/java/compositions/SlackFile.java @@ -1,9 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.Blocks; import com.slack.api.model.block.ImageBlock; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.composition.SlackFileObject; /** @@ -15,7 +14,7 @@ public class SlackFile { * An image block referencing a Slack file by url. */ public static ImageBlock example01() { - ImageBlock block = Blocks.image(i -> i.title(plainText("Please enjoy this photo of a kitten")) + ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten")) .blockId("image4") .slackFile(SlackFileObject.builder() .url("https://files.slack.com/files-pri/T0123456-F0123456/xyz.png") @@ -28,7 +27,7 @@ public static ImageBlock example01() { * An image block referencing a Slack file by id. */ public static ImageBlock example02() { - ImageBlock block = Blocks.image(i -> i.title(plainText("Please enjoy this photo of a kitten")) + ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten")) .blockId("image4") .slackFile(SlackFileObject.builder().id("F0123456").build()) .altText("An incredibly cute kitten.")); diff --git a/block-kit/src/main/java/compositions/Text.java b/block-kit/src/main/java/compositions/Text.java index 1bf7454..4241ec1 100644 --- a/block-kit/src/main/java/compositions/Text.java +++ b/block-kit/src/main/java/compositions/Text.java @@ -1,9 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.markdownText; - import com.slack.api.model.block.Blocks; import com.slack.api.model.block.SectionBlock; +import com.slack.api.model.block.composition.BlockCompositions; /** * Defines an object containing some text. @@ -14,8 +13,8 @@ public class Text { * A section block hosting an mrkdwn text object. */ public static SectionBlock example01() { - SectionBlock block = Blocks.section( - s -> s.text(markdownText("A message *with some bold text* and _some italicized text_."))); + SectionBlock block = Blocks.section(s -> + s.text(BlockCompositions.markdownText("A message *with some bold text* and _some italicized text_."))); return block; } } diff --git a/block-kit/src/main/java/compositions/Trigger.java b/block-kit/src/main/java/compositions/Trigger.java index 90bd99f..91ab6f4 100644 --- a/block-kit/src/main/java/compositions/Trigger.java +++ b/block-kit/src/main/java/compositions/Trigger.java @@ -1,10 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.markdownText; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.Blocks; import com.slack.api.model.block.SectionBlock; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.composition.WorkflowObject; import com.slack.api.model.block.element.BlockElements; import java.util.List; @@ -18,24 +16,24 @@ public class Trigger { * A section block with a workflow button whose trigger carries customizable input parameters. */ public static SectionBlock example01() { - SectionBlock block = - Blocks.section(s -> s.text(markdownText("A message *with some bold text* and _some italicized text_.")) - .accessory(BlockElements.workflowButton(w -> w.text(plainText("Run Workflow")) - .actionId("workflowbutton123") - .workflow(WorkflowObject.builder() - .trigger(WorkflowObject.Trigger.builder() - .url("https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx") - .customizableInputParameters(List.of( - WorkflowObject.Trigger.InputParameter.builder() - .name("input_parameter_a") - .value("Value for input param A") - .build(), - WorkflowObject.Trigger.InputParameter.builder() - .name("input_parameter_b") - .value("Value for input param B") - .build())) - .build()) - .build())))); + SectionBlock block = Blocks.section(s -> s.text( + BlockCompositions.markdownText("A message *with some bold text* and _some italicized text_.")) + .accessory(BlockElements.workflowButton(w -> w.text(BlockCompositions.plainText("Run Workflow")) + .actionId("workflowbutton123") + .workflow(WorkflowObject.builder() + .trigger(WorkflowObject.Trigger.builder() + .url("https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx") + .customizableInputParameters(List.of( + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_a") + .value("Value for input param A") + .build(), + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_b") + .value("Value for input param B") + .build())) + .build()) + .build())))); return block; } } diff --git a/block-kit/src/main/java/compositions/Workflow.java b/block-kit/src/main/java/compositions/Workflow.java index c93b6ba..68e009f 100644 --- a/block-kit/src/main/java/compositions/Workflow.java +++ b/block-kit/src/main/java/compositions/Workflow.java @@ -1,10 +1,8 @@ package compositions; -import static com.slack.api.model.block.composition.BlockCompositions.markdownText; -import static com.slack.api.model.block.composition.BlockCompositions.plainText; - import com.slack.api.model.block.Blocks; import com.slack.api.model.block.SectionBlock; +import com.slack.api.model.block.composition.BlockCompositions; import com.slack.api.model.block.composition.WorkflowObject; import com.slack.api.model.block.element.BlockElements; import java.util.List; @@ -18,24 +16,24 @@ public class Workflow { * A section block with a workflow button whose workflow carries a trigger. */ public static SectionBlock example01() { - SectionBlock block = - Blocks.section(s -> s.text(markdownText("A message *with some bold text* and _some italicized text_.")) - .accessory(BlockElements.workflowButton(w -> w.text(plainText("Run Workflow")) - .actionId("workflowbutton123") - .workflow(WorkflowObject.builder() - .trigger(WorkflowObject.Trigger.builder() - .url("https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx") - .customizableInputParameters(List.of( - WorkflowObject.Trigger.InputParameter.builder() - .name("input_parameter_a") - .value("Value for input param A") - .build(), - WorkflowObject.Trigger.InputParameter.builder() - .name("input_parameter_b") - .value("Value for input param B") - .build())) - .build()) - .build())))); + SectionBlock block = Blocks.section(s -> s.text( + BlockCompositions.markdownText("A message *with some bold text* and _some italicized text_.")) + .accessory(BlockElements.workflowButton(w -> w.text(BlockCompositions.plainText("Run Workflow")) + .actionId("workflowbutton123") + .workflow(WorkflowObject.builder() + .trigger(WorkflowObject.Trigger.builder() + .url("https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx") + .customizableInputParameters(List.of( + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_a") + .value("Value for input param A") + .build(), + WorkflowObject.Trigger.InputParameter.builder() + .name("input_parameter_b") + .value("Value for input param B") + .build())) + .build()) + .build())))); return block; } } From e81f3053629a662224e8c19f07e225aba27cbcf6 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 03:14:21 -0700 Subject: [PATCH 4/9] docs(block-kit): order Option group before Option to match docs composition index Co-Authored-By: Claude --- block-kit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block-kit/README.md b/block-kit/README.md index 4a11ef2..5761220 100644 --- a/block-kit/README.md +++ b/block-kit/README.md @@ -25,8 +25,8 @@ Read the [docs](https://docs.slack.dev/block-kit/) to learn concepts behind thes - **[Confirmation dialog](https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object)**: Defines a dialog that adds a confirmation step to interactive elements. [Implementation](./src/main/java/compositions/ConfirmationDialog.java). - **[Conversation filter](https://docs.slack.dev/reference/block-kit/composition-objects/conversation-filter-object)**: Defines a filter for the list of options in a conversation selector menu. [Implementation](./src/main/java/compositions/ConversationFilter.java). - **[Dispatch action configuration](https://docs.slack.dev/reference/block-kit/composition-objects/dispatch-action-configuration-object)**: Defines when a plain-text input element will return a `block_actions` interaction payload. [Implementation](./src/main/java/compositions/DispatchActionConfiguration.java). -- **[Option](https://docs.slack.dev/reference/block-kit/composition-objects/option-object)**: Defines a single item in a number of item selection elements. [Implementation](./src/main/java/compositions/Option.java). - **[Option group](https://docs.slack.dev/reference/block-kit/composition-objects/option-group-object)**: Defines a way to group options in a menu. [Implementation](./src/main/java/compositions/OptionGroup.java). +- **[Option](https://docs.slack.dev/reference/block-kit/composition-objects/option-object)**: Defines a single item in a number of item selection elements. [Implementation](./src/main/java/compositions/Option.java). - **[Slack file](https://docs.slack.dev/reference/block-kit/composition-objects/slack-file-object)**: Defines an object containing Slack file information to be used in an image block or image element. [Implementation](./src/main/java/compositions/SlackFile.java). - **[Text](https://docs.slack.dev/reference/block-kit/composition-objects/text-object)**: Defines an object containing some text. [Implementation](./src/main/java/compositions/Text.java). - **[Trigger](https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object)**: Defines an object containing trigger information. [Implementation](./src/main/java/compositions/Trigger.java). From a831fa380be669f78625fb08d321deda1613af19 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 03:23:27 -0700 Subject: [PATCH 5/9] docs(block-kit): align text example secondary description with docs prose Match "a section block containing a text object" from the text-object reference page. Co-Authored-By: Claude --- block-kit/src/main/java/compositions/Text.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block-kit/src/main/java/compositions/Text.java b/block-kit/src/main/java/compositions/Text.java index 4241ec1..b894de6 100644 --- a/block-kit/src/main/java/compositions/Text.java +++ b/block-kit/src/main/java/compositions/Text.java @@ -10,7 +10,7 @@ */ public class Text { /** - * A section block hosting an mrkdwn text object. + * A section block containing a text object. */ public static SectionBlock example01() { SectionBlock block = Blocks.section(s -> From f7a3bf47e6ae0b2a59865bbc98b2273b76a2b493 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 03:27:28 -0700 Subject: [PATCH 6/9] docs(block-kit): align slack_file example descriptions with the 'containing' phrasing Drop 'hosting'/divergent wording; unify all langs on 'An image block containing a Slack file object referenced by url/id.' Co-Authored-By: Claude --- block-kit/src/main/java/compositions/SlackFile.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block-kit/src/main/java/compositions/SlackFile.java b/block-kit/src/main/java/compositions/SlackFile.java index 46fcb1d..71f6d11 100644 --- a/block-kit/src/main/java/compositions/SlackFile.java +++ b/block-kit/src/main/java/compositions/SlackFile.java @@ -11,7 +11,7 @@ */ public class SlackFile { /** - * An image block referencing a Slack file by url. + * An image block containing a Slack file object referenced by url. */ public static ImageBlock example01() { ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten")) @@ -24,7 +24,7 @@ public static ImageBlock example01() { } /** - * An image block referencing a Slack file by id. + * An image block containing a Slack file object referenced by id. */ public static ImageBlock example02() { ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten")) From f02b298425e2aa4bb21b2b3b857f1701445f3e22 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 03:29:24 -0700 Subject: [PATCH 7/9] docs(block-kit): match slack_file example descriptions to the blocks/image example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Duplicate the canonical 'An image block using slack_file with a url/id.' phrasing rather than diverging — the composition example demonstrates the same payload as blocks/image, so the wording matches by design. Co-Authored-By: Claude --- block-kit/src/main/java/compositions/SlackFile.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block-kit/src/main/java/compositions/SlackFile.java b/block-kit/src/main/java/compositions/SlackFile.java index 71f6d11..9db89b0 100644 --- a/block-kit/src/main/java/compositions/SlackFile.java +++ b/block-kit/src/main/java/compositions/SlackFile.java @@ -11,7 +11,7 @@ */ public class SlackFile { /** - * An image block containing a Slack file object referenced by url. + * An image block using slack_file with a url. */ public static ImageBlock example01() { ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten")) @@ -24,7 +24,7 @@ public static ImageBlock example01() { } /** - * An image block containing a Slack file object referenced by id. + * An image block using slack_file with an id. */ public static ImageBlock example02() { ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten")) From 0a9c365b00b5884023ea77886b2f9fcee5c26557 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 03:32:27 -0700 Subject: [PATCH 8/9] docs(block-kit): align option_group example description with docs prose Match "a static select menu containing the option group object" from the option-group-object reference page; drop 'hosted'/divergent per-lang wording. Co-Authored-By: Claude --- block-kit/src/main/java/compositions/OptionGroup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block-kit/src/main/java/compositions/OptionGroup.java b/block-kit/src/main/java/compositions/OptionGroup.java index f26350e..d8fa5bc 100644 --- a/block-kit/src/main/java/compositions/OptionGroup.java +++ b/block-kit/src/main/java/compositions/OptionGroup.java @@ -14,7 +14,7 @@ */ public class OptionGroup { /** - * Option groups hosted in a static select menu across several blocks. + * A static select menu containing the option group object. */ public static List example01() { List blocks = List.of( From 7e1468dc6afaa2f800a4d23d99203682176083c7 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Tue, 1 Sep 2026 03:37:56 -0700 Subject: [PATCH 9/9] docs(block-kit): align option example description with docs prose Use "A static select menu element with several option objects." (from the option-object reference page); drop 'hosted'/divergent per-lang wording. Co-Authored-By: Claude --- block-kit/src/main/java/compositions/Option.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block-kit/src/main/java/compositions/Option.java b/block-kit/src/main/java/compositions/Option.java index 802caac..c26177d 100644 --- a/block-kit/src/main/java/compositions/Option.java +++ b/block-kit/src/main/java/compositions/Option.java @@ -24,7 +24,7 @@ public static OptionObject example01() { } /** - * Options hosted in a static select menu across several blocks. + * A static select menu element with several option objects. */ public static List example02() { List blocks = List.of(