From fab5a7bbc250eefdea2b958fdae06beda5726339 Mon Sep 17 00:00:00 2001 From: Myriam Delaruelle <myriam.delaruelle@univ-lorraine.fr> Date: Fri, 31 Mar 2023 11:33:43 +0200 Subject: [PATCH] refonte progress + description du cours --- classes/output/courseformat/content.php | 91 ++++++++++++++++- entity/course_format_iena_completion.php | 120 +++++++++++------------ styles.css | 22 ++++- templates/courseformat/content.mustache | 98 ++++++++++++++++++ view/view_course_header.php | 3 +- 5 files changed, 267 insertions(+), 67 deletions(-) diff --git a/classes/output/courseformat/content.php b/classes/output/courseformat/content.php index c8d69c0..6611996 100644 --- a/classes/output/courseformat/content.php +++ b/classes/output/courseformat/content.php @@ -25,6 +25,9 @@ namespace format_iena\output\courseformat; use core_courseformat\output\local\content as content_base; +use format_iena\entity\course_format_iena_completion; +require_once($CFG->libdir . '/accesslib.php'); + /** * Base class to render a course content. @@ -36,11 +39,91 @@ use core_courseformat\output\local\content as content_base; class content extends content_base { /** - * @var bool Topic format has add section after each topic. + * Export this data so it can be used as the context for a mustache template (core/inplace_editable). * - * The responsible for the buttons is core_courseformat\output\local\content\section. + * @param renderer_base $output typically, the renderer that's calling this function + * @return stdClass data context for a mustache template + */ + public function export_for_template(\renderer_base $output) { + global $CFG, $COURSE, $USER; + + $data=parent::export_for_template($output); + //$section_entity = new course_format_iena_sections(); + + // return false if completion disabled (site or course) + $completion=new course_format_iena_completion(); + $cpl = $completion->get_completion_by_sections($data->sections); + /* Passer le calcul de complétion de la classe course_format_iena_completion à part à la vue qui fait le header permet de ne pas récupérer deux fois les mêmes informations. */ + //$header = new view_course_header($nameSections, $idSections, $course, $cpl); + $progress= $this->create_view($cpl); + + foreach ($progress as $key => $value) { + $data->$key=$value; + } + //$data->progress=(object)$progress; + //$data->student=$progress['student']; + //$data->summary=$progress['summary']; + //$course_infos=$header->get_data($cpl); + + + return $data; + } + + /** + * Retourne un tableau d'informations : array progress_total, array progress_sections, bool student, string summary + * @param array of object $infos + * @return array */ - protected $hasaddsection = false; + private function get_data($infos){ + global $CFG, $COURSE, $USER; + require_once($CFG->libdir . '/accesslib.php'); + $course_data=[]; + $course_data['student']=false; + //if user is a student + if(!has_capability('course/iena:suivi', $context = \context_course::instance($COURSE->id), $USER->id) &&$infos["progress"]){ + $course_data['progress_total']=$infos['progress']->total; + + + + // PROGRESS TOTAL : total progression percentage + if ( $infos['progress'] !== false && $infos['progress']->total !== false ) { + + + $course_data['progress_sections']=[]; + // section progress total + foreach ($infos['progress']->sections as $section) { + if ( count($section->modules) > 0 ) { + array_push($course_data['progress_sections'], $section); + + } + } + } + else { + + } + $course_data['student']=true; + } + + $course_data['summary']=$COURSE->summary; - + return $course_data; + } + + /** + * Description + * @param type $progress + * @return type + */ + public function create_view($progress) { + // $this->get_progress_bis($this->section_names, $this->idSection, $this->course); + //$prog = $progress != false ? $progress : $this->get_progress_bis($this->section_names, $this->idSection, $this->course); + $infos = [ + 'progress' => $progress, + //'teachers' => $this->get_teachers(), + //'groups' => $this->get_groupes(), + // 'attendance' => $this->get_attendance_link() + ]; + + return $this->get_data($infos); + } } diff --git a/entity/course_format_iena_completion.php b/entity/course_format_iena_completion.php index cb23070..874596d 100644 --- a/entity/course_format_iena_completion.php +++ b/entity/course_format_iena_completion.php @@ -33,7 +33,7 @@ class course_format_iena_completion { * @param array $idsection * @return type */ - public static function get_completion_by_sections($sectionnames, $idsection) { + public static function get_completion_by_sections($arraySections) { global $COURSE, $USER, $DB, $CFG; @@ -42,17 +42,14 @@ class course_format_iena_completion { || $completion->has_activities() == false || $completion->is_enabled() == 0) { return false; } - - $sections = []; - $course = course_get_format($COURSE)->get_course(); $fastmodinfo = get_fast_modinfo($COURSE->id); $modinfoscms = $fastmodinfo->get_cms(); - - $hiddenbutavailable = $course->allmodulesbreadcrum == 1; + $sections=[]; + //$hiddenbutavailable = $course->allmodulesbreadcrum == 1; $modules = []; //Il récupère les modules qui ne sont pas en cours de suppression, qui ont l'achèvement d'activité, qui sont visibles pour l'user, et qui dépend du paramètre "caché mais disponible" - foreach ($modinfoscms as $cm) { + /*foreach ($modinfoscms as $cm) { $module = $completion->get_data($cm, true, $USER->id, $fastmodinfo); $module->url = "$CFG->wwwroot/mod/$cm->modname/view.php?id=$cm->id"; $module->section = $cm->section; @@ -61,19 +58,21 @@ class course_format_iena_completion { $module->url = "$CFG->wwwroot/mod/$cm->modname/view.php?id=$cm->id"; $modules[] = $module; } - } + }*/ $totalcompleted = 0; $totalmodules = 0; - foreach ($idsection as $i => $sectionid) { - $section = new StdClass(); - $section->id = $i; - $section->name = $sectionnames[$i]; + foreach ($arraySections as $singleSection) { + $section = new \StdClass(); + $section->id = $singleSection->id; + $section->name = $singleSection->header->name; $innermodules = []; $innercompleted = 0; + $modules=self::get_completion_modules($modinfoscms, $USER->id, $course, $completion, $singleSection); + //$section->completion=$this->get_completion_by_section($section, $modinfoscms, $course, $modules ); foreach ($modules as $module) { - if ($module->section == $sectionid) { - $mod = new StdClass(); + //if ($module->section == $singleSection->id) { + $mod = new \StdClass(); $mod->coursemoduleid = $module->coursemoduleid; $mod->completion = $module->completionstate; $mod->name = $module->name; @@ -82,7 +81,7 @@ class course_format_iena_completion { $innercompleted++; } $innermodules[] = $mod; - } + //} } $section->modules = $innermodules; if (count($innermodules) == 0) { @@ -92,19 +91,26 @@ class course_format_iena_completion { } $totalcompleted += $innercompleted; $totalmodules += count($innermodules); + array_push($sections, $section); } if ($totalmodules == 0) { return false; } - $progress = new StdClass(); + $progress = new \StdClass(); $progress->total = number_format(100 * $totalcompleted / $totalmodules, 0); $progress->sections = $sections; return $progress; } - -public static function get_completion_by_section($section, $cms, $course) { + /** + * [get_completion_by_section Retourne la progression pour une section donnée] + * @param [section_info] $section + * @param [type] $cms liste des modules du cours + * @param [type] $course cours + * @return [float] $progress pourcentage de complétion pour une section + */ + public static function get_completion_by_section($section, $cms, $course) { global $USER, $DB, $CFG; @@ -114,16 +120,17 @@ public static function get_completion_by_section($section, $cms, $course) { return false; } - $sections = []; - ///$course = course_get_format($COURSE)->get_course();// - $fastmodinfo = get_fast_modinfo($course->id); - $modinfoscms = $fastmodinfo->get_cms(); + //$fastmodinfo = get_fast_modinfo($course->id); + //$modinfoscms = $fastmodinfo->get_cms(); - $hiddenbutavailable = $course->allmodulesbreadcrum == 1; - $modules = []; + $modules = []; + $modules=self::get_completion_modules($cms, $USER->id, $course, $completion, $section); + + + //Il récupère les modules qui ne sont pas en cours de suppression, qui ont l'achèvement d'activité, qui sont visibles pour l'user, et qui dépend du paramètre "caché mais disponible" - foreach ($cms as $cm) { + /*foreach ($cms as $cm) { if ($cm->section == $section->id) { $module = $completion->get_data($cm, true, $USER->id); $module->url = "$CFG->wwwroot/mod/$cm->modname/view.php?id=$cm->id"; @@ -135,21 +142,20 @@ public static function get_completion_by_section($section, $cms, $course) { } } - } + }*/ + $totalcompleted = 0; $totalmodules = 0; - $innermodules = []; $innercompleted = 0; + //on récupère les modules qui ont la complétion d'activé foreach ($modules as $module) { - if ($module->completionstate == 1 || $module->completionstate == 2) { $innercompleted++; } $innermodules[] = $module; - } /*if (count($innermodules) == 0) { $section->completion = 0; @@ -159,35 +165,6 @@ public static function get_completion_by_section($section, $cms, $course) { $totalcompleted += $innercompleted; $totalmodules += count($innermodules); - /*foreach ($idsection as $i => $sectionid) { - $section = new StdClass(); - $section->id = $i; - $section->name = $sectionnames[$i]; - $innermodules = []; - $innercompleted = 0; - foreach ($modules as $module) { - if ($module->section == $sectionid) { - $mod = new StdClass(); - $mod->coursemoduleid = $module->coursemoduleid; - $mod->completion = $module->completionstate; - $mod->name = $module->name; - $mod->url = $module->url; - if ($mod->completion == 1 || $mod->completion == 2) { - $innercompleted++; - } - $innermodules[] = $mod; - } - } - $section->modules = $innermodules; - if (count($innermodules) == 0) { - $section->completion = 0; - } else { - $section->completion = number_format(100 * $innercompleted / count($innermodules), 0); - } - $totalcompleted += $innercompleted; - $totalmodules += count($innermodules); - array_push($sections, $section); - }*/ if ($totalmodules == 0) { return false; } @@ -196,6 +173,7 @@ public static function get_completion_by_section($section, $cms, $course) { //$progress->sections = $sections; return $progress; } + public static function get_completion_by_section_old() { global $COURSE, $DB, $USER; @@ -228,13 +206,13 @@ public static function get_completion_by_section($section, $cms, $course) { $sections = []; foreach ($sectionids as $i => $sectionid) { - $section = new StdClass(); + $section = new \StdClass(); $section->id = $i; $innermodules = []; $innercompleted = 0; foreach ($modules as $module) { if ($module->section == $sectionid) { - $mod = new StdClass(); + $mod = new \StdClass(); $mod->coursemoduleid = $module->coursemoduleid; $mod->completion = $module->completionstate; if ($mod->completion == 1 || $mod->completion == 2) { @@ -255,5 +233,27 @@ public static function get_completion_by_section($section, $cms, $course) { return $sections; } + public static function get_completion_modules($cms, $userid, $course, $completion, $section){ + global $CFG; + $hiddenbutavailable = $course->allmodulesbreadcrum == 1; + $modules=[]; + foreach ($cms as $cm) { + + if ($cm->section == $section->id) { + + $module = $completion->get_data($cm, true, $userid); + $module->url = "$CFG->wwwroot/mod/$cm->modname/view.php?id=$cm->id"; + $module->section = $cm->section; + if ( $cm->deletioninprogress == 0 && $cm->completion != 0 && $cm->uservisible && ($cm->visibleoncoursepage==1 || $hiddenbutavailable)) { + $module->name = $cm->name; + $module->url = "$CFG->wwwroot/mod/$cm->modname/view.php?id=$cm->id"; + $modules[] = $module; + } + } + + } + return $modules; + } + } diff --git a/styles.css b/styles.css index 0744ace..de0dfaf 100644 --- a/styles.css +++ b/styles.css @@ -260,8 +260,15 @@ ul.nav.navbar-nav.ml-auto { .label_item.sect-date.prog{ background-color:#40aca3; - font-weight: bold; color: white; + font-weight: 500; + padding: 5px 17px; + font-weight: 700; + font-size: 1rem; + border: none; + font-style: normal; + +} } .iena-description { @@ -350,6 +357,8 @@ ul.nav.navbar-nav.ml-auto { padding: 15px; } + + /* Toggler */ .iena-course-header-toggler { @@ -381,8 +390,17 @@ ul.nav.navbar-nav.ml-auto { .iena-progress-header{ background-color: #eaeaea; - padding: 10px; + padding: 15px; margin-bottom: 20px; + border-radius: 5px; +} + +.iena-progress-header .btn.btn-icon:hover, .iena-progress-header .btn.btn-icon:focus{ + background:white; +} + +.iena-progress-header h5{ + margin: 0 7px 0 2px; } .progress-wrapper{ diff --git a/templates/courseformat/content.mustache b/templates/courseformat/content.mustache index 8c52d74..54f8661 100644 --- a/templates/courseformat/content.mustache +++ b/templates/courseformat/content.mustache @@ -158,7 +158,101 @@ } } }} +<div class="iena-course-header"> + {{#student}} + <!--<a href="#" class="btn btn-outline-primary iena-course-h-total" onclick="iena_toggle_course_header(event)">Ma progression : {{progress_total}}%</a>--> + <div class="iena-progress-header"> + <div style="display:flex;align-items:center;"> + <a role="button" data-toggle="collapse" href="#progress-details" aria-expanded="false" aria-controls="progress-details" class="btn btn-icon mr-1 icons-collapse-expand justify-content-center collapsed" aria-label="Progress"> + <span class="expanded-icon icon-no-margin p-2" title="Replier"> + <i class="icon fa fa-chevron-down fa-fw " aria-hidden="true"></i> + </span> + <span class="collapsed-icon icon-no-margin p-2" title="Déplier"> + <span class="dir-rtl-hide"><i class="icon fa fa-chevron-right fa-fw " aria-hidden="true"></i></span> + <span class="dir-ltr-hide"><i class="icon fa fa-chevron-left fa-fw " aria-hidden="true"></i></span> + </span> + </a> + <h5 class="iena-progress-label">{{# str }} my_progress, format_iena {{/ str}}</h5> + <div class="progress-wrapper"> + <div class="progress"> + <div class="progress-bar" role="progressbar" aria-valuenow="{{progress_total}}" style="width:{{progress_total}}%" aria-valuemin="0" aria-valuemax="100"> {{progress_total}}%</div> + </div> + </div> + <!-- <a class="iena-progress-label" data-toggle="collapse" href="#progress-details" role="button" aria-expanded="false" aria-controls="progress-details"> <i class="fa fa-search-plus"></i> </a>--> + + + + </div> + + <div class="iena-course-header-bottom" id="iena-h-bottom" aria-expanded="false" style=""> + <div class="iena-h-prog-sect collapse row" id="progress-details"> + <div class="details-progress col-md-7"> + {{#progress_sections}} + <div class="section-progress"> + <a href="#section-{{id}}" class="iena-h-prog-name">{{name}}</a> + <div class="progress-wrapper"> + <div class="progress"> + <div class="progress-bar" role="progressbar" aria-valuenow="{{completion}}" style="width:{{completion}}%" aria-valuemin="0" aria-valuemax="100"></div> + + </div> + <div class="iena-prog-label">{{completion}}%</strong> terminé</div> + </div> + <div class="iena-prog-bubbles"> + {{#modules}} + + <!-- <a href="{{url}}" class="iena-h-prog-mod-item iena-g-prog-{{completion}}"><span>{{name}}</span></a> --> + <div class="iena-prog-bubble iena-h-prog-mod-item state-{{completion}}"> + + <span class="icon-progress"></span> + <a href="{{url}}" class="iena-prog-link"> + + <span class="popover-module">{{name}}</span> + </a> + </div> + {{/modules}} + </div> + + </div> + {{/progress_sections}} + </div> + <div class="col-md-5 iena-progress-legend"> + <div id="caption-iena"><h5>{{# str }} caption, format_iena {{/ str}}</h5> + <div class=""> + <div class="caption-status"><div class="pointer-help state-0"><span class="icon-progress"></span></div> <span class="caption-title"> {{# str }} status0, format_iena {{/ str}}</span></div> + <div class="caption-status"><div class="pointer-help state-1"><span class="icon-progress"></span></div> <span class="caption-title">{{# str }} status1, format_iena {{/ str}}</span></div> + <div class="caption-status"><div class="pointer-help state-2"><span class="icon-progress"></span></div> <span class="caption-title">{{# str }} status2, format_iena {{/ str}}</span></div> + <div class="caption-status"><div class="pointer-help state-3"><span class="icon-progress"></span></div> <span class="caption-title">{{# str }} status3, format_iena {{/ str}}</span></div> + </div> + </div> + </div> + </div> + + + </div> + </div> + + {{/student}} + + {{#summary}} + <div class="iena-course-header-bottom" id="" aria-expanded="false"> + <div id="title-summary-iena"> + <h3> + {{# str }} aboutcourse, format_iena {{/ str}} + </h3> + <div id="summary-wrapper"> + <div id="summary-collapse" aria-expanded="false">{{{ summary }}}</div> + </div> + + + + + + <a role="button" href="#" onclick="return false" id="button-collapse" aria-expanded="false" aria-controls="summary-collapse">{{# str }} displayInfos, format_iena {{/ str}}</a> + </div> + </div> + {{/summary}} +</div> <div id="{{uniqid}}-course-format"> <h2 class="accesshide">{{{title}}}</h2> {{{completionhelp}}} @@ -205,4 +299,8 @@ require(['core_courseformat/local/content'], function(component) { component.init('{{uniqid}}-course-format', {}, {{sectionreturn}}); }); +require(['format_iena/header'], function(module) { + module.registerHeader(); + +}); {{/js}} diff --git a/view/view_course_header.php b/view/view_course_header.php index 4ec9611..b754daf 100644 --- a/view/view_course_header.php +++ b/view/view_course_header.php @@ -231,6 +231,7 @@ class view_course_header { // } + /*31/03/2023 : Useless private function get_completion_by_section($idSection) { global $COURSE, $USER; $ressources_entity = new course_format_iena_section_ressources(); @@ -249,7 +250,7 @@ class view_course_header { } } return array($modules, $valueTotal); - } + }*/ private function get_teachers() { global $COURSE, $CFG, $USER; -- GitLab