diff --git a/lang/en/checklist.php b/lang/en/checklist.php index a7e2f7d1..a6cd967c 100644 --- a/lang/en/checklist.php +++ b/lang/en/checklist.php @@ -164,6 +164,7 @@ $string['showcompletemymoodle'] = 'Show completed Checklists on \'My Moodle\' page'; $string['showfulldetails'] = 'Show full details'; +$string['showhidechecked'] = 'Show/hide selected items'; $string['showupdateablemymoodle'] = 'Show only updatable Checklists on \'My Moodle\' page'; $string['showmymoodle'] = 'Show Checklists on \'My Moodle\' page'; $string['showprogressbars'] = 'Show progress bars'; diff --git a/locallib.php b/locallib.php index 22f01826..4d0790d4 100644 --- a/locallib.php +++ b/locallib.php @@ -1421,6 +1421,9 @@ protected function view_edit_items() { if ($this->editdates) { $thispage->param('editdates', 'on'); } + if ($itemid = optional_param('itemid', null, PARAM_INT)) { + $thispage->param('itemid', $itemid); + } if ($this->checklist->autoupdate && $this->checklist->autopopulate) { if ($this->checklist->teacheredit == CHECKLIST_MARKING_STUDENT) { @@ -1436,6 +1439,17 @@ protected function view_edit_items() { if ($this->items) { $lastitem = count($this->items); $lastindent = 0; + + echo html_writer::start_tag('form', array('action' => $thispage->out_omit_querystring(), 'method' => 'post')); + echo html_writer::input_hidden_params($thispage); + + if ($this->checklist->autopopulate) { + echo html_writer::empty_tag('input', array( + 'type' => 'submit', 'name' => 'showhideitems', + 'value' => get_string('showhidechecked', 'checklist') + )); + } + foreach ($this->items as $item) { while ($item->indent > $currindent) { @@ -1481,6 +1495,14 @@ protected function view_edit_items() { $hasauto = $hasauto || ($item->moduleid != 0); echo '
  • '; + + echo html_writer::start_span('', array('style' => 'display: inline-block; width: 16px;')); + if ($autoitem && $item->hidden != CHECKLIST_HIDDEN_BYMODULE) { + echo html_writer::checkbox('items[' . $item->id . ']', $item->id, false, '', + array('title' => $item->displaytext)); + } + echo html_writer::end_span(); + if ($item->itemoptional == CHECKLIST_OPTIONAL_YES) { $title = '"'.get_string('optionalitem', 'checklist').'"'; echo ''; @@ -1515,23 +1537,16 @@ protected function view_edit_items() { } if (isset($item->editme)) { - echo '
    '; echo ''; - echo ''; - echo html_writer::input_hidden_params($thispage); if ($this->editdates) { $this->print_edit_date($item->duetime); } echo ''; - echo '
    '; $focusitem = 'updateitembox'; - echo '
    '; - echo html_writer::input_hidden_params($thispage, array('sesskey', 'itemid')); echo ''; - echo '
    '; $addatend = false; @@ -1611,9 +1626,6 @@ protected function view_edit_items() { if ($this->additemafter == $item->id) { $addatend = false; echo '
  • '; - echo '
    '; - echo html_writer::input_hidden_params($thispage); - echo ''; echo ''; echo ''; echo ' '; @@ -1622,12 +1634,7 @@ protected function view_edit_items() { $this->print_edit_date(); } echo ''; - echo '
    '; - - echo '
    '; - echo html_writer::input_hidden_params($thispage, array('sesskey', 'additemafter')); echo ''; - echo '
    '; echo '
  • '; if (!$focusitem) { @@ -1639,6 +1646,8 @@ protected function view_edit_items() { echo ''; } + + echo html_writer::end_tag('form'); } $thispage->remove_params(array('itemid')); @@ -2189,9 +2198,7 @@ protected function process_view_actions() { return; } - if (!confirm_sesskey()) { - error('Invalid sesskey'); - } + require_sesskey(); $itemid = optional_param('itemid', 0, PARAM_INT); @@ -2237,7 +2244,7 @@ protected function process_view_actions() { break; default: - error('Invalid action - "'.s($action).'"'); + throw new moodle_exception('invalidaction', 'mod_checklist', '', $action); } if ($action != 'updatechecks') { @@ -2254,22 +2261,29 @@ protected function process_edit_actions() { if ($removeauto) { // Remove any automatically generated items from the list // (if no longer using automatic items). - if (!confirm_sesskey()) { - error('Invalid sesskey'); - } + require_sesskey(); $this->removeauto(); return; } $action = optional_param('action', false, PARAM_TEXT); + if (!$action) { + if (optional_param('additem', false, PARAM_BOOL)) { + $action = 'additem'; + } else if (optional_param('updateitem', false, PARAM_BOOL)) { + $action = 'updateitem'; + } else if (optional_param('showhideitems', false, PARAM_BOOL)) { + $action = 'showhideitems'; + } else if (optional_param('canceledititem', false, PARAM_BOOL)) { + $additemafter = false; + } + } if (!$action) { $this->additemafter = $additemafter; return; } - if (!confirm_sesskey()) { - error('Invalid sesskey'); - } + require_sesskey(); $itemid = optional_param('itemid', 0, PARAM_INT); @@ -2344,8 +2358,16 @@ protected function process_edit_actions() { case 'nextcolour': $this->nextcolour($itemid); break; + + case 'showhideitems': + $itemids = optional_param_array('items', array(), PARAM_INT); + foreach ($itemids as $itemid) { + $this->toggledisableitem($itemid); + } + break; + default: - error('Invalid action - "'.s($action).'"'); + throw new moodle_exception('invalidaction', 'mod_checklist', '', $action); } if ($additemafter) { diff --git a/tests/behat/show_hide_multiple_items.feature b/tests/behat/show_hide_multiple_items.feature new file mode 100644 index 00000000..0aa0519e --- /dev/null +++ b/tests/behat/show_hide_multiple_items.feature @@ -0,0 +1,56 @@ +@mod @mod_checklist @checklist +Feature: Multiple autopopulate items can be shown/hidden at once + + Background: + Given the following "courses" exist: + | fullname | shortname | + | Course 1 | C1 | + And the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + | student1 | Student | 1 | student1@asd.com | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And the following "activities" exist: + | activity | course | section | idnumber | name | intro | + | assign | C1 | 1 | assign1 | Test assignment | This is an assignment | + | data | C1 | 1 | data1 | Test database | This is a database | + | checklist | C1 | 1 | checklist1 | Test checklist | This is a checklist | + And I log in as "teacher1" + And I follow "Course 1" + And I turn editing mode on + And I add a "Checklist" to section "1" and I fill the form with: + | Checklist | Test auto-pop checklist | + | Introduction | This is an auto-populated checklist | + | Show course modules in checklist | Whole course | + And I log out + + Scenario: When viewing an auto-populated checklist, a student should see items corresponding to the course modules + When I log in as "student1" + And I follow "Course 1" + And I follow "Test auto-pop checklist" + Then I should see "Test auto-pop checklist" + And I should see "This is an auto-populated checklist" + And I should see "Test assignment" + And I should see "Test database" + + Scenario: When I select multiple items and click the 'Show/hide' button, the items' visibility should toggle + Given I log in as "teacher1" + And I follow "Course 1" + And I follow "Test auto-pop checklist" + And I follow "Edit checklist" + And I set the field with xpath "//input[@type='checkbox' and @title='Test assignment']" to "1" + And I set the field with xpath "//input[@type='checkbox' and @title='Test database']" to "1" + And I press "Show/hide selected items" + And I set the field with xpath "//input[@type='checkbox' and @title='Test database']" to "1" + And I set the field with xpath "//input[@type='checkbox' and @title='Test checklist']" to "1" + And I press "Show/hide selected items" + And I log out + When I log in as "student1" + And I follow "Course 1" + And I follow "Test auto-pop checklist" + Then I should not see "Test assignment" in the "#region-main" "css_element" + And I should see "Test database" in the "#region-main" "css_element" + And I should not see "Test checklist" in the "#region-main" "css_element" diff --git a/tests/generator/lib.php b/tests/generator/lib.php index e8b7f350..55af544a 100644 --- a/tests/generator/lib.php +++ b/tests/generator/lib.php @@ -23,6 +23,8 @@ */ defined('MOODLE_INTERNAL') || die(); +global $CFG; +require_once($CFG->dirroot.'/mod/checklist/lib.php'); class mod_checklist_generator extends testing_module_generator { public function create_instance($record = null, array $options = null) { diff --git a/version.php b/version.php index 3651f589..7e354c56 100644 --- a/version.php +++ b/version.php @@ -30,10 +30,10 @@ $plugin = new stdClass(); } // Used by M2.6 and above. -$plugin->version = 2015122300; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2016031400; // The current module version (Date: YYYYMMDDXX) $plugin->cron = 60; // Period for cron to check this module (secs). $plugin->maturity = MATURITY_STABLE; -$plugin->release = '2.x (Build: 2015122300)'; +$plugin->release = '2.x (Build: 2016031400)'; $plugin->requires = 2010112400; $plugin->component = 'mod_checklist'; @@ -45,4 +45,4 @@ $module->release = $plugin->release; $module->requires = $plugin->requires; $module->component = $plugin->component; -} \ No newline at end of file +}