1use serde::{Deserialize, Serialize};
2
3use crate::composition::{self, Text};
4use crate::util::Style;
5
6#[derive(Debug, Deserialize, Serialize)]
7#[serde(rename_all = "snake_case", tag = "type")]
8pub enum Element {
9 Button(Button),
10 Checkboxes(CheckboxGroup),
11 #[serde(rename = "datepicker")]
12 DatePicker(DatePicker),
13 Image(Image),
14 MultiStaticSelect(MultiStaticSelect),
15 MultiExternalSelect(MultiExternalSelect),
16 MultiUsersSelect(MultiUsersSelect),
17 MultiConversationsSelect(MultiConversationsSelect),
18 MultiChannelsSelect(MultiChannelsSelect),
19 Overflow(OverflowMenu),
20 PlainTextInput(PlainTextInput),
21 RadioButtons(RadioButtonGroup),
22 StaticSelect(StaticSelect),
23 ExternalSelect(ExternalSelect),
24 UsersSelect(UsersSelect),
25 ConversationsSelect(ConversationsSelect),
26 ChannelsSelect(ChannelsSelect),
27 #[serde(rename = "timepicker")]
28 TimePicker(TimePicker),
29}
30
31#[derive(Debug, Deserialize, Serialize, Default)]
32pub struct Button {
33 pub text: Text,
34 pub action_id: String,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub url: Option<String>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub value: Option<String>,
41
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub style: Option<Style>,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub confirm: Option<composition::ConfirmationDialog>,
47}
48
49#[derive(Debug, Deserialize, Serialize, Default)]
50pub struct CheckboxGroup {
51 pub action_id: String,
52 pub options: Vec<composition::Option>,
53 pub initial_options: Option<Vec<composition::Option>>,
54 pub confirm: Option<composition::ConfirmationDialog>,
55}
56
57#[derive(Debug, Deserialize, Serialize, Default)]
58pub struct DatePicker {
59 pub action_id: String,
60 pub placeholder: Option<Text>,
61 pub initial_date: Option<String>,
62 pub confirm: Option<composition::ConfirmationDialog>,
63}
64
65#[derive(Debug, Deserialize, Serialize)]
66pub struct Image {
67 pub image_url: String,
68 pub alt_text: String,
69}
70
71#[derive(Debug, Deserialize, Serialize, Default)]
72pub struct MultiStaticSelect {
73 pub placeholder: Text,
74 pub action_id: String,
75 pub options: Vec<composition::Option>,
76
77 #[serde(default, skip_serializing_if = "Vec::is_empty")]
78 pub option_groups: Vec<composition::OptionGroup>,
79
80 #[serde(default, skip_serializing_if = "Vec::is_empty")]
81 pub initial_options: Vec<composition::Option>,
82
83 #[serde(default, skip_serializing_if = "Option::is_none")]
84 pub confirm: Option<composition::ConfirmationDialog>,
85
86 #[serde(default, skip_serializing_if = "Option::is_none")]
87 pub max_selected_items: Option<usize>,
88}
89
90#[derive(Debug, Deserialize, Serialize, Default)]
91pub struct MultiExternalSelect {
92 pub placeholder: Text,
93 pub action_id: String,
94
95 #[serde(default, skip_serializing_if = "Option::is_none")]
96 pub min_query_length: Option<usize>,
97
98 #[serde(default, skip_serializing_if = "Vec::is_empty")]
99 pub initial_options: Vec<composition::Option>,
100
101 #[serde(default, skip_serializing_if = "Option::is_none")]
102 pub confirm: Option<composition::ConfirmationDialog>,
103
104 pub max_selected_items: Option<usize>,
105}
106
107#[derive(Debug, Deserialize, Serialize, Default)]
108pub struct MultiUsersSelect {
109 pub placeholder: Text,
110 pub action_id: String,
111
112 #[serde(default, skip_serializing_if = "Vec::is_empty")]
113 pub initial_users: Vec<String>,
114
115 #[serde(default, skip_serializing_if = "Option::is_none")]
116 pub confirm: Option<composition::ConfirmationDialog>,
117
118 #[serde(default, skip_serializing_if = "Option::is_none")]
119 pub max_selected_items: Option<usize>,
120}
121
122#[derive(Debug, Deserialize, Serialize, Default)]
123pub struct MultiConversationsSelect {
124 pub placeholder: Text,
125 pub action_id: String,
126
127 #[serde(default, skip_serializing_if = "Vec::is_empty")]
128 pub initial_conversations: Vec<String>,
129
130 #[serde(default)]
131 pub default_to_current_conversation: bool,
132
133 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub confirm: Option<composition::ConfirmationDialog>,
135
136 #[serde(default, skip_serializing_if = "Option::is_none")]
137 pub max_selected_items: Option<usize>,
138
139 #[serde(default, skip_serializing_if = "Option::is_none")]
140 pub filter: Option<composition::FilterAction>,
141}
142
143#[derive(Debug, Deserialize, Serialize, Default)]
144pub struct MultiChannelsSelect {
145 pub placeholder: Text,
146 pub action_id: String,
147
148 #[serde(default, skip_serializing_if = "Vec::is_empty")]
149 pub initial_channels: Vec<String>,
150
151 #[serde(default, skip_serializing_if = "Option::is_none")]
152 pub confirm: Option<composition::ConfirmationDialog>,
153
154 #[serde(default, skip_serializing_if = "Option::is_none")]
155 pub max_selected_items: Option<usize>,
156}
157
158#[derive(Debug, Deserialize, Serialize, Default)]
159pub struct OverflowMenu {
160 pub action_id: String,
161 pub options: Vec<composition::Option>,
162
163 #[serde(default, skip_serializing_if = "Option::is_none")]
164 pub confirm: Option<composition::ConfirmationDialog>,
165}
166
167#[derive(Debug, Deserialize, Serialize, Default)]
168pub struct PlainTextInput {
169 pub action_id: String,
170
171 #[serde(default, skip_serializing_if = "Option::is_none")]
172 pub placeholder: Option<Text>,
173
174 #[serde(default, skip_serializing_if = "Option::is_none")]
175 pub initial_value: Option<String>,
176
177 #[serde(default)]
178 pub multiline: bool,
179
180 #[serde(default, skip_serializing_if = "Option::is_none")]
181 pub min_length: Option<usize>,
182
183 #[serde(default, skip_serializing_if = "Option::is_none")]
184 pub max_length: Option<usize>,
185
186 #[serde(default, skip_serializing_if = "Option::is_none")]
187 pub dispatch_action_config: Option<composition::DispatchAction>,
188}
189
190#[derive(Debug, Deserialize, Serialize, Default)]
191pub struct RadioButtonGroup {
192 action_id: String,
193 options: Vec<composition::Option>,
194 initial_option: Option<composition::Option>,
195 confirm: Option<composition::ConfirmationDialog>,
196}
197
198#[derive(Debug, Deserialize, Serialize, Default)]
199pub struct StaticSelect {
200 pub placeholder: Text,
201 pub action_id: String,
202 pub options: Vec<composition::Option>,
203
204 #[serde(default)]
205 pub option_groups: Vec<composition::OptionGroup>,
206
207 #[serde(default, skip_serializing_if = "Option::is_none")]
208 pub initial_option: Option<composition::Option>,
209
210 #[serde(default, skip_serializing_if = "Option::is_none")]
211 pub confirm: Option<composition::ConfirmationDialog>,
212}
213
214#[derive(Debug, Deserialize, Serialize, Default)]
215pub struct ExternalSelect {
216 pub placeholder: Text,
217 pub action_id: String,
218
219 #[serde(default, skip_serializing_if = "Option::is_none")]
220 pub initial_option: Option<composition::Option>,
221
222 #[serde(default, skip_serializing_if = "Option::is_none")]
223 pub min_query_length: Option<usize>,
224
225 #[serde(default, skip_serializing_if = "Option::is_none")]
226 pub confirm: Option<composition::ConfirmationDialog>,
227}
228
229#[derive(Debug, Deserialize, Serialize, Default)]
230pub struct UsersSelect {
231 pub placeholder: Text,
232 pub action_id: String,
233
234 #[serde(default, skip_serializing_if = "Option::is_none")]
235 pub initial_user: Option<String>,
236
237 #[serde(default, skip_serializing_if = "Option::is_none")]
238 pub confirm: Option<composition::ConfirmationDialog>,
239}
240
241#[derive(Debug, Deserialize, Serialize, Default)]
242pub struct ConversationsSelect {
243 pub placeholder: Text,
244 pub action_id: String,
245
246 #[serde(default, skip_serializing_if = "Option::is_none")]
247 pub initial_conversation: Option<String>,
248
249 #[serde(default)]
250 pub default_to_current_conversation: bool,
251
252 #[serde(default, skip_serializing_if = "Option::is_none")]
253 pub confirm: Option<composition::ConfirmationDialog>,
254
255 #[serde(default)]
256 pub response_url_enabled: bool,
257
258 #[serde(default, skip_serializing_if = "Option::is_none")]
259 pub filter: Option<composition::FilterAction>,
260}
261
262#[derive(Debug, Deserialize, Serialize, Default)]
263pub struct ChannelsSelect {
264 pub placeholder: Text,
265 pub action_id: String,
266
267 #[serde(default, skip_serializing_if = "Option::is_none")]
268 pub initial_channel: Option<String>,
269
270 #[serde(default, skip_serializing_if = "Option::is_none")]
271 pub confirm: Option<composition::ConfirmationDialog>,
272
273 #[serde(default)]
274 pub response_url_enabled: bool,
275}
276
277#[derive(Debug, Deserialize, Serialize, Default)]
278pub struct TimePicker {
279 #[serde(default, skip_serializing_if = "Option::is_none")]
280 pub placeholder: Option<Text>,
281
282 pub action_id: String,
283
284 #[serde(default, skip_serializing_if = "Option::is_none")]
285 pub initial_time: Option<String>,
286
287 #[serde(default, skip_serializing_if = "Option::is_none")]
288 pub confirm: Option<composition::ConfirmationDialog>,
289}