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
Другие вопросы по тегам