import { useAutoAnimate } from "@formkit/auto-animate/react"; import { useEffect, useState } from "react"; import type { UseFormReturn } from "react-hook-form"; import { Controller, useFieldArray } from "react-hook-form"; import { v4 as uuidv4 } from "uuid"; import Shell from "@calcom/features/shell/Shell"; import classNames from "@calcom/lib/classNames"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { BooleanToggleGroupField, Button, EmptyScreen, FormCard, SelectField, TextAreaField, TextField, } from "@calcom/ui"; import { Plus, FileText } from "@calcom/ui/components/icon"; import type { inferSSRProps } from "@lib/types/inferSSRProps"; import type { RoutingFormWithResponseCount } from "../../components/SingleForm"; import SingleForm, { getServerSidePropsForSingleFormView as getServerSideProps, } from "../../components/SingleForm"; export { getServerSideProps }; type HookForm = UseFormReturn; export const FieldTypes = [ { label: "Short Text", value: "text", }, { label: "Number", value: "number", }, { label: "Long Text", value: "textarea", }, { label: "Select", value: "select", }, { label: "MultiSelect", value: "multiselect", }, { label: "Phone", value: "phone", }, { label: "Email", value: "email", }, ]; function Field({ hookForm, hookFieldNamespace, deleteField, fieldIndex, moveUp, moveDown, appUrl, }: { fieldIndex: number; hookForm: HookForm; hookFieldNamespace: `fields.${number}`; deleteField: { check: () => boolean; fn: () => void; }; moveUp: { check: () => boolean; fn: () => void; }; moveDown: { check: () => boolean; fn: () => void; }; appUrl: string; }) { const [identifier, _setIdentifier] = useState(hookForm.getValues(`${hookFieldNamespace}.identifier`)); const { t } = useLocale(); const setUserChangedIdentifier = (val: string) => { _setIdentifier(val); // Also, update the form identifier so tha it can be persisted hookForm.setValue(`${hookFieldNamespace}.identifier`, val); }; const label = hookForm.watch(`${hookFieldNamespace}.label`); useEffect(() => { if (!hookForm.getValues(`${hookFieldNamespace}.identifier`)) { _setIdentifier(label); } }, [label, hookFieldNamespace, hookForm]); const router = hookForm.getValues(`${hookFieldNamespace}.router`); const routerField = hookForm.getValues(`${hookFieldNamespace}.routerField`); return (
setUserChangedIdentifier(e.target.value)} />
{ const defaultValue = FieldTypes.find((fieldType) => fieldType.value === value); return ( { if (!option) { return; } onChange(option.value); }} defaultValue={defaultValue} /> ); }} />
{["select", "multiselect"].includes(hookForm.watch(`${hookFieldNamespace}.type`)) ? (
) : null}
{ return ( ); }} />
); } const FormEdit = ({ hookForm, form, appUrl, }: { hookForm: HookForm; form: inferSSRProps["form"]; appUrl: string; }) => { const fieldsNamespace = "fields"; const { fields: hookFormFields, append: appendHookFormField, remove: removeHookFormField, swap: swapHookFormField, // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore https://github.com/react-hook-form/react-hook-form/issues/6679 } = useFieldArray({ control: hookForm.control, name: fieldsNamespace, }); const [animationRef] = useAutoAnimate(); const addField = () => { appendHookFormField({ // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore id: uuidv4(), // This is same type from react-awesome-query-builder type: "text", label: "", }); }; // hookForm.reset(form); if (!form.fields) { form.fields = []; } return hookFormFields.length ? (
{hookFormFields.map((field, key) => { return ( hookFormFields.length > 1, fn: () => { removeHookFormField(key); }, }} moveUp={{ check: () => key !== 0, fn: () => { swapHookFormField(key, key - 1); }, }} moveDown={{ check: () => key !== hookFormFields.length - 1, fn: () => { if (key === hookFormFields.length - 1) { return; } swapHookFormField(key, key + 1); }, }} key={key} /> ); })}
{hookFormFields.length ? (
) : null}
) : (
Create Field } />
); }; export default function FormEditPage({ form, appUrl, }: inferSSRProps & { appUrl: string }) { return ( } /> ); } FormEditPage.getLayout = (page: React.ReactElement) => { return ( {page} ); };