Commit 26c27ebc authored by Hawkeye Tenderwolf's avatar Hawkeye Tenderwolf Committed by Mateu Aguiló Bosch
Browse files

Issue #3254676 by hawkeye.twolf, e0ipso: Sort and group Widget Type selection field

parent 4330e7bf
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -5,8 +5,12 @@
 * Provides a widget instance entity type.
 */

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\widget_instance\WidgetInstanceInterface;
use Drupal\widget_type\WidgetTypeInterface;

/**
 * Implements hook_theme().
@@ -69,3 +73,41 @@ function widget_instance_theme_suggestions_widget_instance(array $variables) {
  return $suggestions;
}

/**
 * Implements hook_options_list_alter().
 */
function widget_instance_options_list_alter(array &$options, array $context) {
  $field_definition = $context['fieldDefinition'] ?? NULL;
  if (!$field_definition instanceof FieldStorageDefinitionInterface) {
    return;
  }
  if ($field_definition->getType() !== 'entity_reference') {
    return;
  }
  if ($field_definition->getSetting('target_type') !== 'widget_type') {
    return;
  }
  $widget_type_ids = array_keys($options);
  $widget_types = \Drupal::entityTypeManager()
    ->getStorage('widget_type')
    ->loadMultiple($widget_type_ids);
  $options = array_reduce(
    $widget_types,
    static function (array $carry, WidgetTypeInterface $widget_type): array {
      $registry_source = $widget_type->widget_registry_source->entity ?? NULL;
      $option_group = (string) new TranslatableMarkup('Other');
      if ($registry_source instanceof EntityInterface) {
        $option_group = $registry_source->label();
      }
      $carry[$option_group][$widget_type->id()] = $widget_type->label();
      return $carry;
    },
    []
  );
  // Sort option groups.
  ksort($options);
  // Sort options within groups.
  array_walk($options, static function (array &$option_group): void {
    sort($option_group);
  });
}