Skip to content

Reference Fields

ReferenceField lets users select from a list of reference options, such as entity records, with multiple layout and data provider options.

Basic Configuration

dart
ReferenceField(
  name: 'instructor',
  title: 'Instructor',
  provider: StaticReferenceProviderConfiguration(
    options: [
      ReferenceOption(id: 'INS001', title: 'Dr. Alice Smith'),
      ReferenceOption(id: 'INS002', title: 'Prof. Bob Jones'),
      ReferenceOption(id: 'INS003', title: 'Dr. Carol Williams'),
    ],
  ),
  allowMultiple: false,
  allowCreate: false,
)

Properties

PropertyTypeDefaultDescription
providerReferenceDataProviderConfiguration?nullData source for options
allowMultipleboolfalseMulti-select mode
maxSelectionsint?nullMaximum selections (0 = unlimited)
minSelectionsint?nullMinimum selections required
allowCreateboolfalseAllow creating new items

Data Providers

Reference fields use provider configurations to fetch options. The built-in provider is StaticReferenceProviderConfiguration for static option lists. Every provider can implement option search, fetch by id, fetch many by id, and optionally creation.

At runtime, custom providers are registered through the vyuh_feature_forms ReferenceFieldDescriptor with provider TypeDescriptors:

dart
ReferenceFieldDescriptor(
  providers: [
    StaticReferenceProviderConfiguration.typeDescriptor,
    MyEntityProviderConfiguration.typeDescriptor,
  ],
)

For the visual editor, vyuh_form_editor uses editor-side ProviderType factories instead:

dart
FormEditorDescriptor.withDefaults(
  fieldTypes: [
    ReferenceFieldDescriptor(
      providers: [
        staticProviderType(),
        myEntityProviderType(['course', 'instructor']),
      ],
    ),
  ],
)

ProviderType keeps visual-authoring state self-contained and converts to or from a runtime ReferenceDataProviderConfiguration during import/export.

Layout Options

ReferenceField supports 6 different layouts:

Autocomplete (Default)

Type-ahead search with suggestions dropdown:

dart
ReferenceField(
  name: 'instructor',
  title: 'Instructor',
  provider: provider,
  layout: AutocompleteReferenceLayout(
    minSearchLength: 1,
    searchDelay: 300,
    maxSuggestions: 10,
    showSubtitle: true,
    clearable: true,
  ),
)

Standard dropdown select:

dart
ReferenceField(
  name: 'department',
  title: 'Department',
  provider: provider,
  layout: DropdownReferenceLayout(
    showSearch: true,
    dropdownMaxHeight: 300,
    clearable: true,
    dense: false,
  ),
)

Chips

Chip/tag selection, especially good for multi-select:

dart
ReferenceField(
  name: 'prerequisites',
  title: 'Prerequisites',
  provider: provider,
  allowMultiple: true,
  layout: ChipsReferenceLayout(
    wrapChips: true,
    chipSize: 'medium',
    useAutocomplete: true,
    showCount: true,
  ),
)

Radio

Radio button group for single selection with limited options:

dart
ReferenceField(
  name: 'exam_center',
  title: 'Exam Center',
  provider: provider,
  layout: RadioReferenceLayout(
    direction: 'vertical',
    showDescription: true,
  ),
)

Checkbox

Checkbox group for multi-select with limited options:

dart
ReferenceField(
  name: 'electives',
  title: 'Elective Courses',
  provider: provider,
  allowMultiple: true,
  layout: CheckboxReferenceLayout(
    direction: 'vertical',
    showDescription: true,
    columns: 2,
  ),
)

Barcode Scanner

Scan a barcode or QR code to select a reference:

dart
ReferenceField(
  name: 'equipment',
  title: 'Equipment',
  provider: provider,
  layout: BarcodeScannerReferenceLayout(
    fullscreenScanner: true,
    showTorchButton: true,
    showSelectedValue: true,
    clearable: true,
    validationPattern: r'^EQ-\d{6}$',
  ),
)

Multi-Select Configuration

dart
ReferenceField(
  name: 'enrolled_courses',
  title: 'Enrolled Courses',
  provider: courseProvider,
  allowMultiple: true,
  minSelections: 1,
  maxSelections: 5,
)

When allowMultiple is true, the FormControl type becomes FormControl<List<String>>.

Field Dependencies

Providers can declare formFieldDependencies to feed current form values into option queries. The reference field container watches those dependency controls and refreshes options when they change.

DSL Usage

dart
.reference('instructor', title: 'Instructor')
  .required()
  .help('Select the lead instructor')

Registration

Reference fields with custom providers require descriptor registration:

dart
// In feature registration
ReferenceFieldDescriptor(
  layouts: [
    AutocompleteReferenceLayout.typeDescriptor,
    DropdownReferenceLayout.typeDescriptor,
    ChipsReferenceLayout.typeDescriptor,
    RadioReferenceLayout.typeDescriptor,
    CheckboxReferenceLayout.typeDescriptor,
    BarcodeScannerReferenceLayout.typeDescriptor,
  ],
  providers: [
    StaticReferenceProviderConfiguration.typeDescriptor,
    // Add custom providers here
  ],
)

When the same provider should be configurable in the visual editor, register the matching editor ProviderType in the form editor descriptor as shown above.

Next Steps