+ );
+};
+
+export const WorkflowSchemaFieldsForm = ({
+ contract,
+ schema,
+ onSubmit,
+ onDirtyChange,
+}: WorkflowSchemaFieldsFormProps) => {
+ const [projection] = useState(() => projectWorkflowSchema(schema));
+ const [rows, setRows] = useState(projection.rows);
+ const nextId = useRef(0);
+ const markDirty = (): void => onDirtyChange?.(true);
+ const createId = (): string => `new-field-${nextId.current++}`;
+ const update = (
+ id: string,
+ updater: (row: WorkflowSchemaFieldRow) => WorkflowSchemaFieldRow,
+ ): void => {
+ setRows((current) => updateTree(current, id, updater));
+ markDirty();
+ };
+ const remove = (id: string): void => {
+ setRows((current) => removeFromTree(current, id));
+ markDirty();
+ };
+ const submit = (event: FormEvent