Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions block-kit/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
58 changes: 58 additions & 0 deletions block-kit/src/main/java/compositionobjects/Option.java
Original file line number Diff line number Diff line change
@@ -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<LayoutBlock> example02() {
List<LayoutBlock> blocks = List.of(
Blocks.section(s -> s.text(markdownText(":mag: Search results for *Cata*"))),
Blocks.divider(),
Blocks.section(s -> s.text(
markdownText(
"*<fakeLink.toYourApp.com|Use Case Catalogue>*\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;
}
}
56 changes: 56 additions & 0 deletions block-kit/src/main/java/compositionobjects/OptionGroup.java
Original file line number Diff line number Diff line change
@@ -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<LayoutBlock> example01() {
List<LayoutBlock> blocks = List.of(
Blocks.section(s -> s.text(markdownText(":mag: Search results for *Cata*"))),
Blocks.divider(),
Blocks.section(s -> s.text(
markdownText(
"*<fakeLink.toYourApp.com|Use Case Catalogue>*\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;
}
}
37 changes: 37 additions & 0 deletions block-kit/src/main/java/compositionobjects/SlackFile.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
21 changes: 21 additions & 0 deletions block-kit/src/main/java/compositionobjects/Text.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
41 changes: 41 additions & 0 deletions block-kit/src/main/java/compositionobjects/Trigger.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
Loading