diff --git a/core/modules/datetime/tests/src/Functional/DateTimeIFETest.php b/core/modules/datetime/tests/src/Functional/DateTimeIFETest.php new file mode 100644 index 0000000000..38744ba18c --- /dev/null +++ b/core/modules/datetime/tests/src/Functional/DateTimeIFETest.php @@ -0,0 +1,142 @@ + '']; + + /** + * {@inheritdoc} + */ + protected function getTestFieldType() { + return 'datetime'; + } + + /** + * Tests Date List Widget functionality. + */ + public function testErrorMessages() { + $field_name = $this->fieldStorage->getName(); + $field_label = $this->field->label(); + + // Change the field to a datetime field. + $this->fieldStorage->setSetting('datetime_type', 'datetime'); + $this->fieldStorage->save(); + + // Test the widget for partial completion of fields. + \Drupal::service('entity_display.repository')->getFormDisplay($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'default') + ->setComponent($field_name, [ + 'type' => 'datetime_datelist', + 'settings' => [ + 'increment' => 1, + 'date_order' => 'YMD', + 'time_type' => '24', + ], + ]) + ->save(); + \Drupal::service('entity_field.manager')->clearCachedFieldDefinitions(); + + // Test the widget for validation notifications. + foreach ($this->datelistDataProvider($field_label) as $data) { + list($date_value, $expected) = $data; + + // Display creation form. + $this->drupalGet('entity_test/add'); + + // Submit a partial date and ensure and error message is provided. + $edit = []; + foreach ($date_value as $part => $value) { + $edit["{$field_name}[0][value][$part]"] = $value; + } + + $this->drupalPostForm(NULL, $edit, t('Save')); + $this->assertResponse(200); + foreach ($expected as $expected_text) { + $this->assertText(t($expected_text)); + } + } + } + + /** + * The data provider for testing the validation of the datelist widget. + * + * @param string $field_label + * The label of the field being tested. + * + * @return array + * An array of datelist input permutations to test. + */ + protected function datelistDataProvider($field_label) { + // @todo Use the field label in the top IFE message. + return [ + // Nothing selected. + [ + ['year' => '', 'month' => '', 'day' => '', 'hour' => '', 'minute' => ''], + [ + "The $field_label date is required.", + "1 error has been found: Year", + ], + ], + // Year only selected, validation error on Month, Day, Hour, Minute. + [ + ['year' => 2012, 'month' => '', 'day' => '', 'hour' => '', 'minute' => ''], + [ + "The $field_label date is incomplete.", + 'A value must be selected for month, day, hour, minute', + "1 error has been found: Year", + ], + ], + // Year and Month selected, validation error on Day, Hour, Minute. + [ + ['year' => 2012, 'month' => '12', 'day' => '', 'hour' => '', 'minute' => ''], + [ + "The $field_label date is incomplete.", + 'A value must be selected for day, hour, minute', + "1 error has been found: Year", + ], + ], + // Year, Month and Day selected, validation error on Hour, Minute. + [ + ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '', 'minute' => ''], + [ + "The $field_label date is incomplete.", + 'A value must be selected for hour, minute', + "1 error has been found: Year", + ], + ], + // Year, Month, Day and Hour selected, validation error on Minute only. + [ + ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => ''], + [ + "The $field_label date is incomplete.", + 'A value must be selected for minute', + "1 error has been found: Year", + ], + ], + ]; + } + +} diff --git a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php index b0f3ea7be7..891db62d69 100644 --- a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php +++ b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php @@ -25,6 +25,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $element['#element_validate'][] = [$this, 'validateStartEnd']; $element['value']['#title'] = $this->t('Start date'); + $element['value']['#error_no_message'] = TRUE; $element['end_value'] = [ '#title' => $this->t('End date'), diff --git a/core/modules/datetime_range/tests/src/Functional/DateRangeFieldTest.php b/core/modules/datetime_range/tests/src/Functional/DateRangeFieldTest.php index cdf95cce14..28e757f684 100644 --- a/core/modules/datetime_range/tests/src/Functional/DateRangeFieldTest.php +++ b/core/modules/datetime_range/tests/src/Functional/DateRangeFieldTest.php @@ -925,68 +925,56 @@ protected function datelistDataProvider() { [ ['year' => 2012, 'month' => '', 'day' => '', 'hour' => '', 'minute' => ''], ['year' => 2013, 'month' => '1', 'day' => '15', 'hour' => '3', 'minute' => '30'], [ - 'A value must be selected for month.', - 'A value must be selected for day.', - 'A value must be selected for hour.', - 'A value must be selected for minute.', + 'A value must be selected for month, day, hour, minute', ], ], // Year and Month selected, validation error on Day, Hour, Minute. [ ['year' => 2012, 'month' => '12', 'day' => '', 'hour' => '', 'minute' => ''], ['year' => 2013, 'month' => '1', 'day' => '15', 'hour' => '3', 'minute' => '30'], [ - 'A value must be selected for day.', - 'A value must be selected for hour.', - 'A value must be selected for minute.', + 'A value must be selected for day, hour, minute', ], ], // Year, Month and Day selected, validation error on Hour, Minute. [ ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '', 'minute' => ''], ['year' => 2013, 'month' => '1', 'day' => '15', 'hour' => '3', 'minute' => '30'], [ - 'A value must be selected for hour.', - 'A value must be selected for minute.', + 'A value must be selected for hour, minute', ], ], // Year, Month, Day and Hour selected, validation error on Minute only. [ ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => ''], ['year' => 2013, 'month' => '1', 'day' => '15', 'hour' => '3', 'minute' => '30'], [ - 'A value must be selected for minute.', + 'A value must be selected for minute', ], ], // Year selected, validation error on Month, Day, Hour, Minute. [ ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => '0'], ['year' => 2013, 'month' => '', 'day' => '', 'hour' => '', 'minute' => ''], [ - 'A value must be selected for month.', - 'A value must be selected for day.', - 'A value must be selected for hour.', - 'A value must be selected for minute.', + 'A value must be selected for month, day, hour, minute', ], ], // Year and Month selected, validation error on Day, Hour, Minute. [ ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => '0'], ['year' => 2013, 'month' => '1', 'day' => '', 'hour' => '', 'minute' => ''], [ - 'A value must be selected for day.', - 'A value must be selected for hour.', - 'A value must be selected for minute.', + 'A value must be selected for day, hour, minute', ], ], // Year, Month and Day selected, validation error on Hour, Minute. [ ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => '0'], ['year' => 2013, 'month' => '1', 'day' => '15', 'hour' => '', 'minute' => ''], [ - 'A value must be selected for hour.', - 'A value must be selected for minute.', + 'A value must be selected for hour, minute', ], ], // Year, Month, Day and Hour selected, validation error on Minute only. [ ['year' => 2012, 'month' => '12', 'day' => '31', 'hour' => '0', 'minute' => '0'], ['year' => 2013, 'month' => '1', 'day' => '15', 'hour' => '3', 'minute' => ''], [ - 'A value must be selected for minute.', + 'A value must be selected for minute', ], ], ]; diff --git a/core/modules/datetime_range/tests/src/Functional/DateRangeIFETest.php b/core/modules/datetime_range/tests/src/Functional/DateRangeIFETest.php new file mode 100644 index 0000000000..f765efbf5f --- /dev/null +++ b/core/modules/datetime_range/tests/src/Functional/DateRangeIFETest.php @@ -0,0 +1,75 @@ + '', 'separator' => '-']; + + /** + * {@inheritdoc} + */ + protected function getTestFieldType() { + return 'daterange'; + } + + /** + * Test the error messages displayed with inline form errors. + */ + public function testErrorMessages() { + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_DATETIME); + $this->fieldStorage->save(); + $field_name = $this->fieldStorage->getName(); + $field_label = $this->field->label(); + + $this->drupalGet('entity_test/add'); + $this->assertFieldByName("{$field_name}[0][value][date]", '', 'Start date element found.'); + $this->assertFieldByName("{$field_name}[0][value][time]", '', 'Start time element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][date]", '', 'End date element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][time]", '', 'End time element found.'); + $edit = [ + "{$field_name}[0][value][date]" => '2012-12-01', + "{$field_name}[0][value][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2010-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', + ]; + $this->drupalPostForm(NULL, $edit, t('Save')); + $this->assertUniqueText(new FormattableMarkup('The @title end date cannot be before the start date', ['@title' => $field_label]), 'End date before start date has been caught.'); + + $edit = [ + "{$field_name}[0][value][date]" => '2012-12-01', + "{$field_name}[0][value][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '11:00:00', + ]; + $this->drupalPostForm(NULL, $edit, t('Save')); + $this->assertUniqueText(new FormattableMarkup('The @title end date cannot be before the start date', ['@title' => $field_label]), 'End time before start time has been caught.'); + } + +}