Merge branch 'MDL-66016-master' of git://github.com/abias/moodle
authorAdrian Greeve <abgreeve@gmail.com>
Tue, 27 Aug 2019 01:32:42 +0000 (09:32 +0800)
committerAdrian Greeve <abgreeve@gmail.com>
Tue, 27 Aug 2019 01:32:42 +0000 (09:32 +0800)
19 files changed:
blocks/myoverview/amd/build/view.min.js
blocks/myoverview/amd/build/view.min.js.map
blocks/myoverview/amd/src/view.js
blocks/myoverview/classes/output/main.php
blocks/myoverview/lang/en/block_myoverview.php
blocks/myoverview/lib.php
blocks/myoverview/settings.php
blocks/myoverview/styles.css [new file with mode: 0644]
blocks/myoverview/templates/nav-grouping-selector.mustache
blocks/myoverview/tests/behat/block_myoverview_adminsettings.feature [new file with mode: 0644]
blocks/myoverview/tests/behat/block_myoverview_dashboard.feature
blocks/myoverview/tests/behat/block_myoverview_hidden.feature
blocks/myoverview/tests/behat/block_myoverview_pagelimit_persistence.feature
blocks/myoverview/tests/behat/block_myoverview_progress.feature
blocks/myoverview/tests/privacy_test.php
blocks/myoverview/version.php
course/externallib.php
course/lib.php
course/upgrade.txt

index f58ff47..01b71bc 100644 (file)
Binary files a/blocks/myoverview/amd/build/view.min.js and b/blocks/myoverview/amd/build/view.min.js differ
index ea5cedd..5de1f87 100644 (file)
Binary files a/blocks/myoverview/amd/build/view.min.js.map and b/blocks/myoverview/amd/build/view.min.js.map differ
index 3e53ea0..40d48b9 100644 (file)
@@ -67,6 +67,16 @@ function(
         NOCOURSES: 'core_course/no-courses'
     };
 
+    var GROUPINGS = {
+        GROUPING_ALLINCLUDINGHIDDEN: 'allincludinghidden',
+        GROUPING_ALL: 'all',
+        GROUPING_INPROGRESS: 'inprogress',
+        GROUPING_FUTURE: 'future',
+        GROUPING_PAST: 'past',
+        GROUPING_FAVOURITES: 'favourites',
+        GROUPING_HIDDEN: 'hidden'
+    };
+
     var NUMCOURSES_PERPAGE = [12, 24, 48, 96, 0];
 
     var loadedPages = [];
@@ -252,15 +262,104 @@ function(
         }).catch(Notification.exception);
     };
 
+    /**
+     * Get the action menu item
+     *
+     * @param {Object} root  root The course overview container
+     * @param {Number} courseId Course id.
+     * @return {Object} The hide course menu item.
+     */
+    var getHideCourseMenuItem = function(root, courseId) {
+        return root.find('[data-action="hide-course"][data-course-id="' + courseId + '"]');
+    };
+
+    /**
+     * Get the action menu item
+     *
+     * @param {Object} root  root The course overview container
+     * @param {Number} courseId Course id.
+     * @return {Object} The show course menu item.
+     */
+    var getShowCourseMenuItem = function(root, courseId) {
+        return root.find('[data-action="show-course"][data-course-id="' + courseId + '"]');
+    };
+
+    /**
+     * Hide course
+     *
+     * @param  {Object} root The course overview container
+     * @param  {Number} courseId Course id number
+     */
+    var hideCourse = function(root, courseId) {
+        var hideAction = getHideCourseMenuItem(root, courseId);
+        var showAction = getShowCourseMenuItem(root, courseId);
+        var filters = getFilterValues(root);
+
+        setCourseHiddenState(courseId, true);
+
+        // Remove the course from this view as it is now hidden and thus not covered by this view anymore.
+        // Do only if we are not in "All" view mode where really all courses are shown.
+        if (filters.grouping != GROUPINGS.GROUPING_ALLINCLUDINGHIDDEN) {
+            hideElement(root, courseId);
+        }
+
+        hideAction.addClass('hidden');
+        showAction.removeClass('hidden');
+    };
+
+    /**
+     * Show course
+     *
+     * @param  {Object} root The course overview container
+     * @param  {Number} courseId Course id number
+     */
+    var showCourse = function(root, courseId) {
+        var hideAction = getHideCourseMenuItem(root, courseId);
+        var showAction = getShowCourseMenuItem(root, courseId);
+        var filters = getFilterValues(root);
+
+        setCourseHiddenState(courseId, null);
+
+        // Remove the course from this view as it is now shown again and thus not covered by this view anymore.
+        // Do only if we are not in "All" view mode where really all courses are shown.
+        if (filters.grouping != GROUPINGS.GROUPING_ALLINCLUDINGHIDDEN) {
+            hideElement(root, courseId);
+        }
+
+        hideAction.removeClass('hidden');
+        showAction.addClass('hidden');
+    };
+
+    /**
+     * Set the courses hidden status and push to repository
+     *
+     * @param  {Number} courseId Course id to favourite.
+     * @param  {Bool} status new hidden status.
+     * @return {Promise} Repository promise.
+     */
+    var setCourseHiddenState = function(courseId, status) {
+
+        // If the given status is not hidden, the preference has to be deleted with a null value.
+        if (status === false) {
+            status = null;
+        }
+        return Repository.updateUserPreferences({
+            preferences: [
+                {
+                    type: 'block_myoverview_hidden_course_' + courseId,
+                    value: status
+                }
+            ]
+        });
+    };
+
     /**
      * Reset the loadedPages dataset to take into account the hidden element
      *
      * @param {Object} root The course overview container
-     * @param {Object} target The course that you want to hide
+     * @param {Number} id The course id number
      */
-    var hideElement = function(root, target) {
-        var id = getCourseId(target);
-
+    var hideElement = function(root, id) {
         var pagingBar = root.find('[data-region="paging-bar"]');
         var jumpto = parseInt(pagingBar.attr('data-active-page-number'));
 
@@ -570,38 +669,15 @@ function(
 
         root.on(CustomEvents.events.activate, SELECTORS.ACTION_HIDE_COURSE, function(e, data) {
             var target = $(e.target).closest(SELECTORS.ACTION_HIDE_COURSE);
-            var id = getCourseId(target);
-
-            var request = {
-                preferences: [
-                    {
-                        type: 'block_myoverview_hidden_course_' + id,
-                        value: true
-                    }
-                ]
-            };
-            Repository.updateUserPreferences(request);
-
-            hideElement(root, target);
+            var courseId = getCourseId(target);
+            hideCourse(root, courseId);
             data.originalEvent.preventDefault();
         });
 
         root.on(CustomEvents.events.activate, SELECTORS.ACTION_SHOW_COURSE, function(e, data) {
             var target = $(e.target).closest(SELECTORS.ACTION_SHOW_COURSE);
-            var id = getCourseId(target);
-
-            var request = {
-                preferences: [
-                    {
-                        type: 'block_myoverview_hidden_course_' + id,
-                        value: null
-                    }
-                ]
-            };
-
-            Repository.updateUserPreferences(request);
-
-            hideElement(root, target);
+            var courseId = getCourseId(target);
+            showCourse(root, courseId);
             data.originalEvent.preventDefault();
         });
     };
index e1c92a9..5f4a033 100644 (file)
@@ -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);
 
index 637368b..8fe7076 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-$string['all'] = 'All';
-$string['allexcepthidden'] = 'All (except hidden)';
+$string['allincludinghidden'] = 'All';
+$string['all'] = 'All (except hidden)';
 $string['addtofavourites'] = 'Star this course';
 $string['aria:addtofavourites'] = 'Star for';
-$string['aria:allcourses'] = 'All courses';
-$string['aria:allcoursesexcepthidden'] = 'All courses except hidden courses';
+$string['aria:allcoursesincludinghidden'] = 'All courses';
+$string['aria:allcourses'] = 'All courses except hidden courses';
 $string['aria:card'] = 'Switch to card view';
 $string['aria:controls'] = 'Course overview controls';
 $string['aria:courseactions'] = 'Actions for current course';
@@ -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:';
index 7acbaff..81090ed 100644 (file)
@@ -27,6 +27,7 @@ defined('MOODLE_INTERNAL') || die();
 /**
  * Constants for the user preferences grouping options
  */
+define('BLOCK_MYOVERVIEW_GROUPING_ALLINCLUDINGHIDDEN', 'allincludinghidden');
 define('BLOCK_MYOVERVIEW_GROUPING_ALL', 'all');
 define('BLOCK_MYOVERVIEW_GROUPING_INPROGRESS', 'inprogress');
 define('BLOCK_MYOVERVIEW_GROUPING_FUTURE', 'future');
@@ -74,6 +75,7 @@ function block_myoverview_user_preferences() {
         'default' => BLOCK_MYOVERVIEW_GROUPING_ALL,
         'type' => PARAM_ALPHA,
         'choices' => array(
+            BLOCK_MYOVERVIEW_GROUPING_ALLINCLUDINGHIDDEN,
             BLOCK_MYOVERVIEW_GROUPING_ALL,
             BLOCK_MYOVERVIEW_GROUPING_INPROGRESS,
             BLOCK_MYOVERVIEW_GROUPING_FUTURE,
index b17ea4e..b633f22 100644 (file)
@@ -27,22 +27,74 @@ defined('MOODLE_INTERNAL') || die;
 if ($ADMIN->fulltree) {
     require_once($CFG->dirroot . '/blocks/myoverview/lib.php');
 
+    // Presentation options heading.
+    $settings->add(new admin_setting_heading('block_myoverview/appearance',
+            get_string('appearance', 'admin'),
+            ''));
+
     // Display Course Categories on Dashboard course items (cards, lists, summary items).
     $settings->add(new admin_setting_configcheckbox(
-        'block_myoverview/displaycategories',
-        get_string('displaycategories', 'block_myoverview'),
-        get_string('displaycategories_help', 'block_myoverview'),
-        1));
-
-       $choices = array(BLOCK_MYOVERVIEW_VIEW_CARD => get_string('card', 'block_myoverview'),
-        BLOCK_MYOVERVIEW_VIEW_LIST => get_string('list', 'block_myoverview'),
-        BLOCK_MYOVERVIEW_VIEW_SUMMARY => get_string('summary', 'block_myoverview'));
+            'block_myoverview/displaycategories',
+            get_string('displaycategories', 'block_myoverview'),
+            get_string('displaycategories_help', 'block_myoverview'),
+            1));
 
+    // Enable / Disable available layouts.
+    $choices = array(BLOCK_MYOVERVIEW_VIEW_CARD => get_string('card', 'block_myoverview'),
+            BLOCK_MYOVERVIEW_VIEW_LIST => get_string('list', 'block_myoverview'),
+            BLOCK_MYOVERVIEW_VIEW_SUMMARY => get_string('summary', 'block_myoverview'));
     $settings->add(new admin_setting_configmulticheckbox(
-        'block_myoverview/layouts',
-        get_string('layouts', 'block_myoverview'),
-        get_string('layouts_help', 'block_myoverview'),
-        $choices,
-        $choices));
+            'block_myoverview/layouts',
+            get_string('layouts', 'block_myoverview'),
+            get_string('layouts_help', 'block_myoverview'),
+            $choices,
+            $choices));
+    unset ($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 (file)
index 0000000..76daded
--- /dev/null
@@ -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;
+}
index fb56f6d..703482f 100644 (file)
 
     Example context (json):
     {
+        "allincludinghidden": false,
         "all": true,
         "inprogress": false,
         "future": false,
-        "past": false
+        "past": false,
+        "favourites": false,
+        "hidden": false,
+        "displaygroupingallincludinghidden": false,
+        "displaygroupingall": true,
+        "displaygroupinginprogress": true,
+        "displaygroupingfuture": true,
+        "displaygroupingpast": true,
+        "displaygroupingstarred": true,
+        "displaygroupinghidden": true,
+        "displaygroupingselector": true
     }
 }}
+{{#displaygroupingselector}}
 <div class="dropdown mb-1 mr-auto">
     <button id="groupingdropdown" type="button" class="btn btn-outline-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="{{#str}} aria:groupingdropdown, block_myoverview {{/str}}">
         {{#pix}} i/filter {{/pix}}
         <span class="d-sm-inline-block" data-active-item-text>
-            {{#all}}{{#str}} allexcepthidden, block_myoverview {{/str}}{{/all}}
+            {{#allincludinghidden}}{{#str}} allincludinghidden, block_myoverview {{/str}}{{/allincludinghidden}}
+            {{#all}}{{#str}} all, block_myoverview {{/str}}{{/all}}
             {{#inprogress}}{{#str}} inprogress, block_myoverview {{/str}}{{/inprogress}}
             {{#future}}{{#str}} future, block_myoverview {{/str}}{{/future}}
             {{#past}}{{#str}} past, block_myoverview {{/str}}{{/past}}
         </span>
     </button>
     <ul class="dropdown-menu" data-show-active-item data-active-item-text aria-labelledby="groupingdropdown">
+        {{#displaygroupingallincludinghidden}}
         <li>
-            <a class="dropdown-item {{#all}}active{{/all}}" href="#" data-filter="grouping" data-value="all" data-pref="all" aria-label="{{#str}} aria:allcoursesexcepthidden, block_myoverview {{/str}}" aria-controls="courses-view-{{uniqid}}">
-                {{#str}} allexcepthidden, block_myoverview {{/str}}
+            <a class="dropdown-item {{#allincludinghidden}}active{{/allincludinghidden}}" href="#" data-filter="grouping" data-value="allincludinghidden" data-pref="allincludinghidden" aria-label="{{#str}} aria:allcoursesincludinghidden, block_myoverview {{/str}}" aria-controls="courses-view-{{uniqid}}">
+                {{#str}} allincludinghidden, block_myoverview {{/str}}
             </a>
         </li>
+        {{/displaygroupingallincludinghidden}}
+        {{#displaygroupingall}}
+        <li class="dropdown-divider" role="presentation">
+            <span class="filler">&nbsp;</span>
+        </li>
+        <li>
+            <a class="dropdown-item {{#all}}active{{/all}}" href="#" data-filter="grouping" data-value="all" data-pref="all" aria-label="{{#str}} aria:allcourses, block_myoverview {{/str}}" aria-controls="courses-view-{{uniqid}}">
+                {{#str}} all, block_myoverview {{/str}}
+            </a>
+        </li>
+        {{/displaygroupingall}}
+        {{#displaygroupinginprogress}}
         <li class="dropdown-divider" role="presentation">
             <span class="filler">&nbsp;</span>
         </li>
                 {{#str}} inprogress, block_myoverview {{/str}}
             </a>
         </li>
+        {{/displaygroupinginprogress}}
+        {{#displaygroupingfuture}}
+            {{^displaygroupinginprogress}}
+            <li class="dropdown-divider" role="presentation">
+                <span class="filler">&nbsp;</span>
+            </li>
+            {{/displaygroupinginprogress}}
         <li>
             <a class="dropdown-item {{#future}}active{{/future}}" href="#" data-filter="grouping" data-value="future" data-pref="future" aria-label="{{#str}} aria:future, block_myoverview {{/str}}" aria-controls="courses-view-{{uniqid}}">
                 {{#str}} future, block_myoverview {{/str}}
             </a>
         </li>
+        {{/displaygroupingfuture}}
+        {{#displaygroupingpast}}
+            {{^displaygroupinginprogress}}
+                {{^displaygroupingfuture}}
+                <li class="dropdown-divider" role="presentation">
+                    <span class="filler">&nbsp;</span>
+                </li>
+                {{/displaygroupingfuture}}
+            {{/displaygroupinginprogress}}
         <li>
             <a class="dropdown-item {{#past}}active{{/past}}" href="#" data-filter="grouping" data-value="past" data-pref="past" aria-label="{{#str}} aria:past, block_myoverview {{/str}}" aria-controls="courses-view-{{uniqid}}">
                 {{#str}} past, block_myoverview {{/str}}
             </a>
         </li>
+        {{/displaygroupingpast}}
+        {{#displaygroupingstarred}}
         <li class="dropdown-divider" role="presentation">
             <span class="filler">&nbsp;</span>
         </li>
             <a class="dropdown-item {{#favourites}}active{{/favourites}}" href="#" data-filter="grouping" data-value="favourites"  data-pref="favourites" aria-label="{{#str}} aria:favourites, block_myoverview {{/str}}" aria-controls="courses-view-{{uniqid}}">
                 {{#str}} favourites, block_myoverview {{/str}}
             </a>
-        </li>
+        {{/displaygroupingstarred}}
+        {{#displaygroupinghidden}}
         <li class="dropdown-divider" role="presentation">
             <span class="filler">&nbsp;</span>
         </li>
                 {{#str}} hiddencourses, block_myoverview {{/str}}
             </a>
         </li>
+        {{/displaygroupinghidden}}
     </ul>
 </div>
+{{/displaygroupingselector}}
+{{^displaygroupingselector}}
+<div class="mb-1 mr-auto">
+    <span class="filler">&nbsp;</span>
+</div>
+{{/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 (file)
index 0000000..5e69256
--- /dev/null
@@ -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
index b63804b..9101de8 100644 (file)
@@ -28,7 +28,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View past courses
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "Past" "link" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     And I should not see "Course 2" in the "Course overview" "block"
@@ -39,7 +39,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View future courses
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "Future" "link" in the "Course overview" "block"
     Then I should see "Course 5" in the "Course overview" "block"
     And I should not see "Course 1" in the "Course overview" "block"
@@ -50,7 +50,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View inprogress courses
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "In progress" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     Then I should see "Course 3" in the "Course overview" "block"
@@ -59,10 +59,25 @@ Feature: The my overview block allows users to easily access their courses
     And I should not see "Course 5" in the "Course overview" "block"
     And I log out
 
-  Scenario: View all courses
+  Scenario: View all (except hidden) courses
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
-    When I click on "All" "link" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    Then I should see "Course 1" in the "Course overview" "block"
+    Then I should see "Course 2" in the "Course overview" "block"
+    Then I should see "Course 3" in the "Course overview" "block"
+    Then I should see "Course 4" in the "Course overview" "block"
+    Then I should see "Course 5" in the "Course overview" "block"
+    And I log out
+
+  Scenario: View all (including hidden) courses
+    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"
     Then I should see "Course 1" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     Then I should see "Course 3" in the "Course overview" "block"
@@ -72,7 +87,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View inprogress courses - test persistence
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     And I click on "In progress" "link" in the "Course overview" "block"
     And I reload the page
     Then I should see "In progress" in the "Course overview" "block"
@@ -83,12 +98,12 @@ Feature: The my overview block allows users to easily access their courses
     And I should not see "Course 5" in the "Course overview" "block"
     And I log out
 
-  Scenario: View all courses - w/ persistence
+  Scenario: View all (except hidden) courses - w/ persistence
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
-    When I click on "All" "link" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
     And I reload the page
-    Then I should see "All" in the "Course overview" "block"
+    Then I should see "All (except hidden)" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     Then I should see "Course 3" in the "Course overview" "block"
@@ -98,7 +113,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View past courses - w/ persistence
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "Past" "link" in the "Course overview" "block"
     And I reload the page
     Then I should see "Past" in the "Course overview" "block"
@@ -111,7 +126,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View future courses - w/ persistence
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "Future" "link" in the "Course overview" "block"
     And I reload the page
     Then I should see "Future" in the "Course overview" "block"
@@ -164,7 +179,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View inprogress courses with hide persistent functionality
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "In progress" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
@@ -178,7 +193,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View past courses with hide persistent functionality
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "Past" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 1')]" "xpath_element"
     And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 1')]" "xpath_element"
@@ -192,7 +207,7 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View future courses with hide persistent functionality
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     When I click on "Future" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
     And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
@@ -204,6 +219,38 @@ Feature: The my overview block allows users to easily access their courses
     And I should not see "Course 4" in the "Course overview" "block"
     And I log out
 
+  Scenario: View all (except hidden) courses with hide persistent functionality
+    Given I log in as "student1"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
+    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
+    And I reload the page
+    Then I should not see "Course 5" in the "Course overview" "block"
+    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 log out
+
+  Scenario: View all (including hidden) courses with hide persistent functionality
+    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"
+    And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
+    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
+    And I reload the page
+    Then I should see "Course 5" in the "Course overview" "block"
+    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 log out
+
   Scenario: Show course category in cards display
     Given I log in as "student1"
     And I click on "Display drop-down menu" "button" in the "Course overview" "block"
index c9c4845..e494c75 100644 (file)
@@ -25,7 +25,9 @@ Feature: The my overview block allows users to hide their courses
 
   Scenario: Test hide toggle functionality
     Given I log in as "student1"
-    When I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I reload the page
     Then I should not see "Course 2" in the "Course overview" "block"
@@ -33,13 +35,15 @@ Feature: The my overview block allows users to hide their courses
 
   Scenario: Test hide toggle functionality w/ favorites
     Given I log in as "student1"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Star this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     When I reload the page
     Then I should not see "Course 2" in the "Course overview" "block"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     And I click on "Starred" "link" in the "Course overview" "block"
     Then I should not see "Course 2" in the "Course overview" "block"
     And I click on "Starred" "button" in the "Course overview" "block"
@@ -49,25 +53,29 @@ Feature: The my overview block allows users to hide their courses
 
   Scenario: Test show toggle functionality
     Given I log in as "student1"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    When I click on "All" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "button" in the "Course overview" "block"
     And I click on "Hidden" "link" in the "Course overview" "block"
     When I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Show this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I reload the page
     And I click on "Hidden" "button" in the "Course overview" "block"
-    When I click on "All" "link" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     And I log out
 
   Scenario: Test show toggle functionality w/ favorites
     Given I log in as "student1"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Star this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     And I click on "Hidden" "link" in the "Course overview" "block"
     And I should see "Course 2" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
@@ -75,9 +83,39 @@ Feature: The my overview block allows users to hide their courses
     When I reload the page
     Then I should not see "Course 2" in the "Course overview" "block"
     And I click on "Hidden" "button" in the "Course overview" "block"
-    And I click on "All" "link" in the "Course overview" "block"
+    And I click on "All (except hidden)" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     And I click on "Starred" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
+    And I log out
+
+  Scenario: Test a course is hidden directly with "All (except hidden)" courses
+    Given I log in as "student1"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    Then I should not see "Course 2" in the "Course overview" "block"
+    And I log out
+
+  Scenario: Test a course is never hidden with "All (including hidden)" courses
+    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"
+    And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    Then I should see "Course 2" in the "Course overview" "block"
+    And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I should not see "Hide from view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I should see "Show this course" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Show this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    Then I should see "Course 2" in the "Course overview" "block"
+    And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I should see "Hide from view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I should not see "Show this course" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I log out
\ No newline at end of file
index 6e0e107..84f2e4e 100644 (file)
@@ -50,7 +50,7 @@ Feature: The my overview block allows users to persistence of their page limits
     Given I log in as "student1"
     When I click on "[data-toggle='dropdown']" "css_element" in the "Course overview" "block"
     And I click on "All" "link"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     And I click on "In progress" "link" in the "Course overview" "block"
     Then I should see "Course 13"
     And I should see "All" in the "[data-action='limit-toggle']" "css_element"
index 06813f5..3c2c1c9 100644 (file)
@@ -22,8 +22,8 @@ Feature: Course overview block show users their progress on courses
 
   Scenario: Course progress percentage should not be displayed if completion is not enabled
     Given I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
-    When I click on "All" "link" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    When I click on "All (except hidden)" "link" in the "Course overview" "block"
     Then I should not see "0%" in the "Course overview" "block"
     And I log out
 
@@ -38,12 +38,12 @@ Feature: Course overview block show users their progress on courses
     And I press "Save and return to course"
     And I log out
     When I log in as "student1"
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     And I should see "0%" in the "Course overview" "block"
     And I am on "Course 1" course homepage
     And I follow "Test choice 1"
     And I follow "Dashboard" in the user menu
-    And I click on "All" "button" in the "Course overview" "block"
+    And I click on "All (except hidden)" "button" in the "Course overview" "block"
     And I should see "100%" in the "Course overview" "block"
     And I log out
index 5b5b488..12a7387 100644 (file)
@@ -72,6 +72,7 @@ class block_myoverview_privacy_testcase extends \core_privacy\tests\provider_tes
         return array(
             array('block_myoverview_user_sort_preference', 'lastaccessed', ''),
             array('block_myoverview_user_sort_preference', 'title', ''),
+            array('block_myoverview_user_grouping_preference', 'allincludinghidden', ''),
             array('block_myoverview_user_grouping_preference', 'all', ''),
             array('block_myoverview_user_grouping_preference', 'inprogress', ''),
             array('block_myoverview_user_grouping_preference', 'future', ''),
index 4c93e24..6b5751d 100644 (file)
@@ -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).
index 7f3a170..8877119 100644 (file)
@@ -3741,6 +3741,8 @@ class core_course_external extends external_api {
         $sort = $params['sort'];
 
         switch($classification) {
+            case COURSE_TIMELINE_ALLINCLUDINGHIDDEN:
+                break;
             case COURSE_TIMELINE_ALL:
                 break;
             case COURSE_TIMELINE_PAST:
@@ -3764,10 +3766,16 @@ class core_course_external extends external_api {
         $hiddencourses = get_hidden_courses_on_timeline();
         $courses = [];
 
-        // If the timeline requires the hidden courses then restrict the result to only $hiddencourses else exclude.
-        if ($classification == COURSE_TIMELINE_HIDDEN) {
+        // If the timeline requires really all courses, get really all courses.
+        if ($classification == COURSE_TIMELINE_ALLINCLUDINGHIDDEN) {
+            $courses = course_get_enrolled_courses_for_logged_in_user(0, $offset, $sort, $fields, COURSE_DB_QUERY_LIMIT);
+
+            // Otherwise if the timeline requires the hidden courses then restrict the result to only $hiddencourses.
+        } else if ($classification == COURSE_TIMELINE_HIDDEN) {
             $courses = course_get_enrolled_courses_for_logged_in_user(0, $offset, $sort, $fields,
                 COURSE_DB_QUERY_LIMIT, $hiddencourses);
+
+            // Otherwise get the requested courses and exclude the hidden courses.
         } else {
             $courses = course_get_enrolled_courses_for_logged_in_user(0, $offset, $sort, $fields,
                 COURSE_DB_QUERY_LIMIT, [], $hiddencourses);
index dc8b162..0a6ef2f 100644 (file)
@@ -56,6 +56,7 @@ define('FIRSTUSEDEXCELROW', 3);
 define('MOD_CLASS_ACTIVITY', 0);
 define('MOD_CLASS_RESOURCE', 1);
 
+define('COURSE_TIMELINE_ALLINCLUDINGHIDDEN', 'allincludinghidden');
 define('COURSE_TIMELINE_ALL', 'all');
 define('COURSE_TIMELINE_PAST', 'past');
 define('COURSE_TIMELINE_INPROGRESS', 'inprogress');
@@ -4320,9 +4321,9 @@ function course_filter_courses_by_timeline_classification(
 ) : array {
 
     if (!in_array($classification,
-            [COURSE_TIMELINE_ALL, COURSE_TIMELINE_PAST, COURSE_TIMELINE_INPROGRESS,
+            [COURSE_TIMELINE_ALLINCLUDINGHIDDEN, COURSE_TIMELINE_ALL, COURSE_TIMELINE_PAST, COURSE_TIMELINE_INPROGRESS,
                 COURSE_TIMELINE_FUTURE, COURSE_TIMELINE_HIDDEN])) {
-        $message = 'Classification must be one of COURSE_TIMELINE_ALL, COURSE_TIMELINE_PAST, '
+        $message = 'Classification must be one of COURSE_TIMELINE_ALLINCLUDINGHIDDEN, COURSE_TIMELINE_ALL, COURSE_TIMELINE_PAST, '
             . 'COURSE_TIMELINE_INPROGRESS or COURSE_TIMELINE_FUTURE';
         throw new moodle_exception($message);
     }
@@ -4336,7 +4337,7 @@ function course_filter_courses_by_timeline_classification(
         $pref = get_user_preferences('block_myoverview_hidden_course_' . $course->id, 0);
 
         // Added as of MDL-63457 toggle viewability for each user.
-        if (($classification == COURSE_TIMELINE_HIDDEN && $pref) ||
+        if ($classification == COURSE_TIMELINE_ALLINCLUDINGHIDDEN || ($classification == COURSE_TIMELINE_HIDDEN && $pref) ||
             (($classification == COURSE_TIMELINE_ALL || $classification == course_classify_for_timeline($course)) && !$pref)) {
             $filteredcourses[] = $course;
             $filtermatches++;
index 10407f9..d48e163 100644 (file)
@@ -2,8 +2,12 @@ This files describes API changes in /course/*,
 information provided here is intended especially for developers.
 
 === 3.8 ===
+
 * The following functions have been finally deprecated and can not be used any more:
   - core_course_external::get_activities_overview
+* External function core_course_external::get_enrolled_courses_by_timeline_classification now also supports the classification
+  'allincludinghidden' which delivers all courses including hidden courses. The classification 'all' still returns all courses
+  without hidden courses.
 
 === 3.7 ===