From 5f01161095c4e6fefa702f1da64bca6698a19d10 Mon Sep 17 00:00:00 2001 From: Tim Hunt Date: Fri, 12 Apr 2024 12:08:05 +0100 Subject: [PATCH] MDL-82308 forms: set a nice default size for multi-selects This is a backport of MDL-81515. --- lib/form/select.php | 7 +++ lib/form/tests/select_test.php | 79 ++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 lib/form/tests/select_test.php diff --git a/lib/form/select.php b/lib/form/select.php index 7195401151d..b4e0bd8ab2b 100644 --- a/lib/form/select.php +++ b/lib/form/select.php @@ -198,6 +198,13 @@ class MoodleQuickForm_select extends HTML_QuickForm_select implements templatabl } public function export_for_template(renderer_base $output) { + // For multi-selects, if there is not already a size set, then set a sensible default. + if ($this->getMultiple()) { + if (!isset($this->_attributes['size'])) { + $this->_attributes['size'] = min(count($this->_options), 10); + } + } + $context = $this->export_for_template_base($output); $options = []; diff --git a/lib/form/tests/select_test.php b/lib/form/tests/select_test.php new file mode 100644 index 00000000000..c12df378fce --- /dev/null +++ b/lib/form/tests/select_test.php @@ -0,0 +1,79 @@ +. + +namespace core_form; + +use MoodleQuickForm_select; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once($CFG->libdir . '/form/select.php'); + +/** + * Unit tests for MoodleQuickForm_select + * + * @package core_form + * @category test + * @copyright 2024 the Open University + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @covers \MoodleQuickForm_select + */ +final class select_test extends \advanced_testcase { + + /** + * Testcase to check generated timestamp + */ + public function test_multi_select_uses_sensible_default_size(): void { + global $OUTPUT; + + // With fewer than 10 choices, default the size to that number (3 here). + $element = new MoodleQuickForm_select('testel', 'Label', + ['Choice 1', 'Choice 2', 'Choice 3'], ['id' => 'testel_id', 'multiple' => true]); + + $html = $OUTPUT->mform_element($element, false, false, '', false); + $this->assertStringContainsString(' size="3"', $html); + $this->assertEquals(3, $element->_attributes['size']); + + // With more than 10 choices, set to size 10. + $element = new MoodleQuickForm_select('testel', 'Label', [ + 'Choice 1', 'Choice 2', 'Choice 3', + 'Choice 4', 'Choice 5', 'Choice 6', + 'Choice 7', 'Choice 8', 'Choice 9', + 'Choice 10', 'Choice 11', 'Choice 12', + ], ['id' => 'testel_id', 'multiple' => true]); + + $html = $OUTPUT->mform_element($element, false, false, '', false); + $this->assertStringContainsString(' size="10"', $html); + $this->assertEquals(10, $element->_attributes['size']); + + // If a size is already set, don't change in. + $element = new MoodleQuickForm_select('testel', 'Label', + ['Choice 1', 'Choice 2', 'Choice 3'], ['id' => 'testel_id', 'multiple' => true, 'size' => 7]); + + $html = $OUTPUT->mform_element($element, false, false, '', false); + $this->assertStringContainsString(' size="7"', $html); + $this->assertEquals(7, $element->_attributes['size']); + + // Don't set a size for single selects. + $element = new MoodleQuickForm_select('testel', 'Label', + ['Choice 1', 'Choice 2', 'Choice 3'], ['id' => 'testel_id']); + + $html = $OUTPUT->mform_element($element, false, false, '', false); + $this->assertStringNotContainsString('size', $html); + $this->assertArrayNotHasKey('size', $element->_attributes); + } +}