Commit 8050ecd8 authored by Alex Pott's avatar Alex Pott Committed by Jacob Rockowitz
Browse files

Issue #3221398 by alexpott, jrockowitz, paulocs: [Drupal 9.x] Update use of...

Issue #3221398 by alexpott, jrockowitz, paulocs: [Drupal 9.x] Update use of date_time_callbacks and date_date_callbacks in Webform
parent b031332a
Loading
Loading
Loading
Loading
+5 −76
Changes for includes/webform.date.inc: 5 added lines, 76 removed lines.
Original line number Diff line number Diff line
@@ -7,7 +7,8 @@

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Datetime\DateHelper;
use Drupal\webform\Plugin\WebformElement\DateList;
use Drupal\webform\Plugin\WebformElement\DateTime;

/**
 * Callback for removing abbreviation from datelist.
@@ -22,12 +23,7 @@ use Drupal\Core\Datetime\DateHelper;
 * @see \Drupal\Core\Datetime\Element\Datelist::processDatelist
 */
function _webform_datelist_date_date_callback(array &$element, FormStateInterface $form_state, $date) {
  $no_abbreviate = (isset($element['#date_abbreviate']) && $element['#date_abbreviate'] === FALSE);
  if ($no_abbreviate && isset($element['month']) && isset($element['month']['#options'])) {
    // Load translated date part labels from the appropriate calendar plugin.
    $date_helper = new DateHelper();
    $element['month']['#options'] = $date_helper->monthNames($element['#required']);
  }
  DateList::dateListCallback($element, $form_state, $date);
}

/**
@@ -43,22 +39,7 @@ function _webform_datelist_date_date_callback(array &$element, FormStateInterfac
 * @see \Drupal\webform\Plugin\WebformElement\DateTime::prepare
 */
function _webform_datetime_date(array &$element, FormStateInterface $form_state, DrupalDateTime $date = NULL) {
  // Make sure the date element is being displayed.
  if (!isset($element['date'])) {
    return;
  }

  $type = $element['#date_date_element'] ?? 'date';
  switch ($type) {
    case 'datepicker':
      // Convert #type from datepicker to textfield.
      $element['date']['#type'] = 'textfield';

      // Must manually set 'data-drupal-date-format' to trigger date picker.
      // @see \Drupal\Core\Render\Element\Date::processDate
      $element['date']['#attributes']['data-drupal-date-format'] = [$element['date']['#date_date_format']];
      break;
  }
  DateTime::dateCallback($element, $form_state, $date);
}

/**
@@ -74,57 +55,5 @@ function _webform_datetime_date(array &$element, FormStateInterface $form_state,
 * @see \Drupal\webform\Plugin\WebformElement\DateTime::prepare
 */
function _webform_datetime_time(array &$element, FormStateInterface $form_state, DrupalDateTime $date = NULL) {
  // Make sure the time element is being displayed.
  if (!isset($element['time'])) {
    return;
  }

  // Apply time specific min/max to the element.
  foreach (['min', 'max'] as $property) {
    if (!empty($element["#date_time_$property"])) {
      $value = $element["#date_time_$property"];
    }
    elseif (!empty($element["#date_$property"])) {
      $value = date('H:i:s', strtotime($element["#date_$property"]));
    }
    else {
      $value = NULL;
    }
    if ($value) {
      $element['time']["#$property"] = $value;
      $element['time']['#attributes'][$property] = $value;
    }
  }

  // Apply time step and format to the element.
  if (!empty($element['#date_time_step'])) {
    $element['time']['#step'] = $element['#date_time_step'];
    $element['time']['#attributes']['step'] = $element['#date_time_step'];
  }
  if (!empty($element['#date_time_format'])) {
    $element['time']['#time_format'] = $element['#date_time_format'];
  }

  // Remove extra attributes for date element.
  unset(
    $element['time']['#attributes']['data-min-year'],
    $element['time']['#attributes']['data-max-year']
  );

  $type = $element['#date_time_element'] ?? 'time';

  switch ($type) {
    case 'timepicker':
      $element['time']['#type'] = 'webform_time';
      $element['time']['#timepicker'] = TRUE;
      break;

    case 'time':
      $element['time']['#type'] = 'webform_time';
      break;

    case 'text':
      $element['time']['#element_validate'][] = ['\Drupal\webform\Element\WebformTime', 'validateWebformTime'];
      break;
  }
  DateTime::timeCallback($element, $form_state, $date);
}
+32 −2
Changes for src/Plugin/WebformElement/DateList.php: 32 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -2,10 +2,12 @@

namespace Drupal\webform\Plugin\WebformElement;

use Drupal\Core\Datetime\DateHelper;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Datetime\Element\Datelist as DatelistElement;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Security\TrustedCallbackInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\webform\WebformSubmissionConditionsValidator;
use Drupal\webform\WebformSubmissionInterface;
@@ -21,7 +23,7 @@ use Drupal\webform\WebformSubmissionInterface;
 *   category = @Translation("Date/time elements"),
 * )
 */
class DateList extends DateBase {
class DateList extends DateBase implements TrustedCallbackInterface {

  /**
   * {@inheritdoc}
@@ -57,7 +59,7 @@ class DateList extends DateBase {
    // Remove month abbreviation.
    // @see \Drupal\Core\Datetime\Element\Datelist::processDatelist
    if (isset($element['#date_abbreviate']) && $element['#date_abbreviate'] === FALSE) {
      $element['#date_date_callbacks'][] = '_webform_datelist_date_date_callback';
      $element['#date_date_callbacks'][] = floatval(\Drupal::VERSION) >= 9.3 ? [DateList::class, 'dateListCallback'] : '_webform_datelist_date_date_callback';
    }

    // Remove 'for' from the element's label.
@@ -296,4 +298,32 @@ class DateList extends DateBase {
    }
  }

  /**
   * Callback for removing abbreviation from datelist.
   *
   * @param array $element
   *   The element.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state.
   * @param \Drupal\Core\Datetime\DrupalDateTime|null $date
   *   The date value.
   *
   * @see \Drupal\Core\Datetime\Element\Datelist::processDatelist
   */
  public static function dateListCallback(array &$element, FormStateInterface $form_state, $date) {
    $no_abbreviate = (isset($element['#date_abbreviate']) && $element['#date_abbreviate'] === FALSE);
    if ($no_abbreviate && isset($element['month']) && isset($element['month']['#options'])) {
      // Load translated date part labels from the appropriate calendar plugin.
      $date_helper = new DateHelper();
      $element['month']['#options'] = $date_helper->monthNames($element['#required']);
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function trustedCallbacks() {
    return array_merge(['dateListCallback'], parent::trustedCallbacks());
  }

}
+110 −3
Changes for src/Plugin/WebformElement/DateTime.php: 110 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ namespace Drupal\webform\Plugin\WebformElement;
use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Datetime\Entity\DateFormat;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Security\TrustedCallbackInterface;
use Drupal\webform\WebformSubmissionConditionsValidator;
use Drupal\webform\WebformSubmissionInterface;

@@ -19,7 +20,7 @@ use Drupal\webform\WebformSubmissionInterface;
 *   category = @Translation("Date/time elements"),
 * )
 */
class DateTime extends DateBase {
class DateTime extends DateBase implements TrustedCallbackInterface {

  /**
   * {@inheritdoc}
@@ -113,7 +114,7 @@ class DateTime extends DateBase {
    }

    // Add date callback.
    $element['#date_date_callbacks'][] = '_webform_datetime_date';
    $element['#date_date_callbacks'][] = floatval(\Drupal::VERSION) >= 9.3 ? [DateTime::class, 'dateCallback'] : '_webform_datetime_date';

    /* Time */

@@ -123,7 +124,7 @@ class DateTime extends DateBase {
    }

    // Add time callback.
    $element['#date_time_callbacks'][] = '_webform_datetime_time';
    $element['#date_time_callbacks'][] = floatval(\Drupal::VERSION) >= 9.3 ? [DateTime::class, 'timeCallback'] : '_webform_datetime_time';

    // Prepare element after date/time formats have been updated.
    parent::prepare($element, $webform_submission);
@@ -425,4 +426,110 @@ class DateTime extends DateBase {
    return $properties;
  }

  /**
   * Callback for custom datetime date element.
   *
   * @param array $element
   *   The element.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state.
   * @param \Drupal\Core\Datetime\DrupalDateTime|null $date
   *   The date value.
   *
   * @see \Drupal\webform\Plugin\WebformElement\DateTime::prepare
   */
  public static function dateCallback(array &$element, FormStateInterface $form_state, DrupalDateTime $date = NULL) {
    // Make sure the date element is being displayed.
    if (!isset($element['date'])) {
      return;
    }

    $type = (isset($element['#date_date_element'])) ? $element['#date_date_element'] : 'date';
    switch ($type) {
      case 'datepicker':
        // Convert #type from datepicker to textfield.
        $element['date']['#type'] = 'textfield';

        // Must manually set 'data-drupal-date-format' to trigger date picker.
        // @see \Drupal\Core\Render\Element\Date::processDate
        $element['date']['#attributes']['data-drupal-date-format'] = [$element['date']['#date_date_format']];
        break;
    }
  }

  /**
   * Callback for custom datetime time element.
   *
   * @param array $element
   *   The element.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form state.
   * @param \Drupal\Core\Datetime\DrupalDateTime|null $date
   *   The date value.
   *
   * @see \Drupal\webform\Plugin\WebformElement\DateTime::prepare
   */
  public static function timeCallback(array &$element, FormStateInterface $form_state, DrupalDateTime $date = NULL) {
    // Make sure the time element is being displayed.
    if (!isset($element['time'])) {
      return;
    }

    // Apply time specific min/max to the element.
    foreach (['min', 'max'] as $property) {
      if (!empty($element["#date_time_$property"])) {
        $value = $element["#date_time_$property"];
      }
      elseif (!empty($element["#date_$property"])) {
        $value = date('H:i:s', strtotime($element["#date_$property"]));
      }
      else {
        $value = NULL;
      }
      if ($value) {
        $element['time']["#$property"] = $value;
        $element['time']['#attributes'][$property] = $value;
      }
    }

    // Apply time step and format to the element.
    if (!empty($element['#date_time_step'])) {
      $element['time']['#step'] = $element['#date_time_step'];
      $element['time']['#attributes']['step'] = $element['#date_time_step'];
    }
    if (!empty($element['#date_time_format'])) {
      $element['time']['#time_format'] = $element['#date_time_format'];
    }

    // Remove extra attributes for date element.
    unset(
      $element['time']['#attributes']['data-min-year'],
      $element['time']['#attributes']['data-max-year']
    );

    $type = $element['#date_time_element'] ?? 'time';

    switch ($type) {
      case 'timepicker':
        $element['time']['#type'] = 'webform_time';
        $element['time']['#timepicker'] = TRUE;
        break;

      case 'time':
        $element['time']['#type'] = 'webform_time';
        break;

      case 'text':
        $element['time']['#element_validate'][] = ['\Drupal\webform\Element\WebformTime', 'validateWebformTime'];
        break;
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function trustedCallbacks() {
    return array_merge(['dateCallback', 'timeCallback'], parent::trustedCallbacks());
  }

}