Проблема с элементом ArrayInput «многие к одному»> «один ко многим» в реакции-администратора с использованием Hydra dataProvider - PullRequest
0 голосов
/ 05 марта 2020

Контекст: я написал API для обработки своих пользователей / групп / разрешений в api-платформе, очень похожий на то, что мы имели в Symfony 1.4 sfGuardUserPlugin - за исключением того, что ассоциация userGroup имеет дополнительные свойства:

Пример поддельного запроса на получение пользователя:

{
  "@context": "/contexts/User",
  "@id": "/users/92",
  "@type": "User",
  "id": 92,
  "firstName": "Joseph",
  "lastName": "Chauvet",
  "email": "Joseph.Chauvet@fakemail.fr",
  "isActive": true,
  "userGroups": [
    {
      "@id": "/user_groups/group=17;user=92",
      "@type": "UserGroup",
      "group": {
        "@id": "/groups/17",
        "@type": "Group",
        "id": 17,
        "name": "adsi",
        "role": "ROLE_ADSI"
      },
      "isManual": false,
      "isForbidden": false,
      "groupname": "adsi"
    }
  ]
}

sidenote: свойство groupname в userGroup является виртуальным свойством с использованием метода получения, а не избыточных данных.

Проблема:

Я очень старался получить работающий UserEdit в Reaction-Admin, который мог бы обрабатывать API, описанный выше (это именно то, что я хотел, поэтому здесь нет проблем).

Для того, чтобы сопоставьте структуру данных пользователей -> userGroups -> групп ресурсов, я думаю, мне нужен ArrayInput для итерации userGroups и ReferenceInput + selectInput для выбора значения группы.

Список ресурсов группы в selectInput это хорошо, но текущее значение группы пользователя никогда не отображается, поэтому я предполагаю, что проблема связана со значением моего исходного атрибута referenceInput.

Я пробовал много, много, много комбинаций, используя - getSource() - добавляя <FormDataConsumer> Элемент - пытаясь использовать прямой хук useGetOne(), даже если я не очень хорошо понимаю, как hooks работает, и что hooks и callback не очень хорошо играют вместе. - даже пытаясь установить источник "трудным путем", таким как {"userGroups [0] .group"} или пытаясь {"scopedFormData.group"} в форме formDataConsumer. но ничего не работает ...

Вот пример одной из моих (самых простых) попыток

export const UserEdit = props => (
  <Edit {...props}>
    <SimpleForm>
      <TextInput source={"firstName"}/>
      <TextInput source={"lastName"}/>
      <TextInput source={"email"} type="email"/>
      <DateInput source={"lastLogin"}/>
      <BooleanInput source={"isActive"}/>
      <ArrayInput source={"userGroups"}>

        <SimpleFormIterator>
           <ReferenceInput
                source={"group"} //should translate to userGroups[0].group
                reference={"groups"}
                label={"Groupe"}
           >
              <SelectInput label={"Groupe"} optionText="name"/>
           </ReferenceInput>
        </SimpleFormIterator>
      </ArrayInput>
    </SimpleForm>
  </Edit>
)

Я пробовал вот так:

[...]
        <ArrayInput source={"userGroups"}>
          <SimpleFormIterator>
            <FormDataConsumer>
              {({
                  formData, // The whole form data
                  scopedFormData, // The data for this item of the ArrayInput
                  getSource, // A function to get the valid source inside an ArrayInput
                  ...props
                }) =>
                <ReferenceInput
                  //source={useGetOne('groups', '/groups/16').data}
                  source={getSource('group')}
                  reference={"groups"}
                  label={"Groupe"}
                >
                <SelectInput label={"Groupe"} optionText="name"/>
                </ReferenceInput>
              }
            </FormDataConsumer>
          </SimpleFormIterator>

Я также пытался использовать ловушку useGetOne для извлечения данных с прямой ссылкой, но перехватчики запрещены в обратном вызове, и я не очень разбираюсь в предпосылках в контексте jsx.

Бесполезный собственный контекст: I Я старший разработчик, новичок во всей парадигме реакции / редукции, и я привык решать проблемы самостоятельно, но я застрял на этом и потратил около пятидесяти часов на изучение документации, ошибок, источников, чтобы избавиться от этого. Мой стек Api-платформы и response-admin современны (да, даже пота-admin сегодня выпуска 3.2.4, который исправляет ошибку arrayInput)

Мое необразованное предположение диких символов таково:

  1. Я просто делаю это неправильно
  2. Это может быть связано с тем, как HydraProvider анализирует и сохраняет / кэширует ссылки связанных ресурсов, а не передает его реагирующим элементам, как simpleRestProvider.

Возможно, это связано с тем, что ни мне, ни другим моим товарищам по команде не удалось использовать source = {"reference.property"} в любом поле ввода / ввода в response-admin с использованием Hydra dataProvider.

Любая помощь очень, очень ценится, один из моих товарищей по команде добавил: «Кевин (ie: Dunglas), Viens Mettre des paillettes dans ma v ie» 10

...