diff --git a/block_course_overview_uwmoodle.php b/block_course_overview_uwmoodle.php index f0efd4921a88f69cdb41a266b2951b82a569d10b..9a40467a130950161c028c116542ff1a689c2871 100644 --- a/block_course_overview_uwmoodle.php +++ b/block_course_overview_uwmoodle.php @@ -69,6 +69,11 @@ class block_course_overview_uwmoodle extends block_base { set_user_preference('block_course_overview_uwmoodle-show-coursenews-'.$uwmcourse, $uwmshow); } + $currentterm = get_config('block_course_overview_uwmoodle', 'currentterm'); + if (!$currentterm) { + $currentterm = self::TERM_OTHER; + } + // Find the termcode for each course if (!empty($courses)) { $courseids = array(); @@ -97,8 +102,14 @@ class block_course_overview_uwmoodle extends block_base { } } // Sort terms, descending - ksort($terms); - $terms = array_reverse($terms, true); + // TERM_OTHER courses get ordered right after current term + $sortfcn = function($a,$b) use ($currentterm) { + if ($a == self::TERM_OTHER) { $a = $currentterm - 0.5; } + if ($b == self::TERM_OTHER) { $b = $currentterm - 0.5; } + if ($a == $b) {return 0;} + return ($a > $b)? -1 : 1; + }; + uksort($terms, $sortfcn); // Update lastaccess for news summary foreach ($courses as $c) { @@ -133,7 +144,8 @@ class block_course_overview_uwmoodle extends block_base { $yuiitems[] = "term-$termcode"; $termname = $this->get_term_name($termcode); - $showterm = get_user_preferences("block_course_overview_uwmoodle-show-term-$termcode", 1); + $defaultshowterm = ($termcode == $currentterm || $termcode == self::TERM_OTHER)? 1 : 0; + $showterm = get_user_preferences("block_course_overview_uwmoodle-show-term-$termcode", $defaultshowterm); if (!$showterm) { $class = 'collapsed'; $ariaexpanded = "aria-expanded='false'"; @@ -141,13 +153,20 @@ class block_course_overview_uwmoodle extends block_base { $class = ''; $ariaexpanded = "aria-expanded='true'"; } + if ($termcode == $currentterm) { + $termclass = 'currentterm'; + } else if ($termcode == self::TERM_OTHER) { + $termclass = 'miscterm'; + } else { + $termclass = 'noncurrentterm'; + } $aria = "$ariaexpanded aria-controls='uwm-{$this->instance->id}-term-$termcode-list' role='button'"; $showhidetermurl = $PAGE->url->out_as_local_url(true, array('uwmterm' => $termcode, 'uwmshow' => ($showterm)? 0 : 1 )); echo "<li class='$class'>"; - echo "<h3 class='term treeitem'>"; + echo "<h3 class='$termclass'>"; // The data-ajax attribute prevents the Moodle mobile theme from overriding the AJAX behavior - echo "<a class='showhide' data-ajax='false' $aria href='$showhidetermurl' id='uwm-{$this->instance->id}-term-$termcode'><span>$termname</span></a>"; + echo "<a class='showhide' data-ajax='false' $aria href='$showhidetermurl' id='uwm-{$this->instance->id}-term-$termcode'><span class='term treeitem'>$termname</span></a>"; echo "</h3>"; echo "<ul class='treelist' id='uwm-{$this->instance->id}-term-$termcode-list' role='region'>"; foreach ($termcourses as $course) { @@ -161,6 +180,7 @@ class block_course_overview_uwmoodle extends block_base { $newsclass = ''; $showhidehtml = ''; if ($hasnews) { + $defaultshownews = ($termcode == $currentterm || $termcode == self::TERM_OTHER)? 1 : 0; $shownews = get_user_preferences('block_course_overview_uwmoodle-show-coursenews-'.$course->id, 1); $yuiitems[] = "coursenews-$course->id"; $showhidenewsurl = $PAGE->url->out_as_local_url(true, array('uwmcourse' => $course->id, 'uwmshow' => ($shownews)? 0 : 1)); @@ -176,7 +196,7 @@ class block_course_overview_uwmoodle extends block_base { $aria = "$ariaexpanded aria-controls='uwm-{$this->instance->id}-coursenews-{$course->id}-list' role='button'"; // The data-ajax attribute prevents the Moodle mobile theme from overriding the AJAX behavior $showhidehtml = "<div class='shownews'><a data-ajax='false' $aria href='$showhidenewsurl' id='uwm-{$this->instance->id}-coursenews-$course->id' >"; - $showhidehtml .= "<span class='treeitem'><span class='showhidetext'>$showhidetext</span> news"; + $showhidehtml .= "<span class='coursenews treeitem'><span class='showhidetext'>$showhidetext</span> news"; $showhidehtml .= "</span></a></div>"; } @@ -259,11 +279,75 @@ class block_course_overview_uwmoodle extends block_base { $name = sprintf("Summer %d courses", $year); break; default: - $name = "Other courses"; + $name = "Miscellaneous courses"; } return $name; } + /** + * Get the current term from the datastore, and update user show/hide preferences when it changes. + * + * @return boolean true on success + */ + public function update_current_term() { + global $CFG, $DB; + + $oldcurrentterm = get_config('block_course_overview_uwmoodle', 'currentterm'); + try { + $currentterm = $this->get_current_term(); + } catch (Exception $e) { + mtrace("Error fetching current term: ".$e->getMessage()); + return false; + } + if ($currentterm === false) { + mtrace("No current term found"); + return false; + } + + if ($currentterm === $oldcurrentterm) { + // no change, so return + return true; + } + 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; + } + + /** + * Fetch current term from CHUB. Throw exception on CHUB error. + * + * @return string|false term_code or false if none found. + */ + public function get_current_term() { + global $CFG; + + require_once($CFG->dirroot.'/enrol/wisc/lib/datastore.php'); + $datastore = wisc_timetable_datastore::get_timetable_datastore(); + $terms = $datastore->getAvailableTerms(); + + $now = time(); + $futureterms = array(); + foreach ($terms as $term) { + // check that term hasn't ended and doesn't have an odd termCode + // odd term codes (e.g. Winter) are never considered the current term + if ($term->endDate > $now && ($term->termCode % 2 != 1)) { + $futureterms[] = $term->termCode; + } + } + if (!empty($futureterms)) { + $currentterm = min($futureterms); + } else { + $currentterm = false; + } + return $currentterm; + } /** * allow the block to have a configuration page @@ -282,4 +366,13 @@ class block_course_overview_uwmoodle extends block_base { public function applicable_formats() { return array('my-index'=>true); } + + /** + * Block cron to update currentterm + * + * @return boolean true on success + */ + public function cron() { + return $this->update_current_term(); + } } \ No newline at end of file diff --git a/styles.css b/styles.css index dfd2c61708b388e29d5d3770cbc22b95369fab60..437fbd4504b2f8a160cd5a45847a819f17fe01ac 100644 --- a/styles.css +++ b/styles.css @@ -1,17 +1,20 @@ -.block_course_overview_uwmoodle .treeitem span { - background-image: url([[pix:t/expanded]]); +.block_course_overview_uwmoodle .treeitem { background-position: 0 40%; background-repeat: no-repeat; padding-left: 18px; text-align: left; } -.block_course_overview_uwmoodle .showhidespacer {padding-left: 18px;} -.block_course_overview_uwmoodle li.collapsed .treeitem span {background-image: url([[pix:t/collapsed]]);} + +.block_course_overview_uwmoodle .treeitem.term {background-image: url([[pix:t/expanded]]);} +.block_course_overview_uwmoodle li.collapsed .treeitem.term {background-image: url([[pix:t/collapsed]]);} +.block_course_overview_uwmoodle .treeitem.coursenews {background-image: url([[pix:t/switch_minus]]);} +.block_course_overview_uwmoodle li.collapsed .treeitem.coursenews {background-image: url([[pix:t/switch_plus]]);} .block_course_overview_uwmoodle li.collapsed ul {display: none;} .block_course_overview_uwmoodle li ul {margin: 0;padding-left:16px;} .block_course_overview_uwmoodle .coursebox h3 {margin-left:10px;} -.block_course_overview_uwmoodle h3.term a {color:#000;} -.block_course_overview_uwmoodle h3.term {font-size:1.1em;} +.block_course_overview_uwmoodle h3 {font-size:1.1em;} +.block_course_overview_uwmoodle .noncurrentterm .term {color:#AAAAAA;} +.block_course_overview_uwmoodle .term {color:#000;} .block_course_overview_uwmoodle .shownews {float:right;color:#333;font-weight:normal;margin-right:1em;font-size:91%;} .block_course_overview_uwmoodle a:focus, .block_course_overview_uwmoodle a:hover, diff --git a/version.php b/version.php index 5b1614a19bfa6a8dcc2e6aafe04130a2bc4841fa..f79fc33164cdfb676cc298915d99cccbf7674ee0 100644 --- a/version.php +++ b/version.php @@ -18,10 +18,11 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'block_course_overview_uwmoodle'; -$plugin->version = 2013031300; -$plugin->release = '1.0)'; -$plugin->requires = 2012062500; -$plugin->maturity = MATURITY_RC; +$plugin->version = 2013031500; +$plugin->release = '1.0'; +$plugin->requires = 2012062500; +$plugin->maturity = MATURITY_RC; +$plugin->cron = 43200; // Set min time between cron executions to 12 hours $plugin->dependencies = array( 'enrol_wisc' => 2013030400,