ReferenceInput: использование GET_ONE вместо GET_MANY, как это было сделано в admin-on-rest - PullRequest
0 голосов
/ 17 мая 2019

Я перехожу с admin-on-rest на response-admin

При использовании точно такой же комбинации Edit / SimpleForm / ReferenceInput поведение отличается между admin-on-rest (кажется, использует GET_ONE) и response-admin (кажется, использует GET_MANY)

Проблема в том, что мой бэкэнд API не поддерживает GET_MANY

Значит ли это, что мне нужно изменить поставщика данных, чтобы каким-то образом преобразовать GET_MANY в несколько вызовов GET_ONE?

Если это так, не могли бы вы привести базовый пример для этого.

Обратите внимание, что это может быть частью документации на https://marmelab.com/react-admin/Inputs.html#referenceinput, так как я предполагаю, что это не редкость

1 Ответ

0 голосов
/ 20 мая 2019

В ожидании окончательного ответа на мой вопрос, вот что я сделал в своем поставщике данных на основе https://marmelab.com/react-admin/DataProviders.html#example-request-processing:

const convertRESTRequestToHTTP = (type, resource, params) => new Promise((resolve, reject) => {
    let url = '';
    const options = {};
    switch (type) {
        /* see other cases in the doc */
        case GET_MANY: {
            //our API does not support GET_MANY
            //=> we fallback to GET_ONE if there is a single id,
            //   otherwise we throw an error
            // also see convertHTTPResponseToREST to transform the JSON
            if (params.ids.length === 1) {
              url = `${apiUrl}/${resource}/${params.ids[0]}`;
              break;
            }
            throw new Error('the API does not support GET_MANY')
        }
    }
    resolve({ url, options });
});

const convertHTTPResponseToREST = (response, type, resource, params) => {
    const { json } = response;
    switch (type) {
        /* see other cases in the doc */
        case GET_MANY:
            //see explanantion in convertRESTRequestToHTTP
            if (params.ids.length !== 1) {
              throw new Error('the API does not support GET_MANY')
            }
            return { data: [json] };            
    }
};
...