diff --git a/blocks/myoverview/classes/output/main.php b/blocks/myoverview/classes/output/main.php index abe98d9e20910..11b269abfb7e4 100644 --- a/blocks/myoverview/classes/output/main.php +++ b/blocks/myoverview/classes/output/main.php @@ -503,83 +503,71 @@ public function export_for_zero_state_template(renderer_base $output) { $nocoursesimg = $output->image_url('courses', 'block_myoverview'); + $buttons = []; $coursecat = \core_course_category::user_top(); if ($coursecat) { + // Manage courses button. + if ($categorytomanage = \core_course_category::get_nearest_editable_subcategory($coursecat, ['manage'])) { + $managebutton = new \single_button( + new \moodle_url('/course/management.php', ['category' => $categorytomanage->id]), + get_string('managecourses'), + ); + $buttons[] = $managebutton->export_for_template($output); + } + + // Request a course button. $category = \core_course_category::get_nearest_editable_subcategory($coursecat, ['moodle/course:request']); if ($category && $category->can_request_course()) { - // Add Request a course button. - $button = new \single_button( + $requestbutton = new \single_button( new \moodle_url('/course/request.php', ['category' => $category->id]), get_string('requestcourse'), 'post', \single_button::BUTTON_PRIMARY ); + $buttons[] = $requestbutton->export_for_template($output); return $this->generate_zero_state_data( $nocoursesimg, - [$button->export_for_template($output)], - ['title' => 'zero_request_title', 'intro' => 'zero_request_intro'] + $buttons, + ['title' => 'zero_request_title', 'intro' => 'zero_request_intro'], ); } $totalcourses = $DB->count_records_select('course', 'category > 0'); - if (!$totalcourses && ($category = \core_course_category::get_nearest_editable_subcategory($coursecat, ['create']))) { - // Add Quickstart guide and Create course buttons. + // Quickstart guide and Create course buttons. + if ($category = \core_course_category::get_nearest_editable_subcategory($coursecat, ['create'])) { $quickstarturl = $CFG->coursecreationguide; - if ($quickstarturl) { + if (!$totalcourses && $quickstarturl) { $quickstartbutton = new \single_button( new \moodle_url($quickstarturl, ['lang' => current_language()]), get_string('viewquickstart', 'block_myoverview'), 'get', ); - $buttons = [$quickstartbutton->export_for_template($output)]; + // Add the Quickstart button in the first position. + array_unshift($buttons, $quickstartbutton->export_for_template($output)); } $createbutton = new \single_button( new \moodle_url('/course/edit.php', ['category' => $category->id]), get_string('createcourse', 'block_myoverview'), 'post', - \single_button::BUTTON_PRIMARY + \single_button::BUTTON_PRIMARY, ); $buttons[] = $createbutton->export_for_template($output); - return $this->generate_zero_state_data( - $nocoursesimg, - $buttons, - ['title' => 'zero_nocourses_title', 'intro' => 'zero_nocourses_intro'] - ); - } - if ($categorytocreate = \core_course_category::get_nearest_editable_subcategory($coursecat, ['create'])) { - $createbutton = new \single_button( - new \moodle_url('/course/edit.php', ['category' => $categorytocreate->id]), - get_string('createcourse', 'block_myoverview'), - 'post', - \single_button::BUTTON_PRIMARY - ); - $buttons = [$createbutton->export_for_template($output)]; - if ($categorytomanage = \core_course_category::get_nearest_editable_subcategory($coursecat, ['manage'])) { - // Add a Manage course button. - $managebutton = new \single_button( - new \moodle_url('/course/management.php', ['category' => $categorytomanage->id]), - get_string('managecourses') - ); - $buttons[] = $managebutton->export_for_template($output); - return $this->generate_zero_state_data( - $nocoursesimg, - array_reverse($buttons), - ['title' => 'zero_default_title', 'intro' => 'zero_default_intro'] - ); - } + $title = $totalcourses ? 'zero_default_title' : 'zero_nocourses_title'; + $intro = $totalcourses ? 'zero_default_intro' : 'zero_nocourses_intro'; return $this->generate_zero_state_data( $nocoursesimg, $buttons, - ['title' => 'zero_default_title', 'intro' => 'zero_default_intro'] + ['title' => $title, 'intro' => $intro], ); } + } return $this->generate_zero_state_data( $nocoursesimg, - [], + $buttons, ['title' => 'zero_default_title', 'intro' => 'zero_default_intro'] ); } diff --git a/lang/en/deprecated.txt b/lang/en/deprecated.txt index 9b7bebd3cb525..bd9791b8f9bc5 100644 --- a/lang/en/deprecated.txt +++ b/lang/en/deprecated.txt @@ -127,3 +127,4 @@ reviewbadge,core_badges myisamproblem,core_error newpasswordtext,core cannotsetpassword,core_error +coursemanagementoptions,core_my diff --git a/lang/en/my.php b/lang/en/my.php index 519f203993aae..5fd569d2183b7 100644 --- a/lang/en/my.php +++ b/lang/en/my.php @@ -22,7 +22,6 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['coursemanagementoptions'] = 'Course management options'; $string['error:dashboardisdisabled'] = 'The Dashboard has been disabled by an administrator.'; $string['mymoodle'] = 'Dashboard'; $string['nocourses'] = 'No course information to show.'; @@ -42,3 +41,6 @@ $string['resetpage'] = 'Reset page to default'; $string['reseterror'] = 'There was an error resetting your page'; $string['privacy:metadata:core_my:preference:user_home_page_preference'] = 'The user home page preference.'; + +// Deprecated since Moodle 4.5. +$string['coursemanagementoptions'] = 'Course management options'; diff --git a/my/courses.php b/my/courses.php index 60489dc053306..4d41218e00ca5 100644 --- a/my/courses.php +++ b/my/courses.php @@ -71,19 +71,21 @@ // Add course management if the user has the capabilities for it. $coursecat = core_course_category::user_top(); $coursemanagemenu = []; -if ($coursecat && ($category = core_course_category::get_nearest_editable_subcategory($coursecat, ['create']))) { - // The user has the capability to create course. - $coursemanagemenu['newcourseurl'] = new moodle_url('/course/edit.php', ['category' => $category->id]); -} -if ($coursecat && ($category = core_course_category::get_nearest_editable_subcategory($coursecat, ['manage']))) { - // The user has the capability to manage the course category. - $coursemanagemenu['manageurl'] = new moodle_url('/course/management.php', ['categoryid' => $category->id]); -} -if ($coursecat) { - $category = core_course_category::get_nearest_editable_subcategory($coursecat, ['moodle/course:request']); - if ($category && $category->can_request_course()) { - $coursemanagemenu['courserequesturl'] = new moodle_url('/course/request.php', ['categoryid' => $category->id]); - +// Only display the action menu if the user has courses (otherwise, the buttons will be displayed in the zero state). +if (count(enrol_get_all_users_courses($USER->id, true)) > 0) { + if ($coursecat && ($category = core_course_category::get_nearest_editable_subcategory($coursecat, ['create']))) { + // The user has the capability to create course. + $coursemanagemenu['newcourseurl'] = new moodle_url('/course/edit.php', ['category' => $category->id]); + } + if ($coursecat && ($category = core_course_category::get_nearest_editable_subcategory($coursecat, ['manage']))) { + // The user has the capability to manage the course category. + $coursemanagemenu['manageurl'] = new moodle_url('/course/management.php', ['categoryid' => $category->id]); + } + if ($coursecat) { + $category = core_course_category::get_nearest_editable_subcategory($coursecat, ['moodle/course:request']); + if ($category && $category->can_request_course()) { + $coursemanagemenu['courserequesturl'] = new moodle_url('/course/request.php', ['categoryid' => $category->id]); + } } } if (!empty($coursemanagemenu)) { diff --git a/my/templates/dropdown.mustache b/my/templates/dropdown.mustache index 0ef5225855499..e6483f1bf30c9 100644 --- a/my/templates/dropdown.mustache +++ b/my/templates/dropdown.mustache @@ -27,19 +27,21 @@ } }}
- - - diff --git a/my/tests/behat/my_courses.feature b/my/tests/behat/my_courses.feature index ef10341f7b109..dad8e275f7e5b 100644 --- a/my/tests/behat/my_courses.feature +++ b/my/tests/behat/my_courses.feature @@ -17,25 +17,65 @@ Feature: Run tests over my courses. Scenario: Admin can add new courses or manage them from my courses Given I am on the "My courses" page logged in as "admin" - And I click on "Course management options" "link" - And I click on "New course" "link" - And I wait to be redirected + And "Create course" "button" should not exist in the "page-header" "region" + And "Manage courses" "button" should not exist in the "page-header" "region" + When I click on "Create course" "button" in the "page-content" "region" Then I should see "Add a new course" And I am on the "My courses" page - And I click on "Course management options" "link" - And I click on "Manage courses" "link" + And I click on "Manage courses" "button" in the "page-content" "region" And I should see "Manage course categories and courses" + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | admin | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Create course" "button" should exist in the "page-header" "region" + And "Manage courses" "button" should exist in the "page-header" "region" + And "Create course" "button" should not exist in the "page-content" "region" + And "Manage courses" "button" should not exist in the "page-content" "region" + @javascript Scenario: User without creating a course and managing category permissions cannot see any link Given I am on the "My courses" page logged in as "user1" - Then "Course management options" "link" should not exist + Then "Create course" "button" should not exist + And "Manage courses" "button" should not exist + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | user1 | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Create course" "button" should not exist + And "Manage courses" "button" should not exist Scenario: User without capability to browse courses cannot see any link Given the following "permission overrides" exist: | capability | permission | role | contextlevel | reference | | moodle/category:viewcourselist | Prevent | user | System | | - Given I am on the "My courses" page logged in as "user1" - Then "Course management options" "link" should not exist + When I am on the "My courses" page logged in as "user1" + Then "Create course" "button" should not exist + And "Manage courses" "button" should not exist + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | user1 | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Create course" "button" should not exist + And "Manage courses" "button" should not exist @javascript Scenario: User with creating a course permission can see the Create course link only @@ -43,28 +83,48 @@ Feature: Run tests over my courses. | capability | permission | role | contextlevel | reference | | moodle/course:create | Allow | role1 | Category | cata | When I am on the "My courses" page logged in as "user1" - Then "Course management options" "link" should exist - And I click on "Course management options" "link" - And I should see "New course" - And I should not see "Manage courses" - And I click on "New course" "link" - And I wait to be redirected + Then "Create course" "button" should exist in the "page-content" "region" + But "Manage courses" "button" should not exist + And "Create course" "button" should not exist in the "page-header" "region" + And I click on "Create course" "button" And I should see "Add a new course" And "CatA" "autocomplete_selection" should exist + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | user1 | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Create course" "button" should exist in the "page-header" "region" + And "Manage courses" "button" should not exist + And "Create course" "button" should not exist in the "page-content" "region" - @javascript Scenario: User with managing a category permission can see the Manage course link only Given the following "permission overrides" exist: | capability | permission | role | contextlevel | reference | | moodle/category:manage | Allow | role1 | Category | cata | When I am on the "My courses" page logged in as "user1" - Then "Course management options" "link" should exist - And I click on "Course management options" "link" - And I should not see "New course" - And I should see "Manage courses" - And I click on "Manage courses" "link" - And I wait to be redirected + Then "Manage courses" "button" should exist in the "page-content" "region" + And "Create course" "button" should not exist + And I click on "Manage courses" "button" in the "page-content" "region" And I should see "Manage course categories and courses" + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | user1 | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Manage courses" "button" should exist in the "page-header" "region" + And "Create course" "button" should not exist + And "Manage courses" "button" should not exist in the "page-content" "region" @javascript Scenario: User with both creating a course and managing a category permission can see both links @@ -73,19 +133,30 @@ Feature: Run tests over my courses. | moodle/course:create | Allow | role1 | Category | cata | | moodle/category:manage | Allow | role1 | Category | cata | When I am on the "My courses" page logged in as "user1" - Then "Course management options" "link" should exist - And I click on "Course management options" "link" - And I should see "New course" - And I should see "Manage courses" - And I click on "New course" "link" - And I wait to be redirected + Then "Create course" "button" should exist in the "page-content" "region" + And "Manage courses" "button" should exist in the "page-content" "region" + And "Create course" "button" should not exist in the "page-header" "region" + And "Manage courses" "button" should not exist in the "page-header" "region" + And I click on "Create course" "button" And I should see "Add a new course" And "CatA" "autocomplete_selection" should exist And I am on the "My courses" page - And I click on "Course management options" "link" - And I click on "Manage courses" "link" - And I wait to be redirected + And I click on "Manage courses" "button" And I should see "Manage course categories and courses" + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | user1 | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Create course" "button" should exist in the "page-header" "region" + And "Manage courses" "button" should exist in the "page-header" "region" + And "Create course" "button" should not exist in the "page-content" "region" + And "Manage courses" "button" should not exist in the "page-content" "region" @javascript Scenario: Admin can see relevant blocks but not add or move them @@ -112,30 +183,73 @@ Feature: Run tests over my courses. And I click on "Actions menu" "icon" in the "Course overview" "block" And I should not see "Delete Course overview block" - @javascript Scenario: User with creating a course permission can't see the Request course link Given the following "permission overrides" exist: | capability | permission | role | contextlevel | reference | | moodle/course:request | Allow | user | System | | When I am on the "My courses" page logged in as "admin" - And I click on "Course management options" "link" - And I should see "New course" - Then I should not see "Request a course" + Then "Create course" "button" should exist in the "page-content" "region" + And "Request a course" "button" should not exist + And "Create course" "button" should not exist in the "page-header" "region" + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | admin | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Create course" "button" should exist in the "page-header" "region" + And "Request a course" "button" should not exist + And "Create course" "button" should not exist in the "page-content" "region" - @javascript Scenario: User without creating a course but with course request permission could see the Request course link Given the following "permission overrides" exist: | capability | permission | role | contextlevel | reference | | moodle/course:request | Allow | user | System | | When I am on the "My courses" page logged in as "user1" - And I click on "Course management options" "link" - And I should not see "New course" - Then I should see "Request a course" + Then "Request a course" "button" should exist in the "page-content" "region" + And "Create course" "button" should not exist in the "page-content" "region" + And "Create course" "button" should not exist in the "page-header" "region" + And "Request a course" "button" should not exist in the "page-header" "region" + # Check the request a course button is not displayed when this feature is disabled. And the following config values are set as admin: | enablecourserequests | 0 | And I am on the "My courses" page logged in as "user1" - And "Course management options" "link" should not exist + And "Request a course" "button" should not exist + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | user1 | + | course | C1 | + | role | student | + And the following config values are set as admin: + | enablecourserequests | 1 | + And I am on the "My courses" page + And "Request a course" "button" should exist in the "page-header" "region" + And "Create course" "button" should not exist + And "Request a course" "button" should not exist in the "page-content" "region" Scenario: User without creating nor course request permission shouldn't see any Request course link Given I am on the "My courses" page logged in as "user1" - Then "Course management options" "link" should not exist + Then "Request a course" "button" should not exist in the "page-content" "region" + And "Create course" "button" should not exist in the "page-content" "region" + And "Manage courses" "button" should not exist in the "page-content" "region" + # Check that the same buttons are displayed in the header when the user is enrolled in a course. + But the following "course" exists: + | fullname | Course 1 | + | shortname | C1 | + | format | topics | + And the following "course enrolment" exists: + | user | user1 | + | course | C1 | + | role | student | + And I am on the "My courses" page + And "Create course" "button" should not exist + And "Request a course" "button" should not exist + And "Manage courses" "button" should not exist diff --git a/theme/boost/scss/moodle/core.scss b/theme/boost/scss/moodle/core.scss index 2bb620ebc9263..ac1784db64726 100644 --- a/theme/boost/scss/moodle/core.scss +++ b/theme/boost/scss/moodle/core.scss @@ -2944,6 +2944,13 @@ body.dragging { } } +#page-my-index .my-action-buttons { + display: flex; + justify-content: center; + align-items: center; + gap: 10px; +} + .dropdown-toggle::after { @extend .fa-solid; content: fa-content($fa-var-chevron-down); diff --git a/theme/boost/style/moodle.css b/theme/boost/style/moodle.css index ae6f748b20b83..08da4541cdbfa 100644 --- a/theme/boost/style/moodle.css +++ b/theme/boost/style/moodle.css @@ -25921,6 +25921,13 @@ body.dragging .dragging { padding-right: 0 !important; /* stylelint-disable-line declaration-no-important */ } +#page-my-index .my-action-buttons { + display: flex; + justify-content: center; + align-items: center; + gap: 10px; +} + .dropdown-toggle::after { content: "\f078"; margin-right: 0; diff --git a/theme/classic/style/moodle.css b/theme/classic/style/moodle.css index f02544c7eeef2..413d657a3b2c9 100644 --- a/theme/classic/style/moodle.css +++ b/theme/classic/style/moodle.css @@ -25921,6 +25921,13 @@ body.dragging .dragging { padding-right: 0 !important; /* stylelint-disable-line declaration-no-important */ } +#page-my-index .my-action-buttons { + display: flex; + justify-content: center; + align-items: center; + gap: 10px; +} + .dropdown-toggle::after { content: "\f078"; margin-right: 0;