Skip to content

Commit db74fe5

Browse files
srtaalejzimeg
andauthored
feat(model): add TaskCardBlock and UrlSourceElement (#1638)
Co-authored-by: Eden Zimbelman <eden.zimbelman@salesforce.com>
1 parent e30ba9d commit db74fe5

6 files changed

Lines changed: 164 additions & 22 deletions

File tree

‎slack-api-model/src/main/java/com/slack/api/model/block/Blocks.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,10 @@ public static CarouselBlock carousel(ModelConfigurator<CarouselBlock.CarouselBlo
147147
return configurator.configure(CarouselBlock.builder()).build();
148148
}
149149

150+
// TaskCardBlock
151+
152+
public static TaskCardBlock taskCard(ModelConfigurator<TaskCardBlock.TaskCardBlockBuilder> configurator) {
153+
return configurator.configure(TaskCardBlock.builder()).build();
154+
}
155+
150156
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.slack.api.model.block;
2+
3+
import com.slack.api.model.block.composition.SlackIconObject;
4+
import com.slack.api.model.block.element.UrlSourceElement;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
import java.util.List;
11+
12+
/**
13+
* https://docs.slack.dev/reference/block-kit/blocks/task-card-block
14+
*/
15+
@Data
16+
@Builder
17+
@NoArgsConstructor
18+
@AllArgsConstructor
19+
public class TaskCardBlock implements LayoutBlock {
20+
public static final String TYPE = "task_card";
21+
private final String type = TYPE;
22+
23+
private String taskId;
24+
private String title;
25+
private String status;
26+
private RichTextBlock details;
27+
private RichTextBlock output;
28+
private List<UrlSourceElement> sources;
29+
private String blockId;
30+
private SlackIconObject icon;
31+
private Boolean hideTitle;
32+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.slack.api.model.block.element;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
/**
9+
* https://docs.slack.dev/reference/block-kit/block-elements/url-source-element
10+
*/
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class UrlSourceElement {
16+
public static final String TYPE = "url";
17+
private final String type = TYPE;
18+
19+
private String url;
20+
private String text;
21+
}

‎slack-api-model/src/main/java/com/slack/api/util/json/GsonLayoutBlockFactory.java‎

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,40 +33,42 @@ public LayoutBlock deserialize(JsonElement json, Type typeOfT, JsonDeserializati
3333

3434
private Class<? extends LayoutBlock> getLayoutClassInstance(String typeName) {
3535
switch (typeName) {
36-
case SectionBlock.TYPE:
37-
return SectionBlock.class;
38-
case DividerBlock.TYPE:
39-
return DividerBlock.class;
40-
case ImageBlock.TYPE:
41-
return ImageBlock.class;
42-
case ContextBlock.TYPE:
43-
return ContextBlock.class;
44-
case ContextActionsBlock.TYPE:
45-
return ContextActionsBlock.class;
46-
case CallBlock.TYPE:
47-
return CallBlock.class;
4836
case ActionsBlock.TYPE:
4937
return ActionsBlock.class;
38+
case AlertBlock.TYPE:
39+
return AlertBlock.class;
40+
case CallBlock.TYPE:
41+
return CallBlock.class;
42+
case CardBlock.TYPE:
43+
return CardBlock.class;
44+
case CarouselBlock.TYPE:
45+
return CarouselBlock.class;
46+
case ContextActionsBlock.TYPE:
47+
return ContextActionsBlock.class;
48+
case ContextBlock.TYPE:
49+
return ContextBlock.class;
50+
case DividerBlock.TYPE:
51+
return DividerBlock.class;
5052
case FileBlock.TYPE:
5153
return FileBlock.class;
52-
case InputBlock.TYPE:
53-
return InputBlock.class;
5454
case HeaderBlock.TYPE:
5555
return HeaderBlock.class;
56+
case ImageBlock.TYPE:
57+
return ImageBlock.class;
58+
case InputBlock.TYPE:
59+
return InputBlock.class;
5660
case MarkdownBlock.TYPE:
5761
return MarkdownBlock.class;
58-
case VideoBlock.TYPE:
59-
return VideoBlock.class;
6062
case RichTextBlock.TYPE:
6163
return RichTextBlock.class;
64+
case SectionBlock.TYPE:
65+
return SectionBlock.class;
6266
case ShareShortcutBlock.TYPE:
6367
return ShareShortcutBlock.class;
64-
case AlertBlock.TYPE:
65-
return AlertBlock.class;
66-
case CardBlock.TYPE:
67-
return CardBlock.class;
68-
case CarouselBlock.TYPE:
69-
return CarouselBlock.class;
68+
case TaskCardBlock.TYPE:
69+
return TaskCardBlock.class;
70+
case VideoBlock.TYPE:
71+
return VideoBlock.class;
7072
default:
7173
if (failOnUnknownProperties) {
7274
throw new JsonParseException("Unsupported layout block type: " + typeName);

‎slack-api-model/src/test/java/test_locally/api/model/block/BlockKitTest.java‎

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2202,4 +2202,80 @@ public void buildCarouselBlock() {
22022202
assertThat(parsedCarousel.getElements().get(0).getBlockId(), is("card1"));
22032203
assertThat(parsedCarousel.getElements().get(0).getActions().size(), is(1));
22042204
}
2205+
2206+
@Test
2207+
public void parseTaskCardBlock() {
2208+
String json = "{\n" +
2209+
" \"blocks\": [\n" +
2210+
" {\n" +
2211+
" \"type\": \"task_card\",\n" +
2212+
" \"task_id\": \"task_1\",\n" +
2213+
" \"title\": \"Fetching weather data\",\n" +
2214+
" \"status\": \"in_progress\",\n" +
2215+
" \"output\": {\n" +
2216+
" \"type\": \"rich_text\",\n" +
2217+
" \"elements\": [\n" +
2218+
" {\n" +
2219+
" \"type\": \"rich_text_section\",\n" +
2220+
" \"elements\": [\n" +
2221+
" {\n" +
2222+
" \"type\": \"text\",\n" +
2223+
" \"text\": \"Found weather data for Chicago from 2 sources\"\n" +
2224+
" }\n" +
2225+
" ]\n" +
2226+
" }\n" +
2227+
" ]\n" +
2228+
" },\n" +
2229+
" \"sources\": [\n" +
2230+
" {\n" +
2231+
" \"type\": \"url\",\n" +
2232+
" \"url\": \"https://weather.com/\",\n" +
2233+
" \"text\": \"weather.com\"\n" +
2234+
" },\n" +
2235+
" {\n" +
2236+
" \"type\": \"url\",\n" +
2237+
" \"url\": \"https://www.accuweather.com/\",\n" +
2238+
" \"text\": \"accuweather.com\"\n" +
2239+
" }\n" +
2240+
" ]\n" +
2241+
" }\n" +
2242+
" ]\n" +
2243+
"}";
2244+
Gson gson = GsonFactory.createSnakeCase();
2245+
Message message = gson.fromJson(json, Message.class);
2246+
assertThat(message, is(notNullValue()));
2247+
assertThat(message.getBlocks().size(), is(1));
2248+
2249+
TaskCardBlock taskCard = (TaskCardBlock) message.getBlocks().get(0);
2250+
assertThat(taskCard.getType(), is("task_card"));
2251+
assertThat(taskCard.getTaskId(), is("task_1"));
2252+
assertThat(taskCard.getTitle(), is("Fetching weather data"));
2253+
assertThat(taskCard.getStatus(), is("in_progress"));
2254+
2255+
assertThat(taskCard.getOutput(), is(notNullValue()));
2256+
assertThat(taskCard.getOutput().getType(), is("rich_text"));
2257+
2258+
assertThat(taskCard.getSources().size(), is(2));
2259+
assertThat(taskCard.getSources().get(0).getType(), is("url"));
2260+
assertThat(taskCard.getSources().get(0).getUrl(), is("https://weather.com/"));
2261+
assertThat(taskCard.getSources().get(0).getText(), is("weather.com"));
2262+
assertThat(taskCard.getSources().get(1).getUrl(), is("https://www.accuweather.com/"));
2263+
assertThat(taskCard.getSources().get(1).getText(), is("accuweather.com"));
2264+
}
2265+
2266+
@Test
2267+
public void buildTaskCardBlock() {
2268+
TaskCardBlock taskCard = Blocks.taskCard(t -> t
2269+
.taskId("task_42")
2270+
.title("Processing data")
2271+
.status("in_progress")
2272+
.sources(Arrays.asList(
2273+
UrlSourceElement.builder().url("https://example.com").text("example").build())));
2274+
assertThat(taskCard, is(notNullValue()));
2275+
assertThat(taskCard.getType(), is("task_card"));
2276+
assertThat(taskCard.getTaskId(), is("task_42"));
2277+
assertThat(taskCard.getTitle(), is("Processing data"));
2278+
assertThat(taskCard.getStatus(), is("in_progress"));
2279+
assertThat(taskCard.getSources().size(), is(1));
2280+
}
22052281
}

‎slack-api-model/src/test/java/test_locally/api/model/block/BlocksTest.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,11 @@ public void testRichText() {
153153
), is(notNullValue()));
154154
}
155155

156+
@Test
157+
public void testTaskCard() {
158+
assertThat(taskCard(t -> t.taskId("task_1").title("Do thing").status("complete")), is(notNullValue()));
159+
}
160+
156161
@Test
157162
public void testDateTimePicker() {
158163
assertThat(datetimePicker(h -> h.actionId("block-id").initialDateTime(12345)), is(notNullValue()));

0 commit comments

Comments
 (0)