+ {type === 'boolean' ? (
+
+ {isTaxonTreeSelector && !taxonTreeAvailable ? (
+ setupToolText.emptyTaxonTree()
+ ) : (
+
+
+ handleChange(fieldName, isChecked)
+ }
+ />
+ {!inTable && label}
+
+ )}
+
+ ) : type === 'select' && Array.isArray(options) ? (
+
+ {!inTable && {label}}
+
+
+ ) : type === 'password' ? (
+ <>
+
+ {!inTable && label}
+ {
+ handleChange(fieldName, value);
+ if (passwordRepeat !== undefined && formRef.current) {
+ const target = formRef.current.elements.namedItem(
+ passwordRepeat.name
+ ) as HTMLInputElement | null;
+
+ if (target) {
+ target.setCustomValidity(
+ target.value && target.value === value
+ ? ''
+ : userText.passwordsDoNotMatchError()
+ );
+ }
+ }
+ }}
+ />
+
+
+ {passwordRepeat === undefined ? null : (
+
+ {!inTable && passwordRepeat.label}
+ {
+ target.setCustomValidity(
+ target.value ===
+ getFormValue(formData, currentStep, fieldName)
+ ? ''
+ : userText.passwordsDoNotMatchError()
+ );
+ }}
+ onValueChange={(value) =>
+ setTemporaryFormData((previous) => ({
+ ...previous,
+ [passwordRepeat.name]: value,
+ }))
+ }
+ />
+
+ )}
+ >
+ ) : type === 'object' ? (
+ // Subforms
+
+
+ {label}
+
+ {fields
+ ? renderFormFields(fields, fieldName, isTable === true)
+ : null}
+
+ ) : type === 'tree' ? (
+ showTreeSelector ? (
+ // Taxon tree selection
+
+ {label}
+
+ {setupToolText.selectATree()}
+
+ {(() => {
+ // Display the selected tree
+ const selectedTree = getFormValue(
+ formData,
+ currentStep,
+ fieldName
+ );
+ if (selectedTree && typeof selectedTree === 'object') {
+ const tree = selectedTree as TaxonFileDefaultDefinition;
+ return (
+
+
+
{tree.title}
+
+ {tree.description}
+
+
{`${treeText.source()}: ${tree.src}`}
+
+
+ );
+ }
+ return null;
+ })()}
+ {isTreeDialogOpen ? (
+
+ ) : null}
+
+ ) : null
+ ) : (
+
+ {!inTable && label}
+ handleChange(fieldName, value)}
+ />
+
+ )}
+
+ );
+ };
+
+ const renderFormFields = (
+ fields: RA