Commit a8f480f0 authored by catch's avatar catch
Browse files

fix: #3543555 DateTime time only form element cannot be submitted without specifying date format

By: @RichardGaunt
By: @smustgrave
(cherry picked from commit e5b46c6d)
parent 88ad1af6
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -90,8 +90,8 @@ public static function valueCallback(&$element, $input, FormStateInterface $form
      else {
        $date_input = $element['#date_date_element'] != 'none' && !empty($input['date']) ? $input['date'] : '';
        $time_input = $element['#date_time_element'] != 'none' && !empty($input['time']) ? $input['time'] : '';
        $date_format = $element['#date_date_format'] != 'none' ? static::getHtml5DateFormat($element) : '';
        $time_format = $element['#date_time_element'] != 'none' ? static::getHtml5TimeFormat($element) : '';
        $date_format = $element['#date_date_element'] != 'none' && $element['#date_date_format'] != 'none' ? static::getHtml5DateFormat($element) : '';
        $time_format = $element['#date_time_element'] != 'none' && $element['#date_time_format'] != 'none' ? static::getHtml5TimeFormat($element) : '';
      }

      // Seconds will be omitted in a post in case there's no entry.
+38 −0
Original line number Diff line number Diff line
@@ -61,6 +61,14 @@ public function buildForm(array $form, FormStateInterface $form_state): array {
      '#date_time_element' => 'none',
    ];

    // Test time-only element.
    $form['datetime_time_only'] = [
      '#type' => 'datetime',
      '#date_date_element' => 'none',
      '#date_time_element' => 'time',
      '#date_time_format' => 'H:i',
    ];

    $form['submit'] = [
      '#type' => 'submit',
      '#value' => 'Submit',
@@ -95,6 +103,7 @@ public function testNoErrorMetOnFormSubmit(): void {
    // No error expected when a datetime-local element has a valid value.
    $form_state = new FormState();
    $form_state->setValue('datetime_local_picker', ['date' => '2025-02-18T12:00']);
    $form_state->setValue('datetime_time_only', ['time' => '12:00']);
    $this->formBuilder->submitForm($this, $form_state);
    $this->assertEmpty($form_state->getErrors());
  }
@@ -175,4 +184,33 @@ public function testDatetimeLocalProcessDatetime(): void {
    $this->assertArrayNotHasKey('time', $result);
  }

  /**
   * Checks expected values are returned by ::valueCallback().
   *
   * Test only applied to time-only datetime element.
   *
   * @legacy-covers ::valueCallback
   */
  public function testDatetimeTimeOnlyValueCallback(): void {
    $element = [
      '#type' => 'datetime',
      '#date_date_element' => 'none',
      '#date_time_element' => 'time',
      '#date_time_format' => 'H:i:s',
    ];
    $input = [
      'time' => '14:30:00',
    ];
    $form_state = new FormState();
    $form_state->setValue('datetime_time_only', ['time' => '14:30']);

    $result = Datetime::valueCallback($element, $input, $form_state);
    $this->assertIsArray($result);
    $this->assertArrayHasKey('time', $result);
    $this->assertEquals('14:30:00', $result['time']);
    $this->assertArrayHasKey('object', $result);
    $this->assertInstanceOf(DrupalDateTime::class, $result['object']);
    $this->assertEquals('14:30:00', $result['object']->format('H:i:s'));
  }

}