Skip to content
Snippets Groups Projects
Commit 678ee3b5 authored by Owen Bush's avatar Owen Bush Committed by Owen Bush
Browse files

Issue #3090658 by owenbush, naresh_bavaskar, siddhant.bhosale, the_glitch: Add...

Issue #3090658 by owenbush, naresh_bavaskar, siddhant.bhosale, the_glitch: Add Event Series crashes on save when end date or start date isn't selected
parent e13496f3
No related branches found
No related tags found
No related merge requests found
......@@ -127,11 +127,11 @@ class EventSeriesForm extends ContentEntityForm {
$config = \Drupal::config('recurring_events.eventseries.config');
$editing = ($form_state->getBuildInfo()['form_id'] == 'eventseries_edit_form');
/* @var $entity \Drupal\recurring_events\Entity\EventSeries */
$entity = $this->entity;
$editing = ($form_state->getBuildInfo()['form_id'] == 'eventseries_' . $entity->bundle() . '_edit_form');
$form['custom_date']['#states'] = [
'visible' => [
':input[name="recur_type"]' => ['value' => 'custom'],
......@@ -260,8 +260,7 @@ class EventSeriesForm extends ContentEntityForm {
/* @var $entity \Drupal\recurring_events\Entity\EventSeries */
$entity = $this->entity;
$editing = ($form_state->getBuildInfo()['form_id'] == 'eventseries_edit_form');
$editing = ($form_state->getBuildInfo()['form_id'] == 'eventseries_' . $entity->bundle() . '_edit_form');
$trigger = $form_state->getTriggeringElement();
$ignored_triggers = [
......
......@@ -11,6 +11,7 @@ use Drupal\recurring_events\Plugin\RecurringEventsFieldTrait;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\recurring_events\Plugin\Field\FieldType\ConsecutiveRecurringDate;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Plugin implementation of the 'consecutive recurring date' widget.
......@@ -26,6 +27,7 @@ use Drupal\recurring_events\Plugin\Field\FieldType\ConsecutiveRecurringDate;
class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
use RecurringEventsFieldTrait;
use StringTranslationTrait;
/**
* {@inheritdoc}
......@@ -42,8 +44,9 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
],
];
$element['#element_validate'][] = [$this, 'validateThreshold'];
$element['#element_validate'][] = [$this, 'validateForm'];
$element['value']['#title'] = t('Create Events Between');
$element['value']['#title'] = $this->t('Create Events Between');
$element['value']['#weight'] = 1;
$element['value']['#date_date_format'] = DateTimeItemInterface::DATE_STORAGE_FORMAT;
$element['value']['#date_date_element'] = 'date';
......@@ -55,7 +58,7 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
'wrapper' => 'eventseries-edit-form',
];
$element['end_value']['#title'] = t('And');
$element['end_value']['#title'] = $this->t('And');
$element['end_value']['#weight'] = 2;
$element['end_value']['#date_date_format'] = DateTimeItemInterface::DATE_STORAGE_FORMAT;
$element['end_value']['#date_date_element'] = 'date';
......@@ -73,7 +76,7 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
$end_time = end($time_keys);
$element['time'] = [
'#type' => 'select',
'#title' => t('First Event Starts At'),
'#title' => $this->t('First Event Starts At'),
'#options' => $times,
'#default_value' => $items[$delta]->time ?: $start_time,
'#weight' => 3,
......@@ -86,7 +89,7 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
$element['end_time'] = [
'#type' => 'select',
'#title' => t('Final Event Starts At'),
'#title' => $this->t('Final Event Starts At'),
'#options' => $times,
'#default_value' => $items[$delta]->end_time ?: $end_time,
'#weight' => 4,
......@@ -101,7 +104,7 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
$element['duration'] = [
'#type' => 'number',
'#title' => t('Event Duration'),
'#title' => $this->t('Event Duration'),
'#default_value' => $items[$delta]->duration ?: 5,
'#weight' => 5,
'#ajax' => [
......@@ -113,7 +116,7 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
$element['duration_units'] = [
'#type' => 'select',
'#title' => t('Event Duration'),
'#title' => $this->t('Event Duration'),
'#options' => $units,
'#default_value' => $items[$delta]->duration_units ?: 'minute',
'#weight' => 6,
......@@ -147,14 +150,14 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
$element['buffer'] = [
'#type' => 'number',
'#title' => t('Event Buffer'),
'#title' => $this->t('Event Buffer'),
'#default_value' => $items[$delta]->buffer ?: 0,
'#weight' => 7,
];
$element['buffer_units'] = [
'#type' => 'select',
'#title' => t('Event Buffer'),
'#title' => $this->t('Event Buffer'),
'#options' => $units,
'#default_value' => $items[$delta]->buffer_units ?: 'minute',
'#weight' => 8,
......@@ -197,7 +200,9 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
*/
public function changeDuration(array $form, FormStateInterface $form_state) {
$response = new AjaxResponse();
$form_id = $form_state->getBuildInfo()['form_id'] == 'eventseries_edit_form' ? 'eventseries-edit-form' : 'eventseries-add-form';
/* @var $entity \Drupal\recurring_events\Entity\EventSeries */
$entity = $form_state->getformObject()->getEntity();
$form_id = $form_state->getBuildInfo()['form_id'] == 'eventseries_' . $entity->bundle() . '_edit_form' ? 'eventseries-' . $entity->bundle() . '-edit-form' : 'eventseries-' . $entity->bundle() . '-add-form';
$response->addCommand(new HtmlCommand('#' . $form_id, $form));
return $response;
}
......@@ -209,7 +214,7 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
$day_count = $time_count = $total = 0;
$utc_timezone = new \DateTimeZone(DateTimeItemInterface::STORAGE_TIMEZONE);
$form_data = ConsecutiveRecurringDate::convertFormConfigToArray($form_state);
if (!empty($form_data['start_date']) && !empty($form_data['end_date'])) {
if (!empty($form_data['start_date']) && !empty($form_data['end_date']) && !empty($form_data['duration'])) {
$day_count = ConsecutiveRecurringDate::findDailyDatesBetweenDates($form_data['start_date'], $form_data['end_date'], TRUE);
$time_parts = static::convertTimeTo24hourFormat($form_data['time']);
if (!empty($time_parts)) {
......@@ -251,4 +256,60 @@ class ConsecutiveRecurringDateWidget extends DateRangeDefaultWidget {
}
}
/**
* Element validate callback to ensure that widget values are valid.
*
* @param array $element
* An associative array containing the properties and children of the
* generic form element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the form.
* @param array $complete_form
* The complete form structure.
*/
public function validateForm(array &$element, FormStateInterface $form_state, array &$complete_form) {
$recur_type = $form_state->getValue('recur_type');
if ($recur_type[0]['value'] === 'consecutive_recurring_date') {
$values = $form_state->getValue('consecutive_recurring_date');
if (empty($values[0])) {
$form_state->setError($element, $this->t('Please configure the Consecutive Recurring Date settings'));
}
if (!empty($values[0])) {
$values = $values[0];
if (empty($values['value'])) {
$form_state->setError($element['value'], $this->t('Please enter a start date'));
}
if (empty($values['end_value'])) {
$form_state->setError($element['end_value'], $this->t('Please enter an end date'));
}
if (empty($values['time'])) {
$form_state->setError($element['time'], $this->t('Please enter a start time'));
}
if (empty($values['end_time'])) {
$form_state->setError($element['end_time'], $this->t('Please enter an end time'));
}
if (empty($values['duration']) || $values['duration'] < 1) {
$form_state->setError($element['duration'], $this->t('Please enter a duration greater than 0'));
}
if (empty($values['duration_units']) || !isset($complete_form['consecutive_recurring_date']['widget'][0]['duration_units']['#options'][$values['duration_units']])) {
$form_state->setError($element['duration_units'], $this->t('Please select a duration units value from the list'));
}
if (!isset($values['buffer']) || $values['buffer'] === '' || $values['buffer'] < 0) {
$form_state->setError($element['buffer'], $this->t('Please enter a buffer greater than or equal to 0'));
}
if (empty($values['buffer_units']) || !isset($complete_form['consecutive_recurring_date']['widget'][0]['buffer_units']['#options'][$values['buffer_units']])) {
$form_state->setError($element['buffer_units'], $this->t('Please select a buffer units value from the list'));
}
}
}
}
}
......@@ -8,6 +8,7 @@ use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
use Drupal\recurring_events\Plugin\RecurringEventsFieldTrait;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Plugin implementation of the 'daily recurring date' widget.
......@@ -23,6 +24,7 @@ use Drupal\recurring_events\Plugin\RecurringEventsFieldTrait;
class DailyRecurringDateWidget extends DateRangeDefaultWidget {
use RecurringEventsFieldTrait;
use StringTranslationTrait;
/**
* {@inheritdoc}
......@@ -36,15 +38,16 @@ class DailyRecurringDateWidget extends DateRangeDefaultWidget {
':input[name="recur_type"]' => ['value' => 'daily_recurring_date'],
],
];
$element['#element_validate'][] = [$this, 'validateForm'];
$element['value']['#title'] = t('Create Events Between');
$element['value']['#title'] = $this->t('Create Events Between');
$element['value']['#weight'] = 1;
$element['value']['#date_date_format'] = DateTimeItemInterface::DATE_STORAGE_FORMAT;
$element['value']['#date_date_element'] = 'date';
$element['value']['#date_time_format'] = '';
$element['value']['#date_time_element'] = 'none';
$element['end_value']['#title'] = t('And');
$element['end_value']['#title'] = $this->t('And');
$element['end_value']['#weight'] = 2;
$element['end_value']['#date_date_format'] = DateTimeItemInterface::DATE_STORAGE_FORMAT;
$element['end_value']['#date_date_element'] = 'date';
......@@ -54,7 +57,7 @@ class DailyRecurringDateWidget extends DateRangeDefaultWidget {
$times = $this->getTimeOptions();
$element['time'] = [
'#type' => 'select',
'#title' => t('Event Start Time'),
'#title' => $this->t('Event Start Time'),
'#options' => $times,
'#default_value' => $items[$delta]->time ?: '',
'#weight' => 3,
......@@ -63,7 +66,7 @@ class DailyRecurringDateWidget extends DateRangeDefaultWidget {
$durations = $this->getDurationOptions();
$element['duration'] = [
'#type' => 'select',
'#title' => t('Event Duration'),
'#title' => $this->t('Event Duration'),
'#options' => $durations,
'#default_value' => $items[$delta]->duration ?: '',
'#weight' => 4,
......@@ -101,4 +104,44 @@ class DailyRecurringDateWidget extends DateRangeDefaultWidget {
return $values;
}
/**
* Element validate callback to ensure that widget values are valid.
*
* @param array $element
* An associative array containing the properties and children of the
* generic form element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the form.
* @param array $complete_form
* The complete form structure.
*/
public function validateForm(array &$element, FormStateInterface $form_state, array &$complete_form) {
$recur_type = $form_state->getValue('recur_type');
if ($recur_type[0]['value'] === 'daily_recurring_date') {
$values = $form_state->getValue('daily_recurring_date');
if (empty($values[0])) {
$form_state->setError($element, $this->t('Please configure the Daily Recurring Date settings'));
}
if (!empty($values[0])) {
$values = $values[0];
if (empty($values['value'])) {
$form_state->setError($element['value'], $this->t('Please enter a start date'));
}
if (empty($values['end_value'])) {
$form_state->setError($element['end_value'], $this->t('Please enter an end date'));
}
if (empty($values['time'])) {
$form_state->setError($element['time'], $this->t('Please enter a start time'));
}
if (empty($values['duration']) || !isset($complete_form['daily_recurring_date']['widget'][0]['duration']['#options'][$values['duration']])) {
$form_state->setError($element['duration'], $this->t('Please select a duration from the list'));
}
}
}
}
}
......@@ -6,6 +6,7 @@ use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Plugin implementation of the 'monthly recurring date' widget.
......@@ -20,6 +21,8 @@ use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
*/
class MonthlyRecurringDateWidget extends WeeklyRecurringDateWidget {
use StringTranslationTrait;
/**
* {@inheritdoc}
*/
......@@ -31,13 +34,14 @@ class MonthlyRecurringDateWidget extends WeeklyRecurringDateWidget {
':input[name="recur_type"]' => ['value' => 'monthly_recurring_date'],
],
];
$element['#element_validate'][] = [$this, 'validateForm'];
$element['type'] = [
'#type' => 'radios',
'#title' => t('Event Recurrence Schedule'),
'#title' => $this->t('Event Recurrence Schedule'),
'#options' => [
'weekday' => t('Recur on Day of Week'),
'monthday' => t('Recur on Day of Month'),
'weekday' => $this->t('Recur on Day of Week'),
'monthday' => $this->t('Recur on Day of Month'),
],
'#default_value' => $items[$delta]->type ?: '',
'#weight' => 5,
......@@ -45,13 +49,13 @@ class MonthlyRecurringDateWidget extends WeeklyRecurringDateWidget {
$element['day_occurrence'] = [
'#type' => 'checkboxes',
'#title' => t('Day Occurrence'),
'#title' => $this->t('Day Occurrence'),
'#options' => [
'first' => t('First'),
'second' => t('Second'),
'third' => t('Third'),
'fourth' => t('Fourth'),
'last' => t('Last'),
'first' => $this->t('First'),
'second' => $this->t('Second'),
'third' => $this->t('Third'),
'fourth' => $this->t('Fourth'),
'last' => $this->t('Last'),
],
'#default_value' => $items[$delta]->day_occurrence ? explode(',', $items[$delta]->day_occurrence) : [],
'#states' => [
......@@ -65,7 +69,7 @@ class MonthlyRecurringDateWidget extends WeeklyRecurringDateWidget {
$days = $this->getDayOptions();
$element['days'] = [
'#type' => 'checkboxes',
'#title' => t('Days of the Week'),
'#title' => $this->t('Days of the Week'),
'#options' => $days,
'#default_value' => $items[$delta]->days ? explode(',', $items[$delta]->days) : [],
'#states' => [
......@@ -79,7 +83,7 @@ class MonthlyRecurringDateWidget extends WeeklyRecurringDateWidget {
$month_days = $this->getMonthDayOptions();
$element['day_of_month'] = [
'#type' => 'checkboxes',
'#title' => t('Days of the Month'),
'#title' => $this->t('Days of the Month'),
'#options' => $month_days,
'#default_value' => $items[$delta]->day_of_month ? explode(',', $items[$delta]->day_of_month) : [],
'#states' => [
......@@ -136,11 +140,82 @@ class MonthlyRecurringDateWidget extends WeeklyRecurringDateWidget {
$date->modify('+1 day');
}
$days[-1] = t('Last');
$days[-1] = $this->t('Last');
\Drupal::moduleHandler()->alter('recurring_events_month_days', $days);
return $days;
}
/**
* Element validate callback to ensure that widget values are valid.
*
* @param array $element
* An associative array containing the properties and children of the
* generic form element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the form.
* @param array $complete_form
* The complete form structure.
*/
public function validateForm(array &$element, FormStateInterface $form_state, array &$complete_form) {
$recur_type = $form_state->getValue('recur_type');
if ($recur_type[0]['value'] === 'monthly_recurring_date') {
$values = $form_state->getValue('monthly_recurring_date');
if (empty($values[0])) {
$form_state->setError($element, $this->t('Please configure the Monthly Recurring Date settings'));
}
if (!empty($values[0])) {
$values = $values[0];
if (empty($values['value'])) {
$form_state->setError($element['value'], $this->t('Please enter a start date'));
}
if (empty($values['end_value'])) {
$form_state->setError($element['end_value'], $this->t('Please enter an end date'));
}
if (empty($values['time'])) {
$form_state->setError($element['time'], $this->t('Please enter a start time'));
}
if (empty($values['duration']) || !isset($complete_form['monthly_recurring_date']['widget'][0]['duration']['#options'][$values['duration']])) {
$form_state->setError($element['duration'], $this->t('Please select a duration from the list'));
}
if (empty($values['type']) || !isset($complete_form['monthly_recurring_date']['widget'][0]['type']['#options'][$values['type']])) {
$form_state->setError($element['type'], $this->t('Please select an event recurrence schedule type from the list'));
}
else {
switch ($values['type']) {
case 'weekday':
$filtered_day_occurrences = array_filter($values['day_occurrence'], function ($value) {
return !empty($value);
});
if (empty($values['day_occurrence']) || empty($filtered_day_occurrences)) {
$form_state->setError($element['day_occurrence'], $this->t('Please select a day occurrence from the list'));
}
$filtered_days = array_filter($values['days'], function ($value) {
return !empty($value);
});
if (empty($values['days']) || empty($filtered_days)) {
$form_state->setError($element['days'], $this->t('Please select week days from the list'));
}
break;
case 'monthday':
$filtered_days = array_filter($values['day_of_month'], function ($value) {
return !empty($value);
});
if (empty($values['day_of_month']) || empty($filtered_days)) {
$form_state->setError($element['day_of_month'], $this->t('Please select days of the month from the list'));
}
break;
}
}
}
}
}
}
......@@ -5,6 +5,7 @@ namespace Drupal\recurring_events\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Plugin implementation of the 'weekly recurring date' widget.
......@@ -19,6 +20,8 @@ use Drupal\Core\Datetime\DrupalDateTime;
*/
class WeeklyRecurringDateWidget extends DailyRecurringDateWidget {
use StringTranslationTrait;
/**
* {@inheritdoc}
*/
......@@ -31,11 +34,12 @@ class WeeklyRecurringDateWidget extends DailyRecurringDateWidget {
':input[name="recur_type"]' => ['value' => 'weekly_recurring_date'],
],
];
$element['#element_validate'][] = [$this, 'validateForm'];
$days = $this->getDayOptions();
$element['days'] = [
'#type' => 'checkboxes',
'#title' => t('Days of the Week'),
'#title' => $this->t('Days of the Week'),
'#options' => $days,
'#default_value' => $items[$delta]->days ? explode(',', $items[$delta]->days) : [],
'#weight' => 5,
......@@ -99,4 +103,53 @@ class WeeklyRecurringDateWidget extends DailyRecurringDateWidget {
return $days;
}
/**
* Element validate callback to ensure that widget values are valid.
*
* @param array $element
* An associative array containing the properties and children of the
* generic form element.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The current state of the form.
* @param array $complete_form
* The complete form structure.
*/
public function validateForm(array &$element, FormStateInterface $form_state, array &$complete_form) {
$recur_type = $form_state->getValue('recur_type');
if ($recur_type[0]['value'] === 'weekly_recurring_date') {
$values = $form_state->getValue('weekly_recurring_date');
if (empty($values[0])) {
$form_state->setError($element, $this->t('Please configure the Weekly Recurring Date settings'));
}
if (!empty($values[0])) {
$values = $values[0];
if (empty($values['value'])) {
$form_state->setError($element['value'], $this->t('Please enter a start date'));
}
if (empty($values['end_value'])) {
$form_state->setError($element['end_value'], $this->t('Please enter an end date'));
}
if (empty($values['time'])) {
$form_state->setError($element['time'], $this->t('Please enter a start time'));
}
if (empty($values['duration']) || !isset($complete_form['weekly_recurring_date']['widget'][0]['duration']['#options'][$values['duration']])) {
$form_state->setError($element['duration'], $this->t('Please select a duration from the list'));
}
$filtered_days = array_filter($values['days'], function ($value) {
return !empty($value);
});
if (empty($values['days']) || empty($filtered_days)) {
$form_state->setError($element['days'], $this->t('Please select week days from the list'));
}
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment