Index: ./modules/widget_engine_domain_access/src/Plugin/EntityReferenceSelection/WidgetSelection.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- ./modules/widget_engine_domain_access/src/Plugin/EntityReferenceSelection/WidgetSelection.php	(revision )
+++ ./modules/widget_engine_domain_access/src/Plugin/EntityReferenceSelection/WidgetSelection.php	(revision )
@@ -0,0 +1,124 @@
+<?php
+
+namespace Drupal\widget_engine_domain_access\Plugin\EntityReferenceSelection;
+
+use Drupal\Component\Utility\Html;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\domain\DomainNegotiatorInterface;
+use Drupal\widget_engine_domain_access\WidgetEngineDomainAccessManager;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides specific access control for the widget entity type.
+ *
+ * @EntityReferenceSelection(
+ *   id = "default:widget",
+ *   label = @Translation("Widget selection"),
+ *   entity_types = {"widget"},
+ *   group = "default",
+ *   weight = 1
+ * )
+ */
+class WidgetSelection extends DefaultSelection {
+
+  /**
+   * Domain negotiator.
+   * 
+   * @var \Drupal\domain\DomainNegotiatorInterface
+   */
+  protected $domain_negotiator;
+
+  /**
+   * Domain access manager.
+   * 
+   * @var \Drupal\widget_engine_domain_access\WidgetEngineDomainAccessManager
+   */
+  protected $domain_access_manager;
+  
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(
+    array $configuration, 
+    $plugin_id, 
+    $plugin_definition, 
+    EntityManagerInterface $entity_manager, 
+    ModuleHandlerInterface $module_handler, 
+    AccountInterface $current_user, 
+    DomainNegotiatorInterface $domainNegotiator, 
+    WidgetEngineDomainAccessManager $domainAccessManager
+  ) {
+    parent::__construct(
+      $configuration, 
+      $plugin_id, 
+      $plugin_definition, 
+      $entity_manager, 
+      $module_handler, 
+      $current_user
+    );
+    
+    $this->domain_negotiator     = $domainNegotiator;
+    $this->domain_access_manager = $domainAccessManager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(
+    ContainerInterface $container,
+    array $configuration,
+    $plugin_id,
+    $plugin_definition
+  ) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity.manager'),
+      $container->get('module_handler'),
+      $container->get('current_user'),
+      $container->get('domain.negotiator'),
+      $container->get('widget_engine_domain_access.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
+    $options        = [];
+    $bundles        = $this->entityManager->getBundleInfo('widget');
+    $bundle_names   = $this->getConfiguration()['target_bundles'] ?: array_keys($bundles);
+    $current_domain = $this->domain_negotiator->getActiveDomain()->getDomainId();
+    $query          = $this->buildEntityQuery($match, $match_operator);
+
+    if ($limit > 0) {
+      $query->range(0, $limit);
+    }
+
+    $result = $query->execute();
+
+    foreach ($bundle_names as $bundle) {
+      if ($sub_widgets = $this->entityManager->getStorage('widget')
+        ->loadByProperties(['type' => $bundle, 'wid' => $result])) {
+        foreach ($sub_widgets as $sub_widget) {
+          $domain_values = $this->domain_access_manager
+            ->getAccessValues($sub_widget);
+          $all_value     = $this->domain_access_manager
+            ->getAllValue($sub_widget);
+
+          if ($all_value || in_array($current_domain, $domain_values)) {
+            $options[$bundle][$sub_widget->id()] = Html::escape($this->entityManager
+              ->getTranslationFromContext($sub_widget)->label());
+          }
+        }
+      }
+    }
+
+    return $options;
+  }
+
+}
