Skip to content

Commit

Permalink
MDL-55074 theme_boost: Navigation and blocks
Browse files Browse the repository at this point in the history
This patch includes a big set of changes that are all designed to work together to provide
a better way to navigate in the new theme, and a different way of working with blocks.

Blocks have been moved to a "drawer" that can be opened and closed (this is remembered in a user pref).

A new "flat navigation" element is also available in a drawer - which should let you do 90% of things
without needing to open the "blocks" drawer.

The flat navigation is build from specific parts of the nav tree - the top nodes like "calendar, dashboard" are
hand picked. There is a mycourses node listing your enrolled courses.

There is a node for the current course, built from the top nodes in the current course node in the nav tree.

Administrators have a link to the Site admin settings here too.

These nav elements are used by the templates for the new theme, which also has a resigned layout for login and signup.

There have also been some additional fixes / improvements to the scss for the new theme which goes along with these
layout changes.

This set of changes is a collaboration between Martin, Damyon and Alberto (thanks!).
  • Loading branch information
Damyon Wiese committed Oct 21, 2016
1 parent 919b9df commit 9906115
Show file tree
Hide file tree
Showing 52 changed files with 1,602 additions and 240 deletions.
48 changes: 48 additions & 0 deletions admin/admin_settings_search_form.php
@@ -0,0 +1,48 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Admin settings search form
*
* @package admin
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

defined('MOODLE_INTERNAL') || die();

require_once $CFG->libdir.'/formslib.php';

/**
* Admin settings search form
*
* @package admin
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class admin_settings_search_form extends moodleform {
function definition () {
$mform = $this->_form;

//$mform->addElement('header', 'settingsheader', get_string('search', 'admin'));
$elements = [];
$elements[] = $mform->createElement('text', 'query', get_string('query', 'admin'));
$elements[] = $mform->createElement('submit', 'search', get_string('search'));
$mform->addGroup($elements);
$mform->setType('query', PARAM_RAW);
$mform->setDefault('query', optional_param('query', '', PARAM_RAW));
}
}
16 changes: 15 additions & 1 deletion admin/search.php
Expand Up @@ -36,13 +36,27 @@
// to modify them
echo $OUTPUT->header($focus);

echo $OUTPUT->heading(get_string('administrationsite'));

if ($errormsg !== '') {
echo $OUTPUT->notification($errormsg);

} else if ($statusmsg !== '') {
echo $OUTPUT->notification($statusmsg, 'notifysuccess');
}

echo admin_search_settings_html($query);
require_once("admin_settings_search_form.php");
$form = new admin_settings_search_form();
$form->display();
echo '<hr>';

if ($query) {
echo admin_search_settings_html($query);
} else {
$node = $PAGE->settingsnav->find('root', navigation_node::TYPE_SITE_ADMIN);
if ($node) {
echo $OUTPUT->render_from_template('core/settings_link_page', ['node' => $node]);
}
}

echo $OUTPUT->footer();
2 changes: 1 addition & 1 deletion admin/settings/top.php
Expand Up @@ -47,4 +47,4 @@
$ADMIN->add('root', new admin_category('unsupported', new lang_string('unsupported', 'admin'), true));

// hidden search script
$ADMIN->add('root', new admin_externalpage('search', new lang_string('searchresults'), "$CFG->wwwroot/$CFG->admin/search.php", 'moodle/site:config', true));
$ADMIN->add('root', new admin_externalpage('search', new lang_string('search', 'admin'), "$CFG->wwwroot/$CFG->admin/search.php", 'moodle/site:config', true));
48 changes: 48 additions & 0 deletions course/admin.php
@@ -0,0 +1,48 @@
<?php

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Listing of the course administration pages for this course.
*
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

require_once("../config.php");

$courseid = required_param('courseid', PARAM_INT);

$PAGE->set_url('/course/admin.php', array('courseid'=>$courseid));

$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);

require_login($course);
$context = context_course::instance($course->id);

$PAGE->set_pagelayout('incourse');
$PAGE->set_title(get_string('courseadministration'));
$PAGE->set_heading($course->fullname);
$PAGE->navbar->add(get_string('courseadministration'));
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('courseadministration'));

$node = $PAGE->settingsnav->find('courseadmin', navigation_node::TYPE_COURSE);
if ($node) {
echo $OUTPUT->render_from_template('core/settings_link_page', ['node' => $node]);
}

echo $OUTPUT->footer();
3 changes: 0 additions & 3 deletions course/format/topics/lib.php
Expand Up @@ -121,9 +121,6 @@ public function get_view_url($section, $options = array()) {
if ($sectionno != 0 && $usercoursedisplay == COURSE_DISPLAY_MULTIPAGE) {
$url->param('section', $sectionno);
} else {
if (empty($CFG->linkcoursesections) && !empty($options['navigation'])) {
return null;
}
$url->set_anchor('section-'.$sectionno);
}
}
Expand Down
3 changes: 0 additions & 3 deletions course/format/weeks/lib.php
Expand Up @@ -124,9 +124,6 @@ public function get_view_url($section, $options = array()) {
if ($sectionno != 0 && $usercoursedisplay == COURSE_DISPLAY_MULTIPAGE) {
$url->param('section', $sectionno);
} else {
if (empty($CFG->linkcoursesections) && !empty($options['navigation'])) {
return null;
}
$url->set_anchor('section-'.$sectionno);
}
}
Expand Down
23 changes: 23 additions & 0 deletions course/lib.php
Expand Up @@ -3510,6 +3510,29 @@ function course_get_user_navigation_options($context, $course = null) {
$options->participants = has_capability('moodle/course:viewparticipants', $context);
$options->badges = !empty($CFG->enablebadges) && !empty($CFG->badges_allowcoursebadges) &&
has_capability('moodle/badges:viewbadges', $context);
// Add view grade report is permitted.
$grades = false;
if (has_capability('moodle/grade:viewall', $context)) {
$grades = true;
} else if (!empty($course->showgrades)) {
$reports = core_component::get_plugin_list('gradereport');
if (is_array($reports) && count($reports) > 0) { // Get all installed reports.
arsort($reports); // User is last, we want to test it first.
foreach ($reports as $plugin => $plugindir) {
if (has_capability('gradereport/'.$plugin.':view', $context)) {
// Stop when the first visible plugin is found.
$grades = true;
break;
}
}
}
}
$options->grades = $grades;
}

if (\core_competency\api::is_enabled()) {
$capabilities = array('moodle/competency:coursecompetencyview', 'moodle/competency:coursecompetencymanage');
$options->competencies = has_any_capability($capabilities, $context);
}
return $options;
}
Expand Down
21 changes: 19 additions & 2 deletions course/switchrole.php
Expand Up @@ -46,9 +46,11 @@
$returnurl = clean_param($returnurl, PARAM_URL);
}

$PAGE->set_url('/course/switchrole.php', array('id'=>$id));
$PAGE->set_url('/course/switchrole.php', array('id'=>$id, 'switchrole'=>$switchrole));

require_sesskey();
if ($switchrole >= 0) {
require_sesskey();
}

if (!$course = $DB->get_record('course', array('id'=>$id))) {
redirect(new moodle_url('/'));
Expand All @@ -70,6 +72,21 @@
if (is_array($aroles) && isset($aroles[$switchrole])) {
role_switch($switchrole, $context);
}
} else if ($switchrole < 0) {

$PAGE->set_title(get_string('switchroleto'));
$PAGE->set_heading($course->fullname);
$PAGE->set_pagelayout('incourse');

echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('switchroleto'));

require_once($CFG->dirroot.'/course/switchrole_form.php');
$form = new switchrole_form(null, ['course' => $course]);
$form->display();

echo $OUTPUT->footer();
exit;
}

redirect($returnurl);
96 changes: 96 additions & 0 deletions course/switchrole_form.php
@@ -0,0 +1,96 @@
<?php

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Switch roles form.
*
* @package core_course
* @copyright 2016 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

defined('MOODLE_INTERNAL') || die();

require_once($CFG->libdir.'/formslib.php');

/**
* Defines the course completion settings form.
*/
class switchrole_form extends moodleform {

/**
* Determine whether the user is assuming another role
*
* This function checks to see if the user is assuming another role by means of
* role switching. In doing this we compare each RSW key (context path) against
* the current context path. This ensures that we can provide the switching
* options against both the course and any page shown under the course.
*
* @param context $context
* @return bool|int The role(int) if the user is in another role, false otherwise
*/
protected function in_alternative_role($context) {
global $USER, $PAGE;
if (!empty($USER->access['rsw']) && is_array($USER->access['rsw'])) {
if (!empty($PAGE->context) && !empty($USER->access['rsw'][$PAGE->context->path])) {
return $USER->access['rsw'][$PAGE->context->path];
}
foreach ($USER->access['rsw'] as $key=>$role) {
if (strpos($context->path, $key)===0) {
return $role;
}
}
}
return false;
}

/**
* Defines the form fields.
*/
public function definition() {
global $USER, $CFG, $DB;

$mform = $this->_form;
$course = $this->_customdata['course'];

// Overall criteria aggregation.
$context = context_course::instance($course->id);
$roles = array();
$assumedrole = -1;
if (is_role_switched($course->id)) {
$roles[0] = get_string('switchrolereturn');
$assumedrole = $USER->access['rsw'][$context->path];
}
$availableroles = get_switchable_roles($context);
if (is_array($availableroles)) {
foreach ($availableroles as $key=>$role) {
if ($assumedrole == (int)$key) {
continue;
}
$roles[$key] = $role;
}
}
$mform->addElement('select', 'switchrole', get_string('role'), $roles);

// Add common action buttons.
$this->add_action_buttons();

// Add hidden fields.
$mform->addElement('hidden', 'id', $course->id);
$mform->setType('id', PARAM_INT);
}
}
7 changes: 5 additions & 2 deletions course/tests/externallib_test.php
Expand Up @@ -1796,20 +1796,23 @@ public function test_get_user_navigation_options() {
$navoptions->{$option['name']} = $option['available'];
}
if ($course['id'] == SITEID) {
$this->assertCount(7, $course['options']);
$this->assertCount(8, $course['options']);
$this->assertTrue($navoptions->blogs);
$this->assertFalse($navoptions->notes);
$this->assertFalse($navoptions->participants);
$this->assertTrue($navoptions->badges);
$this->assertTrue($navoptions->tags);
$this->assertFalse($navoptions->search);
$this->assertTrue($navoptions->calendar);
$this->assertTrue($navoptions->competencies);
} else {
$this->assertCount(4, $course['options']);
$this->assertCount(6, $course['options']);
$this->assertTrue($navoptions->blogs);
$this->assertFalse($navoptions->notes);
$this->assertTrue($navoptions->participants);
$this->assertTrue($navoptions->badges);
$this->assertTrue($navoptions->grades);
$this->assertTrue($navoptions->competencies);
}
}
}
Expand Down
1 change: 1 addition & 0 deletions lang/en/admin.php
Expand Up @@ -889,6 +889,7 @@
$string['proxyport'] = 'Proxy port';
$string['proxytype'] = 'Proxy type';
$string['proxyuser'] = 'Proxy username';
$string['query'] = 'Query';
$string['question'] = 'Question';
$string['questionbehaviours'] = 'Question behaviours';
$string['questioncwqpfscheck'] = 'One or more \'random\' questions in a quiz are set up to select questions from a mixture of shared and unshared question categories. There is a more detailed report <a href="{$a->reporturl}">here</a> and see Moodle Docs page <a href="{$a->docsurl}">here</a>.';
Expand Down
2 changes: 2 additions & 0 deletions lang/en/block.php
Expand Up @@ -26,6 +26,7 @@
$string['anypagematchingtheabove'] = 'Any page matching the above';
$string['appearsinsubcontexts'] = 'Appears in sub-contexts';
$string['assignrolesinblock'] = 'Assign roles in {$a} block';
$string['blocksdrawertoggle'] = 'Hide/show blocks drawer';
$string['blocksettings'] = 'Block settings';
$string['bracketfirst'] = '{$a} (first)';
$string['bracketlast'] = '{$a} (last)';
Expand All @@ -51,6 +52,7 @@
$string['moveblockbefore'] = 'Move block to before {$a} block';
$string['moveblockinregion'] = 'Move block to {$a} region';
$string['movingthisblockcancel'] = 'Moving this block ({$a})';
$string['myblocks'] = 'My blocks';
$string['onthispage'] = 'On this page';
$string['pagetypes'] = 'Page types';
$string['pagetypewarning'] = 'The previously specified page type is no longer selectable. Please choose the most appropriate page type below.';
Expand Down

0 comments on commit 9906115

Please sign in to comment.