AutorÃa | Ultima modificación | Ver Log |
<?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/>./*** Completion Progress block renderer.** @package block_completion_progress* @copyright 2016 Michael de Raadt* @copyright 2020 Jonathon Fowler <fowlerj@usq.edu.au>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace block_completion_progress\output;use block_completion_progress\completion_progress;use block_completion_progress\defaults;use plugin_renderer_base;use html_writer;/*** Completion Progress block renderer.** @package block_completion_progress* @copyright 2020 Jonathon Fowler <fowlerj@usq.edu.au>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class renderer extends plugin_renderer_base {/*** Generate a progress bar.* @param completion_progress $progress* @return string HTML*/public function render_completion_progress(completion_progress $progress) {global $CFG, $USER;$activities = $progress->get_visible_activities();$completions = $progress->get_completions();$config = $progress->get_block_config();$userid = $progress->get_user()->id;$courseid = $progress->get_course()->id;$instance = $progress->get_block_instance()->id;$simple = $progress->is_simple_bar();$content = '';$now = time();$usingrtl = right_to_left();$numactivities = count($activities);if ($simple && $numactivities == 0) {return get_string('no_visible_activities_message', 'block_completion_progress');}$alternatelinks = array('assign' => array('url' => '/mod/assign/view.php?id=:cmid&action=grade&userid=:userid','capability' => 'mod/assign:grade',),'feedback' => array(// Breaks if anonymous feedback is collected.'url' => '/mod/feedback/show_entries.php?id=:cmid&do_show=showoneentry&userid=:userid','capability' => 'mod/feedback:viewreports',),'lesson' => array('url' => '/mod/lesson/report.php?id=:cmid&action=reportdetail&userid=:userid','capability' => 'mod/lesson:viewreports',),'quiz' => array('url' => '/mod/quiz/report.php?id=:cmid&mode=overview','capability' => 'mod/quiz:viewreports',),);// Get relevant block instance settings or use defaults.if (get_config('block_completion_progress', 'forceiconsinbar') == 0) {$useicons = $config->progressBarIcons ?? defaults::PROGRESSBARICONS;} else {$useicons = true;}if (($defaultlongbars = get_config('block_completion_progress', 'defaultlongbars')) === false) {$defaultlongbars = defaults::LONGBARS;}$orderby = $config->orderby ?? defaults::ORDERBY;$longbars = $config->longbars ?? $defaultlongbars;$displaynow = $orderby == completion_progress::ORDERBY_TIME;$showpercentage = $config->showpercentage ?? defaults::SHOWPERCENTAGE;$rowoptions = array('style' => '');$cellsoptions = array('style' => '');$barclasses = array('barRow');$content .= html_writer::start_div('barContainer', ['data-instanceid' => $instance]);// Determine the segment width.$wrapafter = get_config('block_completion_progress', 'wrapafter') ?: defaults::WRAPAFTER;if ($wrapafter <= 1) {$wrapafter = 1;}if ($longbars == 'wrap' && $numactivities <= $wrapafter) {$longbars = 'squeeze';}if ($longbars == 'wrap') {$rows = ceil($numactivities / $wrapafter);if ($rows <= 1) {$rows = 1;}$cellsoptions['style'] = 'flex-basis: calc(100% / ' . ceil($numactivities / $rows) . ');';$displaynow = false;}if ($longbars == 'scroll') {$leftpoly = html_writer::tag('polygon', '', array('points' => '30,0 0,15 30,30', 'class' => 'triangle-polygon'));$rightpoly = html_writer::tag('polygon', '', array('points' => '0,0 30,15 0,30', 'class' => 'triangle-polygon'));$content .= html_writer::tag('svg', $leftpoly, array('class' => 'left-arrow-svg', 'height' => '30', 'width' => '30'));$content .= html_writer::tag('svg', $rightpoly, array('class' => 'right-arrow-svg', 'height' => '30', 'width' => '30'));}$barclasses[] = 'barMode' . ucfirst($longbars);if ($useicons) {$barclasses[] = 'barWithIcons';}// Determine where to put the NOW indicator.$nowpos = -1;if ($orderby == 'orderbytime' && $longbars != 'wrap' && $displaynow && !$simple) {$barclasses[] = 'barWithNow';// Find where to put now arrow.$nowpos = 0;while ($nowpos < $numactivities && $now > $activities[$nowpos]->expected && $activities[$nowpos]->expected != 0) {$nowpos++;}$nowstring = get_string('now_indicator', 'block_completion_progress');$leftarrowimg = $this->pix_icon('left', $nowstring, 'block_completion_progress', array('class' => 'nowicon'));$rightarrowimg = $this->pix_icon('right', $nowstring, 'block_completion_progress', array('class' => 'nowicon'));}// Determine links to activities.for ($i = 0; $i < $numactivities; $i++) {if ($userid != $USER->id &&array_key_exists($activities[$i]->type, $alternatelinks) &&has_capability($alternatelinks[$activities[$i]->type]['capability'], $activities[$i]->context)) {$substitutions = array('/:courseid/' => $courseid,'/:eventid/' => $activities[$i]->instance,'/:cmid/' => $activities[$i]->id,'/:userid/' => $userid,);$link = $alternatelinks[$activities[$i]->type]['url'];$link = preg_replace(array_keys($substitutions), array_values($substitutions), $link);$activities[$i]->link = $CFG->wwwroot.$link;} else {$activities[$i]->link = $activities[$i]->url;}}// Start progress bar.$content .= html_writer::start_div(implode(' ', $barclasses), $rowoptions);$content .= html_writer::start_div('barRowCells', $cellsoptions);$counter = 1;foreach ($activities as $activity) {$complete = $completions[$activity->id] ?? null;// A cell in the progress bar.$cellcontent = '';$celloptions = array('class' => 'progressBarCell','data-info-ref' => 'progressBarInfo'.$instance.'-'.$userid.'-'.$activity->id,);if ($complete === 'submitted') {$celloptions['class'] .= ' submittedNotComplete';} else if ($complete == COMPLETION_COMPLETE || $complete == COMPLETION_COMPLETE_PASS) {$celloptions['class'] .= ' completed';} else if ($complete == COMPLETION_COMPLETE_FAIL ||(!isset($config->orderby) || $config->orderby == 'orderbytime') &&(isset($activity->expected) && $activity->expected > 0 && $activity->expected < $now)) {$celloptions['class'] .= ' notCompleted';} else {$celloptions['class'] .= ' futureNotCompleted';}if (empty($activity->link)) {$celloptions['data-haslink'] = 'false';} else if (!empty($activity->available) || $simple) {$celloptions['data-haslink'] = 'true';} else if (!empty($activity->link)) {$celloptions['data-haslink'] = 'not-allowed';}// Place the NOW indicator.if ($nowpos >= 0) {if ($nowpos == 0 && $counter == 1) {$nowcontent = $usingrtl ? $rightarrowimg.$nowstring : $leftarrowimg.$nowstring;$cellcontent .= html_writer::div($nowcontent, 'nowDiv firstNow');} else if ($nowpos == $counter) {if ($nowpos < $numactivities / 2) {$nowcontent = $usingrtl ? $rightarrowimg.$nowstring : $leftarrowimg.$nowstring;$cellcontent .= html_writer::div($nowcontent, 'nowDiv firstHalfNow');} else {$nowcontent = $usingrtl ? $nowstring.$leftarrowimg : $nowstring.$rightarrowimg;$cellcontent .= html_writer::div($nowcontent, 'nowDiv lastHalfNow');}}}$counter++;$content .= html_writer::div($cellcontent, null, $celloptions);}$content .= html_writer::end_div(); // ... barRowCells$content .= html_writer::end_div(); // ... $barclasses$content .= html_writer::end_div(); // ... barContainer// Add the percentage below the progress bar.if ($showpercentage && !$simple) {$progress = $progress->get_percentage();$percentagecontent = get_string('progress', 'block_completion_progress').': '.$progress.'%';$percentageoptions = array('class' => 'progressPercentage');$content .= html_writer::tag('div', $percentagecontent, $percentageoptions);}// Add the info box below the table.$divoptions = array('class' => 'progressEventInfo','id' => 'progressBarInfo'.$instance.'-'.$userid.'-info');$content .= html_writer::start_tag('div', $divoptions);if (!$simple) {$content .= get_string('mouse_over_prompt', 'block_completion_progress');$content .= ' ';$attributes = array ('class' => 'accesshide progressShowAllInfo',);$content .= html_writer::link('#', get_string('showallinfo', 'block_completion_progress'), $attributes);}$content .= html_writer::end_tag('div');// Add hidden divs for activity information.$strincomplete = get_string('completion-n', 'completion');$strcomplete = get_string('completed', 'completion');$strpassed = get_string('completion-pass', 'completion');$strfailed = get_string('completion-fail', 'completion');$strsubmitted = get_string('submitted', 'block_completion_progress');$strdateformat = get_string('strftimedate', 'langconfig');$strtimeexpected = get_string('time_expected', 'block_completion_progress');foreach ($activities as $activity) {$completed = $completions[$activity->id] ?? null;$divoptions = array('class' => 'progressEventInfo','id' => 'progressBarInfo'.$instance.'-'.$userid.'-'.$activity->id,'style' => 'display: none;');$content .= html_writer::start_tag('div', $divoptions);$text = '';$text .= html_writer::empty_tag('img',array('src' => $activity->icon, 'class' => 'moduleIcon', 'alt' => '', 'role' => 'presentation'));$text .= $activity->name;if (!empty($activity->link) && (!empty($activity->available) || $simple)) {$attrs = ['class' => 'action_link'];if (!empty($activity->onclick)) {$attrs['onclick'] = $activity->onclick;}$content .= $this->action_link($activity->link, $text, null, $attrs);} else {$content .= $text;}$content .= html_writer::empty_tag('br');$altattribute = '';if ($completed == COMPLETION_COMPLETE) {$content .= $strcomplete.' ';$icon = 'tick';$altattribute = $strcomplete;} else if ($completed == COMPLETION_COMPLETE_PASS) {$content .= $strpassed.' ';$icon = 'tick';$altattribute = $strpassed;} else if ($completed == COMPLETION_COMPLETE_FAIL) {$content .= $strfailed.' ';$icon = 'cross';$altattribute = $strfailed;} else {$content .= $strincomplete .' ';$icon = 'cross';$altattribute = $strincomplete;if ($completed === 'submitted') {$content .= '(' . $strsubmitted . ') ';$altattribute .= '(' . $strsubmitted . ')';}}$content .= $this->pix_icon($icon, $altattribute, 'block_completion_progress', array('class' => 'iconInInfo'));$content .= html_writer::empty_tag('br');if ($activity->expected != 0) {$content .= html_writer::start_tag('div', array('class' => 'expectedBy'));$content .= $strtimeexpected.': ';$content .= userdate($activity->expected, $strdateformat, $CFG->timezone);$content .= html_writer::end_tag('div');}$content .= html_writer::end_tag('div');}return $content;}}