Form cannot be used within a Form component

Hi Team,
I’m trying to create a dashboard gadget using Forge UI Kit to display a list of users in a group.
To select a group(s) within in DashboardGadgetEdit, I use Select component that can only be used inside a Form or a MacroConfig component. Here is my error:
formError
Please advise.

Hey Egor,

Judging from the error message it looks like you’re nesting one Form component within another Form component? Is that the case? Do you think you could share the code that you’ve written so that we can review?

Regards,
Dave

Hi Dave,

Please see my code below:

My index.jsx

import { render } from "@forge/ui";
import { View } from "./components/view";
import { Edit } from "./components/edit";
export const runView = render(<View />);
export const runEdit = render(<Edit />);

My Edit.jsx

import { DashboardGadgetEdit, useState, Fragment } from "@forge/ui";
import { getGroups } from "../utils/utils";

//Display list of users from selected groups
import { UsersTable } from "./UsersTable";
//Modal window to select a group(s)
import { GroupsDialog } from "./GroupsDialog";
import { users } from "../constants/mock";

//Main return of data to View table
export const Edit = () => {
  const onSubmit = async (values) => {
    return { ...values, refresh: 25 };
  };
  const [isOpenModal, setOpenModal] = useState(false);
  const [groups, setGroups] = useState(getGroups());
  return (
    <DashboardGadgetEdit onSubmit={onSubmit}>
      <Fragment>
        <UsersTable users={users} setOpenModal={setOpenModal} />
        <GroupsDialog
          groups={groups}
          setGroups={setGroups}
          isOpenModal={isOpenModal}
          setOpenModal={setOpenModal}
        />
      </Fragment>
    </DashboardGadgetEdit>
  );
};

My GroupsDialog.jsx

import ForgeUI, {
  useState,
  Select,
  Option,
  Fragment,
  FormCondition,
  Form,
  ModalDialog,
} from "@forge/ui";

//Modal window to select user groups
export const GroupsDialog = ({
  groups,
  setGroups,
  isOpenModal,
  setOpenModal,
}) => {
  const onSubmit = async (formData) => {
    setGroups([...groups, formData]);
    setOpenModal(false);
  };

  const options = groups.map((group) => (
    <Option label={group.name} value={group.groupId} />
  ));

  return (
    <Fragment>
      {isOpenModal && (
        <ModalDialog header="Add Group" onClose={() => setOpenModal(false)}>
          <Form onSubmit={onSubmit}>
            <Select
              isRequired={true}
              label="Select a group"
              name="groups"
              isMulti="true"
            >
              {options}
            </Select>
          </Form>
        </ModalDialog>
      )}
    </Fragment>
  );
};

Hi @EgorTiunov, the DashboardGadgetEdit component itself contains a Form component, and so your Form component is techncially nested within another Form. You should remove your Form and instead put your onSubmit prop on DashboardGadgetEdit.

2 Likes

Hi @PeterYu ,

Thank you for your reply. I think I was confused by Props saying “The edit code for the dashboard gadget. Can contain any UI Kit component.” Now this makes sense to me.