diff --git a/block-kit/README.md b/block-kit/README.md index 4e54988..c35ba87 100644 --- a/block-kit/README.md +++ b/block-kit/README.md @@ -29,6 +29,7 @@ Read the [docs](https://docs.slack.dev/block-kit/) to learn concepts behind thes - **[Broadcast](https://docs.slack.dev/reference/block-kit/block-elements/broadcast-element)**: Displays a broadcast mention such as here, channel, or everyone. [Implementation](./src/main/java/elements/Broadcast.java). - **[Button](https://docs.slack.dev/reference/block-kit/block-elements/button-element)**: Allows users a direct path to performing basic actions. [Implementation](./src/main/java/elements/Button.java). - **[Channel](https://docs.slack.dev/reference/block-kit/block-elements/channel-element)**: Renders as a mention of a channel. [Implementation](./src/main/java/elements/Channel.java). +- **[Checkboxes](https://docs.slack.dev/reference/block-kit/block-elements/checkboxes-element)**: Allows users to choose multiple items from a list of options. [Implementation](./src/main/java/elements/Checkboxes.java). - **[Color](https://docs.slack.dev/reference/block-kit/block-elements/color-element)**: Displays a color swatch from a hex value. [Implementation](./src/main/java/elements/Color.java). - **[Date](https://docs.slack.dev/reference/block-kit/block-elements/date-element)**: Displays a formatted, localized date. [Implementation](./src/main/java/elements/Date.java). - **[Date picker](https://docs.slack.dev/reference/block-kit/block-elements/date-picker-element)**: Allows users to select a date from a calendar style UI. [Implementation](./src/main/java/elements/DatePicker.java). diff --git a/block-kit/src/main/java/elements/Checkboxes.java b/block-kit/src/main/java/elements/Checkboxes.java new file mode 100644 index 0000000..39cb738 --- /dev/null +++ b/block-kit/src/main/java/elements/Checkboxes.java @@ -0,0 +1,60 @@ +package elements; + +import com.slack.api.model.block.Blocks; +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 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; + +/** + * Allows users to choose multiple items from a list of options. + * {@link https://docs.slack.dev/reference/block-kit/block-elements/checkboxes-element/} + */ +public class Checkboxes { + /** + * A section block containing a group of checkboxes. + */ + 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.section(s -> s.text( + BlockCompositions.plainText("Check out these charming checkboxes")) + .accessory(BlockElements.checkboxes(c -> c.actionId("this_is_an_action_id") + .initialOptions(List.of(OptionObject.builder() + .value("A1") + .text(BlockCompositions.plainText("Checkbox 1")) + .build())) + .options(List.of( + OptionObject.builder() + .value("A1") + .text(BlockCompositions.plainText("Checkbox 1")) + .build(), + OptionObject.builder() + .value("A2") + .text(BlockCompositions.plainText("Checkbox 2")) + .description( + BlockCompositions.markdownText("*A description of option two*")) + .build()))))))) + .build(); + return view; + } +} diff --git a/block-kit/src/test/java/elements/CheckboxesTest.java b/block-kit/src/test/java/elements/CheckboxesTest.java new file mode 100644 index 0000000..7fed58f --- /dev/null +++ b/block-kit/src/test/java/elements/CheckboxesTest.java @@ -0,0 +1,79 @@ +package elements; + +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 CheckboxesTest { + @Test + public void testExample01() { + View view = Checkboxes.example01(); + String actual = GsonFactory.createSnakeCase().toJson(view); + String expected = """ + { + "type": "modal", + "title": { + "type": "plain_text", + "text": "My App", + "emoji": true + }, + "submit": { + "type": "plain_text", + "text": "Submit", + "emoji": true + }, + "close": { + "type": "plain_text", + "text": "Cancel", + "emoji": true + }, + "blocks": [ + { + "type": "section", + "text": { + "type": "plain_text", + "text": "Check out these charming checkboxes" + }, + "accessory": { + "type": "checkboxes", + "action_id": "this_is_an_action_id", + "initial_options": [ + { + "value": "A1", + "text": { + "type": "plain_text", + "text": "Checkbox 1" + } + } + ], + "options": [ + { + "value": "A1", + "text": { + "type": "plain_text", + "text": "Checkbox 1" + } + }, + { + "value": "A2", + "text": { + "type": "plain_text", + "text": "Checkbox 2" + }, + "description": { + "type": "mrkdwn", + "text": "*A description of option two*" + } + } + ] + } + } + ] + } + """; + assertEquals(JsonParser.parseString(expected), JsonParser.parseString(actual)); + } +}