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