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