From 47b6cd31956092d2e3d094965b0cebcc59f1eb30 Mon Sep 17 00:00:00 2001 From: Matt Petro <matt.petro@wisc.edu> Date: Fri, 26 Jul 2013 13:20:07 +0000 Subject: [PATCH] Improved the interface for the new courseoverview block. --- block_course_overview_uwmoodle.php | 41 ++++----- lang/en/block_course_overview_uwmoodle.php | 8 +- locallib.php | 38 ++++---- renderer.php | 102 ++++++++++++++++++--- styles.css | 61 ++++++------ 5 files changed, 165 insertions(+), 85 deletions(-) diff --git a/block_course_overview_uwmoodle.php b/block_course_overview_uwmoodle.php index 346bd92..5928118 100644 --- a/block_course_overview_uwmoodle.php +++ b/block_course_overview_uwmoodle.php @@ -18,8 +18,7 @@ /** * Course overview block for UW Moodle * - * This block improves on the course_summary block by presenting courses sorted by term. - * It also allows showing/hiding of terms and course news summaries. + * This block improves on the default course_summary block by filtering courses by term. * * The block is dependent on the UW enrollment plugins and is largely coped from the existing course_overview block. * I've left copyright statements for the original authors on most files. @@ -28,6 +27,7 @@ */ require_once($CFG->dirroot.'/blocks/course_overview_uwmoodle/locallib.php'); +require_once($CFG->dirroot.'/user/profile/lib.php'); class block_course_overview_uwmoodle extends block_base { /** @@ -55,13 +55,11 @@ class block_course_overview_uwmoodle extends block_base { $this->content = new stdClass(); $this->content->text = ''; - $this->content->footer = "<a href=\"$CFG->wwwroot/course/index.php\">".get_string("fulllistofcourses")."</a> ...";; - - $content = array();$this->content->text .= profile_load_custom_fields($USER); - $courses = block_course_overview_uwmoodle_get_sorted_courses(); + // Get user's courses and sort by term + $courses = block_course_overview_uwmoodle_get_sorted_courses(); $terms = block_course_overview_uwmoodle_group_courses_by_term($courses); $currentterm = block_course_overview_uwmoodle_get_current_term(); @@ -73,11 +71,15 @@ class block_course_overview_uwmoodle extends block_base { if (!isset($terms[self::TERM_OTHER])) { $terms[self::TERM_OTHER] = array(); } + // If selectedterm is not valid, select currentterm if (!isset($terms[$selectedterm])) { $selectedterm = $currentterm; } + // Always display non-term courses in addition to selected term. $displayedcourses = $terms[self::TERM_OTHER] + $terms[$selectedterm]; + + // Get course overviews $overviews = block_course_overview_uwmoodle_get_overviews($displayedcourses); $renderer = $this->page->get_renderer('block_course_overview_uwmoodle'); @@ -88,11 +90,12 @@ class block_course_overview_uwmoodle extends block_base { } $this->content->text .= $renderer->course_header($terms, $selectedterm); - $this->content->text .= $renderer->course_overview($terms[$selectedterm], $overviews); + $this->content->text .= $renderer->course_block($selectedterm, $terms[$selectedterm], $overviews); + if (!empty($terms[self::TERM_OTHER])) { - $this->content->text .= $renderer->other_header(); - $this->content->text .= $renderer->course_overview($terms[self::TERM_OTHER], $overviews); + $this->content->text .= $renderer->other_course_block($terms[self::TERM_OTHER], $overviews); } + $this->content->footer = $renderer->footer(); return $this->content; } @@ -116,23 +119,15 @@ class block_course_overview_uwmoodle extends block_base { return false; } - if ($currentterm === $oldcurrentterm) { - // no change, so return - return true; + if ($currentterm && $currentterm != $oldcurrentterm) { + // store new term + mtrace('new current term: '.$currentterm); + set_config('currentterm', $currentterm, 'block_course_overview_uwmoodle'); } - mtrace('new current term: '.$currentterm); - - // New term, so clear user preferences for both current and previous term - if ($oldcurrentterm) { - $DB->delete_records('user_preferences', array('name'=> 'block_course_overview_uwmoodle-show-term-'.$oldcurrentterm)); - } - $DB->delete_records('user_preferences', array('name'=> 'block_course_overview_uwmoodle-show-term-'.$currentterm)); - - set_config('currentterm', $currentterm, 'block_course_overview_uwmoodle'); return true; } - /** + /**news * Fetch current term from CHUB. Throw exception on CHUB error. * * @return string|false term_code or false if none found. @@ -170,7 +165,7 @@ class block_course_overview_uwmoodle extends block_base { return true; } - /** + /**news * locations where block can be displayed * * @return array diff --git a/lang/en/block_course_overview_uwmoodle.php b/lang/en/block_course_overview_uwmoodle.php index f594578..b232fc4 100644 --- a/lang/en/block_course_overview_uwmoodle.php +++ b/lang/en/block_course_overview_uwmoodle.php @@ -18,9 +18,11 @@ defined('MOODLE_INTERNAL') || die(); $string['pluginname'] = 'UW Moodle course overview'; -$string['mycoursesinterm'] = 'My courses in term:'; -$string['othercourses'] = 'Other courses'; -$string['nocourses'] = 'You are not enrolled in any courses for this term.'; +$string['mycoursesinterm'] = '{$a} courses'; +$string['nocourses'] = 'You are not enrolled in any courses for this term'; +$string['ongoingcourses'] = 'Ongoing courses'; +$string['selectterm'] = 'Select a term: '; + $string['activityoverview'] = 'You have {$a}s that need attention'; $string['alwaysshowall'] = 'Always Show All'; diff --git a/locallib.php b/locallib.php index 97f2528..79fa93a 100644 --- a/locallib.php +++ b/locallib.php @@ -86,7 +86,7 @@ function block_course_overview_uwmoodle_get_child_shortnames($courseid) { * @return array list of sorted courses grouped by term. */ function block_course_overview_uwmoodle_get_sorted_courses() { - global $USER, $DB; + global $USER; $courses = enrol_get_my_courses('id, shortname, fullname, modinfo, sectioncache', 'fullname', 0); $site = get_site(); @@ -103,7 +103,20 @@ function block_course_overview_uwmoodle_get_sorted_courses() { } } - // Find the termcode for each course + return $courses; +} + +/** + * Organize courses into terms, maintaining existing sorting inside each term + * + * @param array $courses user courses + * @return array + */ +function block_course_overview_uwmoodle_group_courses_by_term($courses) { + global $DB; + + // Find the termcodes for each course + $courseterms = array(); if (!empty($courses)) { $courseids = array(); foreach ($courses as $course) { @@ -113,26 +126,17 @@ function block_course_overview_uwmoodle_get_sorted_courses() { $select = "enrol='wisc' AND courseid $insql"; $enrols = $DB->get_records_select('enrol', $select, $inparams, '', 'id,courseid,customchar1'); foreach ($enrols as $enrol) { - if (empty($courses[$enrol->courseid]->term) || $courses[$enrol->courseid]->term < $enrol->customchar1) { - $courses[$enrol->courseid]->term = $enrol->customchar1; - } + $courseterms[$enrol->courseid][$enrol->customchar1] = true; } } - return $courses; -} -/** - * Group courses by term - * - * @param array $courses user courses - * @return array - */ -function block_course_overview_uwmoodle_group_courses_by_term($courses) { - // Organize courses into terms, maintaining existing sorting inside each term + // Sort the courses by termcode. Note that one course can be in multiple terms. $terms = array(); foreach ($courses as $course) { - if (!empty($course->term)) { - $terms[$course->term][$course->id] = $course; + if (!empty($courseterms[$course->id])) { + foreach ($courseterms[$course->id] as $termcode => $unused) { + $terms[$termcode][$course->id] = $course; + } } else { $terms[block_course_overview_uwmoodle::TERM_OTHER][$course->id] = $course; } diff --git a/renderer.php b/renderer.php index 5b2aa2e..fb121fb 100644 --- a/renderer.php +++ b/renderer.php @@ -45,7 +45,7 @@ class block_course_overview_uwmoodle_renderer extends plugin_renderer_base { $html .= html_writer::start_tag('div', array('id' => 'course_list_uwmoodle')); if (empty($courses)) { $html .= $this->output->box_start('coursebox'); - $html .= get_string('nocourses','block_course_overview_uwmoodle'); + $html .= '<h2>'.get_string('nocourses','block_course_overview_uwmoodle').'</h2>'; $html .= $this->output->box_end(); } else { foreach ($courses as $key => $course) { @@ -76,32 +76,110 @@ class block_course_overview_uwmoodle_renderer extends plugin_renderer_base { return $html; } + public function begin_course_block($title) { + $html = $this->output->box_start('block'); + $html .= $this->output->box_start('header'); + $html .= $this->output->box_start('title'); + $html .= $this->output->heading($title, 2, 'sectiontitle'); + $html .= $this->output->box_end(); + $html .= $this->output->box_end(); + $html .= $this->output->box_start('content'); + return $html; + } + + public function end_course_block() { + $html = ''; + $html .= $this->output->box_end(); + $html .= $this->output->box_end(); + return $html; + } + + public function course_block($selectedterm, $courses, $overviews) { + $termstr = block_course_overview_uwmoodle_get_term_name($selectedterm); + $title = get_string('mycoursesinterm', 'block_course_overview_uwmoodle', $termstr); + + $html = $this->begin_course_block($title); + $html .= $this->course_overview($courses, $overviews); + $html .= $this->end_course_block(); + return $html; + } + + public function other_course_block($courses, $overviews) { + $html = $this->begin_course_block(get_string('ongoingcourses', 'block_course_overview_uwmoodle')); + $html .= $this->course_overview($courses, $overviews); + $html .= $this->end_course_block(); + return $html; + } + + + /** + * Render term selection box above the list of courses + * + * @param array $terms + * @param string $selectedterm + * @return string html to be displayed in course_overview block + */ public function course_header($terms, $selectedterm) { - $output = $this->output->box_start('notice'); + $output = ''; + $thisterm = block_course_overview_uwmoodle_get_term_name($selectedterm); $options = array(); + + $url = new moodle_url('/my/index.php'); + + $output .= $this->output->box_start('notice'); + $output .= html_writer::start_tag('ul', array('class'=>'termlist')); + $output .= html_writer::start_tag('li'); + $output .= get_string('selectterm', 'block_course_overview_uwmoodle'); + $output .= html_writer::end_tag('li'); + // sort by term date, ascending + ksort($terms, SORT_NUMERIC); + $firstitem = true; foreach ($terms as $termcode => $courses) { if ($termcode == block_course_overview_uwmoodle::TERM_OTHER) { // non-term courses are shown regardless continue; } - $options[$termcode] = block_course_overview_uwmoodle_get_term_name($termcode); + $termname = block_course_overview_uwmoodle_get_term_name($termcode); + $output .= html_writer::start_tag('li'); + if (!$firstitem) { + $output .= ' | '; + } else { + $firstitem = false; + } + if ($termcode == $selectedterm) { + $output .= html_writer::tag('span', $this->rarrow().$termname, array('class'=>'selectedterm')); + } else { + $output .= html_writer::tag('a', $termname, array('href' => $url->out(false, array('term'=>$termcode)))); + } + $output .= html_writer::end_tag('li'); + //$options[$termcode] = block_course_overview_uwmoodle_get_term_name($termcode); } - ksort($options, SORT_NUMERIC); - $url = new moodle_url('/my/index.php'); - $select = new single_select($url, 'term', $options, $selectedterm, array()); - $select->set_label(get_string('mycoursesinterm', 'block_course_overview_uwmoodle')); - $output .= $this->output->render($select); + //ksort($options, SORT_NUMERIC); + $output .= html_writer::end_tag('ul'); + + + //$output .= $this->output->heading(get_string('mycoursesinterm', 'block_course_overview_uwmoodle', $thisterm), 2, 'sectiontitle'); $output .= $this->output->box_end(); + + //$url = new moodle_url('/my/index.php'); + //$select = new single_select($url, 'term', $options, '', array('' => 'choosedots')); + //$select->set_label(get_string('selectterm', 'block_course_overview_uwmoodle')); + //$output .= $this->output->render($select); return $output; } - public function other_header() { - $output = $this->output->box_start('notice'); - $output .= $this->output->heading(get_string('othercourses', 'block_course_overview_uwmoodle'), 2, 'sectiontitle'); - $output .= $this->output->box_end(); + /** + * Render block footer + * + * @return string html to be displayed in course_overview block + */ + public function footer() { + global $CFG; + $output = html_writer::tag('a', get_string("fulllistofcourses"), array('href' => "$CFG->wwwroot/course/index.php")); + $output .= ' ...'; return $output; } diff --git a/styles.css b/styles.css index a6494ed..ce393b4 100644 --- a/styles.css +++ b/styles.css @@ -10,9 +10,33 @@ margin: 5px 0; } +.block_course_overview_uwmoodle .block { + margin-bottom: 10px; +} + .block_course_overview_uwmoodle .coursebox { - padding: 15px; + padding: 5px 15px 5px 15px; width: auto; + margin: 15px 0; +} + +.block_course_overview_uwmoodle .termlist { + list-style-type:none; + margin:20px 0 0 0; + padding:0; + font-size:120%; +} + +.block_course_overview_uwmoodle .termlist li { + display:inline; +} + +.block_course_overview_uwmoodle .termlist .selectedterm { + /*color: #0000aa;*/ + font-weight: bold; + font-size:100%; + /*border: 1px solid #000000;*/ + padding: 5px; } .block_course_overview_uwmoodle .profilepicture { @@ -39,22 +63,22 @@ .block_course_overview_uwmoodle .content h2.title { float: left; - margin: 0 0 .5em 0; + margin: 0; position: relative; } +.block_course_overview_uwmoodle .activity_info { + margin: 0.5em 0 0 1em; +} .block_course_overview_uwmoodle .content h2.sectiontitle { - color: #444444; - margin: 2em 0 0; + /*color: #444444;*/ + /*margin: 2em 0 0;*/ } .block_course_overview_uwmoodle .content label { color: #444444; - font-size: 120%; - font-weight: bold; } .collapsibleregioncaption { cursor: pointer; } -font-size: 123.1%; .dir-rtl .block_course_overview_uwmoodle .content h2.title { float:right; } @@ -93,30 +117,7 @@ font-size: 123.1%; .editing .block_course_overview_uwmoodle .movedownspacer { float: left; width: 14px; -}.block_course_overview_uwmoodle_uwmoodle .treeitem { - background-position: 0 40%; - background-repeat: no-repeat; - padding-left: 18px; - text-align: left; } - -.block_course_overview_uwmoodle_uwmoodle .treeitem.term {background-image: url([[pix:t/expanded]]);} -.block_course_overview_uwmoodle_uwmoodle li.collapsed .treeitem.term {background-image: url([[pix:t/collapsed]]);} -.block_course_overview_uwmoodle_uwmoodle .treeitem.coursenews {background-image: url([[pix:t/switch_minus]]);} -.block_course_overview_uwmoodle_uwmoodle li.collapsed .treeitem.coursenews {background-image: url([[pix:t/switch_plus]]);} -.block_course_overview_uwmoodle_uwmoodle li.collapsed ul {display: none;} -.block_course_overview_uwmoodle_uwmoodle li ul {margin: 0;padding-left:16px;} -.block_course_overview_uwmoodle_uwmoodle .coursebox h3 {margin-left:10px;} -.block_course_overview_uwmoodle_uwmoodle h3 {font-size:1.1em;} -/*.block_course_overview_uwmoodle_uwmoodle .miscterm .term {font-weight:bold;}*/ -.block_course_overview_uwmoodle_uwmoodle .term {color:#000;font-weight:normal;} -.block_course_overview_uwmoodle_uwmoodle .shownews {float:right;color:#333;font-weight:normal;margin-right:1em;font-size:91%;} -.block_course_overview_uwmoodle_uwmoodle a:focus, -.block_course_overview_uwmoodle_uwmoodle a:hover, -.block_course_overview_uwmoodle_uwmoodle a:active {outline:none;} -.block_course_overview_uwmoodle_uwmoodle ul.treelist {list-style:none outside none;} -.block_course_overview_uwmoodle_uwmoodle .courselist {margin:0;padding:0;} -.block_course_overview_uwmoodle_uwmoodle ul {margin:0 1em 0 0;} .dir-rtl.editing .block_course_overview_uwmoodle .movedownspacer { float:right; } -- GitLab