diff --git a/block_course_overview_uwmoodle.php b/block_course_overview_uwmoodle.php index 59281182db7af5383f8c026a1c2a976319324bcd..c56bfbec608659acab53c25568fcb125bca53fd0 100644 --- a/block_course_overview_uwmoodle.php +++ b/block_course_overview_uwmoodle.php @@ -23,7 +23,7 @@ * 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. * - * @author Matt Petro + * @author 2013 Matt Petro */ require_once($CFG->dirroot.'/blocks/course_overview_uwmoodle/locallib.php'); @@ -68,19 +68,13 @@ class block_course_overview_uwmoodle extends block_base { if (!isset($terms[$currentterm])) { $terms[$currentterm] = array(); } - 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); + $overviews = block_course_overview_uwmoodle_get_overviews($courses); $renderer = $this->page->get_renderer('block_course_overview_uwmoodle'); if (!empty($config->showwelcomearea)) { @@ -89,11 +83,23 @@ class block_course_overview_uwmoodle extends block_base { $this->content->text = $renderer->welcome_area($msgcount); } - $this->content->text .= $renderer->course_header($terms, $selectedterm); - $this->content->text .= $renderer->course_block($selectedterm, $terms[$selectedterm], $overviews); + // Sort the terms with newest first + block_course_overview_uwmoodle_sort_term_array($terms); + + $displayedterms = $terms; + $othercourses = false; + if (empty($this->config->combineongoing)) { + unset($displayedterms[self::TERM_OTHER]); + if (!empty($terms[self::TERM_OTHER])) { + $othercourses = $terms[self::TERM_OTHER]; + } + } + + // Render the block + $this->content->text .= $renderer->course_block($displayedterms, $overviews, $selectedterm); - if (!empty($terms[self::TERM_OTHER])) { - $this->content->text .= $renderer->other_course_block($terms[self::TERM_OTHER], $overviews); + if (!empty($othercourses)) { + $this->content->text .= $renderer->other_course_block($othercourses, $overviews); } $this->content->footer = $renderer->footer(); return $this->content; diff --git a/edit_form.php b/edit_form.php new file mode 100644 index 0000000000000000000000000000000000000000..05aae3c763fe8ed9000338d03557cf8c27a0b84f --- /dev/null +++ b/edit_form.php @@ -0,0 +1,13 @@ +<?php + +class block_course_overview_uwmoodle_edit_form extends block_edit_form { + + protected function specific_definition($mform) { + + // Section header title according to language file. + $mform->addElement('header', 'configheader', get_string('blocksettings', 'block')); + + $mform->addElement('advcheckbox', 'config_combineongoing', get_string('combineongoing', 'block_course_overview_uwmoodle'), null, null, array(0, 1)); + $mform->setDefault('config_nontermseparate', 0); + } +} \ No newline at end of file diff --git a/lang/en/block_course_overview_uwmoodle.php b/lang/en/block_course_overview_uwmoodle.php index b232fc4f56f1b4b2fd19df31da0aeb04f989ed8f..92b541d9e7e9bbf02c18937550076cd6e51acd2c 100644 --- a/lang/en/block_course_overview_uwmoodle.php +++ b/lang/en/block_course_overview_uwmoodle.php @@ -18,9 +18,12 @@ defined('MOODLE_INTERNAL') || die(); $string['pluginname'] = 'UW Moodle course overview'; +$string['courses'] = 'My courses'; $string['mycoursesinterm'] = '{$a} courses'; $string['nocourses'] = 'You are not enrolled in any courses for this term'; -$string['ongoingcourses'] = 'Ongoing courses'; +$string['combineongoing'] = 'Show ongoing classes in term menu'; +$string['ongoingcourses'] = 'My ongoing courses'; +$string['ongoingcourses_help'] = 'This section lists courses which are not tied to a specific UW term.'; $string['selectterm'] = 'Select a term: '; diff --git a/locallib.php b/locallib.php index 79fa93a87441dfe8f0499ef2c112331180f1689f..a4b85d29a756e300e26420015793bc0d7da7415a 100644 --- a/locallib.php +++ b/locallib.php @@ -145,6 +145,20 @@ function block_course_overview_uwmoodle_group_courses_by_term($courses) { return $terms; } +function block_course_overview_uwmoodle_sort_term_array(&$terms) { + + // Sort the terms with ongoing (code = 0) first, then in decreasing order + $cmp = function ($a, $b) { + if ($a == 0 || $b == 0) { + return $a-$b; + } else { + return $b-$a; + } + }; + + return uksort($terms, $cmp); +} + /** * Get the current term from our settings * @@ -174,19 +188,19 @@ function block_course_overview_uwmoodle_get_term_name($termCode) { $semester = substr($termCode,3,1); switch($semester) { case 2: - $name = sprintf("Fall %d", $year-1); + $name = sprintf("<span class='semester'>Fall</span> <span class='year'>%d</span>", $year-1); break; case 3: - $name = sprintf("Winter %d", $year); + $name = sprintf("<span class='semester'>Winter</span> <span class='year'>%d</span>", $year); break; case 4: - $name = sprintf("Spring %d", $year); + $name = sprintf("<span class='semester'>Spring</span> <span class='year'>%d</span>", $year); break; case 6: - $name = sprintf("Summer %d", $year); + $name = sprintf("<span class='semester'>Summer</span> <span class='year'>%d</span>", $year); break; default: - $name = "Other"; + $name = "Ongoing"; } return $name; } \ No newline at end of file diff --git a/module.js b/module.js index 820ae47246780618e56e9cf95de6da99c1021216..6afcf71f745d9764895f093a262291eb5ef6b404 100644 --- a/module.js +++ b/module.js @@ -108,3 +108,34 @@ M.block_course_overview_uwmoodle.CollapsibleRegion.prototype.div = null; */ M.block_course_overview_uwmoodle.CollapsibleRegion.prototype.icon = null; +M.block_course_overview_uwmoodle.TermSelector = function(Y) { + + // Find the selector div in the document. + var selector = Y.one('#uwmm_terms'); + + // Find all the content nodes. + var contentnodes = Y.all('#uwmm_terms_content div.courselist'); + + var onClick = function(e) { + var content = Y.one('#'+e.currentTarget.get('id')+'_courses'); + if (content) { + selector.all('.active').each(function(e) {e.removeClass('active');}); + e.currentTarget.addClass('active'); // e.currentTarget === li + + contentnodes.each(function(e) {e.addClass('hidden');}); + content.removeClass('hidden'); + + // Stop the event's default behavior + e.preventDefault(); + + // Stop the event from bubbling up the DOM tree + e.stopPropagation(); + } + }; + + selector.delegate('click', onClick, 'li'); +}; + +M.block_course_overview_uwmoodle.termselector = function(Y) { + new M.block_course_overview_uwmoodle.TermSelector(Y); +}; diff --git a/pix/menu.gif b/pix/menu.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e8c574b3eed607786ae85412716b62ae6d8f45e Binary files /dev/null and b/pix/menu.gif differ diff --git a/renderer.php b/renderer.php index fb121fb3d92e0b56c9ebe82baa5f42fdf8f218ef..c8d7afd6209522d82e7246579a2dea6032f465f0 100644 --- a/renderer.php +++ b/renderer.php @@ -31,6 +31,7 @@ defined('MOODLE_INTERNAL') || die; */ class block_course_overview_uwmoodle_renderer extends plugin_renderer_base { + /** * Construct contents of course_overview block * @@ -38,18 +39,43 @@ class block_course_overview_uwmoodle_renderer extends plugin_renderer_base { * @param array $overviews list of course overviews * @return string html to be displayed in course_overview block */ - public function course_overview($courses, $overviews) { + public function course_overview_allterms($terms, $overviews, $selectedterm) { $html = ''; - $config = get_config('block_course_overview_uwmoodle'); - $html .= html_writer::start_tag('div', array('id' => 'course_list_uwmoodle')); + $html .= html_writer::start_tag('div', array('class' => 'courselistcontainer', 'id' => 'uwmm_terms_content')); + foreach ($terms as $termcode => $courses) { + if ($termcode != $selectedterm) { + $hidden = 'hidden'; + } else { + $hidden = ''; + } + $html .= html_writer::start_tag('div', array('class' => 'courselist '.$hidden, 'id' => 'uwmm_term_'.$termcode.'_courses')); + + $termstr = block_course_overview_uwmoodle_get_term_name($termcode); + $title = get_string('mycoursesinterm', 'block_course_overview_uwmoodle', $termstr); + $html .= html_writer::start_tag('div', array('class' => 'title')); + $html .= $this->output->heading($title, 2, 'termname'); + $html .= html_writer::end_tag('div'); + + $html .= $this->course_overview($courses, $overviews, $termcode); + $html .= html_writer::end_tag('div'); + } + $html .= html_writer::end_tag('div'); + $this->page->requires->js_init_call('M.block_course_overview_uwmoodle.termselector'); + + return $html; + } + + public function course_overview($courses, $overviews, $termcode) { + $html = ''; + $html .= html_writer::start_tag('div', array('class' => 'courselistcontainer')); if (empty($courses)) { $html .= $this->output->box_start('coursebox'); - $html .= '<h2>'.get_string('nocourses','block_course_overview_uwmoodle').'</h2>'; + $html .= $this->output->heading(get_string('nocourses','block_course_overview_uwmoodle'), 3); $html .= $this->output->box_end(); } else { foreach ($courses as $key => $course) { - $html .= $this->output->box_start('coursebox', "course-{$course->id}"); + $html .= $this->output->box_start('coursebox'); $html .= html_writer::start_tag('div', array('class' => 'course_title')); // No need to pass title through s() here as it will be done automatically by html_writer. @@ -60,15 +86,15 @@ class block_course_overview_uwmoodle_renderer extends plugin_renderer_base { $courseurl = new moodle_url('/course/view.php', array('id' => $course->id)); $coursefullname = format_string($course->fullname, true, $course->id); $link = html_writer::link($courseurl, $coursefullname, $attributes); - $html .= $this->output->heading($link, 2, 'title'); - $html .= $this->output->box('', 'flush'); + $html .= $this->output->heading($link, 3, 'title'); + //$html .= $this->output->box('', 'flush'); $html .= html_writer::end_tag('div'); if (isset($overviews[$course->id])) { - $html .= $this->activity_display($course->id, $overviews[$course->id]); + $html .= $this->activity_display($course->id, $overviews[$course->id], $termcode); } - $html .= $this->output->box('', 'flush'); + //$html .= $this->output->box('', 'flush'); $html .= $this->output->box_end(); } } @@ -76,37 +102,69 @@ 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'); + public function term_list($termcodes, $selectedterm) { + $thisurl = $this->page->url; + $html = ''; + $html .= html_writer::start_tag('div', array('class' => 'termscontainer')); + $html .= html_writer::start_tag('ul', array('class' => 'terms', 'id' => 'uwmm_terms')); + foreach ($termcodes as $termcode) { + $termname = block_course_overview_uwmoodle_get_term_name($termcode); + $attributes = array('id'=>'uwmm_term_'.$termcode); + if ($termcode == $selectedterm) { + $attributes['class'] = 'active'; + } + $html .= html_writer::start_tag('li', $attributes); + $html .= html_writer::tag('a', $termname, array('href' => $thisurl->out(false, array('term'=>$termcode)))); + $html .= html_writer::end_tag('li'); + } + $html .= html_writer::end_tag('ul'); + $html .= html_writer::end_tag('div'); return $html; } - public function end_course_block() { + public function begin_course_block($title, $id='', $helpidentifier='') { $html = ''; - $html .= $this->output->box_end(); - $html .= $this->output->box_end(); + $attributes = array('class' => 'courseblock clearfix'); + if (!empty($id)) { + $attributes['id'] = $id; + } + $html .= html_writer::start_tag('div', $attributes); + $html .= html_writer::start_tag('div', array('class' => 'cbheader')); + $help = ''; + if ($helpidentifier) { + $help = $this->output->help_icon($helpidentifier, 'block_course_overview_uwmoodle'); + } + $html .= $this->output->heading($title.$help, 2, 'sectiontitle help'); + $html .= html_writer::end_tag('div'); + $html .= html_writer::start_tag('div', array('class' => 'cbcontent')); 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); + public function end_course_block() { + $html = ''; + $html .= html_writer::end_tag('div'); + $html .= html_writer::end_tag('div'); + return $html; + } - $html = $this->begin_course_block($title); - $html .= $this->course_overview($courses, $overviews); + public function course_block($terms, $overviews, $selectedterm) { + $html = ''; + $html .= $this->begin_course_block(get_string('courses', 'block_course_overview_uwmoodle'), 'uwmm_mycourses_block'); + $termcodes = array_keys($terms); + $html .= html_writer::start_tag('div', array('class' => 'lhs')); + $html .= $this->term_list($termcodes, $selectedterm); + $html .= html_writer::end_tag('div'); + $html .= html_writer::start_tag('div', array('class' => 'rhs')); + $html .= $this->course_overview_allterms($terms, $overviews, $selectedterm); + $html .= html_writer::end_tag('div'); $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 = ''; + $html .= $this->begin_course_block(get_string('ongoingcourses', 'block_course_overview_uwmoodle'), 'uwmm_othercourses_block', 'ongoingcourses'); + $html .= $this->course_overview($courses, $overviews, block_course_overview_uwmoodle::TERM_OTHER); $html .= $this->end_course_block(); return $html; } @@ -190,7 +248,7 @@ class block_course_overview_uwmoodle_renderer extends plugin_renderer_base { * @param array $overview overview of activities in course * @return string html of activities overview */ - protected function activity_display($cid, $overview) { + protected function activity_display($cid, $overview, $id) { $output = html_writer::start_tag('div', array('class' => 'activity_info')); foreach (array_keys($overview) as $module) { $output .= html_writer::start_tag('div', array('class' => 'activity_overview')); @@ -204,7 +262,7 @@ class block_course_overview_uwmoodle_renderer extends plugin_renderer_base { } // Add collapsible region with overview text in it. - $output .= $this->collapsible_region($overview[$module], '', 'uwmm_region_'.$cid.'_'.$module, $icontext, '', true); + $output .= $this->collapsible_region($overview[$module], '', 'uwmm_region_'.$id.'_'.$cid.'_'.$module, $icontext, '', true); $output .= html_writer::end_tag('div'); } diff --git a/styles.css b/styles.css index ce393b43c2d3b8bfffe27571607101eb444b3358..c4084fcb4ed464c5dd8a958cd493271feaae15ea 100644 --- a/styles.css +++ b/styles.css @@ -1,8 +1,3 @@ -.block_course_overview_uwmoodle .coursechildren { - font-weight: normal; - font-style: italic; -} - .block_course_overview_uwmoodle .content { margin: 0 20px; } @@ -10,44 +5,145 @@ margin: 5px 0; } -.block_course_overview_uwmoodle .block { +.block_course_overview_uwmoodle .courseblock { margin-bottom: 10px; + border: 1px solid #666666; + width: 100%; + clear: both; + position: relative; } -.block_course_overview_uwmoodle .coursebox { - padding: 5px 15px 5px 15px; - width: auto; - margin: 15px 0; +.block_course_overview_uwmoodle .cbheader { + /*border-bottom: 1px solid #666666;*/ + /*padding: 5px;*/ + background-color: #E3E3E3; + /*background-image: url("/theme/image.php?theme=big_red&component=theme&image=gradient_h");*/ + /*background-repeat: repeat-x;*/ + border-bottom: 1px solid #666666; + clear: both; +} + +.block_course_overview_uwmoodle .cbheader h2 { + margin: 0; + padding: 0.2em 0 0 0.3em; } -.block_course_overview_uwmoodle .termlist { - list-style-type:none; - margin:20px 0 0 0; - padding:0; - font-size:120%; +.block_course_overview_uwmoodle .cbheader h2.help img { + vertical-align: middle; } -.block_course_overview_uwmoodle .termlist li { - display:inline; +.block_course_overview_uwmoodle .termscontainer { + width: 100%; + margin: 0; + padding: 0; } -.block_course_overview_uwmoodle .termlist .selectedterm { - /*color: #0000aa;*/ - font-weight: bold; - font-size:100%; - /*border: 1px solid #000000;*/ - padding: 5px; +.block_course_overview_uwmoodle a { + -moz-outline: none 0; + outline: none 0; } -.block_course_overview_uwmoodle .profilepicture { +.block_course_overview_uwmoodle .courselistcontainer { +} + +.block_course_overview_uwmoodle .rhs .courselist { +} + +.block_course_overview_uwmoodle .rhs { + padding: 5px 0 10px 0; +} + +.block_course_overview_uwmoodle .lhs { float: left; + left:0; + top:0; + position:relative; + width: 10em; + background: #E3DFD4; + z-index: 1; +} +.block_course_overview_uwmoodle .rhs { + border-left: 10em solid #E3DFD4; +} + +.block_course_overview_uwmoodle .courselistcontainer { + padding: 0 1em; +} + +.block_course_overview_uwmoodle ul.terms { + list-style: none inside none; + margin: 0; + padding: 0; + border-top: 1px solid #ffffff; +} +.block_course_overview_uwmoodle .terms li { + margin: 0; + padding: 0; + text-align: right; +} + +.block_course_overview_uwmoodle .terms .semester { + position: relative; + right: 4px; +} + +.block_course_overview_uwmoodle .terms .year { +} + +.block_course_overview_uwmoodle .terms li a { + font: bold 12px Verdana, Arial, Helvetica, sans-serif; + display: block; + background: #dddddd url([[pix:block_course_overview_uwmoodle|menu]]) 100% 0; + height: 22px; /*Set to height of bg image- padding within link (ie: 32px - 4px - 4px)*/ + padding: 4px 0 4px 10px; + line-height: 24px; /*Set line-height of bg image- padding within link (ie: 32px - 4px - 4px)*/ + text-decoration: none; + color: #000000; + padding-right: 2em; +} + +.block_course_overview_uwmoodle .terms li.active a { + color: #ffffff; + background-color: #A00000; + background-position: 100% -60px; +} + +.block_course_overview_uwmoodle .terms li:not(.active) a:hover { + color: #000000; + background-position: 100% -30px; +} + +.block_course_overview_uwmoodle .hidden { + /*display: none;*/ + visibility:hidden; + position: absolute; + left: -9999px; +} + +#uwmm_mycourses_block .courselistcontainer { + min-height: 14.56em; +} + +#uwmm_othercourses_block .courselistcontainer { + padding-bottom: 10px; +} + + +.block_course_overview_uwmoodle .coursebox { + padding: 5px 15px 5px 15px; + width: auto; + margin: 15px 0 0 0; +} + +.block_course_overview_uwmoodle .profilepicture { + /*float: left;*/ } .dir-rtl.block_course_overview_uwmoodle .profilepicture { float:right; } .block_course_overview_uwmoodle .welcome_area { width: 100%; - padding-bottom: 5px; + padding-bottom: 10px; } .block_course_overview_uwmoodle .welcome_message { @@ -62,9 +158,8 @@ } .block_course_overview_uwmoodle .content h2.title { - float: left; margin: 0; - position: relative; + text-align: left; } .block_course_overview_uwmoodle .activity_info { margin: 0.5em 0 0 1em; @@ -79,9 +174,6 @@ .collapsibleregioncaption { cursor: pointer; } -.dir-rtl .block_course_overview_uwmoodle .content h2.title { - float:right; -} .block_course_overview_uwmoodle .course_title { position: relative; @@ -139,7 +231,6 @@ } .block_course_overview_uwmoodle .activity_info { - clear: both; } .dir-rtl .block_course_overview_uwmoodle .activity_info { margin-right: 25px;