import { PropsWithChildren, useCallback, useEffect, useMemo, useState } from "react"; import type { FormOptions, FormType, SubmissionType } from "../../../interfaces"; import { Card } from "../../../molecules/card/Card"; import { Form } from "../../form/Form"; import { AccessRolesType, dataAccessToSubmissions, FormAccessType, getFormAccess, shouldUpdate, SubmissionAccessType, submissionsToDataAccess, updateSubmissions } from "./FormAccess.utils"; export interface FormAccessProps { form: Partial; roles: any; onSubmit?: Function; options?: FormOptions; } function useFormAccess({ form: formDefinition, roles, onSubmit, options }: FormAccessProps) { const form = useMemo(() => getFormAccess(roles), [roles]); const [submissions, setSubmissions] = useState(() => dataAccessToSubmissions(formDefinition, form)); const onChange = useCallback( (type: string, submission: SubmissionType) => { updateSubmissions(type, submission, submissions, setSubmissions); }, [submissions] ); useEffect(() => { const input = dataAccessToSubmissions(formDefinition, form); if (formDefinition?._id) { if (shouldUpdate("access", submissions.access, input) || shouldUpdate("submissionAccess", submissions.submissionAccess, input)) { setSubmissions(input); } } }, [formDefinition?._id]); return { options, form, type: formDefinition.type, submissions, onChange, onSubmit: () => { onSubmit && onSubmit(submissionsToDataAccess(formDefinition, submissions)); } }; } interface NamedFormAccessProps { name: "access" | "submissionAccess"; form: FormAccessType; submissions: SubmissionAccessType; options: any; onSubmit: any; onChange(name: "access" | "submissionAccess", submission: SubmissionType): void; } function NamedFormAccess({ name, form, submissions, options, onChange, onSubmit, children }: PropsWithChildren) { const [isValid, setIsValid] = useState(true); return ( <> form={form[name]} submission={submissions[name]} onChange={({ data, isValid }) => { isValid && onChange(name, { data: data as unknown as AccessRolesType }); setIsValid(isValid); }} options={options} /> {children}
Elevated permissions allow users to access and modify other user's entities. Assign with caution.
); } export function FormAccess(props: PropsWithChildren) { const { type, form, submissions, options, onChange, onSubmit } = useFormAccess(props); return (
{props.children}
{props.children}

Submission Data Permissions allow you to control who can create, view, and modify form submission data.

  • Own Permissions - These permissions apply if the user is the original creator of the submission data and is listed as the owner of the submission in submission.owner. This allows users to create and edit their own submission data without seeing other user's data.
  • All Permissions - These permissions apply to all submission data regardless of who owns it.
{props.children}

These permissions allow you to give access to a single form's JSON definition so they can render the form.

Typically you will want to allow all of your roles to be able to Read the form definition.

Each form also has an owner at form.owner which is the user who created the form. In some applications users are allowed to create their own forms. In those cases it is helpful to have Owner based permissions as well.

); }