diff --git a/reportbuilder/classes/local/filters/autocomplete.php b/reportbuilder/classes/local/filters/autocomplete.php new file mode 100644 index 00000000000..dd94c3f8b22 --- /dev/null +++ b/reportbuilder/classes/local/filters/autocomplete.php @@ -0,0 +1,78 @@ +. + +declare(strict_types=1); + +namespace core_reportbuilder\local\filters; + +use MoodleQuickForm; +use core_reportbuilder\local\helpers\database; + +/** + * Autocomplete report filter + * + * @package core_reportbuilder + * @copyright 2022 Nathan Nguyen + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class autocomplete extends base { + + /** + * Return the options for the filter as an array, to be used to populate the select input field + * + * @return array + */ + protected function get_select_options(): array { + return (array) $this->filter->get_options(); + } + + /** + * Setup form + * + * @param MoodleQuickForm $mform + */ + public function setup_form(MoodleQuickForm $mform): void { + $operatorlabel = get_string('filterfieldvalue', 'core_reportbuilder', $this->get_header()); + $values = [0 => ''] + $this->get_select_options(); + $options = ['multiple' => true]; + + $mform->addElement('autocomplete', $this->name . '_values', $operatorlabel, $values, $options) + ->setHiddenLabel(true); + } + + /** + * Return filter SQL + * + * @param array $values + * @return array + */ + public function get_sql_filter(array $values): array { + global $DB; + + $fieldsql = $this->filter->get_field_sql(); + $params = $this->filter->get_field_params(); + + $invalues = $values["{$this->name}_values"] ?? []; + if (empty($invalues)) { + return ['', []]; + } + + $paramprefix = database::generate_param_name() . '_'; + [$insql, $inparams] = $DB->get_in_or_equal($invalues, SQL_PARAMS_NAMED, $paramprefix); + + return ["{$fieldsql} $insql", array_merge($params, $inparams)]; + } +} diff --git a/reportbuilder/tests/local/filters/autocomplete_test.php b/reportbuilder/tests/local/filters/autocomplete_test.php new file mode 100644 index 00000000000..e42768eb18f --- /dev/null +++ b/reportbuilder/tests/local/filters/autocomplete_test.php @@ -0,0 +1,96 @@ +. + +declare(strict_types=1); + +namespace core_reportbuilder\local\filters; + +use advanced_testcase; +use core_reportbuilder\local\report\filter; + +/** + * Unit tests for course selector filter + * + * @package core_reportbuilder + * @covers \core_reportbuilder\local\filters\base + * @covers \core_reportbuilder\local\filters\autocomplete + * @copyright 2022 Nathan Nguyen + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class autocomplete_test extends advanced_testcase { + + /** + * Data provider for {@see test_get_sql_filter} + * + * @return array + */ + public function get_sql_filter_provider(): array { + return [ + [[], ["Course 1 full name", "Course 2 full name", "Course 3 full name", "PHPUnit test site"]], + [["course1", "course3"], ["Course 1 full name", "Course 3 full name"]], + [["course1"], ["Course 1 full name"]], + ]; + } + + /** + * Test getting filter SQL + * + * @param array $shortnames list of course short name + * @param array $expected list of course full name + * + * @dataProvider get_sql_filter_provider + */ + public function test_get_sql_filter(array $shortnames, array $expected): void { + global $DB; + + $this->resetAfterTest(); + + // Create courses as values for autocompletion. + $course1 = $this->getDataGenerator()->create_course([ + 'fullname' => "Course 1 full name", + 'shortname' => 'course1', + ]); + + $course2 = $this->getDataGenerator()->create_course([ + 'fullname' => "Course 2 full name", + 'shortname' => 'course2', + ]); + + $course3 = $this->getDataGenerator()->create_course([ + 'fullname' => "Course 3 full name", + 'shortname' => 'course3', + ]); + + $filter = (new filter( + autocomplete::class, + 'test', + new \lang_string('course'), + 'testentity', + 'shortname' + ))->set_options([ + $course1->shortname => $course1->fullname, + $course2->shortname => $course2->fullname, + $course3->shortname => $course3->fullname, + ]); + + [$select, $params] = text::create($filter)->get_sql_filter([ + $filter->get_unique_identifier() . '_values' => $shortnames, + ]); + $fullnames = $DB->get_fieldset_select('course', 'fullname', $select, $params); + $this->assertEqualsCanonicalizing($expected, $fullnames); + + } +} diff --git a/reportbuilder/upgrade.txt b/reportbuilder/upgrade.txt index bde3cd2c67a..ab5da321356 100644 --- a/reportbuilder/upgrade.txt +++ b/reportbuilder/upgrade.txt @@ -22,3 +22,4 @@ Information provided here is intended especially for developers. * New report filter types: - `category` for reports containing course categories - `tags` for reports containing entities with support for core_tag API + - `autocomplete` for reports that contain pre-defined values for selection.