import type { App_RoutingForms_Form } from "@prisma/client"; import type { Dispatch, SetStateAction } from "react"; import { SkeletonText } from "@calcom/ui/components/skeleton"; import getFieldIdentifier from "../lib/getFieldIdentifier"; import { getQueryBuilderConfigForFormFields } from "../lib/getQueryBuilderConfig"; import isRouterLinkedField from "../lib/isRouterLinkedField"; import { getUIOptionsForSelect } from "../lib/selectOptions"; import { getFieldResponseForJsonLogic } from "../lib/transformResponse"; import type { SerializableForm, FormResponse } from "../types/types"; import { ConfigFor, withRaqbSettingsAndWidgets } from "./react-awesome-query-builder/config/uiConfig"; export type FormInputFieldsProps = { form: Pick, "fields">; /** * Make sure that response is updated by setResponse */ response: FormResponse; setResponse: Dispatch>; /** * Identifier of the fields that should be disabled */ disabledFields?: string[]; }; export default function FormInputFields(props: FormInputFieldsProps) { const { form, response, setResponse, disabledFields = [] } = props; const formFieldsQueryBuilderConfig = withRaqbSettingsAndWidgets({ config: getQueryBuilderConfigForFormFields(form), configFor: ConfigFor.FormFields, }); return ( <> {form.fields?.map((field) => { if (isRouterLinkedField(field)) { // @ts-expect-error FIXME @hariombalhara const routerField = field.routerField; // A field that has been deleted from the main form would still be there in the duplicate form but disconnected // In that case, it could mistakenly be categorized as RouterLinkedField, so if routerField is nullish, we use the field itself field = routerField ?? field; } const widget = formFieldsQueryBuilderConfig.widgets[field.type]; if (!("factory" in widget)) { return null; } const Component = widget.factory; const options = getUIOptionsForSelect(field); const fieldIdentifier = getFieldIdentifier(field); return (
{ setResponse(() => { return { ...response, [field.id]: { label: field.label, identifier: field?.identifier, value: getFieldResponseForJsonLogic({ field, value }), }, }; }); }} />
); })} ); } export const FormInputFieldsSkeleton = () => { const numberOfFields = 5; return ( <> {Array.from({ length: numberOfFields }).map((_, index) => (
))} ); };