From bfdfe82ea2f073a2d0e5f05ba315972cfe16a42a Mon Sep 17 00:00:00 2001
From: webchick <drupal@webchick.net>
Date: Tue, 31 Jan 2017 13:29:16 -0800
Subject: [PATCH] Issue #2346773 by dmsmidt, lokapujya, klakegg, marcvangend,
 andrewmacpherson, ptsimard, Getekid, Rade, yoroy, tstoeckler, mgifford,
 tim.plunkett, estoyausente, xjm, PierreMarcel, hass, SKAUGHT,
 sukanya.ramakrishnan, flyke, alvar0hurtad0, bojanz, pwolanin, arunkumark,
 Bojhan, bleen: Details form element should open when there are errors on
 child elements

---
 core/lib/Drupal/Core/Render/Element/Details.php  |  4 +++-
 core/modules/node/src/Tests/NodeEditFormTest.php | 15 +++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/core/lib/Drupal/Core/Render/Element/Details.php b/core/lib/Drupal/Core/Render/Element/Details.php
index ae25d345ace9..2ae6f1d8ef71 100644
--- a/core/lib/Drupal/Core/Render/Element/Details.php
+++ b/core/lib/Drupal/Core/Render/Element/Details.php
@@ -75,7 +75,9 @@ public static function preRenderDetails($element) {
 
     // Collapsible details.
     $element['#attached']['library'][] = 'core/drupal.collapse';
-    if (!empty($element['#open'])) {
+
+    // Open the detail if specified or if a child has an error.
+    if (!empty($element['#open']) || !empty($element['#children_errors'])) {
       $element['#attributes']['open'] = 'open';
     }
 
diff --git a/core/modules/node/src/Tests/NodeEditFormTest.php b/core/modules/node/src/Tests/NodeEditFormTest.php
index 0d6bf45fd258..bef0252cc02d 100644
--- a/core/modules/node/src/Tests/NodeEditFormTest.php
+++ b/core/modules/node/src/Tests/NodeEditFormTest.php
@@ -115,6 +115,21 @@ public function testNodeEdit() {
     // Check if the node revision checkbox is rendered on node edit form.
     $this->drupalGet('node/' . $node->id() . '/edit');
     $this->assertFieldById('edit-revision', NULL, 'The revision field is present.');
+
+    // Check that details form element opens when there are errors on child
+    // elements.
+    $this->drupalGet('node/' . $node->id() . '/edit');
+    $edit = [];
+    // This invalid date will trigger an error.
+    $edit['created[0][value][date]'] = $this->randomMachineName(8);
+    // Get the current amount of open details elements.
+    $open_details_elements = count($this->cssSelect('details[open="open"]'));
+    $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
+    // The node author details must be open.
+    $this->assertRaw('<details class="node-form-author js-form-wrapper form-wrapper" data-drupal-selector="edit-author" id="edit-author" open="open">');
+    // Only one extra details element should now be open.
+    $open_details_elements++;
+    $this->assertEqual(count($this->cssSelect('details[open="open"]')), $open_details_elements, 'Exactly one extra open &lt;details&gt; element found.');
   }
 
   /**
-- 
GitLab