From e6e6096287d988819b231478799f2c82bcedfe0f Mon Sep 17 00:00:00 2001
From: Myriam Delaruelle <myriam.delaruelle@univ-lorraine.fr>
Date: Thu, 8 Feb 2024 09:42:27 +0100
Subject: [PATCH] Tests interface option

---
 classes/form/edittable_form.php               |  87 +++++++---
 .../course_format_iena_table_option.php       | 135 ++++++++++------
 suivi_edit.php                                |  53 +++++--
 suivi_unit.php                                |   2 +-
 templates/suivi.mustache                      |   2 +-
 tests/my_test.php                             | 150 ++++++++++++------
 6 files changed, 301 insertions(+), 128 deletions(-)

diff --git a/classes/form/edittable_form.php b/classes/form/edittable_form.php
index 9464849..bc4274f 100644
--- a/classes/form/edittable_form.php
+++ b/classes/form/edittable_form.php
@@ -19,7 +19,11 @@ class edittable_form extends moodleform {
     function definition() {
 
         $mform  = $this->_form;
-        //$course = $this->_customdata['course'];
+        $courseid = $this->_customdata['courseid'];
+        $display_groups = $this->_customdata['display_groups'];
+        $display_status = $this->_customdata['display_status'];
+        $display_details = $this->_customdata['display_details'];
+        $display_custom = $this->_customdata['display_custom'];
         //$sectioninfo = $this->_customdata['cs'];
 
 
@@ -42,52 +46,87 @@ class edittable_form extends moodleform {
 
         $mform->addHelpButton('display_details', 'summary');*/
         $radioarray = array();
-        $radioarray[] = $mform->createElement('checkbox', 'display_groups', 'Activer');
+        $radioarray[] = $mform->createElement('advcheckbox', 'display_groups', 'Activer');
         $mform->addGroup($radioarray, 'groups', 'Afficher les groupes', array(' '), false);
         $mform->addHelpButton('groups', 'modalite', 'format_iena');
+        $mform->setDefault('display_groups', $display_groups['value']);
+
         $radioarray = array();
-        $radioarray[] = $mform->createElement('checkbox', 'display_custom', 'Activer');
+        $radioarray[] = $mform->createElement('advcheckbox', 'display_custom', 'Activer');
         $mform->addGroup($radioarray, 'custom', 'Activer la personnalisation', array(' '), false);
         $mform->addHelpButton('custom', 'modalite', 'format_iena');
+        $mform->setDefault('display_custom', $display_custom['value']);
+
         $radioarray = array();
-        $radioarray[] = $mform->createElement('checkbox', 'display_status', 'Activer');
+        $radioarray[] = $mform->createElement('advcheckbox', 'display_status', 'Activer');
         $mform->addGroup($radioarray, 'status', 'Afficher les groupes', array(' '), false);
         $mform->addHelpButton('status', 'modalite', 'format_iena');
+        $mform->setDefault('display_status', $display_status['value']);
+
         $radioarray = array();
-        $radioarray[] = $mform->createElement('checkbox', 'display_details', 'Activer');
+        $radioarray[] = $mform->createElement('advcheckbox', 'display_details', 'Activer');
         $mform->addGroup($radioarray, 'details', 'Afficher les groupes', array(' '), false);
         $mform->addHelpButton('details', 'modalite', 'format_iena');
+        $mform->setDefault('display_details', $display_details['value']);
     
 
-        /*$mform->addElement('hidden', 'id');
-        $mform->setType('id', PARAM_INT);*/
-
-        $this->add_action_buttons();
+       
+        $this->add_action_buttons(true, "Enregistrer");
         //$mform->_registerCancelButton('cancel');
+        //
+       /* $buttonarray=array();
+            $buttonarray[] = $mform->createElement('submit', 'submitbutton', get_string('savechanges'));
+            $buttonarray[] = $mform->createElement('cancel');
+            $mform->addGroup($buttonarray, 'buttonar', '', ' ', false);
+
+
+            */
+           $mform->addElement('hidden', 'courseid', $courseid);
+            $mform->setType('courseid', PARAM_INT);
+
+        $this->set_data($courseid);
     }
 
 
 
 
 
-    /**
-     * Load in existing data as form defaults
-     *
-     * @param stdClass|array $default_values object or array of default values
-     */
-    function set_data($default_values) {
-        if (!is_object($default_values)) {
-            // we need object for file_prepare_standard_editor
-            $default_values = (object)$default_values;
+  
+
+    /*function is_cancelled(){
+        $mform =& $this->_form;
+        error_log("on passe par là monsieur");
+        error_log($mform->isSubmitted());
+        error_log(" bla bla");
+        if ($mform->isSubmitted()){
+            error_log("submitted");
+            foreach ($mform->_cancelButtons as $cancelbutton){
+                if ($this->optional_param($cancelbutton, 0, PARAM_RAW)) {
+                    error_log("on va par là");
+                    return true;
+                }
+            }
         }
-        $editoroptions = $this->_customdata['editoroptions'];
-        $default_values = file_prepare_standard_editor($default_values, 'summary', $editoroptions,
-                $editoroptions['context'], 'course', 'section', $default_values->id);
-        if (strval($default_values->name) === '') {
-            $default_values->name = false;
+        return false;
+    }*/
+
+    function get_data() {
+        $mform =& $this->_form;
+       
+        if (!$this->is_cancelled() and $this->is_submitted() and $this->is_validated()) {
+            $data = $mform->exportValues();
+            unset($data['sesskey']); // we do not need to return sesskey
+            unset($data['_qf__'.$this->_formname]);   // we do not need the submission marker too
+            if (empty($data)) {
+                return NULL;
+            } else {
+                return (object)$data;
+            }
+        } else {
+            return NULL;
         }
-        parent::set_data($default_values);
     }
 
 
+
 }
diff --git a/classes/output/course_format_iena_table_option.php b/classes/output/course_format_iena_table_option.php
index 227ed14..41dd240 100644
--- a/classes/output/course_format_iena_table_option.php
+++ b/classes/output/course_format_iena_table_option.php
@@ -35,6 +35,12 @@ class course_format_iena_table_option {
     public $optionvalue;
     public $courseid;
     public $userid;
+    public $listoptions=array(
+        "display_groups"=>array("value"=>0),
+        "display_custom"=>array("value"=>0),
+        "display_details"=>array("value"=>0),
+        "display_status"=>array("value"=>0)
+    );
 
     
     /**
@@ -75,60 +81,101 @@ class course_format_iena_table_option {
          return $arrayoptions;
     }
 
-    public function get_array_options(){
+    public function get_request_options(){
          global $DB;
-         $arrayoptions = $DB->get_record('format_iena_options', ['id' => "1"]);
-         return $arrayoptions;
+ 
+         $arrayoptions = $DB->get_records('format_iena_options', ['courseid' => $this->courseid]);
+         return $this->get_array_options(array_values($arrayoptions));
+    }
+
+    /**
+     * formate le résultat de la requête qui récupère les options existantes
+     * @param  [array] $requestoptions [le tableau de résultat de la requête]
+     * @return [array]                 [un tableau d'objet qui contient nomoption => ["value" => value, "id"=>idoption]]
+     */
+    private function get_array_options($requestoptions){
+       
+        if(is_object($requestoptions)){
+             $this->listoptions[$requestoptions->optionname]['value']=$requestoptions['optionvalue'];
+             $this->listoptions[$requestoptions->optionname]['id']=$requestoptions['id'];
+        }
+        else{
+            for($i=0; $i<count($requestoptions); $i++){
+                $this->listoptions[$requestoptions[$i]->optionname]['value']=$requestoptions[$i]->optionvalue;
+                $this->listoptions[$requestoptions[$i]->optionname]['id']=$requestoptions[$i]->id;
+            }
+        }
+        
+        return $this->listoptions;
     }
 
     public function toArray() {
         $vars = [];
         foreach ($this as $varname => $varvalue) {
+
             $vars[$varname] = $varvalue;
         }
         return $vars;
     }
 
+    public function get_list_options(){
+        return $this->listoptions;
+    }
  
 
+    public function save_property($property, $value, $existingoption =false){
+        global $DB;
+        $this->setOptionname($property);
+        $this->setOptionvalue($value);
+        if($existingoption){
+            $this->timemodified=time();
+            $this->id=$existingoption;
+            return $result=$DB->update_record("format_iena_options", $this, true);
+        }
+        else{
+            $this->timecreated=time();
+            $this->timemodified=null;
+            return $result=$DB->insert_record("format_iena_options", $this, true);
+        }
+        
+        
 
+    }
+
+    public function check_option_checked($optionfromDB, $arrayfrominput){
 
-    /**
-     * @return mixed
-     */
-    public function getDisplaygroups()
-    {
-        return $this->displaygroups;
     }
 
-    /**
-     * @param mixed $displaygroups
-     *
-     * @return self
-     */
-    public function setDisplaygroups($displaygroups)
-    {
-        $this->displaygroups = $displaygroups;
+    public function check_option_unchecked(){
 
-        return $this;
     }
 
+    public function check_options_state($arrayfrominput){
+        foreach($arrayfrominput as $optionname=>$optionvalue){
+            if(in_array($optionname, array_keys($this->listoptions))){
+                
+            }
+        }
+    }
+  
+
+
     /**
      * @return mixed
      */
-    public function getDisplaycustom()
+    public function getOptionname()
     {
-        return $this->displaycustom;
+        return $this->optionname;
     }
 
     /**
-     * @param mixed $displaycustom
+     * @param mixed $optionname
      *
      * @return self
      */
-    public function setDisplaycustom($displaycustom)
+    public function setOptionname($optionname)
     {
-        $this->displaycustom = $displaycustom;
+        $this->optionname = $optionname;
 
         return $this;
     }
@@ -136,19 +183,19 @@ class course_format_iena_table_option {
     /**
      * @return mixed
      */
-    public function getDisplaydetails()
+    public function getOptionvalue()
     {
-        return $this->displaydetails;
+        return $this->optionvalue;
     }
 
     /**
-     * @param mixed $displaydetails
+     * @param mixed $optionvalue
      *
      * @return self
      */
-    public function setDisplaydetails($displaydetails)
+    public function setOptionvalue($optionvalue)
     {
-        $this->displaydetails = $displaydetails;
+        $this->optionvalue = $optionvalue;
 
         return $this;
     }
@@ -156,19 +203,19 @@ class course_format_iena_table_option {
     /**
      * @return mixed
      */
-    public function getDisplaystatus()
+    public function getCourseid()
     {
-        return $this->displaystatus;
+        return $this->courseid;
     }
 
     /**
-     * @param mixed $displaystatus
+     * @param mixed $courseid
      *
      * @return self
      */
-    public function setDisplaystatus($displaystatus)
+    public function setCourseid($courseid)
     {
-        $this->displaystatus = $displaystatus;
+        $this->courseid = $courseid;
 
         return $this;
     }
@@ -176,19 +223,19 @@ class course_format_iena_table_option {
     /**
      * @return mixed
      */
-    public function getIdcourse()
+    public function getUserid()
     {
-        return $this->idcourse;
+        return $this->userid;
     }
 
     /**
-     * @param mixed $idcourse
+     * @param mixed $userid
      *
      * @return self
      */
-    public function setIdcourse($idcourse)
+    public function setUserid($userid)
     {
-        $this->idcourse = $idcourse;
+        $this->userid = $userid;
 
         return $this;
     }
@@ -196,22 +243,20 @@ class course_format_iena_table_option {
     /**
      * @return mixed
      */
-    public function getIduser()
+    public function getListoptions()
     {
-        return $this->iduser;
+        return $this->listoptions;
     }
 
     /**
-     * @param mixed $iduser
+     * @param mixed $listoptions
      *
      * @return self
      */
-    public function setIduser($iduser)
+    public function setListoptions($listoptions)
     {
-        $this->iduser = $iduser;
+        $this->listoptions = $listoptions;
 
         return $this;
     }
-
-
 }
diff --git a/suivi_edit.php b/suivi_edit.php
index 6e762c5..8f3cb72 100644
--- a/suivi_edit.php
+++ b/suivi_edit.php
@@ -70,15 +70,16 @@ function create_options_form(){
 
 }
 
-$courseid = required_param('course', PARAM_INT);
+$courseid = required_param('courseid', PARAM_INT);
 // Define the url of the view.
 $url = new moodle_url('/course/format/iena/suivi_edit.php', array('courseid' => $courseid));
 $PAGE->set_url($url);
+$returnurl=new moodle_url('/course/format/iena/suivi_unit.php', array('courseid' => $courseid));
 
 $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
 require_login($course);
 
-$completion = new completion_info($course);
+
 $context = context_course::instance($COURSE->id);
 
 if (!has_capability('course/iena:suivi', $context = context_course::instance($courseid), $USER->id)) {
@@ -90,22 +91,50 @@ if (!has_capability('course/iena:suivi', $context = context_course::instance($co
 
 
 
-// If a post is sent trought the page.
-if (isset($_POST['action']) && !empty($_POST['action'])) {
-    // Si on change les filtres.
-    $data = [];
-    $data = set_data($data);
-    echo json_encode($data);
-} else {
+
     init_page($course, $PAGE);
     echo $OUTPUT->header();
     $data = [];
     $obj=new \format_iena\output\course_format_iena_table_option();
-    $array=$obj->get_array_options();
+    $obj->setCourseid($courseid);
+    $obj->setUserid($USER->id);
+    $arrayoptions=$obj->get_request_options();
+    $listoptions=$obj->get_list_options();
+    $arraycustomform=$arrayoptions;
+    $arraycustomform["courseid"]=$courseid;
+    $mform= new edittable_form(null, $arraycustomform);
+    // Form processing and displaying is done here.
+
+    if ($mform->is_cancelled()) {
+        redirect($returnurl);
+    } else if ($fromform = $mform->get_data()) {
+        var_dump($fromform);
+        var_dump($listoptions);
+        foreach($listoptions as $property => $arrayvalue){
+            //fromform : récupère l'input de l'utilisateur
+            //Attention : si on décoche une option elle n'est plus dans dans fromform
+            //Si l'id existe dans arraycustom form et qu'il n'y a plus dans from form alors on va changer
+            //Si la propriété est bien dans fromform : on vient de cocher l'option
+            if(isset($fromform->$property)){
+                if(isset($arraycustomform[$property]['id'])){
+                    $request=$obj->save_property($property, $fromform->$property, $arraycustomform[$property]['id']);
+                }
+                else{
+                    $request=$obj->save_property($property, $fromform->$property);
+                }
+                
+            }
+            //si elle n'est pas dans fromform MAIS qu'il y a un id dans arraycustom alors ça veut dire qu'elle a été décochée
+        
+        }
+
+        //on stocke en BDD les nouvelles données
+       //redirect($returnurl);
+    }
+
 
-    $mform= new edittable_form();
     $data["form"]=$mform->render();
     $renderer = $PAGE->get_renderer('format_iena');
     $renderer->display_edit_page($data);
     echo $OUTPUT->footer();
-}
+
diff --git a/suivi_unit.php b/suivi_unit.php
index 5d70ec3..e26ee94 100644
--- a/suivi_unit.php
+++ b/suivi_unit.php
@@ -229,7 +229,7 @@ function set_data($data, $modules, $progress, $groups, $activegroupid, $activese
     }
 
     $data['link_classicview'] = $CFG->wwwroot . "/report/progress/index.php?course=" . $COURSE->id;
-    $data['link_editview']=$CFG->wwwroot . "/course/format/iena/suivi_edit.php?course=" . $COURSE->id;
+    $data['link_editview']=$CFG->wwwroot . "/course/format/iena/suivi_edit.php?courseid=" . $COURSE->id;
 
     // Pour le téléchargement du tableau ?
     if (!isset($data['data'])) {
diff --git a/templates/suivi.mustache b/templates/suivi.mustache
index 487e1d5..8096663 100644
--- a/templates/suivi.mustache
+++ b/templates/suivi.mustache
@@ -20,7 +20,7 @@
 						    	<a href="{{link_classicview}}" class="" role="menuitem"><i class="icon fa fa-pencil fa-fw " aria-hidden="true"></i>Vue classique</a>
 							</div>         
 							<div class="dropdown-item">
-						    	<a href="{{link_editview}}" class="" role="menuitem"><i class="icon fa fa-pencil fa-fw " aria-hidden="true"></i>Vue classique</a>
+						    	<a href="{{link_editview}}" class="" role="menuitem"><i class="icon fa fa-pencil fa-fw " aria-hidden="true"></i>Paramètres du tableau</a>
 							</div>                                  
 		                </div>
 		            </div>
diff --git a/tests/my_test.php b/tests/my_test.php
index e9f1656..c39d7df 100644
--- a/tests/my_test.php
+++ b/tests/my_test.php
@@ -1,7 +1,8 @@
 <?php
 
-namespace format_iena;
 
+global $CFG;
+require_once($CFG->dirroot. '\course\format\iena\classes\form\edittable_form.php');
 
 
 
@@ -65,34 +66,6 @@ class my_test extends \advanced_testcase {
         global $DB, $CFG;
         $this->resetAfterTest(true);
 
-        /*$generator = $this->getDataGenerator();
-        $cat1 = $generator->create_category();
-        $cat2 = $generator->create_category();
-        $sub1 = $generator->create_category(array('parent' => $cat1->id));
-        $sub2 = $generator->create_category(array('parent' => $cat1->id));
-        $course1 = $generator->create_course(array('category' => $cat1->id));
-        $course2 = $generator->create_course(array('category' => $sub1->id));
-        $course3 = $generator->create_course(array('category' => $sub1->id));
-        $course4 = $generator->create_course(array('category' => $cat2->id));
-
-        $syscontext = \context_system::instance();
-
-        list($user, $roleid) = $this->get_user_objects($generator, $syscontext->id);
-
-        course_capability_assignment::allow(array(self::CATEGORY_MANAGE, self::CATEGORY_VIEWHIDDEN), $roleid, $syscontext->id);
-
-        // Check they are where we think they are.
-        $this->assertEquals(1, $cat1->get_courses_count());
-        $this->assertEquals(1, $cat2->get_courses_count());
-        $this->assertEquals(2, $sub1->get_courses_count());
-        $this->assertEquals(0, $sub2->get_courses_count());
-
-        // Move the courses in sub category 1 to sub category 2.
-        $this->assertTrue(
-            \core_course\management\helper::move_courses_into_category($sub2->id, array($course2->id, $course3->id))
-        );
-		*/
-
         $olddebug = $CFG->debug;
         $CFG->debug = 0;
 
@@ -118,35 +91,122 @@ class my_test extends \advanced_testcase {
         $this->assertEquals($data["courseid"], $arrayoptions->courseid);
         $this->assertEquals($data["userid"], $arrayoptions->userid);
 
-        // Check the settings.
-     /*   $settings = $DB->get_records('adminpresets_it', ['adminpresetid' => $presetid]);
-        $this->assertCount(4, $settings);
-        // These are the settings created in the generator. Check the results match them.
-        $expectedsettings = [
-            'enablebadges' => 0,
-            'allowemojipicker' => 1,
-            'mediawidth' => 900,
-            'maxanswers' => 2,
+    
+        $CFG->debug = $olddebug;
+    }
+
+    public function test_update_option(){
+
+        global $DB, $CFG;
+        $this->resetAfterTest(true);
+
+        $olddebug = $CFG->debug;
+        $CFG->debug = 0;
+        $data=[
+            "option"=>"display_groups",
+            "value"=>"1",
+            "courseid"=>"1",
+            "userid"=>"1",
         ];
-        foreach ($settings as $setting) {
-            $this->assertArrayHasKey($setting->name, $expectedsettings);
-            $this->assertEquals($expectedsettings[$setting->name], $setting->value);
-        }*/
+         // Create a set of options for the table.
+        $obj=new \format_iena\output\course_format_iena_table_option();
+        
+        $obj->setCourseId($data["courseid"]);
+        $obj->setUserId($data["userid"]);
+        $arrayoptionsid=$obj->save_property($data["option"], $data["value"]);
+        // Check the preset data.
+        
+        $arrayoptions = $DB->get_record('format_iena_options', ['id' => $arrayoptionsid]);
+        $this->assertEquals($data["option"], $arrayoptions->optionname);
+        $this->assertEquals($data["value"], $arrayoptions->optionvalue);
+        $this->assertEquals($data["courseid"], $arrayoptions->courseid);
+        $this->assertEquals($data["userid"], $arrayoptions->userid);
+
+        $this->assertNull($arrayoptions->timemodified);
+
+        $arrayoptionsid2=$obj->save_property($data["option"], 0, $arrayoptionsid);
+       // fwrite(STDERR, print_r($arrayoptionsid2, TRUE));
+        $arrayoptionsupdated = $DB->get_record('format_iena_options', ['id' => $arrayoptionsid]);
+
+        $this->assertEquals($data["option"], $arrayoptionsupdated->optionname);
+        $this->assertEquals(0, $arrayoptionsupdated->optionvalue);
+        $this->assertEquals($data["courseid"], $arrayoptionsupdated->courseid);
+        $this->assertEquals($data["userid"], $arrayoptionsupdated->userid);
+
+        $this->assertEquals($arrayoptions->timecreated, $arrayoptionsupdated->timecreated);
+        $this->assertNotNull($arrayoptionsupdated->timemodified);
 
         $CFG->debug = $olddebug;
+    	
     }
 
-   /* public function test_get_options_by_id_course(){
+    public function test_uncheck_option(){
 
         global $DB, $CFG;
         $this->resetAfterTest(true);
 
+        $olddebug = $CFG->debug;
+        $CFG->debug = 0;
+        $data=[
+            "option"=>"display_groups",
+            "value"=>"1",
+            "courseid"=>"1",
+            "userid"=>"1",
+        ];
+        $data2=[
+            "option"=>"display_custom",
+            "value"=>"1",
+            "courseid"=>"1",
+            "userid"=>"1",
+        ];
+         // Create a set of options for the table.
+        $obj=new \format_iena\output\course_format_iena_table_option();
+        
+        $obj->setCourseId($data["courseid"]);
+        $obj->setUserId($data["userid"]);
+        $idoptiongroup=$obj->save_property($data["option"], $data["value"]);
+        // Check the preset data.
+        
+        $idoptioncustom=$obj->save_property($data2["option"], $data2["value"]);
+       // fwrite(STDERR, print_r($arrayoptionsid2, TRUE));
+       $arrayrequest=$DB->get_records('format_iena_options',["courseid"=>1]);
+        $arrayoptions=$obj->get_request_options();
+
+
+        $this->assertCount(2, $arrayrequest);
+        $this->assertEquals($arrayoptions["display_groups"]["id"], $idoptiongroup);
+        $this->assertEquals($arrayoptions["display_custom"]["id"], $idoptioncustom);
         
 
 
+        $listoptions=$obj->get_list_options();
+        $arraycustomform=$arrayoptions;
+        $arraycustomform["courseid"]=1;
+        
+        // Instantiate a form to submit.
+        $values=[
+            "display_groups"=>1,
+            "display_custom"=>0
+        ];
+
+        // Fetch the data and then mock the submission of that data.
+        
+        edittable_form::mock_submit($values);
+
+        $mform= new edittable_form(null, $arraycustomform);
+        $this->assertTrue($mform->is_validated());
+        // The `get_data()` function will return the validated data, plus any defaults.
+        $actualfromform = $mform->get_data();
+        $obj->check_options_state($actualfromform);
+        $arrayrequest=$DB->get_records('format_iena_options',["courseid"=>1, "optionvalue"=>1]);
+
+        fwrite(STDERR, print_r($arrayrequest, TRUE));
+        $this->assertCount(1, $arrayrequest);
+        $this->assertEquals($arrayrequest[$idoptiongroup]->optionname, "display_groups");
+        //fwrite(STDERR, print_r($actualfromform, TRUE));
         $CFG->debug = $olddebug;
-    	
-    }*/
+        
+    }
 
     /*public function create_options_provider(): array {
         return [
-- 
GitLab