Slack Dialog для поиска по внешнему источнику данных
У меня есть пара вопросов по вялому диалогу. Я разработал форму для заполнения и отправки. Одно поле использует внешний источник данных, и я могу видеть параметры в раскрывающемся списке.
В дополнение к этому, я хотел бы знать, можем ли мы использовать функцию поиска, например, если пользователь вводит "abc", он отображается в тех опциях, которые соответствуют "abc".
Другой вопрос, который у меня возникает, состоит в том, что в одной форме, с несколькими полями, мы можем настроить диалог таким образом, чтобы на основе одного значения другой набор опций запрашивал и изменял.
Пожалуйста, помогите в этой части. Спасибо.
Диалог JSON с использованием в настоящее время:
{
"label": "ProjectName",
"type": "select",
"name": "prjname",
"data_source": "external",
"min_query_length":3
},
1 ответ
концепция
Функция поиска
Каждое меню выбора с внешним источником предназначено для обеспечения функции поиска. Как только пользователь вводит хотя бы min_query_length
chars должен автоматически начинать сопоставление с вашим вводом. Однако фактическое сопоставление должно быть выполнено вашим приложением. Slack будет отправлять вашему приложению символы, введенные пользователем, и ваше приложение должно ответить списком совпадений. Если реализовано правильно, это приведет к функции поиска.
Обновление элементов перед отправкой
Пользователь должен нажать "Отправить", прежде чем его вход будет зарегистрирован и отправить в ваше приложение. Невозможно получить промежуточное состояние элементов или обновить их до отправки пользователем.
Пример кода
Вот пример, показывающий, как обеспечить данные для динамического меню внешними данными. Пример приведен на Python с использованием Flask и стандартного Slackclient.
В этом примере будет показан динамический элемент выбора "Город". Как только пользователь вводит текст в поле поиска, список городов динамически фильтруется на основе пользовательского ввода. например, "Ли" покажет только "Лондон" и "Лисабон".
import os
import slack
from flask import Flask, json, request
app = Flask(__name__) #create the Flask app
@app.route('/slash', methods=['POST'])
def dialog_show():
"""shows the dialog"""
# define dialog
dialog = {
"callback_id": "ryde-46e2b0",
"title": "Request a Ride",
"submit_label": "Request",
"notify_on_cancel": True,
"state": "Limo",
"elements": [
{
"type": "text",
"label": "Pickup Location",
"name": "loc_origin"
},
{
"type": "text",
"label": "Dropoff Location",
"name": "loc_destination"
},
{
"label": "City",
"name": "city",
"type": "select",
"data_source": "external"
}
]
}
# open the dialog
client = slack.WebClient(token=os.environ['SLACK_TOKEN'])
response = client.dialog_open(
trigger_id=request.form.get('trigger_id'),
dialog=json.dumps(dialog)
)
assert response["ok"]
return ""
@app.route('/interactive', methods=['POST'])
def dialog_submit():
"""handle dialog submission"""
payload_json = request.form["payload"]
payload = json.loads(payload_json)
print(payload)
return ""
@app.route('/options_load', methods=['POST'])
def dialog_options_load():
"""provide filtered list of options based on input for dialog"""
payload_json = request.form["payload"]
payload = json.loads(payload_json)
# example list of all options
cities = {
"Berlin": 1,
"Copenhagen": 2,
"Lisabon": 3,
"London": 4,
"Madrid": 5,
"Oslo": 6,
"Paris": 7,
"Rom": 8,
"Stockholm": 9
}
# find matching options
# will match if user input string is in name
options = list()
for name, value in cities.items():
if payload["value"] in name:
options.append({
"label": name,
"value": value
})
# build response structure
response = {
"options": options
}
return json.jsonify(response)
if __name__ == '__main__':
app.run(debug=True, port=8000) #run app in debug mode on port 8000