Как получить варианты значений поля формы для enum

Есть форма (User task) для ввода данных. Нам необходимо предлагать конечному пользователю (оператору) 4 варианта ответа, т.е нам нужно как-то передавать возможные значения enum фронту, но api камунды не предоставляет такой возможности.

Для этого, камунда предлагает использовать типы bool, string, enum, enum, long, date и . В данной ситуации нам не удастся найти ничего более подходящего, чем enum или реализовать свой собственный тип.

Прочитав несколько форумов, узнал про TaskListener (тригерит начало/окончание заполнения формы), предоставляющий возможность кастомизировать возвращаемый ответ. Но он не работает (Cannot find serializer for value 'Value ‘null’ of type ‘json’) инфы по этому поводу 0. Кидает при любых типах данных.

Сейчас не вижу возможных действий кроме как попробовать реализовать свой кастомный тип или применить ExecutionListener вместо TaskListener.

@mneverskiy приветствую!

Я правильно понимаю, что это Generated Task Forms используемые для того, чтобы построить форму в каком-то кастомном TaskList (Angular/React)?
Как вы получаете элементы формы и выводите их пользователю?

P.S. enum используемый в Generated Forms - это на самом деле не enum, а LinkedHashMap, т.е. упорядоченный набор пар ключ-значение.

Здравствуйте, да, это Generated Task Forms и нам нужно построить форму во Flutter.
Элементы формы получаем из form variable (type, value, valueInfo), но этого нам не хватит, т.к потребуются еще дополнительные поля для placeholder и label. Думаю, что нужно реализовать свой custom type и отталкиваться от него.

В теории на фронт должен прилетать объект с полями name (заголовок формы), value (введенное имя), placeholder (заполнитель поля), label (подсказка для пользователя). Но это вопрос уже про custom type.

Вообще возможно создать кастомный тип со своими полями? Пытался использовать AbstractFormField, но как понял, он не позволяет добавлять свои поля.

В одной из реализаций кастомного TaskList, с которой мне приходилось сталкиваться, использовался такой подход:

  1. Вызывался REST API Camunda, для задачи извлекалась rendered task form в HTML:
    Get Rendered Task Form | docs.camunda.org

  2. HTML-форма парсилась в объект (кажется FormGroup в Angular), обогащалась значениями переменных:

  1. После выводилась пользователю в красивом виде.

При таком подходе можно использовать Enum’ы, они возвращаются в форме в виде элемента select со всеми опциями.

Есть абстрактный класс AbstractFormFieldType.
На его основе вы можете сделать собственную реализацию нужного вам типа.
Вот, например, для File:

@Slf4j
public class FileFormFieldType extends AbstractFormFieldType {

    public final static String FORM_TYPE = "file";

    @Override
    public String getName() {
        return FORM_TYPE;
    }

    @Override
    public TypedValue convertToFormValue(TypedValue typedValue) {
        log.debug("convertToFormValue Input Object: {}", typedValue);
        if(typedValue instanceof FileValue) {
            return typedValue;
        }
        if (typedValue != null) {
            return typedValue.getValue() == null ?
                Variables.fileValue("null").create() :
                Variables.fileValue((File) typedValue.getValue());
        } else {
            return null;
        }
    }

    @Override
    public TypedValue convertToModelValue(TypedValue typedValue) {
        log.debug("convertToModelValue Input Object: {}", typedValue);
        if(typedValue instanceof FileValue) {
            return typedValue;
        }
        if (typedValue != null) {
            return typedValue.getValue() == null ?
                Variables.fileValue("null").create() :
                Variables.fileValue((File) typedValue.getValue());
        } else {
            return null;
        }
    }

    @Override
    public Object convertFormValueToModelValue(Object o) {
        return null;
    }

    @Override
    public String convertModelValueToFormValue(Object o) {
        return null;
    }

    public TypedValue convertValue(TypedValue propertyValue) {
        log.debug("Input object: {}", propertyValue);
        log.debug("MimeType: {}", propertyValue instanceof FileValue ? ((FileValue) propertyValue).getMimeType() :  "empty");
        if(propertyValue instanceof FileValue) {
            return propertyValue;
        } else {
            Object value = propertyValue.getValue();
            if(value == null) {
                return Variables.fileValue("null").create();
            } else {
                return Variables.fileValue((File) value);
            }
        }
    }
}