options method

  1. @override
Future<OptionsPage> options(
  1. String resourceKey, {
  2. required String field,
  3. Object? recordId,
  4. required Map<String, dynamic> values,
  5. required String query,
})
override

POST /{resource}/options — the options for a select whose list /schema refused to inline.

values carries the form's current state because options depend on siblings: a pilot measured a dependent picker narrowing 6 -> 2 -> 1 as its parent changed. Sending an empty map makes every dependent select wrong.

Implementation

@override
Future<OptionsPage> options(
  String resourceKey, {
  required String field,
  Object? recordId,
  required Map<String, dynamic> values,
  required String query,
}) async {
  final response = await _transport.post('$prefix/$resourceKey/options', {
    'field': field,
    'record_id': recordId,
    'state': values,
    'q': query,
  });

  // Like `state()` and unlike the writes: there is no data-carrying failure
  // outcome to return, so a non-2xx throws rather than letting an error
  // body's absent `options` key parse as "this select has none" — a silently
  // empty picker is indistinguishable from a genuine empty result.
  if (response.statusCode < 200 || response.statusCode >= 300) {
    throw FilamentTransportException(_messageOf(response.body));
  }

  final raw = response.body['options'];

  return OptionsPage(
    options: [
      if (raw is List)
        for (final entry in raw)
          if (entry is Map<String, dynamic> && entry['value'] != null)
            SelectOption(
              value: entry['value'] as Object,
              label: '${entry['label'] ?? entry['value']}',
            ),
    ],
    hasMore: response.body['hasMore'] == true,
  );
}