Skip to content

Commit 276240c

Browse files
authored
feat(block-kit): add composition object examples (#70)
1 parent 81dbafd commit 276240c

19 files changed

Lines changed: 901 additions & 0 deletions

‎block-kit/README.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,15 @@ Read the [docs](https://docs.slack.dev/block-kit/) to learn concepts behind thes
5858
- **[Usergroup](https://docs.slack.dev/reference/block-kit/block-elements/usergroup-element)**: Renders as a mention of a user group. [Implementation](./src/main/java/elements/UserGroup.java).
5959
- **[Workflow button](https://docs.slack.dev/reference/block-kit/block-elements/workflow-button-element)**: Allows users to run a link trigger with customizable inputs. [Implementation](./src/main/java/elements/WorkflowButton.java).
6060

61+
### Composition objects
62+
63+
- **[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).
64+
- **[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).
65+
- **[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).
66+
- **[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).
67+
- **[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).
68+
- **[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).
69+
- **[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).
70+
- **[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).
71+
- **[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).
72+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.ActionsBlock;
4+
import com.slack.api.model.block.Blocks;
5+
import com.slack.api.model.block.composition.BlockCompositions;
6+
import com.slack.api.model.block.composition.ConfirmationDialogObject;
7+
import com.slack.api.model.block.element.BlockElements;
8+
import java.util.List;
9+
10+
/**
11+
* Defines a dialog that adds a confirmation step to interactive elements.
12+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/confirmation-dialog-object/}
13+
*/
14+
public class ConfirmationDialog {
15+
/**
16+
* An actions block with a button carrying a confirmation dialog.
17+
*/
18+
public static ActionsBlock example01() {
19+
ActionsBlock block = Blocks.actions(a -> a.elements(List.of(
20+
BlockElements.button(b -> b.text(BlockCompositions.plainText(
21+
pt -> pt.text("Approve").emoji(true)))
22+
.confirm(ConfirmationDialogObject.builder()
23+
.title(BlockCompositions.plainText("Are you sure?"))
24+
.text(BlockCompositions.markdownText("Would you not prefer a good game of _chess_?"))
25+
.confirm(BlockCompositions.plainText("Do it"))
26+
.deny(BlockCompositions.plainText("Stop, I changed my mind!"))
27+
.build())
28+
.style("primary")
29+
.value("click_me_123")),
30+
BlockElements.button(b -> b.text(BlockCompositions.plainText(
31+
pt -> pt.text("Deny").emoji(true)))
32+
.style("danger")
33+
.value("click_me_123")))));
34+
return block;
35+
}
36+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.Blocks;
4+
import com.slack.api.model.block.composition.BlockCompositions;
5+
import com.slack.api.model.block.element.BlockElements;
6+
import com.slack.api.model.block.element.ConversationsFilter;
7+
import com.slack.api.model.view.View;
8+
import com.slack.api.model.view.ViewClose;
9+
import com.slack.api.model.view.ViewSubmit;
10+
import com.slack.api.model.view.ViewTitle;
11+
import java.util.List;
12+
13+
/**
14+
* Defines a filter for the list of options in a conversation selector menu.
15+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/conversation-filter-object/}
16+
*/
17+
public class ConversationFilter {
18+
/**
19+
* A modal view with a conversations select input carrying a filter.
20+
*/
21+
public static View example01() {
22+
View view = View.builder()
23+
.type("modal")
24+
.title(ViewTitle.builder()
25+
.type("plain_text")
26+
.text("My App")
27+
.emoji(true)
28+
.build())
29+
.submit(ViewSubmit.builder()
30+
.type("plain_text")
31+
.text("Submit")
32+
.emoji(true)
33+
.build())
34+
.close(ViewClose.builder()
35+
.type("plain_text")
36+
.text("Cancel")
37+
.emoji(true)
38+
.build())
39+
.blocks(List.of(Blocks.input(i -> i.element(
40+
BlockElements.conversationsSelect(c -> c.placeholder(BlockCompositions.plainText(pt ->
41+
pt.text("Select a conversation").emoji(true)))
42+
.filter(ConversationsFilter.builder()
43+
.include(List.of("public", "mpim"))
44+
.excludeBotUsers(true)
45+
.build())))
46+
.label(BlockCompositions.plainText(
47+
l -> l.text("Choose the conversation to publish your result to:")
48+
.emoji(true))))))
49+
.build();
50+
return view;
51+
}
52+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.Blocks;
4+
import com.slack.api.model.block.InputBlock;
5+
import com.slack.api.model.block.composition.BlockCompositions;
6+
import com.slack.api.model.block.composition.DispatchActionConfig;
7+
import com.slack.api.model.block.element.BlockElements;
8+
import java.util.List;
9+
10+
/**
11+
* Defines when a plain-text input element will return a block_actions interaction payload.
12+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/dispatch-action-configuration-object/}
13+
*/
14+
public class DispatchActionConfiguration {
15+
/**
16+
* An input block with a multiline plain-text input carrying a dispatch action configuration.
17+
*/
18+
public static InputBlock example01() {
19+
InputBlock block = Blocks.input(i -> i.dispatchAction(true)
20+
.element(BlockElements.plainTextInput(pt -> pt.multiline(true)
21+
.dispatchActionConfig(DispatchActionConfig.builder()
22+
.triggerActionsOn(List.of("on_character_entered"))
23+
.build())))
24+
.label(BlockCompositions.plainText(
25+
l -> l.text("This is a multiline plain-text input").emoji(true))));
26+
return block;
27+
}
28+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.Blocks;
4+
import com.slack.api.model.block.LayoutBlock;
5+
import com.slack.api.model.block.composition.BlockCompositions;
6+
import com.slack.api.model.block.composition.OptionObject;
7+
import com.slack.api.model.block.element.BlockElements;
8+
import java.util.List;
9+
10+
/**
11+
* Defines a single item in a number of item selection elements.
12+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/option-object/}
13+
*/
14+
public class Option {
15+
/**
16+
* A single option object.
17+
*/
18+
public static OptionObject example01() {
19+
OptionObject option = OptionObject.builder()
20+
.text(BlockCompositions.plainText(pt -> pt.text("Save it").emoji(true)))
21+
.value("value-2")
22+
.build();
23+
return option;
24+
}
25+
26+
/**
27+
* A static select menu element with several option objects.
28+
*/
29+
public static List<LayoutBlock> example02() {
30+
List<LayoutBlock> blocks = List.of(
31+
Blocks.section(s -> s.text(BlockCompositions.markdownText(":mag: Search results for *Cata*"))),
32+
Blocks.divider(),
33+
Blocks.section(s -> s.text(
34+
BlockCompositions.markdownText(
35+
"*<fakeLink.toYourApp.com|Use Case Catalogue>*\nUse Case Catalogue for the following departments/roles..."))
36+
.accessory(BlockElements.staticSelect(m -> m.placeholder(BlockCompositions.plainText(
37+
pt -> pt.text("Manage").emoji(true)))
38+
.options(List.of(
39+
OptionObject.builder()
40+
.text(BlockCompositions.plainText(
41+
pt -> pt.text("Edit it").emoji(true)))
42+
.value("value-0")
43+
.build(),
44+
OptionObject.builder()
45+
.text(BlockCompositions.plainText(
46+
pt -> pt.text("Read it").emoji(true)))
47+
.value("value-1")
48+
.build(),
49+
OptionObject.builder()
50+
.text(BlockCompositions.plainText(
51+
pt -> pt.text("Save it").emoji(true)))
52+
.value("value-2")
53+
.build()))))));
54+
return blocks;
55+
}
56+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.Blocks;
4+
import com.slack.api.model.block.LayoutBlock;
5+
import com.slack.api.model.block.composition.BlockCompositions;
6+
import com.slack.api.model.block.composition.OptionGroupObject;
7+
import com.slack.api.model.block.composition.OptionObject;
8+
import com.slack.api.model.block.element.BlockElements;
9+
import java.util.List;
10+
11+
/**
12+
* Defines a way to group options in a menu.
13+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/option-group-object/}
14+
*/
15+
public class OptionGroup {
16+
/**
17+
* A static select menu containing the option group object.
18+
*/
19+
public static List<LayoutBlock> example01() {
20+
List<LayoutBlock> blocks = List.of(
21+
Blocks.section(s -> s.text(BlockCompositions.markdownText(":mag: Search results for *Cata*"))),
22+
Blocks.divider(),
23+
Blocks.section(s -> s.text(
24+
BlockCompositions.markdownText(
25+
"*<fakeLink.toYourApp.com|Use Case Catalogue>*\nUse Case Catalogue for the following departments/roles..."))
26+
.accessory(BlockElements.staticSelect(m -> m.placeholder(BlockCompositions.plainText(
27+
pt -> pt.text("Manage").emoji(true)))
28+
.optionGroups(List.of(
29+
OptionGroupObject.builder()
30+
.label(BlockCompositions.plainText("Group 1"))
31+
.options(List.of(
32+
OptionObject.builder()
33+
.text(
34+
BlockCompositions.plainText(
35+
"*this is plain_text text*"))
36+
.value("value-0")
37+
.build(),
38+
OptionObject.builder()
39+
.text(
40+
BlockCompositions.plainText(
41+
"*this is plain_text text*"))
42+
.value("value-1")
43+
.build(),
44+
OptionObject.builder()
45+
.text(
46+
BlockCompositions.plainText(
47+
"*this is plain_text text*"))
48+
.value("value-2")
49+
.build()))
50+
.build(),
51+
OptionGroupObject.builder()
52+
.label(BlockCompositions.plainText("Group 2"))
53+
.options(List.of(OptionObject.builder()
54+
.text(BlockCompositions.plainText("*this is plain_text text*"))
55+
.value("value-3")
56+
.build()))
57+
.build()))))));
58+
return blocks;
59+
}
60+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.Blocks;
4+
import com.slack.api.model.block.ImageBlock;
5+
import com.slack.api.model.block.composition.BlockCompositions;
6+
import com.slack.api.model.block.composition.SlackFileObject;
7+
8+
/**
9+
* Defines an object containing Slack file information to be used in an image block or image element.
10+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/slack-file-object/}
11+
*/
12+
public class SlackFile {
13+
/**
14+
* An image block using slack_file with a url.
15+
*/
16+
public static ImageBlock example01() {
17+
ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten"))
18+
.blockId("image4")
19+
.slackFile(SlackFileObject.builder()
20+
.url("https://files.slack.com/files-pri/T0123456-F0123456/xyz.png")
21+
.build())
22+
.altText("An incredibly cute kitten."));
23+
return block;
24+
}
25+
26+
/**
27+
* An image block using slack_file with an id.
28+
*/
29+
public static ImageBlock example02() {
30+
ImageBlock block = Blocks.image(i -> i.title(BlockCompositions.plainText("Please enjoy this photo of a kitten"))
31+
.blockId("image4")
32+
.slackFile(SlackFileObject.builder().id("F0123456").build())
33+
.altText("An incredibly cute kitten."));
34+
return block;
35+
}
36+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.Blocks;
4+
import com.slack.api.model.block.SectionBlock;
5+
import com.slack.api.model.block.composition.BlockCompositions;
6+
7+
/**
8+
* Defines an object containing some text.
9+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/text-object/}
10+
*/
11+
public class Text {
12+
/**
13+
* A section block containing a text object.
14+
*/
15+
public static SectionBlock example01() {
16+
SectionBlock block = Blocks.section(s ->
17+
s.text(BlockCompositions.markdownText("A message *with some bold text* and _some italicized text_.")));
18+
return block;
19+
}
20+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package compositions;
2+
3+
import com.slack.api.model.block.Blocks;
4+
import com.slack.api.model.block.SectionBlock;
5+
import com.slack.api.model.block.composition.BlockCompositions;
6+
import com.slack.api.model.block.composition.WorkflowObject;
7+
import com.slack.api.model.block.element.BlockElements;
8+
import java.util.List;
9+
10+
/**
11+
* Defines an object containing trigger information.
12+
* {@link https://docs.slack.dev/reference/block-kit/composition-objects/trigger-object/}
13+
*/
14+
public class Trigger {
15+
/**
16+
* A section block with a workflow button whose trigger carries customizable input parameters.
17+
*/
18+
public static SectionBlock example01() {
19+
SectionBlock block = Blocks.section(s -> s.text(
20+
BlockCompositions.markdownText("A message *with some bold text* and _some italicized text_."))
21+
.accessory(BlockElements.workflowButton(w -> w.text(BlockCompositions.plainText("Run Workflow"))
22+
.actionId("workflowbutton123")
23+
.workflow(WorkflowObject.builder()
24+
.trigger(WorkflowObject.Trigger.builder()
25+
.url("https://slack.com/shortcuts/Ft0123ABC456/xyz...zyx")
26+
.customizableInputParameters(List.of(
27+
WorkflowObject.Trigger.InputParameter.builder()
28+
.name("input_parameter_a")
29+
.value("Value for input param A")
30+
.build(),
31+
WorkflowObject.Trigger.InputParameter.builder()
32+
.name("input_parameter_b")
33+
.value("Value for input param B")
34+
.build()))
35+
.build())
36+
.build()))));
37+
return block;
38+
}
39+
}

0 commit comments

Comments
 (0)