MDL-61928 formslib: shortforms should work with non-editable forms
authorTim Hunt <T.J.Hunt@open.ac.uk>
Tue, 10 Apr 2018 13:00:39 +0000 (14:00 +0100)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Tue, 10 Apr 2018 16:39:49 +0000 (17:39 +0100)
lib/formslib.php
lib/tests/behat/behat_forms.php
lib/tests/behat/readonlyform.feature [new file with mode: 0644]
lib/tests/fixtures/readonlyform.php [new file with mode: 0644]

index 94dc22d..ef522da 100644 (file)
@@ -2894,7 +2894,7 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
         $formid = $form->getAttribute('id');
         parent::startForm($form);
         if ($form->isFrozen()){
-            $this->_formTemplate = "\n<div class=\"mform frozen\">\n{content}\n</div>";
+            $this->_formTemplate = "\n<div id=\"$formid\" class=\"mform frozen\">\n{collapsebtns}\n{content}\n</div>";
         } else {
             $this->_formTemplate = "\n<form{attributes}>\n\t<div style=\"display: none;\">{hidden}</div>\n{collapsebtns}\n{content}\n</form>";
             $this->_hiddenHtml .= $form->_pageparams;
index 1c07838..9e7fc13 100644 (file)
@@ -117,11 +117,16 @@ class behat_forms extends behat_base {
         // so, we will use the reduced timeout as it is a common task and we should save time.
         try {
 
-            // Expand fieldsets link.
-            $xpath = "//div[@class='collapsible-actions']" .
-                "/descendant::a[contains(concat(' ', @class, ' '), ' collapseexpand ')]" .
+            // Expand all fieldsets link - which will only be there if there is more than one collapsible section.
+            $expandallxpath = "//div[@class='collapsible-actions']" .
+                "//a[contains(concat(' ', @class, ' '), ' collapseexpand ')]" .
                 "[not(contains(concat(' ', @class, ' '), ' collapse-all '))]";
-            $collapseexpandlink = $this->find('xpath', $xpath, false, false, self::REDUCED_TIMEOUT);
+            // Else, look for the first expand fieldset link.
+            $expandonlysection = "//legend[@class='ftoggler']" .
+                    "//a[contains(concat(' ', @class, ' '), ' fheader ') and @aria-expanded = 'false']";
+
+            $collapseexpandlink = $this->find('xpath', $expandallxpath . '|' . $expandonlysection,
+                    false, false, self::REDUCED_TIMEOUT);
             $collapseexpandlink->click();
 
         } catch (ElementNotFoundException $e) {
diff --git a/lib/tests/behat/readonlyform.feature b/lib/tests/behat/readonlyform.feature
new file mode 100644 (file)
index 0000000..269dc88
--- /dev/null
@@ -0,0 +1,34 @@
+@core
+Feature: Read-only forms should work
+  In order to use certain forms on large Moodle installations
+  As a user
+  Relevant featuers of non-editable forms should still work
+
+  @javascript
+  Scenario: Shortforms expand collapsing should work for read-only forms - one-section form
+    Given the following "courses" exist:
+      | fullname | shortname | format |
+      | Course 1 | C1        | topics |
+    And the following "activities" exist:
+      | activity   | name | intro                                                                        | course | idnumber |
+      | label      | L1   | <a href="../lib/tests/fixtures/readonlyform.php?sections=1">Fixture link</a> | C1     | label1   |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I follow "Fixture link"
+    When I expand all fieldsets
+    Then the field "Name" matches value "Important information"
+
+  @javascript
+  Scenario: Shortforms expand collapsing should work for read-only forms - two-section form
+    Given the following "courses" exist:
+      | fullname | shortname | format |
+      | Course 1 | C1        | topics |
+    And the following "activities" exist:
+      | activity   | name | intro                                                                        | course | idnumber |
+      | label      | L1   | <a href="../lib/tests/fixtures/readonlyform.php?sections=2">Fixture link</a> | C1     | label1   |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I follow "Fixture link"
+    When I expand all fieldsets
+    Then the field "Name" matches value "Important information"
+    Then the field "Other" matches value "Other information"
diff --git a/lib/tests/fixtures/readonlyform.php b/lib/tests/fixtures/readonlyform.php
new file mode 100644 (file)
index 0000000..472623b
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Fixture for testing the functionality of read-only forms.
+ *
+ * @package core
+ * @copyright 2018 The Open University
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+require_once(__DIR__ . '/../../../config.php');
+require_once($CFG->libdir . '/formslib.php');
+
+$sections = optional_param('sections', 2, PARAM_INT);
+require_login();
+
+
+/**
+ * The form used for testing.
+ */
+class test_read_only_form extends moodleform {
+    protected function definition() {
+        $mform = $this->_form;
+
+        $sections = $this->_customdata;
+
+        $mform->addElement('header', 'sectionheader', 'First section');
+
+        $mform->addElement('text', 'name', 'Name');
+        $mform->setDefault('name', 'Important information');
+        $mform->setType('name', PARAM_RAW);
+
+        $mform->setExpanded('sectionheader', false);
+
+        if ($sections > 1) {
+            $mform->addElement('header', 'secondsection', 'Other section header');
+
+            $mform->addElement('text', 'other', 'Other');
+            $mform->setDefault('other', 'Other information');
+            $mform->setType('other', PARAM_RAW);
+
+            $mform->setExpanded('secondsection', false);
+        }
+
+        $this->add_action_buttons();
+    }
+}
+
+$PAGE->set_context(context_system::instance());
+$PAGE->set_url('/lib/tests/fixtures/readonlyform.php');
+
+$form = new test_read_only_form(null, $sections, 'post', '', null, false); // The false here is $editable.
+
+echo $OUTPUT->header();
+echo $form->render();
+echo $OUTPUT->footer();