From 1af097202dda76bde861b6bc005a38db2ade2b37 Mon Sep 17 00:00:00 2001
From: Owen Bush <ojb@ukhhf.co.uk>
Date: Sat, 9 Mar 2019 19:51:32 -0700
Subject: [PATCH] Modal verify form

---
 src/Entity/EventSeries.php                    |   2 +-
 src/Form/EventSeriesEditForm.php              | 112 -----------------
 src/Form/EventSeriesForm.php                  | 119 ++++++++++++++++--
 .../Field/FieldType/MonthlyRecurringDate.php  |   2 +-
 .../FieldWidget/WeeklyRecurringDateWidget.php |  10 +-
 5 files changed, 120 insertions(+), 125 deletions(-)
 delete mode 100644 src/Form/EventSeriesEditForm.php

diff --git a/src/Entity/EventSeries.php b/src/Entity/EventSeries.php
index 88e0020f..1734e2bc 100644
--- a/src/Entity/EventSeries.php
+++ b/src/Entity/EventSeries.php
@@ -77,7 +77,7 @@ use Drupal\user\UserInterface;
  *     "views_data" = "Drupal\views\EntityViewsData",
  *     "form" = {
  *       "add" = "Drupal\recurring_events\Form\EventSeriesForm",
- *       "edit" = "Drupal\recurring_events\Form\EventSeriesEditForm",
+ *       "edit" = "Drupal\recurring_events\Form\EventSeriesForm",
  *       "delete" = "Drupal\recurring_events\Form\EventSeriesDeleteForm",
  *       "clone" = "Drupal\recurring_events\Form\EventSeriesCloneForm",
  *     },
diff --git a/src/Form/EventSeriesEditForm.php b/src/Form/EventSeriesEditForm.php
deleted file mode 100644
index 1c75552e..00000000
--- a/src/Form/EventSeriesEditForm.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-
-namespace Drupal\recurring_events\Form;
-
-use Drupal\Core\Form\FormStateInterface;
-
-/**
- * Form controller for the eventseries entity edit form.
- *
- * @ingroup recurring_events
- */
-class EventSeriesEditForm extends EventSeriesForm {
-
-  protected $step = 0;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildForm(array $form, FormStateInterface $form_state) {
-    if ($this->step === 0) {
-      $form = parent::buildForm($form, $form_state);
-      $save_button_label = $this->t('Next');
-    }
-    else {
-      /* @var $entity \Drupal\recurring_events\Entity\EventSeries */
-      $entity = $this->entity;
-
-      // Determine if there have been changes to the saved eventseries.
-      $creation_service = \Drupal::service('recurring_events.event_creation_service');
-      $diff_array = $creation_service->buildDiffArray($entity, $form_state);
-
-      $create_form = parent::buildForm($form, $form_state);
-
-      $form['actions'] = $create_form['actions'];
-      unset($create_form);
-
-      $title = $this->t('Save Changes?');
-      $message = $this->t('No recurrence configuration has been changed so no changes will be made to event instances.');
-      $save_button_label = $this->t('Save');
-
-      if (!empty($diff_array)) {
-        $title = $this->t('Confirm Modifications?');
-        $message = $this->t('Recurrence configuration has been changed, as a result all instances will be removed and recreated. This action cannot be undone.');
-        $save_button_label = $this->t('Save and Recreate Event Instances');
-      }
-
-      $form['title'] = [
-        '#type' => '#markup',
-        '#prefix' => '<h2>',
-        '#markup' => $title,
-        '#suffix' => '</h2>',
-        '#weight' => -10,
-      ];
-      $form['message'] = [
-        '#type' => '#markup',
-        '#prefix' => '<p>',
-        '#markup' => $message,
-        '#suffix' => '</p>',
-        '#weight' => -9,
-      ];
-
-      if (!empty($diff_array)) {
-        $form['diff'] = [
-          '#type' => 'table',
-          '#header' => [
-            $this->t('Data'),
-            $this->t('Stored'),
-            $this->t('Overridden'),
-          ],
-          '#rows' => $diff_array,
-          '#weight' => -8,
-        ];
-      }
-
-      $form['actions']['back'] = [
-        '#type' => 'submit',
-        '#value' => $this->t('Back'),
-      ];
-
-      $form['actions']['delete']['#printed'] = TRUE;
-    }
-
-    $form['actions']['submit']['#value'] = $save_button_label;
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    if ($this->step === 0) {
-      $this->step++;
-      $form_state->setRebuild();
-    }
-    else {
-      $triggering_element = $form_state->getTriggeringElement();
-
-      switch ($triggering_element['#id']) {
-        case 'edit-back':
-          $this->step--;
-          $form_state->setRebuild();
-          break;
-
-        case 'edit-submit':
-          parent::submitForm($form, $form_state);
-          break;
-      }
-    }
-  }
-
-}
diff --git a/src/Form/EventSeriesForm.php b/src/Form/EventSeriesForm.php
index 8388cea2..ad471094 100644
--- a/src/Form/EventSeriesForm.php
+++ b/src/Form/EventSeriesForm.php
@@ -4,6 +4,12 @@ namespace Drupal\recurring_events\Form;
 
 use Drupal\Core\Entity\ContentEntityForm;
 use Drupal\Core\Form\FormStateInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\recurring_events\EventCreationService;
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\OpenModalDialogCommand;
+use Drupal\Core\Entity\EntityStorageInterface;
 
 /**
  * Form controller for the eventseries entity create form.
@@ -12,11 +18,55 @@ use Drupal\Core\Form\FormStateInterface;
  */
 class EventSeriesForm extends ContentEntityForm {
 
+  /**
+   * The event creation service.
+   *
+   * @var Drupal\recurring_events\EventCreationService
+   */
+  protected $creationService;
+
+  /**
+   * The entity storage interface.
+   *
+   * @var Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $storage;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('recurring_events.event_creation_service'),
+      $container->get('entity_type.manager')->getStorage('eventseries'),
+      $container->get('entity.manager')
+    );
+  }
+
+  /**
+   * Construct a EventSeriesEditForm.
+   *
+   * @param \Drupal\recurring_events\EventCreationService $creation_service
+   *   The event creation service.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
+   *   The storage interface.
+   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
+   *   The entity manager service.
+   */
+  public function __construct(EventCreationService $creation_service, EntityStorageInterface $storage, EntityManagerInterface $entity_manager) {
+    $this->creationService = $creation_service;
+    $this->storage = $storage;
+    parent::__construct($entity_manager);
+  }
+
   /**
    * {@inheritdoc}
    */
   public function buildForm(array $form, FormStateInterface $form_state) {
     $form = parent::buildForm($form, $form_state);
+    $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
+
+    $editing = ($form_state->getBuildInfo()['form_id'] == 'eventseries_edit_form');
 
     /* @var $entity \Drupal\recurring_events\Entity\EventSeries */
     $entity = $this->entity;
@@ -57,25 +107,76 @@ class EventSeriesForm extends ContentEntityForm {
       '#wrapper_attributes' => ['class' => ['entity-meta__author']],
     ];
 
+    if ($editing) {
+      $form['actions']['verify'] = [
+        '#type' => 'submit',
+        '#value' => $this->t('Verify Changes'),
+        '#ajax' => [
+          'wrapper' => 'eventseries-edit-form',
+          'callback' => [$this, 'ajaxVerifyChanges'],
+          'method' => 'replace',
+          'effect' => 'fade',
+        ],
+      ];
+    }
+
     return $form;
   }
 
   /**
    * {@inheritdoc}
    */
-  public function save(array $form, FormStateInterface $form_state) {
-    $form_state->setRedirect('entity.eventseries.collection');
-
-    $entity = $this->getEntity();
-    $entity->save();
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    // TODO: Add validation.
+    parent::validateForm($form, $form_state);
   }
 
   /**
    * {@inheritdoc}
    */
-  public function validateForm(array &$form, FormStateInterface $form_state) {
-    // TODO: Add validation.
-    parent::validateForm($form, $form_state);
-  }
+  public function ajaxVerifyChanges(array &$form, FormStateInterface $form_state) {
+    /* @var $entity \Drupal\recurring_events\Entity\EventSeries */
+    $entity = $this->entity;
+    $original = $this->storage->loadUnchanged($entity->id());
+
+    // Determine if there have been changes to the saved eventseries.
+    $diff_array = $this->creationService->buildDiffArray($original, $form_state);
 
+    if (!empty($diff_array)) {
+      $build = [];
+      $build['message'] = [
+        '#type' => '#markup',
+        '#prefix' => '<p>',
+        '#markup' => $this->t('Recurrence configuration has been changed, as a result all instances will be removed and recreated. This action cannot be undone.'),
+        '#suffix' => '</p>',
+        '#weight' => -9,
+      ];
+
+      $build['diff'] = [
+        '#type' => 'table',
+        '#header' => [
+          $this->t('Data'),
+          $this->t('Stored'),
+          $this->t('Overridden'),
+        ],
+        '#rows' => $diff_array,
+        '#weight' => -8,
+      ];
+    }
+    else {
+      $build = [];
+      $build['message'] = [
+        '#type' => '#markup',
+        '#prefix' => '<p>',
+        '#markup' => $this->t('No recurrence configuration has changed. No existing instances will be affected by this update.'),
+        '#suffix' => '</p>',
+        '#weight' => -9,
+      ];
+    }
+
+    $response = new AjaxResponse();
+    $title = $this->t('Check Recurrence Modifications');
+    $response->addCommand(new OpenModalDialogCommand($title, $build, ['width' => '700']));
+    return $response;
+  }
 }
diff --git a/src/Plugin/Field/FieldType/MonthlyRecurringDate.php b/src/Plugin/Field/FieldType/MonthlyRecurringDate.php
index f6e23f9b..1f277086 100644
--- a/src/Plugin/Field/FieldType/MonthlyRecurringDate.php
+++ b/src/Plugin/Field/FieldType/MonthlyRecurringDate.php
@@ -32,7 +32,7 @@ class MonthlyRecurringDate extends WeeklyRecurringDate {
 
     $schema['columns']['day_occurrence'] = [
       'type' => 'varchar',
-      'length' => 20,
+      'length' => 255,
     ];
 
     $schema['columns']['days']['not null'] = FALSE;
diff --git a/src/Plugin/Field/FieldWidget/WeeklyRecurringDateWidget.php b/src/Plugin/Field/FieldWidget/WeeklyRecurringDateWidget.php
index 1c618e33..a97217e1 100644
--- a/src/Plugin/Field/FieldWidget/WeeklyRecurringDateWidget.php
+++ b/src/Plugin/Field/FieldWidget/WeeklyRecurringDateWidget.php
@@ -85,15 +85,21 @@ class WeeklyRecurringDateWidget extends DateRangeDefaultWidget {
       if (empty($item['value'])) {
         $item['value'] = '';
       }
-      else {
+      elseif (!$item['value'] instanceof DrupalDateTime) {
         $item['value'] = substr($item['value'], 0, 10) . 'T12:00:00';
       }
+      else {
+        $item['value']->setTime(12, 0, 0);
+      }
       if (empty($item['end_value'])) {
         $item['end_value'] = '';
       }
-      else {
+      elseif (!$item['end_value'] instanceof DrupalDateTime) {
         $item['end_value'] = substr($item['end_value'], 0, 10) . 'T12:00:00';
       }
+      else {
+        $item['end_value']->setTime(12, 0, 0);
+      }
 
       $item['days'] = array_filter($item['days']);
       if (!empty($item['days'])) {
-- 
GitLab