From 8714bcfb61ab7f55925f9598682d86debd870f15 Mon Sep 17 00:00:00 2001
From: s j <sj@1729.be>
Date: Fri, 7 Oct 2022 11:12:10 +0200
Subject: [PATCH] imp: subevent inline entity form

---
 resource_planning.services.yml |  4 ++++
 src/Entity/Event.php           |  3 +++
 src/EventService.php           | 40 ++++++++++++++++++++++++++++++++
 src/EventServiceInterface.php  | 15 ++++++++++++
 src/Form/EventInlineForm.php   | 42 +++++++++++++++++++++++-----------
 5 files changed, 91 insertions(+), 13 deletions(-)
 create mode 100644 src/EventService.php
 create mode 100644 src/EventServiceInterface.php

diff --git a/resource_planning.services.yml b/resource_planning.services.yml
index 630000e..896a823 100644
--- a/resource_planning.services.yml
+++ b/resource_planning.services.yml
@@ -8,6 +8,10 @@ services:
     class: Drupal\resource_planning\CalendarService
     arguments: ['@entity_type.manager']
 
+  resource_planning.event:
+    class: Drupal\resource_planning\EventService
+    arguments: ['@entity_type.manager']
+
   resource_planning.conflict:
     class: Drupal\resource_planning\ConflictService
     arguments: ['@database', '@entity_type.manager']
diff --git a/src/Entity/Event.php b/src/Entity/Event.php
index ad5d350..dccc8f1 100644
--- a/src/Entity/Event.php
+++ b/src/Entity/Event.php
@@ -248,6 +248,9 @@ class Event extends ContentEntityBase implements EventInterface {
       ->setCardinality(BaseFieldDefinition::CARDINALITY_UNLIMITED)
       ->setSettings([
         'target_type' => 'rp_event',
+        'handler_settings' => [
+          'target_bundles' => array_keys(\Drupal::service('resource_planning.event')->getSubEventBundles()),
+        ],
       ])
       ->setDisplayOptions('form', [
         'type' => 'inline_entity_form_complex',
diff --git a/src/EventService.php b/src/EventService.php
new file mode 100644
index 0000000..0653890
--- /dev/null
+++ b/src/EventService.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Drupal\resource_planning;
+
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+
+use Drupal\resource_planning\Entity\EventType;
+
+/**
+ * The Event Service.
+ */
+class EventService implements EventServiceInterface {
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * Constructs a new EventService object.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager) {
+    $this->entityTypeManager = $entity_type_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSubEventBundles() {
+    return array_filter(
+      EventType::loadMultiple(),
+      function ($type) {
+        return $type->isSubEventType();
+      }
+    );
+  }
+
+}
diff --git a/src/EventServiceInterface.php b/src/EventServiceInterface.php
new file mode 100644
index 0000000..2fa8a10
--- /dev/null
+++ b/src/EventServiceInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Drupal\resource_planning;
+
+/**
+ * The EventService Interface.
+ */
+interface EventServiceInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSubEventBundles();
+
+}
diff --git a/src/Form/EventInlineForm.php b/src/Form/EventInlineForm.php
index e06b125..3c1b131 100644
--- a/src/Form/EventInlineForm.php
+++ b/src/Form/EventInlineForm.php
@@ -5,6 +5,10 @@ namespace Drupal\resource_planning\Form;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\inline_entity_form\Form\EntityInlineForm;
 
+use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
+
+
 /**
  * Defines the inline form for event.
  */
@@ -26,18 +30,17 @@ class EventInlineForm extends EntityInlineForm {
    */
   public function getTableFields($bundles) {
     $fields = parent::getTableFields($bundles);
-    /*
-    $fields['start'] = [
-    'type' => 'field',
-    'label' => $this->t('Start'),
-    'weight' => 2,
+    unset($fields['label']);
+    $fields['calendar_id'] = [
+      'type' => 'field',
+      'label' => $this->t('Calendar'),
+      'weight' => 1,
     ];
-    $fields['end'] = [
-    'type' => 'field',
-    'label' => $this->t('End'),
-    'weight' => 3,
+    $fields['date'] = [
+      'type' => 'field',
+      'label' => $this->t('Date'),
+      'weight' => 3,
     ];
-     */
     return $fields;
   }
 
@@ -48,6 +51,19 @@ class EventInlineForm extends EntityInlineForm {
     $entity_form = parent::entityForm($entity_form, $form_state);
     $entity_form['#entity_builders'][] = [get_class($this), 'buildLine'];
 
+    $parent_entity = $form_state->getBuildInfo()['callback_object']->getEntity();
+    $date = new DrupalDateTime(
+      $parent_entity->get('date')->value,
+      DateTimeItemInterface::STORAGE_TIMEZONE
+    );
+    $end_date = new DrupalDateTime(
+      $parent_entity->get('date')->end_value,
+      DateTimeItemInterface::STORAGE_TIMEZONE
+    );
+
+    $entity_form['date']['widget'][0]['value']['#default_value'] = $date;
+    $entity_form['date']['widget'][0]['end_value']['#default_value'] = $end_date;
+
     // Do not show child_ids on sub_events.
     unset($entity_form['name']);
     unset($entity_form['child_ids']);
@@ -64,9 +80,9 @@ class EventInlineForm extends EntityInlineForm {
       $form = $form_state->getFormObject();
       // Set backreference.
       $line->set(
-            'parent_id',
-            $form->getEntity()
-        );
+        'parent_id',
+        $form->getEntity()
+      );
     }
   }
 
-- 
GitLab