@frogbotai/piece-slack 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/actions.d.ts +2 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +285 -193
- package/dist/actions.js.map +1 -1
- package/dist/client.js +47 -35
- package/dist/client.js.map +1 -1
- package/dist/config.js +17 -5
- package/dist/config.js.map +1 -1
- package/dist/define.js +1 -0
- package/dist/define.js.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +25 -15
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +45 -39
- package/dist/index.js.map +1 -1
- package/dist/options.js +36 -21
- package/dist/options.js.map +1 -1
- package/dist/questions/blocks.js +148 -74
- package/dist/questions/blocks.js.map +1 -1
- package/dist/questions/index.js +2 -1
- package/dist/questions/index.js.map +1 -1
- package/dist/questions/notify.js +19 -13
- package/dist/questions/notify.js.map +1 -1
- package/dist/questions/parse.js +110 -59
- package/dist/questions/parse.js.map +1 -1
- package/dist/questions/render.js +16 -7
- package/dist/questions/render.js.map +1 -1
- package/dist/questions/settled.js +9 -3
- package/dist/questions/settled.js.map +1 -1
- package/dist/questions/slackThread.js +12 -6
- package/dist/questions/slackThread.js.map +1 -1
- package/dist/questions/state.js +18 -5
- package/dist/questions/state.js.map +1 -1
- package/dist/questions/updated.js +32 -24
- package/dist/questions/updated.js.map +1 -1
- package/dist/triggers.js +150 -126
- package/dist/triggers.js.map +1 -1
- package/dist/webhook.js +28 -43
- package/dist/webhook.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,52 +1,47 @@
|
|
|
1
1
|
import { createSlackAdapter } from '@chat-adapter/slack';
|
|
2
|
-
import { definePiece
|
|
2
|
+
import { definePiece } from 'frogbot/pieces';
|
|
3
3
|
import { slackActions } from './actions.js';
|
|
4
4
|
import { createSlackClient } from './client.js';
|
|
5
5
|
import { slackAuth, slackOptions, slackScopes } from './config.js';
|
|
6
6
|
import { slackQuestions } from './questions/index.js';
|
|
7
7
|
import { slackTriggers } from './triggers.js';
|
|
8
8
|
import { parseSlackWebhook, slackHandshake, verifySlackWebhook } from './webhook.js';
|
|
9
|
-
export const slackActionNames = slackActions.map((action)
|
|
10
|
-
export const slackTriggerNames = slackTriggers.map((trigger)
|
|
9
|
+
export const slackActionNames = slackActions.map((action)=>action.slug);
|
|
10
|
+
export const slackTriggerNames = slackTriggers.map((trigger)=>trigger.slug);
|
|
11
11
|
export { slackScopes };
|
|
12
12
|
function userToken(tokens) {
|
|
13
13
|
const user = tokens.authed_user;
|
|
14
|
-
return user &&
|
|
15
|
-
typeof user === 'object' &&
|
|
16
|
-
'access_token' in user &&
|
|
17
|
-
typeof user.access_token === 'string'
|
|
18
|
-
? user.access_token
|
|
19
|
-
: undefined;
|
|
14
|
+
return user && typeof user === 'object' && 'access_token' in user && typeof user.access_token === 'string' ? user.access_token : undefined;
|
|
20
15
|
}
|
|
21
16
|
function teamId(tokens) {
|
|
22
17
|
const team = tokens.team;
|
|
23
|
-
return team && typeof team === 'object' && 'id' in team && typeof team.id === 'string'
|
|
24
|
-
? team.id
|
|
25
|
-
: undefined;
|
|
18
|
+
return team && typeof team === 'object' && 'id' in team && typeof team.id === 'string' ? team.id : undefined;
|
|
26
19
|
}
|
|
27
|
-
const slackAccount = async ({ client })
|
|
20
|
+
const slackAccount = async ({ client })=>{
|
|
28
21
|
const account = await client.request('auth.test');
|
|
29
22
|
const id = typeof account.team_id === 'string' ? account.team_id : '';
|
|
30
23
|
const label = typeof account.team === 'string' ? account.team : id;
|
|
31
|
-
if (!id)
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
if (!id) throw new Error('Slack auth.test did not return a workspace ID.');
|
|
25
|
+
return {
|
|
26
|
+
id,
|
|
27
|
+
label
|
|
28
|
+
};
|
|
34
29
|
};
|
|
35
30
|
const slackWebhook = {
|
|
36
31
|
verify: verifySlackWebhook,
|
|
37
|
-
async handshake({ req }) {
|
|
32
|
+
async handshake ({ req }) {
|
|
38
33
|
return slackHandshake(req);
|
|
39
34
|
},
|
|
40
|
-
parse({ req }) {
|
|
35
|
+
parse ({ req }) {
|
|
41
36
|
return parseSlackWebhook(req);
|
|
42
|
-
}
|
|
37
|
+
}
|
|
43
38
|
};
|
|
44
39
|
export const createSlack = definePiece({
|
|
45
40
|
slug: 'slack',
|
|
46
41
|
label: 'Slack',
|
|
47
42
|
admin: {
|
|
48
43
|
description: 'Manage Slack messages, files, channels, users, groups, and workspace events',
|
|
49
|
-
group: 'Communication'
|
|
44
|
+
group: 'Communication'
|
|
50
45
|
},
|
|
51
46
|
auth: slackAuth,
|
|
52
47
|
options: slackOptions,
|
|
@@ -54,50 +49,61 @@ export const createSlack = definePiece({
|
|
|
54
49
|
oauth: {
|
|
55
50
|
authorizationUrl: 'https://slack.com/oauth/v2/authorize',
|
|
56
51
|
tokenUrl: 'https://slack.com/api/oauth.v2.access',
|
|
57
|
-
scopes: [
|
|
52
|
+
scopes: [
|
|
53
|
+
...slackScopes
|
|
54
|
+
],
|
|
58
55
|
params: {
|
|
59
|
-
user_scope: 'search:read,users.profile:write,reactions:read,reactions:write,im:history,stars:read,channels:write,groups:write,im:write,mpim:write,channels:write.invites,groups:write.invites,channels:history,groups:history,chat:write,users:read,usergroups:write'
|
|
56
|
+
user_scope: 'search:read,users.profile:write,reactions:read,reactions:write,im:history,stars:read,channels:write,groups:write,im:write,mpim:write,channels:write.invites,groups:write.invites,channels:history,groups:history,chat:write,users:read,usergroups:write'
|
|
60
57
|
},
|
|
61
|
-
toAuth: ({ tokens })
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
account: slackAccount
|
|
58
|
+
toAuth: ({ tokens })=>({
|
|
59
|
+
botToken: tokens.access_token ?? '',
|
|
60
|
+
userToken: userToken(tokens),
|
|
61
|
+
teamId: teamId(tokens)
|
|
62
|
+
}),
|
|
63
|
+
account: slackAccount
|
|
67
64
|
},
|
|
68
65
|
webhook: slackWebhook,
|
|
69
66
|
channel: {
|
|
70
|
-
adapter({ auth, options }) {
|
|
67
|
+
adapter ({ auth, options }) {
|
|
71
68
|
if (!options.signingSecret) {
|
|
72
69
|
throw new Error('Slack channels require a signingSecret option for webhook verification.');
|
|
73
70
|
}
|
|
74
71
|
return createSlackAdapter({
|
|
75
72
|
botToken: auth.botToken,
|
|
76
|
-
signingSecret: options.signingSecret
|
|
73
|
+
signingSecret: options.signingSecret
|
|
77
74
|
});
|
|
78
75
|
},
|
|
79
|
-
async identity({ author, client, req }) {
|
|
80
|
-
const response = await client.request('users.info', {
|
|
76
|
+
async identity ({ author, client, req }) {
|
|
77
|
+
const response = await client.request('users.info', {
|
|
78
|
+
user: author.userId
|
|
79
|
+
});
|
|
81
80
|
const user = response.user;
|
|
82
81
|
const profile = user && typeof user === 'object' && 'profile' in user ? user.profile : undefined;
|
|
83
82
|
const email = profile && typeof profile === 'object' && 'email' in profile ? profile.email : undefined;
|
|
84
|
-
if (typeof email !== 'string' || !email.trim())
|
|
85
|
-
return null;
|
|
83
|
+
if (typeof email !== 'string' || !email.trim()) return null;
|
|
86
84
|
const config = await req.frogbot.config;
|
|
87
85
|
const payloadConfig = await config._internal.payloadConfig;
|
|
88
86
|
const result = await req.frogbot.find({
|
|
89
87
|
collection: payloadConfig.admin.user,
|
|
90
|
-
where: {
|
|
88
|
+
where: {
|
|
89
|
+
email: {
|
|
90
|
+
equals: email.trim().toLowerCase()
|
|
91
|
+
}
|
|
92
|
+
},
|
|
91
93
|
limit: 1,
|
|
92
94
|
overrideAccess: true,
|
|
93
|
-
req
|
|
95
|
+
req
|
|
94
96
|
});
|
|
95
97
|
const match = result.docs[0];
|
|
96
|
-
return match ? {
|
|
98
|
+
return match ? {
|
|
99
|
+
...match,
|
|
100
|
+
collection: payloadConfig.admin.user
|
|
101
|
+
} : null;
|
|
97
102
|
},
|
|
98
|
-
questions: slackQuestions
|
|
103
|
+
questions: slackQuestions
|
|
99
104
|
},
|
|
100
105
|
actions: slackActions,
|
|
101
|
-
triggers: slackTriggers
|
|
106
|
+
triggers: slackTriggers
|
|
102
107
|
});
|
|
108
|
+
|
|
103
109
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["createSlackAdapter","definePiece","slackActions","createSlackClient","slackAuth","slackOptions","slackScopes","slackQuestions","slackTriggers","parseSlackWebhook","slackHandshake","verifySlackWebhook","slackActionNames","map","action","slug","slackTriggerNames","trigger","userToken","tokens","user","authed_user","access_token","undefined","teamId","team","id","slackAccount","client","account","request","team_id","label","Error","slackWebhook","verify","handshake","req","parse","createSlack","admin","description","group","auth","options","oauth","authorizationUrl","tokenUrl","scopes","params","user_scope","toAuth","botToken","webhook","channel","adapter","signingSecret","identity","author","response","userId","profile","email","trim","config","frogbot","payloadConfig","_internal","result","find","collection","where","equals","toLowerCase","limit","overrideAccess","match","docs","questions","actions","triggers"],"mappings":"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","file":"index.js"}
|
package/dist/options.js
CHANGED
|
@@ -4,47 +4,62 @@ function text(value) {
|
|
|
4
4
|
export async function channelOptions({ client }) {
|
|
5
5
|
const channels = await client.paginate({
|
|
6
6
|
path: 'conversations.list',
|
|
7
|
-
body: {
|
|
7
|
+
body: {
|
|
8
|
+
types: 'public_channel,private_channel',
|
|
9
|
+
exclude_archived: true
|
|
10
|
+
},
|
|
8
11
|
item: 'channels',
|
|
9
|
-
limit: 2000
|
|
12
|
+
limit: 2000
|
|
10
13
|
});
|
|
11
|
-
return channels.flatMap((channel)
|
|
12
|
-
if (!channel || typeof channel !== 'object')
|
|
13
|
-
|
|
14
|
-
if (!('id' in channel) || !('name' in channel))
|
|
15
|
-
return [];
|
|
14
|
+
return channels.flatMap((channel)=>{
|
|
15
|
+
if (!channel || typeof channel !== 'object') return [];
|
|
16
|
+
if (!('id' in channel) || !('name' in channel)) return [];
|
|
16
17
|
const value = text(channel.id);
|
|
17
18
|
const label = text(channel.name);
|
|
18
|
-
return value && label ? [
|
|
19
|
+
return value && label ? [
|
|
20
|
+
{
|
|
21
|
+
label,
|
|
22
|
+
value
|
|
23
|
+
}
|
|
24
|
+
] : [];
|
|
19
25
|
});
|
|
20
26
|
}
|
|
21
27
|
export async function userOptions({ client }) {
|
|
22
28
|
const users = await client.paginate({
|
|
23
29
|
path: 'users.list',
|
|
24
30
|
item: 'members',
|
|
25
|
-
body: {
|
|
31
|
+
body: {
|
|
32
|
+
limit: 1000
|
|
33
|
+
}
|
|
26
34
|
});
|
|
27
|
-
return users.flatMap((user)
|
|
28
|
-
if (!user || typeof user !== 'object' || !('id' in user) || !('name' in user))
|
|
29
|
-
|
|
30
|
-
if ('deleted' in user && user.deleted === true)
|
|
31
|
-
return [];
|
|
35
|
+
return users.flatMap((user)=>{
|
|
36
|
+
if (!user || typeof user !== 'object' || !('id' in user) || !('name' in user)) return [];
|
|
37
|
+
if ('deleted' in user && user.deleted === true) return [];
|
|
32
38
|
const value = text(user.id);
|
|
33
39
|
const label = text(user.name);
|
|
34
|
-
return value && label ? [
|
|
40
|
+
return value && label ? [
|
|
41
|
+
{
|
|
42
|
+
label,
|
|
43
|
+
value
|
|
44
|
+
}
|
|
45
|
+
] : [];
|
|
35
46
|
});
|
|
36
47
|
}
|
|
37
48
|
export async function userGroupOptions({ client }) {
|
|
38
49
|
const response = await client.request('usergroups.list');
|
|
39
50
|
const groups = Array.isArray(response.usergroups) ? response.usergroups : [];
|
|
40
|
-
return groups.flatMap((group)
|
|
41
|
-
if (!group || typeof group !== 'object' || !('id' in group))
|
|
42
|
-
|
|
43
|
-
if ('date_delete' in group && Boolean(group.date_delete))
|
|
44
|
-
return [];
|
|
51
|
+
return groups.flatMap((group)=>{
|
|
52
|
+
if (!group || typeof group !== 'object' || !('id' in group)) return [];
|
|
53
|
+
if ('date_delete' in group && Boolean(group.date_delete)) return [];
|
|
45
54
|
const value = text(group.id);
|
|
46
55
|
const label = 'handle' in group ? text(group.handle) : 'name' in group ? text(group.name) : '';
|
|
47
|
-
return value && label ? [
|
|
56
|
+
return value && label ? [
|
|
57
|
+
{
|
|
58
|
+
label,
|
|
59
|
+
value
|
|
60
|
+
}
|
|
61
|
+
] : [];
|
|
48
62
|
});
|
|
49
63
|
}
|
|
64
|
+
|
|
50
65
|
//# sourceMappingURL=options.js.map
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/options.ts"],"names":["text","value","channelOptions","client","channels","paginate","path","body","types","exclude_archived","item","limit","flatMap","channel","id","label","name","userOptions","users","user","deleted","userGroupOptions","response","request","groups","Array","isArray","usergroups","group","Boolean","date_delete","handle"],"mappings":"AAIA,SAASA,KAAKC,KAAc;IAC1B,OAAO,OAAOA,UAAU,WAAWA,QAAQ;AAC7C;AAEA,OAAO,eAAeC,eAAe,EAAEC,MAAM,EAA2B;IACtE,MAAMC,WAAW,MAAMD,OAAOE,QAAQ,CAAC;QACrCC,MAAM;QACNC,MAAM;YAAEC,OAAO;YAAkCC,kBAAkB;QAAK;QACxEC,MAAM;QACNC,OAAO;IACT;IAEA,OAAOP,SAASQ,OAAO,CAAC,CAACC;QACvB,IAAI,CAACA,WAAW,OAAOA,YAAY,UAAU,OAAO,EAAE;QACtD,IAAI,CAAE,CAAA,QAAQA,OAAM,KAAM,CAAE,CAAA,UAAUA,OAAM,GAAI,OAAO,EAAE;QAEzD,MAAMZ,QAAQD,KAAKa,QAAQC,EAAE;QAC7B,MAAMC,QAAQf,KAAKa,QAAQG,IAAI;QAE/B,OAAOf,SAASc,QAAQ;YAAC;gBAAEA;gBAAOd;YAAM;SAAE,GAAG,EAAE;IACjD;AACF;AAEA,OAAO,eAAegB,YAAY,EAAEd,MAAM,EAA2B;IACnE,MAAMe,QAAQ,MAAMf,OAAOE,QAAQ,CAAC;QAClCC,MAAM;QACNI,MAAM;QACNH,MAAM;YAAEI,OAAO;QAAK;IACtB;IAEA,OAAOO,MAAMN,OAAO,CAAC,CAACO;QACpB,IAAI,CAACA,QAAQ,OAAOA,SAAS,YAAY,CAAE,CAAA,QAAQA,IAAG,KAAM,CAAE,CAAA,UAAUA,IAAG,GAAI,OAAO,EAAE;QACxF,IAAI,aAAaA,QAAQA,KAAKC,OAAO,KAAK,MAAM,OAAO,EAAE;QAEzD,MAAMnB,QAAQD,KAAKmB,KAAKL,EAAE;QAC1B,MAAMC,QAAQf,KAAKmB,KAAKH,IAAI;QAE5B,OAAOf,SAASc,QAAQ;YAAC;gBAAEA;gBAAOd;YAAM;SAAE,GAAG,EAAE;IACjD;AACF;AAEA,OAAO,eAAeoB,iBAAiB,EAAElB,MAAM,EAA2B;IACxE,MAAMmB,WAAW,MAAMnB,OAAOoB,OAAO,CAAC;IACtC,MAAMC,SAASC,MAAMC,OAAO,CAACJ,SAASK,UAAU,IAAIL,SAASK,UAAU,GAAG,EAAE;IAE5E,OAAOH,OAAOZ,OAAO,CAAC,CAACgB;QACrB,IAAI,CAACA,SAAS,OAAOA,UAAU,YAAY,CAAE,CAAA,QAAQA,KAAI,GAAI,OAAO,EAAE;QACtE,IAAI,iBAAiBA,SAASC,QAAQD,MAAME,WAAW,GAAG,OAAO,EAAE;QAEnE,MAAM7B,QAAQD,KAAK4B,MAAMd,EAAE;QAC3B,MAAMC,QAAQ,YAAYa,QAAQ5B,KAAK4B,MAAMG,MAAM,IAAI,UAAUH,QAAQ5B,KAAK4B,MAAMZ,IAAI,IAAI;QAE5F,OAAOf,SAASc,QAAQ;YAAC;gBAAEA;gBAAOd;YAAM;SAAE,GAAG,EAAE;IACjD;AACF","file":"options.js"}
|
package/dist/questions/blocks.js
CHANGED
|
@@ -7,14 +7,14 @@ const SELECT_OPTIONS = 100;
|
|
|
7
7
|
const OPTION_TEXT = 75;
|
|
8
8
|
const MODAL_TITLE = 24;
|
|
9
9
|
export const actionIds = {
|
|
10
|
-
choose: (call, q)
|
|
11
|
-
custom: (call, q)
|
|
12
|
-
dismiss: (call)
|
|
13
|
-
submit: (call)
|
|
10
|
+
choose: (call, q)=>`${QUESTION_PREFIX}:choose:${call.toolCallId}:${q}`,
|
|
11
|
+
custom: (call, q)=>`${QUESTION_PREFIX}:custom:${call.toolCallId}:${q}`,
|
|
12
|
+
dismiss: (call)=>`${QUESTION_PREFIX}:dismiss:${call.toolCallId}`,
|
|
13
|
+
submit: (call)=>`${QUESTION_PREFIX}:submit:${call.toolCallId}`
|
|
14
14
|
};
|
|
15
15
|
export const blockIds = {
|
|
16
|
-
question: (call, q)
|
|
17
|
-
custom: (call, q)
|
|
16
|
+
question: (call, q)=>`${QUESTION_PREFIX}:${call.toolCallId}:${q}`,
|
|
17
|
+
custom: (call, q)=>`${QUESTION_PREFIX}:custom:${call.toolCallId}:${q}`
|
|
18
18
|
};
|
|
19
19
|
export function isQuickQuestion(input) {
|
|
20
20
|
return input.questions.length === 1 && !input.questions[0].multiple;
|
|
@@ -22,27 +22,34 @@ export function isQuickQuestion(input) {
|
|
|
22
22
|
export function questionBlocks(call) {
|
|
23
23
|
return isQuickQuestion(call.input) ? quickBlocks(call) : formBlocks(call);
|
|
24
24
|
}
|
|
25
|
-
export function settledBlocks({ actorId, answers, call
|
|
26
|
-
const blocks = call.input.questions.map((item, q)
|
|
25
|
+
export function settledBlocks({ actorId, answers, call }) {
|
|
26
|
+
const blocks = call.input.questions.map((item, q)=>{
|
|
27
27
|
const answer = answers?.[q];
|
|
28
|
-
const lines = [
|
|
28
|
+
const lines = [
|
|
29
|
+
prompt(item)
|
|
30
|
+
];
|
|
29
31
|
if (answer) {
|
|
30
|
-
const values = [
|
|
32
|
+
const values = [
|
|
33
|
+
...answer.selected,
|
|
34
|
+
...answer.custom ? [
|
|
35
|
+
`“${answer.custom}”`
|
|
36
|
+
] : []
|
|
37
|
+
];
|
|
31
38
|
lines.push(`:white_check_mark: *${escape(values.join(', '))}*`);
|
|
32
39
|
}
|
|
33
40
|
return section(lines.join('\n'));
|
|
34
41
|
});
|
|
35
42
|
const verb = answers ? 'Answered' : 'Dismissed';
|
|
36
|
-
if (!answers)
|
|
37
|
-
|
|
38
|
-
|
|
43
|
+
if (!answers) blocks.push(section(':no_entry_sign: *Dismissed*'));
|
|
44
|
+
return [
|
|
45
|
+
...blocks,
|
|
46
|
+
context(actorId ? `${verb} by <@${actorId}>` : verb)
|
|
47
|
+
];
|
|
39
48
|
}
|
|
40
49
|
export function fallbackText(input) {
|
|
41
|
-
return input.questions
|
|
42
|
-
.map(({ header, question }) => `${escape(header)}: ${escape(question)}`)
|
|
43
|
-
.join('\n');
|
|
50
|
+
return input.questions.map(({ header, question })=>`${escape(header)}: ${escape(question)}`).join('\n');
|
|
44
51
|
}
|
|
45
|
-
export function customAnswerView({ call, initialValue, metadata, q
|
|
52
|
+
export function customAnswerView({ call, initialValue, metadata, q }) {
|
|
46
53
|
const item = call.input.questions[q];
|
|
47
54
|
const quick = isQuickQuestion(call.input);
|
|
48
55
|
return {
|
|
@@ -51,7 +58,9 @@ export function customAnswerView({ call, initialValue, metadata, q, }) {
|
|
|
51
58
|
title: plain(truncate(item.header, MODAL_TITLE)),
|
|
52
59
|
submit: plain(quick ? 'Submit' : 'Save'),
|
|
53
60
|
close: plain('Cancel'),
|
|
54
|
-
private_metadata: JSON.stringify({
|
|
61
|
+
private_metadata: JSON.stringify({
|
|
62
|
+
m: metadata
|
|
63
|
+
}),
|
|
55
64
|
blocks: [
|
|
56
65
|
section(prompt(item)),
|
|
57
66
|
{
|
|
@@ -63,103 +72,165 @@ export function customAnswerView({ call, initialValue, metadata, q, }) {
|
|
|
63
72
|
type: 'plain_text_input',
|
|
64
73
|
action_id: CUSTOM_ANSWER_ACTION_ID,
|
|
65
74
|
multiline: true,
|
|
66
|
-
...
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
75
|
+
...initialValue ? {
|
|
76
|
+
initial_value: initialValue
|
|
77
|
+
} : {}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
]
|
|
70
81
|
};
|
|
71
82
|
}
|
|
72
83
|
function quickBlocks(call) {
|
|
73
84
|
const item = call.input.questions[0];
|
|
74
85
|
const buttons = item.options.length <= BUTTON_OPTIONS;
|
|
75
|
-
const descriptions = buttons
|
|
76
|
-
|
|
77
|
-
: [];
|
|
78
|
-
const controls = buttons
|
|
79
|
-
? item.options.map((option, index) => ({
|
|
86
|
+
const descriptions = buttons ? item.options.flatMap(({ label, description })=>description ? [
|
|
87
|
+
`• *${escape(label)}* — ${escape(description)}`
|
|
88
|
+
] : []) : [];
|
|
89
|
+
const controls = buttons ? item.options.map((option, index)=>({
|
|
80
90
|
type: 'button',
|
|
81
91
|
action_id: `${actionIds.choose(call, 0)}:${index}`,
|
|
82
92
|
text: plain(truncate(option.label, OPTION_TEXT)),
|
|
83
|
-
value: String(index)
|
|
84
|
-
}))
|
|
85
|
-
|
|
93
|
+
value: String(index)
|
|
94
|
+
})) : [
|
|
95
|
+
choiceElement({
|
|
96
|
+
call,
|
|
97
|
+
item,
|
|
98
|
+
q: 0
|
|
99
|
+
})
|
|
100
|
+
];
|
|
86
101
|
return [
|
|
87
|
-
section([
|
|
102
|
+
section([
|
|
103
|
+
prompt(item),
|
|
104
|
+
...descriptions
|
|
105
|
+
].join('\n')),
|
|
88
106
|
{
|
|
89
107
|
type: 'actions',
|
|
90
108
|
elements: [
|
|
91
109
|
...controls,
|
|
92
|
-
...
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
...item.custom ? [
|
|
111
|
+
button({
|
|
112
|
+
actionId: actionIds.custom(call, 0),
|
|
113
|
+
text: 'Type your answer'
|
|
114
|
+
})
|
|
115
|
+
] : [],
|
|
116
|
+
button({
|
|
117
|
+
actionId: actionIds.dismiss(call),
|
|
118
|
+
text: 'Dismiss',
|
|
119
|
+
style: 'danger'
|
|
120
|
+
})
|
|
121
|
+
]
|
|
122
|
+
}
|
|
98
123
|
];
|
|
99
124
|
}
|
|
100
125
|
function formBlocks(call) {
|
|
101
|
-
const questions = call.input.questions.flatMap((item, q)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
const questions = call.input.questions.flatMap((item, q)=>[
|
|
127
|
+
section(prompt(item)),
|
|
128
|
+
{
|
|
129
|
+
type: 'actions',
|
|
130
|
+
block_id: blockIds.question(call, q),
|
|
131
|
+
elements: [
|
|
132
|
+
choiceElement({
|
|
133
|
+
call,
|
|
134
|
+
item,
|
|
135
|
+
q
|
|
136
|
+
}),
|
|
137
|
+
...item.custom ? [
|
|
138
|
+
button({
|
|
139
|
+
actionId: actionIds.custom(call, q),
|
|
140
|
+
text: 'Type an answer'
|
|
141
|
+
})
|
|
142
|
+
] : []
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
]);
|
|
114
146
|
return [
|
|
115
147
|
...questions,
|
|
116
148
|
{
|
|
117
149
|
type: 'actions',
|
|
118
150
|
elements: [
|
|
119
|
-
button({
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
151
|
+
button({
|
|
152
|
+
actionId: actionIds.submit(call),
|
|
153
|
+
text: 'Submit',
|
|
154
|
+
style: 'primary'
|
|
155
|
+
}),
|
|
156
|
+
button({
|
|
157
|
+
actionId: actionIds.dismiss(call),
|
|
158
|
+
text: 'Dismiss',
|
|
159
|
+
style: 'danger'
|
|
160
|
+
})
|
|
161
|
+
]
|
|
162
|
+
}
|
|
123
163
|
];
|
|
124
164
|
}
|
|
125
|
-
function choiceElement({ call, item, q
|
|
126
|
-
const options = item.options.map(({ label, description }, index)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
165
|
+
function choiceElement({ call, item, q }) {
|
|
166
|
+
const options = item.options.map(({ label, description }, index)=>({
|
|
167
|
+
text: plain(truncate(label, OPTION_TEXT)),
|
|
168
|
+
value: String(index),
|
|
169
|
+
...description ? {
|
|
170
|
+
description: plain(truncate(description, OPTION_TEXT))
|
|
171
|
+
} : {}
|
|
172
|
+
}));
|
|
131
173
|
const actionId = actionIds.choose(call, q);
|
|
132
174
|
if (options.length <= RADIO_OPTIONS) {
|
|
133
|
-
return {
|
|
175
|
+
return {
|
|
176
|
+
type: item.multiple ? 'checkboxes' : 'radio_buttons',
|
|
177
|
+
action_id: actionId,
|
|
178
|
+
options
|
|
179
|
+
};
|
|
134
180
|
}
|
|
135
181
|
return {
|
|
136
182
|
type: item.multiple ? 'multi_static_select' : 'static_select',
|
|
137
183
|
action_id: actionId,
|
|
138
184
|
placeholder: plain(item.multiple ? 'Choose options' : 'Choose an option'),
|
|
139
|
-
...
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
185
|
+
...options.length <= SELECT_OPTIONS ? {
|
|
186
|
+
options
|
|
187
|
+
} : {
|
|
188
|
+
option_groups: chunk(options, SELECT_OPTIONS).map((group, index)=>({
|
|
143
189
|
label: plain(`Options ${index * SELECT_OPTIONS + 1}–${index * SELECT_OPTIONS + group.length}`),
|
|
144
|
-
options: group
|
|
145
|
-
}))
|
|
146
|
-
|
|
190
|
+
options: group
|
|
191
|
+
}))
|
|
192
|
+
}
|
|
147
193
|
};
|
|
148
194
|
}
|
|
149
195
|
function prompt({ header, question }) {
|
|
150
196
|
return `*${escape(header)}*\n${escape(question)}`;
|
|
151
197
|
}
|
|
152
|
-
function button({ actionId, style, text
|
|
153
|
-
return {
|
|
198
|
+
function button({ actionId, style, text }) {
|
|
199
|
+
return {
|
|
200
|
+
type: 'button',
|
|
201
|
+
action_id: actionId,
|
|
202
|
+
text: plain(text),
|
|
203
|
+
...style ? {
|
|
204
|
+
style
|
|
205
|
+
} : {}
|
|
206
|
+
};
|
|
154
207
|
}
|
|
155
208
|
function section(text) {
|
|
156
|
-
return {
|
|
209
|
+
return {
|
|
210
|
+
type: 'section',
|
|
211
|
+
text: {
|
|
212
|
+
type: 'mrkdwn',
|
|
213
|
+
text: truncate(text, 3000)
|
|
214
|
+
}
|
|
215
|
+
};
|
|
157
216
|
}
|
|
158
217
|
function context(text) {
|
|
159
|
-
return {
|
|
218
|
+
return {
|
|
219
|
+
type: 'context',
|
|
220
|
+
elements: [
|
|
221
|
+
{
|
|
222
|
+
type: 'mrkdwn',
|
|
223
|
+
text
|
|
224
|
+
}
|
|
225
|
+
]
|
|
226
|
+
};
|
|
160
227
|
}
|
|
161
228
|
function plain(text) {
|
|
162
|
-
return {
|
|
229
|
+
return {
|
|
230
|
+
type: 'plain_text',
|
|
231
|
+
text,
|
|
232
|
+
emoji: true
|
|
233
|
+
};
|
|
163
234
|
}
|
|
164
235
|
function escape(text) {
|
|
165
236
|
return text.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
@@ -168,6 +239,9 @@ function truncate(text, limit) {
|
|
|
168
239
|
return text.length > limit ? `${text.slice(0, limit - 1)}…` : text;
|
|
169
240
|
}
|
|
170
241
|
function chunk(values, size) {
|
|
171
|
-
return Array.from({
|
|
242
|
+
return Array.from({
|
|
243
|
+
length: Math.ceil(values.length / size)
|
|
244
|
+
}, (_, index)=>values.slice(index * size, (index + 1) * size));
|
|
172
245
|
}
|
|
246
|
+
|
|
173
247
|
//# sourceMappingURL=blocks.js.map
|