diff --git a/blocks/myoverview/classes/output/main.php b/blocks/myoverview/classes/output/main.php index e1c92a98992..5f4a033d0d3 100644 --- a/blocks/myoverview/classes/output/main.php +++ b/blocks/myoverview/classes/output/main.php @@ -81,6 +81,55 @@ class main implements renderable, templatable { */ private $layouts; + /** + * Store a course grouping option setting + * + * @var boolean + */ + private $displaygroupingallincludinghidden; + + /** + * Store a course grouping option setting. + * + * @var boolean + */ + private $displaygroupingall; + + /** + * Store a course grouping option setting. + * + * @var boolean + */ + private $displaygroupinginprogress; + + /** + * Store a course grouping option setting. + * + * @var boolean + */ + private $displaygroupingfuture; + + /** + * Store a course grouping option setting. + * + * @var boolean + */ + private $displaygroupingpast; + + /** + * Store a course grouping option setting. + * + * @var boolean + */ + private $displaygroupingstarred; + + /** + * Store a course grouping option setting. + * + * @var boolean + */ + private $displaygroupinghidden; + /** * main constructor. * Initialize the user preferences @@ -92,23 +141,89 @@ class main implements renderable, templatable { * @throws \dml_exception */ public function __construct($grouping, $sort, $view, $paging) { - $this->grouping = $grouping ? $grouping : BLOCK_MYOVERVIEW_GROUPING_ALL; + // Get plugin config. + $config = get_config('block_myoverview'); + + // Build the course grouping option name to check if the given grouping is enabled afterwards. + $groupingconfigname = 'displaygrouping'.$grouping; + // Check the given grouping and remember it if it is enabled. + if ($grouping && $config->$groupingconfigname == true) { + $this->grouping = $grouping; + + // Otherwise fall back to another grouping in a reasonable order. + // This is done to prevent one-time UI glitches in the case when a user has chosen a grouping option previously which + // was then disabled by the admin in the meantime. + } else if ($config->displaygroupingall == true) { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_ALL; + } else if ($config->displaygroupingallincludinghidden == true) { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_ALLINCLUDINGHIDDEN; + } else if ($config->displaygroupinginprogress == true) { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_INPROGRESS; + } else if ($config->displaygroupingfuture == true) { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_FUTURE; + } else if ($config->displaygroupingpast == true) { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_PAST; + } else if ($config->displaygroupingstarred == true) { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_FAVOURITES; + } else if ($config->displaygroupinghidden == true) { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_HIDDEN; + + // In this case, no grouping option is enabled and the grouping is not needed at all. + // But it's better not to leave $this->grouping unset for any unexpected case. + } else { + $this->grouping = BLOCK_MYOVERVIEW_GROUPING_ALLINCLUDINGHIDDEN; + } + unset ($groupingconfigname); + + // Check and remember the given sorting. $this->sort = $sort ? $sort : BLOCK_MYOVERVIEW_SORTING_TITLE; + + // Check and remember the given view. + $this->view = $view ? $view : BLOCK_MYOVERVIEW_VIEW_CARD; + + // Check and remember the given page size. if ($paging == BLOCK_MYOVERVIEW_PAGING_ALL) { $this->paging = BLOCK_MYOVERVIEW_PAGING_ALL; } else { $this->paging = $paging ? $paging : BLOCK_MYOVERVIEW_PAGING_12; } - $config = get_config('block_myoverview'); + // Check and remember if the course categories should be shown or not. if (!$config->displaycategories) { $this->displaycategories = BLOCK_MYOVERVIEW_DISPLAY_CATEGORIES_OFF; } else { $this->displaycategories = BLOCK_MYOVERVIEW_DISPLAY_CATEGORIES_ON; } + // Get and remember the available layouts. $this->set_available_layouts(); $this->view = $view ? $view : reset($this->layouts); + + // Check and remember if the particular grouping options should be shown or not. + $this->displaygroupingallincludinghidden = $config->displaygroupingallincludinghidden; + $this->displaygroupingall = $config->displaygroupingall; + $this->displaygroupinginprogress = $config->displaygroupinginprogress; + $this->displaygroupingfuture = $config->displaygroupingfuture; + $this->displaygroupingpast = $config->displaygroupingpast; + $this->displaygroupingstarred = $config->displaygroupingstarred; + $this->displaygroupinghidden = $config->displaygroupinghidden; + + // Check and remember if the grouping selector should be shown at all or not. + // It will be shown if more than 1 grouping option is enabled. + $displaygroupingselectors = array($this->displaygroupingallincludinghidden, + $this->displaygroupingall, + $this->displaygroupinginprogress, + $this->displaygroupingfuture, + $this->displaygroupingpast, + $this->displaygroupingstarred, + $this->displaygroupinghidden); + $displaygroupingselectorscount = count(array_filter($displaygroupingselectors)); + if ($displaygroupingselectorscount > 1) { + $this->displaygroupingselector = true; + } else { + $this->displaygroupingselector = false; + } + unset ($displaygroupingselectors, $displaygroupingselectorscount); } @@ -204,6 +319,14 @@ class main implements renderable, templatable { 'layouts' => $availablelayouts, 'displaycategories' => $this->displaycategories, 'displaydropdown' => (count($availablelayouts) > 1) ? true : false, + 'displaygroupingallincludinghidden' => $this->displaygroupingallincludinghidden, + 'displaygroupingall' => $this->displaygroupingall, + 'displaygroupinginprogress' => $this->displaygroupinginprogress, + 'displaygroupingfuture' => $this->displaygroupingfuture, + 'displaygroupingpast' => $this->displaygroupingpast, + 'displaygroupingstarred' => $this->displaygroupingstarred, + 'displaygroupinghidden' => $this->displaygroupinghidden, + 'displaygroupingselector' => $this->displaygroupingselector, ]; return array_merge($defaultvariables, $preferences); diff --git a/blocks/myoverview/lang/en/block_myoverview.php b/blocks/myoverview/lang/en/block_myoverview.php index b34455a5e5f..8fe7076c419 100644 --- a/blocks/myoverview/lang/en/block_myoverview.php +++ b/blocks/myoverview/lang/en/block_myoverview.php @@ -45,6 +45,8 @@ $string['aria:past'] = 'Show past courses'; $string['aria:removefromfavourites'] = 'Remove star for'; $string['aria:summary'] = 'Switch to summary view'; $string['aria:sortingdropdown'] = 'Sorting drop-down menu'; +$string['availablegroupings'] = 'Available filters'; +$string['availablegroupings_desc'] = 'Course filters which are available for selection by users. If none are selected, all courses will be displayed.'; $string['card'] = 'Card'; $string['cards'] = 'Cards'; $string['courseprogress'] = 'Course progress:'; diff --git a/blocks/myoverview/settings.php b/blocks/myoverview/settings.php index b17ea4e0f6e..07adc8aa553 100644 --- a/blocks/myoverview/settings.php +++ b/blocks/myoverview/settings.php @@ -45,4 +45,50 @@ if ($ADMIN->fulltree) { $choices, $choices)); + // Enable / Disable course filter items. + $settings->add(new admin_setting_heading('block_myoverview/availablegroupings', + get_string('availablegroupings', 'block_myoverview'), + get_string('availablegroupings_desc', 'block_myoverview'))); + + $settings->add(new admin_setting_configcheckbox( + 'block_myoverview/displaygroupingallincludinghidden', + get_string('allincludinghidden', 'block_myoverview'), + '', + 0)); + + $settings->add(new admin_setting_configcheckbox( + 'block_myoverview/displaygroupingall', + get_string('all', 'block_myoverview'), + '', + 1)); + + $settings->add(new admin_setting_configcheckbox( + 'block_myoverview/displaygroupinginprogress', + get_string('inprogress', 'block_myoverview'), + '', + 1)); + + $settings->add(new admin_setting_configcheckbox( + 'block_myoverview/displaygroupingpast', + get_string('past', 'block_myoverview'), + '', + 1)); + + $settings->add(new admin_setting_configcheckbox( + 'block_myoverview/displaygroupingfuture', + get_string('future', 'block_myoverview'), + '', + 1)); + + $settings->add(new admin_setting_configcheckbox( + 'block_myoverview/displaygroupingstarred', + get_string('favourites', 'block_myoverview'), + '', + 1)); + + $settings->add(new admin_setting_configcheckbox( + 'block_myoverview/displaygroupinghidden', + get_string('hiddencourses', 'block_myoverview'), + '', + 1)); } diff --git a/blocks/myoverview/styles.css b/blocks/myoverview/styles.css new file mode 100644 index 00000000000..76daded2002 --- /dev/null +++ b/blocks/myoverview/styles.css @@ -0,0 +1,5 @@ +/* Hide the first dropdown-divider if no filter option element is listed before it. + This can happen for some subset configurations of the block_myoverview course filter. */ +.block_myoverview button#groupingdropdown + .dropdown-menu li:first-of-type.dropdown-divider:first-of-type { + display: none; +} diff --git a/blocks/myoverview/templates/nav-grouping-selector.mustache b/blocks/myoverview/templates/nav-grouping-selector.mustache index e9f06adb600..703482f5432 100644 --- a/blocks/myoverview/templates/nav-grouping-selector.mustache +++ b/blocks/myoverview/templates/nav-grouping-selector.mustache @@ -27,10 +27,18 @@ "future": false, "past": false, "favourites": false, - "hidden": false - + "hidden": false, + "displaygroupingallincludinghidden": false, + "displaygroupingall": true, + "displaygroupinginprogress": true, + "displaygroupingfuture": true, + "displaygroupingpast": true, + "displaygroupingstarred": true, + "displaygroupinghidden": true, + "displaygroupingselector": true } }} +{{#displaygroupingselector}} +{{/displaygroupingselector}} +{{^displaygroupingselector}} +
+   +
+{{/displaygroupingselector}} diff --git a/blocks/myoverview/tests/behat/block_myoverview_adminsettings.feature b/blocks/myoverview/tests/behat/block_myoverview_adminsettings.feature new file mode 100644 index 00000000000..5e692562ca0 --- /dev/null +++ b/blocks/myoverview/tests/behat/block_myoverview_adminsettings.feature @@ -0,0 +1,226 @@ +@block @block_myoverview @javascript +Feature: The my overview block allows admins to easily configure the students' course list + In order to adapt the my overview block to my users' needs + As an admin + I can configure the appearance of the my overview block + + Background: + Given the following "users" exist: + | username | firstname | lastname | email | idnumber | + | student1 | Student | X | student1@example.com | S1 | + And the following "categories" exist: + | name | category | idnumber | + | Category 1 | 0 | CAT1 | + And the following "courses" exist: + | fullname | shortname | category | startdate | enddate | + | Course 1 | C1 | 0 | ##1 month ago## | ##15 days ago## | + | Course 2 | C2 | 0 | ##yesterday## | ##tomorrow## | + | Course 3 | C3 | 0 | ##yesterday## | ##tomorrow## | + | Course 4 | C4 | CAT1 | ##yesterday## | ##tomorrow## | + | Course 5 | C5 | 0 | ##first day of next month## | ##last day of next month## | + And the following "course enrolments" exist: + | user | course | role | + | student1 | C1 | student | + | student1 | C2 | student | + | student1 | C3 | student | + | student1 | C4 | student | + | student1 | C5 | student | + + Scenario: Enable 'All' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "All" to "1" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + # We have to check for the data attribute instead of the list element text as we would get false positives from the "All (except hidden)" element otherwise + Then "[data-value='allincludinghidden']" "css_element" should exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable 'All' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "All" to "0" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + # We have to check for the data attribute instead of the list element text as we would get false negatives "All (except hidden)" element otherwise + Then "[data-value='allincludinghidden']" "css_element" should not exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Enable 'All (except hidden)' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "All (except hidden)" to "1" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "All (except hidden)" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable 'All (except hidden)' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "All (except hidden)" to "0" + And I press "Save" + And I log out + Then I log in as "student1" + # 'All (except hidden)' option has been disabled, so the button is falling back to the 'In progress' option which is the next enabled option. + And I click on "In progress" "button" in the "Course overview" "block" + Then "All (except hidden)" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Enable 'In progress' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "In progress" to "1" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "In progress" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable 'In progress' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "In progress" to "0" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "In progress" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Enable 'Future' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Future" to "1" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Future" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable 'Future' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Future" to "0" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Future" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Enable 'Past' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Past" to "1" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Past" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable 'Past' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Past" to "0" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Past" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Enable 'Starred' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Starred" to "1" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Starred" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable 'Starred' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Starred" to "0" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Starred" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Enable 'Hidden' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Hidden" to "1" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Hidden" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable 'Hidden' course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "Hidden" to "0" + And I press "Save" + And I log out + Then I log in as "student1" + And I click on "All (except hidden)" "button" in the "Course overview" "block" + Then "Hidden" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element" + And I log out + + Scenario: Disable all course filter options + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "All" to "0" + And I set the field "All (except hidden)" to "0" + And I set the field "In progress" to "0" + And I set the field "Future" to "0" + And I set the field "Past" to "0" + And I set the field "Starred" to "0" + And I set the field "Hidden" to "0" + And I press "Save" + And I log out + And I log in as "student1" + Then "button#groupingdropdown" "css_element" should not exist in the ".block_myoverview" "css_element" + And I should see "Course 1" in the "Course overview" "block" + And I should see "Course 2" in the "Course overview" "block" + And I should see "Course 3" in the "Course overview" "block" + And I should see "Course 4" in the "Course overview" "block" + And I should see "Course 5" in the "Course overview" "block" + And I log out + + Scenario: Disable all but one course filter option + Given I log in as "admin" + And I navigate to "Plugins > Blocks > Course overview" in site administration + And I set the field "All" to "0" + And I set the field "All (except hidden)" to "0" + And I set the field "In progress" to "1" + And I set the field "Future" to "0" + And I set the field "Past" to "0" + And I set the field "Starred" to "0" + And I set the field "Hidden" to "0" + And I press "Save" + And I log out + And I log in as "student1" + Then "button#groupingdropdown" "css_element" should not exist in the ".block_myoverview" "css_element" + And I should see "Course 2" in the "Course overview" "block" + And I should see "Course 3" in the "Course overview" "block" + And I should see "Course 4" in the "Course overview" "block" + And I should not see "Course 1" in the "Course overview" "block" + And I should not see "Course 5" in the "Course overview" "block" + And I log out diff --git a/blocks/myoverview/tests/behat/block_myoverview_dashboard.feature b/blocks/myoverview/tests/behat/block_myoverview_dashboard.feature index a56b065347f..9101de8160d 100644 --- a/blocks/myoverview/tests/behat/block_myoverview_dashboard.feature +++ b/blocks/myoverview/tests/behat/block_myoverview_dashboard.feature @@ -71,7 +71,10 @@ Feature: The my overview block allows users to easily access their courses And I log out Scenario: View all (including hidden) courses - Given I log in as "student1" + Given the following config values are set as admin: + | config | value | plugin | + | displaygroupingallincludinghidden | 1 | block_myoverview | + And I log in as "student1" And I click on "All (except hidden)" "button" in the "Course overview" "block" # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except hidden)" element instead When I click on "[data-value='allincludinghidden']" "css_element" in the "Course overview" "block" @@ -231,7 +234,10 @@ Feature: The my overview block allows users to easily access their courses And I log out Scenario: View all (including hidden) courses with hide persistent functionality - Given I log in as "student1" + Given the following config values are set as admin: + | config | value | plugin | + | displaygroupingallincludinghidden | 1 | block_myoverview | + And I log in as "student1" And I click on "All (except hidden)" "button" in the "Course overview" "block" # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except hidden)" element instead When I click on "[data-value='allincludinghidden']" "css_element" in the "Course overview" "block" diff --git a/blocks/myoverview/tests/behat/block_myoverview_hidden.feature b/blocks/myoverview/tests/behat/block_myoverview_hidden.feature index a4d19f739ed..e494c75e720 100644 --- a/blocks/myoverview/tests/behat/block_myoverview_hidden.feature +++ b/blocks/myoverview/tests/behat/block_myoverview_hidden.feature @@ -100,7 +100,10 @@ Feature: The my overview block allows users to hide their courses And I log out Scenario: Test a course is never hidden with "All (including hidden)" courses - Given I log in as "student1" + Given the following config values are set as admin: + | config | value | plugin | + | displaygroupingallincludinghidden | 1 | block_myoverview | + And I log in as "student1" And I click on "All (except hidden)" "button" in the "Course overview" "block" # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except hidden)" element instead When I click on "[data-value='allincludinghidden']" "css_element" in the "Course overview" "block" diff --git a/blocks/myoverview/version.php b/blocks/myoverview/version.php index 4c93e24f4e4..6b5751d8217 100644 --- a/blocks/myoverview/version.php +++ b/blocks/myoverview/version.php @@ -24,6 +24,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2019070400; // The current plugin version (Date: YYYYMMDDXX). +$plugin->version = 2019070401; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2019051100; // Requires this Moodle version. $plugin->component = 'block_myoverview'; // Full name of the plugin (used for diagnostics).