React Adminで表示ビューからダイアログにフォーム入力を追加するにはどうすればよいですか?

Soullivaneuh

概要

フォームフィールドを含むダイアログを表示するクイックアクションボタンをレコード表示ビューに追加したいと思います。

フォームが送信されたときに、提供されたデータがフォームフィールドデータといくつかのオプションを使用して更新アクションをディスパッチするようにします。

データプロバイダーに更新アクションをディスパッチするアクションボタンを作成する方法を知っていますが、ダイアログでフォームを処理する方法について行き詰まっています。

試行(および失敗)

そこで、TextInput(from react-admin)が付いたダイアログを表示するボタンを作成することから始めました。

const ValidateButton: FC<ButtonProps> = ({ record }) => {
  const [open, setOpen] = useState<boolean>(false);

  const handleInit = () => {
    setOpen(true)
  }

  const handleCancel = () => {
    setOpen(false);
  }

  const handleSubmit = () => {
    setOpen(false);
  }

  return (
    <>
      <Button
        label="Validate"
        onClick={handleInit}
      >
        <ValidateIcon />
      </Button>
      <Dialog
        open={open}
      >
        <DialogTitle>Validate</DialogTitle>
        <DialogContent>
          <TextInput
            source="comment"
            label="Validation comment"
          />
        </DialogContent>
        <DialogActions>
          <Button
            label="Cancel"
            onClick={handleCancel}
          />
          <Button
            label="Validate"
            onClick={handleSubmit}
          />
        </DialogActions>
      </Dialog>
    </>
  );
}

これにより、次のエラーが発生しました。

Error: useField must be used inside of a <Form> component

上手。かなりクリアな。だから私はそれをSimpleFormコンポーネントにラップしてみました

<DialogContent>
  <SimpleForm
    form={createForm({ onSubmit: handleSubmit })}
    resource="rides"
    record={record}
  >
    <TextInput
      source="comment"
      label="Validation comment"
    />
  </SimpleForm>
</DialogContent>

それから私は得ました:

TypeError: can't access property "save", context is undefined
useSaveContext
node_modules/ra-core/esm/controller/details/SaveContext.js:23

  20 |  */
  21 | export var useSaveContext = function (props) {
  22 |     var context = useContext(SaveContext);
> 23 |     if (!context.save || !context.setOnFailure) {
  24 |         /**
  25 |          * The element isn't inside a <SaveContextProvider>
  26 |          * To avoid breakage in that case, fallback to props

は、[ValidateButtonビューの表示]ツールバーに実装されています。

const RideShowActions: FC<ShowActionsProps> = ({ basePath, data }) => {
  if (!data) {
    return null;
  }

  return (
    <TopToolbar>
      <ValidateButton />
      {[
        'created',
        'validated',
        'confirmed',
      ].includes(data?.status) && <CancelButton basePath={basePath} record={data} />}
      <EditButton basePath={basePath} record={data} />
    </TopToolbar>
  );
};

export const RideShow: FC<ShowProps> = (props) => (
  <Show
    title={<RideTitle />}
    actions={<RideShowActions />}
    {...props}
  >
    <SimpleShowLayout>
      // Show classic stuff.
    </SimpleShowLayout>
  </Show>
);

質問

最後のエラーは、SimpleForm上に配置する必要があるためだと思います<Edit>

私の目標は、ダイアログの編集フォームと同じ機能とUX / UIデザインの入力を取得し、カスタムアクションを実行することです。

私が欠けているものは何ですか?どうすればそれを達成できますか?

注:のTextFieldコンポーネントを直接使用しようとしました@material-ui/coreそれは機能しますが、私にとって役立つすべてのreact-admin機能を失いますReferenceInput

Soullivaneuh

DialogFormフォーム自体やアクションボタンなどの一般的なロジックを組み合わせて、カスタムコンポーネントを作成することで、最終的に解決策を見つけました

import { FC, MouseEventHandler } from 'react';
import { Button } from 'react-admin';
import { Dialog, DialogProps, DialogTitle, DialogContent, DialogActions } from '@material-ui/core'
import { Form } from 'react-final-form';
import { Config } from 'final-form';

export interface DialogFormProps {
  open: DialogProps['open'],
  loading?: boolean;
  onSubmit: Config['onSubmit'],
  onCancel: MouseEventHandler,
  title?: string,
  submitLabel?: string;
  cancelLabel?: string;
}

export const DialogForm: FC<DialogFormProps> = ({
  open,
  loading,
  onSubmit,
  onCancel,
  title,
  cancelLabel,
  submitLabel,
  children,
}) => {
  return (
    <Dialog
      open={open}
    >
        <Form
          onSubmit={onSubmit}
          render={({handleSubmit}) => (
            <form onSubmit={handleSubmit}>
              {title && (
                <DialogTitle>
                  {title}
                </DialogTitle>
              )}
              <DialogContent>
                {children}
              </DialogContent>
              <DialogActions>
                <Button
                  label={cancelLabel || 'Cancel'}
                  onClick={onCancel}
                  disabled={loading}
                />
                <Button
                  label={submitLabel || 'Validate'}
                  type="submit"
                  disabled={loading}
                />
              </DialogActions>
            </form>
          )}
        />

    </Dialog>
  )
};

export default null;

上記の例をコピーして貼り付けると、そのまま使用できます。

ボタンを使用した実装例を次に示します。

const ValidateButton: FC<ButtonProps> = ({ record }) => {
  const [open, setOpen] = useState<boolean>(false);
(undefined);
  const [mutate, { loading }] = useMutation();
  const notify = useNotify();
  const refresh = useRefresh();

  const handleInit = () => {
    setOpen(true)
  }

  const handleCancel = () => {
    setOpen(false);
  }

  const handleSubmit: DialogFormProps['onSubmit'] = (values) => {
    console.log(values);
    mutate(
      // Your mutation logic.
    );
  }

  return (
    <>
      <Button
        label="Validate"
        onClick={handleInit}
      >
        <ValidateIcon />
      </Button>
      <DialogForm
        open={open}
        loading={loading}
        onSubmit={handleSubmit}
        onCancel={handleCancel}
        title="Validate that thing"
        submitLabel="Let's go!"
      >
        <DialogContentText>
          Some text.
        </DialogContentText>
        <ReferenceInput
          source="referenceId"
          label="Reference"
          reference="service"
          filter={{ userId: record?.customerId }}
        >
          <SelectInput
            optionText="name"
            resettable
            fullWidth
          />
        </ReferenceInput>
      </DialogForm>
    </>
  );
}

それが何とか役立つことを願っています!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

入力フィールドの値をプログラムでReactに入力するにはどうすればよいですか?

分類Dev

React Redux-入力を追加できるmaterial-uiを使用してフォームを作成するにはどうすればよいですか?

分類Dev

ReactフォームデータをFirebaseリアルタイムデータベースに追加するにはどうすればよいですか?

分類Dev

Material-UI:reactの入力フィールドに検索アイコンを表示するにはどうすればよいですか?

分類Dev

react-adminのリストビューに永続的なフィルター機能を追加するにはどうすればよいですか?

分類Dev

React:フォームの送信後にファイル入力フィールドとデータ入力フィールドをクリアするにはどうすればよいですか?

分類Dev

Reactで入力データをJSON配列に追加するにはどうすればよいですか。

分類Dev

reactでフォーム入力を条件付きで無効にするにはどうすればよいですか?

分類Dev

React.FormEvent <HTMLFormElement>からフォーム値を取得するにはどうすればよいですか?

分類Dev

React / Jest / Enzyme Shallow Renderingテスト中にテキストをフォームに入力するにはどうすればよいですか?

分類Dev

Reactの入力フォームに応じてボタンを無効/有効にするにはどうすればよいですか?

分類Dev

増分値を表示するReactの入力スライダーを作成するにはどうすればよいですか?

分類Dev

React J を使用してフォームの動的入力データを取得するにはどうすればよいですか?

分類Dev

reactの複数のフィールドから同じ入力タイプから値を取得するにはどうすればよいですか?

分類Dev

React:既存の画像をreact更新フォームで表示し、新しい画像がアップロードされたら新しい画像を表示するにはどうすればよいですか?

分類Dev

react jsを使用してカルーセルスライダーでカードアイテムを表示するにはどうすればよいですか?

分類Dev

フロータイプでReact $ Element以外のタイプでJSXを入力するにはどうすればよいですか?

分類Dev

Expressルーターからビューに渡されたデータをreactで表示するにはどうすればよいですか?

分類Dev

react-google-mapsのStandaloneSearchBoxからの出力を入力フィールドに入力するにはどうすればよいですか?

分類Dev

ブール値を持つ状態プロパティを画面に表示するにはどうすればよいですか(reactフォーム)

分類Dev

React Nativeのビューで表示名を変更するにはどうすればよいですか?

分類Dev

React Nativeアプリでビューのオーバーフローを検出するにはどうすればよいですか?

分類Dev

ReactのMaterial-UIから別のコンポーネントのダイアログを閉じるにはどうすればよいですか?

分類Dev

ビューにシェイクアニメーションを追加するにはどうすればよいですか(react-native)?

分類Dev

複数のハンドラーを作成せずに、フォーム内のsemantic-ui-reactドロップダウンオブジェクトの入力変更を処理するにはどうすればよいですか?

分類Dev

React NativeとAxiosでフォームデータを送信するにはどうすればよいですか?

分類Dev

マテリアルUIを使用するReactでグローバルフォントの色を設定するにはどうすればよいですか?

分類Dev

font-faceを使用してreactアプリにローカルフォントを追加するにはどうすればよいですか?

分類Dev

Reactアプリを常にフルページで表示するにはどうすればよいですか?

Related 関連記事

  1. 1

    入力フィールドの値をプログラムでReactに入力するにはどうすればよいですか?

  2. 2

    React Redux-入力を追加できるmaterial-uiを使用してフォームを作成するにはどうすればよいですか?

  3. 3

    ReactフォームデータをFirebaseリアルタイムデータベースに追加するにはどうすればよいですか?

  4. 4

    Material-UI:reactの入力フィールドに検索アイコンを表示するにはどうすればよいですか?

  5. 5

    react-adminのリストビューに永続的なフィルター機能を追加するにはどうすればよいですか?

  6. 6

    React:フォームの送信後にファイル入力フィールドとデータ入力フィールドをクリアするにはどうすればよいですか?

  7. 7

    Reactで入力データをJSON配列に追加するにはどうすればよいですか。

  8. 8

    reactでフォーム入力を条件付きで無効にするにはどうすればよいですか?

  9. 9

    React.FormEvent <HTMLFormElement>からフォーム値を取得するにはどうすればよいですか?

  10. 10

    React / Jest / Enzyme Shallow Renderingテスト中にテキストをフォームに入力するにはどうすればよいですか?

  11. 11

    Reactの入力フォームに応じてボタンを無効/有効にするにはどうすればよいですか?

  12. 12

    増分値を表示するReactの入力スライダーを作成するにはどうすればよいですか?

  13. 13

    React J を使用してフォームの動的入力データを取得するにはどうすればよいですか?

  14. 14

    reactの複数のフィールドから同じ入力タイプから値を取得するにはどうすればよいですか?

  15. 15

    React:既存の画像をreact更新フォームで表示し、新しい画像がアップロードされたら新しい画像を表示するにはどうすればよいですか?

  16. 16

    react jsを使用してカルーセルスライダーでカードアイテムを表示するにはどうすればよいですか?

  17. 17

    フロータイプでReact $ Element以外のタイプでJSXを入力するにはどうすればよいですか?

  18. 18

    Expressルーターからビューに渡されたデータをreactで表示するにはどうすればよいですか?

  19. 19

    react-google-mapsのStandaloneSearchBoxからの出力を入力フィールドに入力するにはどうすればよいですか?

  20. 20

    ブール値を持つ状態プロパティを画面に表示するにはどうすればよいですか(reactフォーム)

  21. 21

    React Nativeのビューで表示名を変更するにはどうすればよいですか?

  22. 22

    React Nativeアプリでビューのオーバーフローを検出するにはどうすればよいですか?

  23. 23

    ReactのMaterial-UIから別のコンポーネントのダイアログを閉じるにはどうすればよいですか?

  24. 24

    ビューにシェイクアニメーションを追加するにはどうすればよいですか(react-native)?

  25. 25

    複数のハンドラーを作成せずに、フォーム内のsemantic-ui-reactドロップダウンオブジェクトの入力変更を処理するにはどうすればよいですか?

  26. 26

    React NativeとAxiosでフォームデータを送信するにはどうすればよいですか?

  27. 27

    マテリアルUIを使用するReactでグローバルフォントの色を設定するにはどうすればよいですか?

  28. 28

    font-faceを使用してreactアプリにローカルフォントを追加するにはどうすればよいですか?

  29. 29

    Reactアプリを常にフルページで表示するにはどうすればよいですか?

ホットタグ

アーカイブ