dynamic-forms / Interface

FormConfig

Generic types:TFields TValue

Configuration interface for defining dynamic form structure and behavior.

This interface defines the complete form schema including field definitions, validation rules, conditional logic, and submission handling using Angular's signal-based reactive forms.

Properties

NameTypeDescription
customFnConfig
CustomFnConfig | undefined

Signal forms adapter configuration.

defaultValidationMessages
ValidationMessages | undefined

Form-level validation messages that act as fallback for field-level messages.

These messages are used when a field has validation errors but no field-level validationMessages are defined for that specific error. This allows you to define common validation messages once at the form level instead of repeating them for each field.

Example usage
defaultValidationMessages: {
  required: 'This field is required',
  email: 'Please enter a valid email address',
  minLength: 'Must be at least {{requiredLength}} characters'
}
fields
TFields

Array of field definitions that define the form structure.

Fields are rendered in the order they appear in this array. Supports nested groups and conditional field visibility.

Example usage
fields: [
  { type: 'input', key: 'firstName', label: 'First Name' },
  { type: 'group', key: 'address', label: 'Address', fields: [
    { type: 'input', key: 'street', label: 'Street' }
  ]}
]
options
FormOptions | undefined

Global form configuration options.

Controls form-wide behavior like validation timing and disabled state.

@value {}

schema
Schema<TValue> | undefined

Optional form-level validation schema.

Provides additional validation beyond field-level validation. Useful for cross-field validation rules.

Example usage
schema: {
  passwordConfirm: validators.equals('password')
}
schemas
SchemaDefinition[] | undefined

Global schemas available to all fields.

Reusable validation schemas that can be referenced by field definitions. Promotes consistency and reduces duplication.

Example usage
schemas: [
  { name: 'addressSchema', schema: {
    street: validators.required,
    zipCode: validators.pattern(/^d{5}$/)
  }}
]
submission
SubmissionConfig<TValue> | undefined

Form submission configuration.

When provided, enables integration with Angular Signal Forms' native submit() function. The submission mechanism is optional - you can still handle submission manually via the (submitted) output if you prefer.

While the submission action is executing, form().submitting() will be true, which automatically disables submit buttons (unless configured otherwise).

Server errors returned from the action will be automatically applied to the corresponding form fields.

Example usage
const config: FormConfig = {
  fields: [...],
  submission: {
    action: async (form) => {
      const value = form().value();
      try {
        await this.api.submit(value);
        return undefined;
      } catch (error) {
        return [{ field: form.email, error: { kind: 'server', message: 'Email exists' }}];
      }
    }
  }
};

Example usage

const formConfig = {
  fields: [
    { type: 'input', key: 'email', value: '', label: 'Email', required: true },
    { type: 'group', key: 'address', label: 'Address', fields: [
      { type: 'input', key: 'street', value: '', label: 'Street' },
      { type: 'input', key: 'city', value: '', label: 'City' }
    ]},
  ],
} as const satisfies FormConfig;

// Infer form value type from config
type FormValue = InferFormValue<typeof formConfig>;