diff --git a/lib/classes/plugin_manager.php b/lib/classes/plugin_manager.php index 5587e60b900..f6349930dc8 100644 --- a/lib/classes/plugin_manager.php +++ b/lib/classes/plugin_manager.php @@ -1943,6 +1943,7 @@ class core_plugin_manager { 'editquestion', 'exportquestions', 'importquestions', + 'viewquestionname', ], 'qbehaviour' => array( diff --git a/question/bank/viewquestionname/classes/plugin_feature.php b/question/bank/viewquestionname/classes/plugin_feature.php new file mode 100644 index 00000000000..57ef7d63822 --- /dev/null +++ b/question/bank/viewquestionname/classes/plugin_feature.php @@ -0,0 +1,36 @@ +. + +namespace qbank_viewquestionname; + +use core_question\local\bank\plugin_features_base; + +/** + * Plugin entrypoint for columns. + * + * @package qbank_viewquestionname + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class plugin_feature extends plugin_features_base { + + public function get_question_columns($qbank): array { + return [ + new question_name_idnumber_tags_column($qbank) + ]; + } +} diff --git a/question/bank/viewquestionname/classes/privacy/provider.php b/question/bank/viewquestionname/classes/privacy/provider.php new file mode 100644 index 00000000000..9c4f547a8ac --- /dev/null +++ b/question/bank/viewquestionname/classes/privacy/provider.php @@ -0,0 +1,32 @@ +. + +namespace qbank_viewquestionname\privacy; + +/** + * Privacy Subsystem for qbank_viewquestionname implementing null_provider. + * + * @package qbank_viewquestionname + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class provider implements \core_privacy\local\metadata\null_provider { + + public static function get_reason(): string { + return 'privacy:metadata'; + } +} diff --git a/question/bank/viewquestionname/classes/question_name_idnumber_tags_column.php b/question/bank/viewquestionname/classes/question_name_idnumber_tags_column.php new file mode 100644 index 00000000000..8956189cc4d --- /dev/null +++ b/question/bank/viewquestionname/classes/question_name_idnumber_tags_column.php @@ -0,0 +1,83 @@ +. + +namespace qbank_viewquestionname; + +/** + * A question bank column showing the question name with idnumber and tags. + * + * @package qbank_viewquestionname + * @copyright 2019 The Open University + * @author 2021 Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class question_name_idnumber_tags_column extends viewquestionname_column_helper { + + public function get_name(): string { + return 'qnameidnumbertags'; + } + + protected function display_content($question, $rowclasses): void { + global $OUTPUT; + + $layoutclasses = 'd-inline-flex flex-nowrap overflow-hidden w-100'; + $labelfor = $this->label_for($question); + if ($labelfor) { + echo \html_writer::start_tag('label', ['for' => $labelfor, 'class' => $layoutclasses]); + $closetag = \html_writer::end_tag('label'); + } else { + echo \html_writer::start_tag('span', ['class' => $layoutclasses]); + echo \html_writer::end_tag('span'); + } + + // Question name. + echo \html_writer::span(format_string($question->name), 'questionname flex-grow-1 flex-shrink-1 text-truncate'); + + // Question idnumber. + if ($question->idnumber !== null && $question->idnumber !== '') { + echo ' ' . \html_writer::span( + \html_writer::span(get_string('idnumber', 'question'), 'accesshide') + . ' ' . \html_writer::span(s($question->idnumber), 'badge badge-primary'), 'ml-1'); + } + + // Question tags. + if (!empty($question->tags)) { + $tags = \core_tag_tag::get_item_tags('core_question', 'question', $question->id); + echo $OUTPUT->tag_list($tags, null, 'd-inline flex-shrink-1 text-truncate ml-1', 0, null, true); + } + + echo $closetag; // Computed above to ensure it matches. + } + + public function get_required_fields(): array { + $fields = parent::get_required_fields(); + $fields[] = 'q.idnumber'; + return $fields; + } + + public function is_sortable(): array { + return [ + 'name' => ['field' => 'q.name', 'title' => get_string('questionname', 'question')], + 'idnumber' => ['field' => 'q.idnumber', 'title' => get_string('idnumber', 'question')], + ]; + } + + public function load_additional_data(array $questions): void { + parent::load_additional_data($questions); + parent::load_question_tags($questions); + } + +} diff --git a/question/bank/viewquestionname/classes/viewquestionname_column_helper.php b/question/bank/viewquestionname/classes/viewquestionname_column_helper.php new file mode 100644 index 00000000000..f4f6def1307 --- /dev/null +++ b/question/bank/viewquestionname/classes/viewquestionname_column_helper.php @@ -0,0 +1,75 @@ +. + +namespace qbank_viewquestionname; + +use core_question\local\bank\column_base; + + +/** + * A column type for the name of the question name. + * + * @package qbank_viewquestionname + * @copyright 2009 Tim Hunt + * @author 2021 Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class viewquestionname_column_helper extends column_base { + + /** + * @var null $checkboxespresent + */ + protected $checkboxespresent = null; + + public function get_name(): string { + return 'questionname'; + } + + protected function get_title(): string { + return get_string('question'); + } + + protected function label_for($question): string { + if (is_null($this->checkboxespresent)) { + $this->checkboxespresent = $this->qbank->has_column('core_question\local\bank\checkbox_column'); + } + if ($this->checkboxespresent) { + return 'checkq' . $question->id; + } + + return ''; + } + + protected function display_content($question, $rowclasses): void { + $labelfor = $this->label_for($question); + if ($labelfor) { + echo \html_writer::start_tag('label', array('for' => $labelfor)); + } + echo format_string($question->name); + if ($labelfor) { + echo \html_writer::end_tag('label'); + } + } + + public function get_required_fields(): array { + return ['q.id', 'q.name']; + } + + public function is_sortable() { + return 'q.name'; + } + +} diff --git a/question/bank/viewquestionname/lang/en/qbank_viewquestionname.php b/question/bank/viewquestionname/lang/en/qbank_viewquestionname.php new file mode 100644 index 00000000000..8952663e293 --- /dev/null +++ b/question/bank/viewquestionname/lang/en/qbank_viewquestionname.php @@ -0,0 +1,27 @@ +. + +/** + * Strings for component qbank_viewquestionname, language 'en' + * + * @package qbank_viewquestionname + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +$string['pluginname'] = 'View question name'; +$string['privacy:metadata'] = 'View question name question bank plugin does not store any user data.'; diff --git a/question/bank/viewquestionname/tests/behat/view_question_name_column.feature b/question/bank/viewquestionname/tests/behat/view_question_name_column.feature new file mode 100644 index 00000000000..73b0852abd5 --- /dev/null +++ b/question/bank/viewquestionname/tests/behat/view_question_name_column.feature @@ -0,0 +1,31 @@ +@qbank @qbank_viewquestionname +Feature: Use the qbank plugin manager page for viewquestionname + In order to check the plugin behaviour with enable and disable + + Background: + Given the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + And the following "activities" exist: + | activity | name | course | idnumber | + | quiz | Test quiz | C1 | quiz1 | + And the following "question categories" exist: + | contextlevel | reference | name | + | Course | C1 | Test questions | + And the following "questions" exist: + | questioncategory | qtype | name | questiontext | + | Test questions | truefalse | First question | Answer the first question | + + Scenario: Enable/disable viewquestionname column from the base view + Given I log in as "admin" + And I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration + And I should see "View question name" + When I click on "Disable" "link" in the "View question name" "table_row" + And I am on the "Test quiz" "quiz activity" page + And I navigate to "Question bank > Questions" in current page administration + Then I should not see "First question" + And I navigate to "Plugins > Question bank plugins > Manage question bank plugins" in site administration + And I click on "Enable" "link" in the "View question name" "table_row" + And I am on the "Test quiz" "quiz activity" page + And I navigate to "Question bank > Questions" in current page administration + And I should see "First question" diff --git a/question/bank/viewquestionname/version.php b/question/bank/viewquestionname/version.php new file mode 100644 index 00000000000..5f48e604b53 --- /dev/null +++ b/question/bank/viewquestionname/version.php @@ -0,0 +1,31 @@ +. + +/** + * Version information for qbank_viewquestionname. + * + * @package qbank_viewquestionname + * @copyright 2021 Catalyst IT Australia Pty Ltd + * @author Safat Shahin + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$plugin->component = 'qbank_viewquestionname'; +$plugin->version = 2021070700; +$plugin->requires = 2021052500; +$plugin->maturity = MATURITY_STABLE; diff --git a/question/classes/local/bank/view.php b/question/classes/local/bank/view.php index 36e8436b9f2..5865cacde30 100644 --- a/question/classes/local/bank/view.php +++ b/question/classes/local/bank/view.php @@ -324,7 +324,7 @@ class view { * @return string Column name for the heading */ protected function heading_column(): string { - return 'question_bank_question_name_column'; + return 'qbank_viewquestionname\viewquestionname_column_helper'; } /** diff --git a/question/editlib.php b/question/editlib.php index 4a5e7aa9647..cf1629b6de7 100644 --- a/question/editlib.php +++ b/question/editlib.php @@ -178,7 +178,7 @@ class_alias('core_question\bank\question_type_column', 'question_bank_question_t * @deprecated since Moodle 2.7 MDL-40457 * @todo MDl-72004 delete the class alias, not done in MDL-71516 for any potential error from other plugins. */ -class_alias('core_question\bank\question_name_column', 'question_bank_question_name_column', true); +class_alias('qbank_viewquestionname\viewquestionname_column_helper', 'question_bank_question_name_column', true); /**