From 2a7450700135d232c41409aaffcb1b5460eb6070 Mon Sep 17 00:00:00 2001
From: Owen Bush <owen.bush@lullabot.com>
Date: Fri, 26 May 2023 17:26:03 -0600
Subject: [PATCH] Sync with patch
 recurring_events-fix-event-instance-language-3318666-1.patch

---
 recurring_events.module                     | 28 +++++++++++++++++
 src/Entity/EventInstance.php                |  9 ++++--
 src/EventCreationService.php                | 35 ++++++++++++++++++---
 src/Plugin/ComputedField/EventInstances.php |  1 +
 4 files changed, 66 insertions(+), 7 deletions(-)

diff --git a/recurring_events.module b/recurring_events.module
index cfe4749f..056d83bc 100644
--- a/recurring_events.module
+++ b/recurring_events.module
@@ -176,6 +176,33 @@ function recurring_events_eventseries_insert(EntityInterface $entity) {
   }
 }
 
+/**
+ * Implements hook_ENTITY_TYPE_translation_insert().
+ */
+function recurring_events_eventseries_translation_insert(EntityInterface $translation) {
+  if (\Drupal::isConfigSyncing()) {
+    return;
+  }
+  $creation_service = \Drupal::service('recurring_events.event_creation_service');
+  $creation_service->createInstances($translation);
+
+  $instances = $translation->event_instances->referencedEntities();
+  if (!empty($instances)) {
+    foreach ($instances as $instance) {
+      if ($instance->hasTranslation($translation->language()->getId())) {
+        $instance = $instance->getTranslation($translation->language()->getId());
+      }
+      $instance->set('eventseries_id', $translation->id());
+      $instance->setNewRevision(FALSE);
+
+      $creation_service->configureDefaultInheritances($instance, $translation->id());
+      $creation_service->updateInstanceStatus($instance, $translation);
+
+      $instance->save();
+    }
+  }
+}
+
 /**
  * Implements hook_ENTITY_TYPE_insert().
  */
@@ -727,6 +754,7 @@ function recurring_events_entity_base_field_info_alter(&$fields, EntityTypeInter
         'weight' => 0,
       ])
       ->setDisplayConfigurable('form', FALSE)
+      ->setTranslatable(TRUE)
       ->setClass(EventInstances::class);
   }
 }
diff --git a/src/Entity/EventInstance.php b/src/Entity/EventInstance.php
index 095cb3f4..530ceb16 100644
--- a/src/Entity/EventInstance.php
+++ b/src/Entity/EventInstance.php
@@ -368,7 +368,8 @@ class EventInstance extends EditorialContentEntityBase implements EventInterface
     $fields['eventseries_id'] = BaseFieldDefinition::create('entity_reference')
       ->setLabel(t('Event Series ID'))
       ->setDescription(t('The ID of the event series entity.'))
-      ->setSetting('target_type', 'eventseries');
+      ->setSetting('target_type', 'eventseries')
+      ->setTranslatable(TRUE);
 
     $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
@@ -410,7 +411,11 @@ class EventInstance extends EditorialContentEntityBase implements EventInterface
    *   The event series.
    */
   public function getEventSeries() {
-    return $this->get('eventseries_id')->entity;
+    $entity = $this->get('eventseries_id')->entity;
+    if ($entity->hasTranslation($this->language()->getId())) {
+      return $entity->getTranslation($this->language()->getId());
+    }
+    return $entity;
   }
 
 }
diff --git a/src/EventCreationService.php b/src/EventCreationService.php
index cb295ed4..b504f048 100644
--- a/src/EventCreationService.php
+++ b/src/EventCreationService.php
@@ -44,9 +44,9 @@ class EventCreationService {
   /**
    * Logger Factory.
    *
-   * @var \Drupal\Core\Logger\LoggerChannelFactoryInterface
+   * @var \Drupal\Core\Logger\LoggerChannel
    */
-  protected $loggerFactory;
+  protected $loggerChannel;
 
   /**
    * The messenger service.
@@ -115,7 +115,7 @@ class EventCreationService {
   public function __construct(TranslationInterface $translation, Connection $database, LoggerChannelFactoryInterface $logger, Messenger $messenger, FieldTypePluginManager $field_type_plugin_manager, EntityFieldManager $entity_field_manager, ModuleHandler $module_handler, EntityTypeManagerInterface $entity_type_manager, KeyValueFactoryInterface $key_value) {
     $this->translation = $translation;
     $this->database = $database;
-    $this->loggerFactory = $logger->get('recurring_events');
+    $this->loggerChannel = $logger->get('recurring_events');
     $this->messenger = $messenger;
     $this->fieldTypePluginManager = $field_type_plugin_manager;
     $this->entityFieldManager = $entity_field_manager;
@@ -528,8 +528,33 @@ class EventCreationService {
 
     $this->moduleHandler->alter('recurring_events_event_instance', $data);
 
-    $entity = $this->entityTypeManager->getStorage('eventinstance')->create($data);
-    $entity->save();
+    $storage = $this->entityTypeManager->getStorage('eventinstance');
+    if ($event->isDefaultTranslation()) {
+      $entity = $storage->create($data);
+    }
+    else {
+      $original = $event->getUntranslated();
+      $entity_ids = $storage->getQuery()
+        ->condition('date__value', $data['date']['value'])
+        ->condition('date__end_value', $data['date']['end_value'])
+        ->condition('eventseries_id', $data['eventseries_id'])
+        ->condition('type', $data['type'])
+        ->condition('langcode', $original->language()->getId())
+        ->accessCheck(FALSE)
+        ->execute();
+
+      if (!empty($entity_ids)) {
+        $entity = $storage->load(reset($entity_ids));
+        $entity->addTranslation($event->language()->getId(), $data);
+      }
+    }
+
+    if ($entity) {
+      $entity->save();
+    }
+    else {
+      $this->loggerChannel->warning('Missing event instance in default language. Translation could not be created');
+    }
 
     return $entity;
   }
diff --git a/src/Plugin/ComputedField/EventInstances.php b/src/Plugin/ComputedField/EventInstances.php
index e5efd463..294679ac 100644
--- a/src/Plugin/ComputedField/EventInstances.php
+++ b/src/Plugin/ComputedField/EventInstances.php
@@ -20,6 +20,7 @@ class EventInstances extends EntityReferenceFieldItemList {
     if (!empty($entity->id())) {
       $instances = \Drupal::entityTypeManager()->getStorage('eventinstance')->loadByProperties([
         'eventseries_id' => $entity->id(),
+        'langcode' => $this->getLangcode(),
       ]);
 
       // Sort by instance start date and reindex by field item delta, as
-- 
GitLab