diff --git a/config/routes.yaml b/config/routes.yaml index 8b8616f..14491a3 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -182,22 +182,10 @@ app_scrum: path: /user/scrum defaults: { _controller: App\Controller\ScrumController:list } -app_scrum_view: - path: /user/scrum/{id} - defaults: { _controller: App\Controller\ScrumController:view } - app_scrum_submit: path: /master/scrum/submit defaults: { _controller: App\Controller\ScrumController:submit } -app_scrum_stat: - path: /user/scrum/stat/{id} - defaults: { _controller: App\Controller\ScrumController:stat } - -app_scrum_info: - path: /user/scrum/info/{id} - defaults: { _controller: App\Controller\ScrumController:info } - app_scrum_update: path: /master/scrum/update/{id} defaults: { _controller: App\Controller\ScrumController:update } @@ -206,6 +194,24 @@ app_scrum_delete: path: /master/scrum/delete/{id} defaults: { _controller: App\Controller\ScrumController:delete } +app_scrum_view: + path: /user/scrum/{id} + defaults: { _controller: App\Controller\ScrumController:view } + +app_scrum_table: + path: /user/scrum/table/{id} + defaults: { _controller: App\Controller\ScrumController:table } + +app_scrum_stat: + path: /user/scrum/stat/{id} + defaults: { _controller: App\Controller\ScrumController:stat } + + +app_scrum_info: + path: /user/scrum/info/{id} + defaults: { _controller: App\Controller\ScrumController:info } + + #== Scrumcolumn ======================================================================================================== app_scrumcolumn_submit: @@ -272,6 +278,27 @@ app_scrumpriority_order: path: /master/scrumpriority/order/{scrumid} defaults: { _controller: App\Controller\ScrumpriorityController:order } +#== Scrumsprint ======================================================================================================== +app_scrumsprint_submit: + path: /master/scrumsprint/submit/{scrumid} + defaults: { _controller: App\Controller\ScrumsprintController:submit } + +app_scrumsprint_update: + path: /master/scrumsprint/update/{id} + defaults: { _controller: App\Controller\ScrumsprintController:update } + +app_scrumsprint_delete: + path: /master/scrumsprint/delete/{id} + defaults: { _controller: App\Controller\ScrumsprintController:delete } + +app_scrumsprint_select: + path: /master/scrumsprint/select/{scrumid} + defaults: { _controller: App\Controller\ScrumsprintController:select } + +app_scrumsprint_order: + path: /master/scrumsprint/order/{scrumid} + defaults: { _controller: App\Controller\ScrumsprintController:order } + #== Scrumtype ======================================================================================================== app_scrumtype_submit: @@ -314,12 +341,3 @@ app_scrumissue_update: app_scrumissue_ctrlchange: path: /user/scrumissue/ctrlchange defaults: { _controller: App\Controller\ScrumissueController:ctrlchange } - -#== Issue ======================================================================================================== -app_issue: - path: /user/issue - defaults: { _controller: App\Controller\IssueController:list, id: 0 } - -app_issuescrum: - path: /user/issuescrum/{id} - defaults: { _controller: App\Controller\IssueController:list } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 2132324..df00e4c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: container_name: ninegitea-app image: reg.cadoles.com/envole/ninegitea ports: - - "8000:80" + - "8005:80" volumes: - ./src:/app/src:delegated - ./templates:/app/templates:delegated @@ -31,6 +31,12 @@ services: - ./.env.local:/app/.env.local:delegated - ./public/uploads:/app/public/uploads:delegated + adminer: + image: adminer + container_name: ninegitea-adminer + restart: always + ports: + - 6081:8080 volumes: mariadb-data: diff --git a/src/Controller/IssueController.php b/src/Controller/IssueController.php deleted file mode 100755 index cbc463a..0000000 --- a/src/Controller/IssueController.php +++ /dev/null @@ -1,212 +0,0 @@ -appKernel = $appKernel; - $this->giteaservice = $giteaservice; - } - - public function list($id, Request $request) - { - $em = $this->getDoctrine()->getManager(); - $fgcsv = $request->get("fgcsv"); - - // Récupérer les repos de gitea - if($id==0) $scrums=$em->getRepository("App:Scrum")->findBy([],["name"=>"ASC"]); - else $scrums=$em->getRepository("App:Scrum")->findBy(["id"=>$id],["name"=>"ASC"]); - - $giteacategorys=[]; - $gitearepos=[]; - $giteamilestones=[]; - $giteacolumns=[]; - $giteateams=[]; - $giteaprioritys=[]; - $giteatypes=[]; - $gitealabels=[]; - $giteaassignees=$em->getRepository("App:User")->findBy([],["username"=>"ASC"]); - $viewclosed = $request->getSession()->get("viewclosed"); - - foreach($scrums as $key => $scrum) { - if(!in_array($scrum->getCategory(),$giteacategorys)) - array_push($giteacategorys,$scrum->getCategory()); - - $gitearepo=$this->giteaservice->getRepo($scrum->getGiteajson()["id"]); - if(!$gitearepo) die("Probleme de connexion avec gitea veuillez vous reconnecter"); - - if($gitearepo->updated_at!=$scrum->getGiteajson()["updated_at"]||$gitearepo->open_issues_count!=$scrum->getGiteajson()["open_issues_count"]) { - $scrum->setGiteajson(json_decode(json_encode($gitearepo), true)); - $em->persist($scrum); - $em->flush(); - } - - if($gitearepo->open_issues_count>0) { - $giteatmp=$this->giteaservice->getMilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open")); - foreach($giteatmp as $key => $value) { - $giteatmp[$key]->title = $scrum->getGiteajson()["full_name"]. " = ".$giteatmp[$key]->title; - } - array_push($giteatmp,["id"=>$scrum->getGiteajson()["full_name"],"title"=> $scrum->getGiteajson()["full_name"]. " = Aucun Jalon"]); - $giteamilestones=array_merge($giteamilestones,$giteatmp); - - $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open")); - $json=$scrum->getGiteajson(); - $json["issues"]=$giteaissues; - $json["category"]=$scrum->getCategory(); - foreach($json["issues"] as $key => $giteaissue) { - $issue=$em->getRepository("App:Scrumissue")->findOneBy(["giteaid"=>$giteaissue->id]); - if($issue) { - $json["issues"][$key]->weight=$issue->getWeight(); - $json["issues"][$key]->issueid=$issue->getId(); - $json["issues"][$key]->scrumid=$issue->getScrum()->getId(); - } - else { - $json["issues"][$key]->weight=0; - $json["issues"][$key]->issueid=0; - $json["issues"][$key]->scrumid=0; - } - } - - $tmp=[]; - foreach($scrum->getScrumcolumns() as $column) { - array_push($tmp,$column->getGiteaid()); - if(!in_array($column->getGiteajson()["name"],$giteacolumns)) - array_push($giteacolumns,$column->getGiteajson()["name"]); - } - $json["columns"]=$tmp; - array_push($gitearepos,$json); - - foreach($scrum->getScrumteams() as $team) { - if(!in_array($team->getGiteajson()["name"],$giteateams)) - array_push($giteateams,$team->getGiteajson()["name"]); - } - - foreach($scrum->getScrumprioritys() as $priority) { - if(!in_array($priority->getGiteajson()["name"],$giteaprioritys)) - array_push($giteaprioritys,$priority->getGiteajson()["name"]); - } - - foreach($scrum->getScrumtypes() as $type) { - if(!in_array($type->getGiteajson()["name"],$giteatypes)) - array_push($giteatypes,$type->getGiteajson()["name"]); - } - - foreach($giteaissues as $giteaissue) { - foreach($giteaissue->labels as $label) { - if(!in_array($label->name,$gitealabels)) - array_push($gitealabels,$label->name); - } - } - } - } - - $keysort = array_column($giteamilestones, 'title'); - array_multisort($keysort, SORT_DESC, $giteamilestones); - sort($giteacolumns); - sort($giteateams); - sort($giteaprioritys); - sort($giteatypes); - sort($gitealabels); - sort($giteacategorys); - - // Préférences utilisateur - $filtercategorys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercategorys",$id); - $filterrepos = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterrepos",$id); - $filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id); - $filtercolumns = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercolumns",$id); - $filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id); - $filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id); - $filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$id); - $filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id); - $filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id); - $filterexcludes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterexcludes",$id); - $showfilters = $em->getRepository("App:User")->getUserpreference($this->getUser(),"showfilters",$id); - - if($fgcsv) { - $dir = $this->appKernel->getProjectDir() . '/uploads/issues/'; - $file = "issues-".$id.".csv"; - $fs = new Filesystem(); - $fs->mkdir($dir); - $csvh = fopen($dir.$file, 'w'); - $d = ';'; // this is the default but i like to be explicit - $e = '"'; // this is the default but i like to be explicit - - $tmp=["Projet","Jalon","Type","Id","Titre","Statut","Label"]; - fputcsv($csvh, $tmp, $d, $e); - - foreach($gitearepos as $gitearepo) { - foreach($gitearepo["issues"] as $giteaissue) { - $statut=""; - $type=""; - $labels=""; - foreach($giteaissue->labels as $label) { - if(in_array($label->id,$gitearepo["columns"])) - $statut=$label->name; - elseif(in_array($label->name,$giteatypes)) - $type=$label->name; - else - $labels=$labels.($labels!=""?"\n":"").$label->name; - } - $tmp=[ - $gitearepo["name"], - (isset($giteaissue->milestone->title)?$giteaissue->milestone->title:""), - $type, - $giteaissue->number, - $giteaissue->title, - $statut, - $labels - ]; - fputcsv($csvh, $tmp, $d, $e); - } - } - fclose($csvh); - - $response = new BinaryFileResponse($dir.$file); - $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); - return $response; - } - - return $this->render($this->render.'list.html.twig',[ - "useheader" => true, - "usesidebar" => false, - "id" => $id, - "giteacategorys" => $giteacategorys, - "gitearepos" => $gitearepos, - "giteamilestones" => $giteamilestones, - "giteacolumns" => $giteacolumns, - "giteateams" => $giteateams, - "giteaprioritys" => $giteaprioritys, - "giteatypes" => $giteatypes, - "gitealabels" => $gitealabels, - "giteaassignees" => $giteaassignees, - "filtercategorys" => $filtercategorys, - "filterrepos" => $filterrepos, - "filtermilestones" => $filtermilestones, - "filtercolumns" => $filtercolumns, - "filterteams" => $filterteams, - "filterprioritys" => $filterprioritys, - "filtertypes" => $filtertypes, - "filterlabels" => $filterlabels, - "filterexcludes" => $filterexcludes, - "filterassignees" => $filterassignees, - "showfilters" => $showfilters, - ]); - } - -} diff --git a/src/Controller/ScrumController.php b/src/Controller/ScrumController.php index 20a8a74..350449b 100755 --- a/src/Controller/ScrumController.php +++ b/src/Controller/ScrumController.php @@ -20,6 +20,7 @@ class ScrumController extends AbstractController private $route = "app_scrum"; private $render = "Scrum/"; private $entity = "App:Scrum"; + private $giteaservice; public function __construct(giteaService $giteaservice) { $this->giteaservice = $giteaservice; } @@ -178,11 +179,197 @@ class ScrumController extends AbstractController $forcereload=false; if($request->get("forcereload")) $forcereload=$request->get("forcereload"); - + + // Mise à jour des issues par rapport à gitea $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$giteatypes,$gitealabels,$forcereload); - + + // Création du tableau des issues + $issues=$data->getScrumissues(); + $tbissues=[]; + $tbcols=[]; + $tbjals=[]; + $tbsprs=[]; + $tbestim=[]; + + $viewclosed = $this->get('session')->get("viewclosed"); + foreach($issues as $issue) { + // bypass closed + if($viewclosed=="false"&&$issue->getGiteastate()=="closed") continue; + + // Ids + $idcol=$issue->getScrumcolumn()->getId(); + $idjal=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100); + $idspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100); + + // Roworders + $rowcol=$issue->getScrumcolumn()->getRowid(); + $rowjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():-100); + $rowspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getRowid():-100); + + // Names + $nmcol=$issue->getScrumcolumn()->getName(); + $nmjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():"Aucun"); + $nmspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun"); + + // Idgiteas + $gicol=$issue->getScrumcolumn()->getGiteaid(); + $gijal=$issue->getGiteaMilestone(); + + // Liste des colonnes/jalons/sprint avec des issues + if(!in_array($idcol,$tbcols)) array_push($tbcols,$idcol); + if(!in_array($idcol."|".$idjal,$tbjals)) array_push($tbjals,$idcol."|".$idjal); + if(!in_array($idcol."|".$idjal."|".$idspr,$tbsprs)) array_push($tbsprs,$idcol."|".$idjal."|".$idspr); + + // Initialisation du tableau des estimations + if(!array_key_exists($idjal,$tbestim)) { + $tbestim[$idjal] = [ + "rowjal" => $rowjal, + "idjal" => $idjal, + "nmjal" => $nmjal, + "gijal" => $gijal, + "nbjrs" => 0, + "sprints" => [] + ]; + } + + if(!array_key_exists($idspr,$tbestim[$idjal]["sprints"])) { + $tbestim[$idjal]["sprints"][$idspr] = [ + "rowspr" => $rowspr, + "idspr" => $idspr, + "nmspr" => $nmspr, + "nbjrs" => 0, + ]; + } + + // Initialisation du tableau des colonnes + if(!array_key_exists($idcol,$tbissues)) { + $tbissues[$idcol]=[ + "rowcol" => $rowcol, + "idcol" => $idcol, + "nmcol" => $nmcol, + "gicol" => $gicol, + "nbjrs" => 0, + "jalons" => [], + ]; + } + + // Initialisation du tableau des jalons de la colonne encours + if(!array_key_exists($idjal,$tbissues[$idcol]["jalons"])) { + $tbissues[$idcol]["jalons"][$idjal] = [ + "rowjal" => $rowjal, + "idjal" => $idjal, + "nmjal" => $nmjal, + "gijal" => $gijal, + "nbjrs" => 0, + "sprints" => [], + ]; + } + + // Initialisation du tableau des sprint de la colonne/jalon encours + if(!array_key_exists($idspr,$tbissues[$idcol]["jalons"][$idjal]["sprints"])) { + $tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr] = [ + "rowspr" => $rowspr, + "idspr" => $idspr, + "nmspr" => $nmspr, + "nbjrs" => 0, + "issues" => [], + ]; + } + + // On cumule les estimations + $tbissues[$idcol]["nbjrs"]+=$issue->getWeight(); + $tbissues[$idcol]["jalons"][$idjal]["nbjrs"]+=$issue->getWeight(); + $tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight(); + $tbestim[$idjal]["nbjrs"]+=$issue->getWeight(); + $tbestim[$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight(); + + // On sauvegarde l'issue + array_push($tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["issues"],$issue); + } + + // On ajoute les colonnes sans issues + $columns=$data->getScrumcolumns(); + foreach($columns as $column) { + if(!in_array($column->getId(),$tbcols)) { + $tbissues[$column->getId()] = [ + "rowcol" => $column->getRowid(), + "idcol" => $column->getId(), + "nmcol" => $column->getName(), + "gicol" => $column->getGiteaid(), + "nbjrs" => 0, + "jalons" => [], + ]; + } + + // On ajoute les jalons sans issues + foreach($giteamilestones as $milestone) { + if(!in_array($column->getId()."|".$milestone->id,$tbjals)) { + $tbissues[$column->getId()]["jalons"][$milestone->id] = [ + "rowjal" => $milestone->title, + "idjal" => $milestone->id, + "nmjal" => $milestone->title, + "gijal" => $milestone->id, + "nbjrs" => 0, + "sprints" => [], + ]; + } + } + + // On ajoute le jalon aucun si sans issue + if(!in_array($column->getId()."|-100",$tbjals)) { + $tbissues[$column->getId()]["jalons"][-100] = [ + "rowjal" => -100, + "idjal" => -100, + "nmjal" => "Aucun", + "gijal" => null, + "nbjrs" => 0, + "sprints" => [], + ]; + } + + // On ajoutes les sprints sans issues + foreach($tbissues[$column->getId()]["jalons"] as $jalon) { + $sprints=$em->getRepository("App:Scrumsprint")->findBy(["scrum"=>$data,"giteamilestone"=>$jalon["idjal"]]); + foreach($sprints as $sprint) { + if(!in_array($column->getId()."|".$jalon["idjal"]."|".$sprint->getId(),$tbsprs)) { + $tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][$sprint->getId()] = [ + "rowspr" => $sprint->getRowid(), + "idspr" => $sprint->getId(), + "nmspr" => $sprint->getName(), + "nbjrs" => 0, + "issues" => [], + ]; + } + } + + // On ajoute les sprint aucun sans issue + if(!in_array($column->getId()."|".$jalon["idjal"]."|-100",$tbsprs)) { + $tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][-100] = [ + "rowspr" => -100, + "idspr" => -100, + "nmspr" => "Aucun", + "nbjrs" => 0, + "issues" => [], + ]; + } + } + } + + // Tri des issues par colonne/jalon/sprint/issue + $rowcol = array_column($tbissues, 'rowcol'); + array_multisort($rowcol, SORT_ASC, $tbissues); + foreach($tbissues as $keycol=>$column) { + $rowjal = array_column($tbissues[$keycol]["jalons"], 'rowjal'); + array_multisort($rowjal, SORT_DESC, $tbissues[$keycol]["jalons"]); + foreach($tbissues[$keycol]["jalons"] as $keyjal=>$jalon) { + $rowspr = array_column($tbissues[$keycol]["jalons"][$keyjal]["sprints"], 'rowspr'); + array_multisort($rowspr, SORT_DESC, $tbissues[$keycol]["jalons"][$keyjal]["sprints"]); + } + } + // Préférences utilisateur $filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id); + $filtersprints = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtersprints",$id); $filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id); $filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id); $filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$id); @@ -198,11 +385,13 @@ class ScrumController extends AbstractController 'giteaassignees' => $giteaassignees, 'giteacolumns' => $giteacolumns, 'giteamilestones' => $giteamilestones, + 'sprints' => $data->getScrumsprints(), 'giteateams' => $giteateams, 'giteaprioritys' => $giteaprioritys, 'giteatypes' => $giteatypes, 'gitealabels' => $gitealabels, 'filtermilestones' => $filtermilestones, + 'filtersprints' => $filtersprints, 'filterteams' => $filterteams, 'filterprioritys' => $filterprioritys, 'filtertypes' => $filtertypes, @@ -210,10 +399,187 @@ class ScrumController extends AbstractController 'filterassignees' => $filterassignees, 'filterexcludes' => $filterexcludes, 'showfilters' => $showfilters, + 'tbissues' => $tbissues, + 'tbestim' => $tbestim, $this->data => $data, ]); } + + public function table($id, Request $request) + { + $em = $this->getDoctrine()->getManager(); + $fgcsv = $request->get("fgcsv"); + + // Récupérer les repos de gitea + $scrum=$em->getRepository("App:Scrum")->findOneBy(["id"=>$id]); + + $gitearepos=[]; + $giteamilestones=[]; + $giteacolumns=[]; + $giteateams=[]; + $giteaprioritys=[]; + $giteatypes=[]; + $gitealabels=[]; + $giteaassignees=$em->getRepository("App:User")->findBy([],["username"=>"ASC"]); + $viewclosed = $request->getSession()->get("viewclosed"); + + + $gitearepo=$this->giteaservice->getRepo($scrum->getGiteajson()["id"]); + if($gitearepo->updated_at!=$scrum->getGiteajson()["updated_at"]||$gitearepo->open_issues_count!=$scrum->getGiteajson()["open_issues_count"]) { + $scrum->setGiteajson(json_decode(json_encode($gitearepo), true)); + $em->persist($scrum); + $em->flush(); + } + + $giteamilestones=$this->giteaservice->getMilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open")); + + $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open")); + $json=$scrum->getGiteajson(); + $json["issues"]=$giteaissues; + foreach($json["issues"] as $key => $giteaissue) { + $issue=$em->getRepository("App:Scrumissue")->findOneBy(["giteaid"=>$giteaissue->id]); + if($issue) { + $json["issues"][$key]->weight=$issue->getWeight(); + $json["issues"][$key]->issueid=$issue->getId(); + $json["issues"][$key]->scrumid=$issue->getScrum()->getId(); + $json["issues"][$key]->sprintid=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100); + $json["issues"][$key]->sprintname=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun"); + } + else { + $json["issues"][$key]->weight=0; + $json["issues"][$key]->issueid=0; + $json["issues"][$key]->scrumid=0; + $json["issues"][$key]->sprintid=-100; + $json["issues"][$key]->sprintname="Aucun"; + } + } + + $tmp=[]; + foreach($scrum->getScrumcolumns() as $column) { + array_push($tmp,$column->getGiteaid()); + if(!in_array($column->getGiteajson()["name"],$giteacolumns)) + array_push($giteacolumns,$column->getGiteajson()["name"]); + } + $json["columns"]=$tmp; + array_push($gitearepos,$json); + + foreach($scrum->getScrumteams() as $team) { + if(!in_array($team->getGiteajson()["name"],$giteateams)) + array_push($giteateams,$team->getGiteajson()["name"]); + } + + foreach($scrum->getScrumprioritys() as $priority) { + if(!in_array($priority->getGiteajson()["name"],$giteaprioritys)) + array_push($giteaprioritys,$priority->getGiteajson()["name"]); + } + + foreach($scrum->getScrumtypes() as $type) { + if(!in_array($type->getGiteajson()["name"],$giteatypes)) + array_push($giteatypes,$type->getGiteajson()["name"]); + } + + foreach($giteaissues as $giteaissue) { + foreach($giteaissue->labels as $label) { + if(!in_array($label->name,$gitealabels)) + array_push($gitealabels,$label->name); + } + } + + $keysort = array_column($giteamilestones, 'title'); + array_multisort($keysort, SORT_DESC, $giteamilestones); + sort($giteacolumns); + sort($giteateams); + sort($giteaprioritys); + sort($giteatypes); + sort($gitealabels); + + // Préférences utilisateur + $filtercategorys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercategorys",$id); + $filterrepos = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterrepos",$id); + $filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id); + $filtersprints = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtersprints",$id); + $filtercolumns = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercolumns",$id); + $filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id); + $filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id); + $filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$id); + $filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id); + $filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id); + $filterexcludes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterexcludes",$id); + $showfilters = $em->getRepository("App:User")->getUserpreference($this->getUser(),"showfilters",$id); + + if($fgcsv) { + $dir = $this->appKernel->getProjectDir() . '/uploads/issues/'; + $file = "issues-".$id.".csv"; + $fs = new Filesystem(); + $fs->mkdir($dir); + $csvh = fopen($dir.$file, 'w'); + $d = ';'; // this is the default but i like to be explicit + $e = '"'; // this is the default but i like to be explicit + + $tmp=["Projet","Jalon","Type","Id","Titre","Statut","Label"]; + fputcsv($csvh, $tmp, $d, $e); + + foreach($gitearepos as $gitearepo) { + foreach($gitearepo["issues"] as $giteaissue) { + $statut=""; + $type=""; + $labels=""; + foreach($giteaissue->labels as $label) { + if(in_array($label->id,$gitearepo["columns"])) + $statut=$label->name; + elseif(in_array($label->name,$giteatypes)) + $type=$label->name; + else + $labels=$labels.($labels!=""?"\n":"").$label->name; + } + $tmp=[ + $gitearepo["name"], + (isset($giteaissue->milestone->title)?$giteaissue->milestone->title:""), + $type, + $giteaissue->number, + $giteaissue->title, + $statut, + $labels + ]; + fputcsv($csvh, $tmp, $d, $e); + } + } + fclose($csvh); + + $response = new BinaryFileResponse($dir.$file); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); + return $response; + } + + return $this->render($this->render.'table.html.twig',[ + "useheader" => true, + "usesidebar" => false, + "id" => $id, + "gitearepos" => $gitearepos, + "giteamilestones" => $giteamilestones, + "sprints" => $scrum->getScrumsprints(), + "giteacolumns" => $giteacolumns, + "giteateams" => $giteateams, + "giteaprioritys" => $giteaprioritys, + "giteatypes" => $giteatypes, + "gitealabels" => $gitealabels, + "giteaassignees" => $giteaassignees, + "filtercategorys" => $filtercategorys, + "filterrepos" => $filterrepos, + "filtermilestones" => $filtermilestones, + "filtersprints" => $filtersprints, + "filtercolumns" => $filtercolumns, + "filterteams" => $filterteams, + "filterprioritys" => $filterprioritys, + "filtertypes" => $filtertypes, + "filterlabels" => $filterlabels, + "filterexcludes" => $filterexcludes, + "filterassignees" => $filterassignees, + "showfilters" => $showfilters, + ]); + } + public function stat($id,Request $request) { // Initialisation de l'enregistrement @@ -225,94 +591,94 @@ class ScrumController extends AbstractController // Préférences utilisateur $filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id); - $filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id); + $filtersprints = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtersprints",$id); $showfilters = $em->getRepository("App:User")->getUserpreference($this->getUser(),"showfilters",$id); - $tbstat=[]; - foreach($data->getScrumIssues() as $issue) { + // Création du tableau des issues + $issues=$data->getScrumissues(); + $tbissues=[]; + $tbcols=[]; + $tbjals=[]; + $tbsprs=[]; + $tbestim=[]; + + $viewclosed = $this->get('session')->get("viewclosed"); + foreach($issues as $issue) { + // bypass closed + if($viewclosed=="false"&&$issue->getGiteastate()=="closed") continue; - $labels=$issue->getGiteajson()["labels"]; - $haveteams=true; - if($filterteams) { - $haveteams=false; - foreach($filterteams as $filterteam) { - foreach($labels as $label) { - if($label["id"]==$filterteam) { - $haveteams=true; - } - } - } + // Ids + $idcol=$issue->getScrumcolumn()->getId(); + $idjal=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100); + $idspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100); + + // Roworders + $rowcol=$issue->getScrumcolumn()->getRowid(); + $rowjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():-100); + $rowspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getRowid():-100); + + // Names + $nmcol=$issue->getScrumcolumn()->getName(); + $nmjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():"Aucun"); + $nmspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun"); + + if(!array_key_exists($idjal,$tbestim)) { + $tbestim[$idjal] = [ + "rowjal" => $rowjal, + "idjal" => $idjal, + "nmjal" => $nmjal, + "nbjrs" => 0, + "columns" => [], + "sprints" => [], + ]; } - if($haveteams) { - $idmilestone=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100); - $lbmilestone=($issue->getGiteamilestone()?$issue->getGiteamilestonename():"Aucun"); - if(!array_key_exists($idmilestone,$tbstat)) { - $tbstat[$idmilestone]=["id"=>$idmilestone,"name"=>$lbmilestone,"stat"=>[]]; - } + if(!array_key_exists($idspr,$tbestim[$idjal]["sprints"])) { + $tbestim[$idjal]["sprints"][$idspr] = [ + "rowspr" => $rowspr, + "idspr" => $idspr, + "nmspr" => $nmspr, + "nbjrs" => 0, + "columns" => [], + ]; + } - if(!$issue->getScrumcolumn()) $ordercolumns=0; - else $ordercolumns=array_search($issue->getScrumcolumn()->getGiteaid(),$giteacolumns); - - //$ordercolumns=$issue->getScrumcolumn()->getId(); - if(!array_key_exists($ordercolumns,$tbstat[$idmilestone]["stat"])) { - $tbstat[$idmilestone]["stat"][$ordercolumns]=[ - "id"=>$issue->getScrumcolumn()->getId(), - "label"=>$issue->getScrumcolumn()->getName(), - "total"=>0, - "color"=>"#".$issue->getScrumcolumn()->getGiteajson()["color"], - "labels"=>[], - ]; - } - - foreach($labels as $label) { - if($ordercolumns!=$label["id"]) { - if(!array_key_exists($label["id"],$tbstat[$idmilestone]["stat"][$ordercolumns]["labels"])) { - $tbstat[$idmilestone]["stat"][$ordercolumns]["labels"][$label["id"]] = [ - "id"=>$label["id"], - "label"=>$label["name"], - "total"=>0, - "color"=>"#".$label["color"], - ]; - } - $tbstat[$idmilestone]["stat"][$ordercolumns]["labels"][$label["id"]]["total"]+=$issue->getWeight(); - } - } - - $tbstat[$idmilestone]["stat"][$ordercolumns]["total"]+=$issue->getWeight(); - } + if(!array_key_exists($idcol,$tbestim[$idjal]["columns"])) { + $tbestim[$idjal]["columns"][$idcol] = [ + "rowcol" => $rowcol, + "idcol" => $idcol, + "nmcol" => $nmcol, + "color" => $issue->getScrumcolumn()->getGiteajson()["color"], + "nbjrs" => 0, + ]; + } + + if(!array_key_exists($idcol,$tbestim[$idjal]["sprints"][$idspr]["columns"])) { + $tbestim[$idjal]["sprints"][$idspr]["columns"][$idcol] = [ + "rowcol" => $rowcol, + "idcol" => $idcol, + "nmcol" => $nmcol, + "color" => $issue->getScrumcolumn()->getGiteajson()["color"], + "nbjrs" => 0, + ]; + } + + // On cumule les estimations + $tbestim[$idjal]["nbjrs"]+=$issue->getWeight(); + $tbestim[$idjal]["columns"][$idcol]["nbjrs"]+=$issue->getWeight(); + $tbestim[$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight(); + $tbestim[$idjal]["sprints"][$idspr]["columns"][$idcol]["nbjrs"]+=$issue->getWeight(); } - - foreach($tbstat as $k1=>$milestone) { - $tmp=$tbstat[$k1]["stat"]; - ksort($tmp); - $tbstat[$k1]["stat"]=$tmp; - } - - foreach($tbstat as $k1=>$milestone) { - foreach($tbstat[$k1]["stat"] as $k2=>$statut) { - $keysort = array_column($tbstat[$k1]["stat"][$k2]["labels"], 'label'); - array_multisort($keysort, SORT_ASC, $tbstat[$k1]["stat"][$k2]["labels"]); - } - } - - + return $this->render($this->render.'stat.html.twig', [ 'useheader' => true, 'usesidebar' => false, 'usetitle' => $data->getName(), - 'giteaassignees' => $giteaassignees, - 'giteacolumns' => $giteacolumns, 'giteamilestones' => $giteamilestones, - 'giteateams' => $giteateams, - 'giteaprioritys' => $giteaprioritys, - 'giteatypes' => $giteatypes, - 'gitealabels' => $gitealabels, 'filtermilestones' => $filtermilestones, - 'filterteams' => $filterteams, 'showfilters' => $showfilters, $this->data => $data, - 'tbstat' => $tbstat, + 'tbestim' => $tbestim, ]); } @@ -345,6 +711,196 @@ class ScrumController extends AbstractController return new JsonResponse($output); } + + private function consolidateScrum($scrum,$giteamilestones,&$tbissues,&$tbestim) { + $em = $this->getDoctrine()->getManager(); + $issues=$scrum->getScrumissues(); + + $tbissues=[]; + $tbestim=[]; + + $tbcols=[]; + $tbjals=[]; + $tbsprs=[]; + + + $viewclosed = $this->get('session')->get("viewclosed"); + foreach($issues as $issue) { + // bypass closed + if($viewclosed=="false"&&$issue->getGiteastate()=="closed") continue; + + // Ids + $idcol=$issue->getScrumcolumn()->getId(); + $idjal=($issue->getGiteamilestone()?$issue->getGiteamilestone():-100); + $idspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getId():-100); + + // Roworders + $rowcol=$issue->getScrumcolumn()->getRowid(); + $rowjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():-100); + $rowspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getRowid():-100); + + // Names + $nmcol=$issue->getScrumcolumn()->getName(); + $nmjal=($issue->getGiteaMilestonename()?$issue->getGiteaMilestonename():"Aucun"); + $nmspr=($issue->getScrumsprint()?$issue->getScrumsprint()->getName():"Aucun"); + + // Idgiteas + $gicol=$issue->getScrumcolumn()->getGiteaid(); + $gijal=$issue->getGiteaMilestone(); + + // Liste des colonnes/jalons/sprint avec des issues + if(!in_array($idcol,$tbcols)) array_push($tbcols,$idcol); + if(!in_array($idcol."|".$idjal,$tbjals)) array_push($tbjals,$idcol."|".$idjal); + if(!in_array($idcol."|".$idjal."|".$idspr,$tbsprs)) array_push($tbsprs,$idcol."|".$idjal."|".$idspr); + + // Initialisation du tableau des estimations + if(!array_key_exists($idjal,$tbestim)) { + $tbestim[$idjal] = [ + "rowjal" => $rowjal, + "idjal" => $idjal, + "nmjal" => $nmjal, + "gijal" => $gijal, + "nbjrs" => 0, + "sprints" => [] + ]; + } + + if(!array_key_exists($idspr,$tbestim[$idjal]["sprints"])) { + $tbestim[$idjal]["sprints"][$idspr] = [ + "rowspr" => $rowspr, + "idspr" => $idspr, + "nmspr" => $nmspr, + "nbjrs" => 0, + ]; + } + + // Initialisation du tableau des colonnes + if(!array_key_exists($idcol,$tbissues)) { + $tbissues[$idcol]=[ + "rowcol" => $rowcol, + "idcol" => $idcol, + "nmcol" => $nmcol, + "gicol" => $gicol, + "nbjrs" => 0, + "jalons" => [], + ]; + } + + // Initialisation du tableau des jalons de la colonne encours + if(!array_key_exists($idjal,$tbissues[$idcol]["jalons"])) { + $tbissues[$idcol]["jalons"][$idjal] = [ + "rowjal" => $rowjal, + "idjal" => $idjal, + "nmjal" => $nmjal, + "gijal" => $gijal, + "nbjrs" => 0, + "sprints" => [], + ]; + } + + // Initialisation du tableau des sprint de la colonne/jalon encours + if(!array_key_exists($idspr,$tbissues[$idcol]["jalons"][$idjal]["sprints"])) { + $tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr] = [ + "rowspr" => $rowspr, + "idspr" => $idspr, + "nmspr" => $nmspr, + "nbjrs" => 0, + "issues" => [], + ]; + } + + // On cumule les estimations + $tbissues[$idcol]["nbjrs"]+=$issue->getWeight(); + $tbissues[$idcol]["jalons"][$idjal]["nbjrs"]+=$issue->getWeight(); + $tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight(); + $tbestim[$idjal]["nbjrs"]+=$issue->getWeight(); + $tbestim[$idjal]["sprints"][$idspr]["nbjrs"]+=$issue->getWeight(); + + // On sauvegarde l'issue + array_push($tbissues[$idcol]["jalons"][$idjal]["sprints"][$idspr]["issues"],$issue); + } + + // On ajoute les colonnes sans issues + $columns=$scrum->getScrumcolumns(); + foreach($columns as $column) { + if(!in_array($column->getId(),$tbcols)) { + $tbissues[$column->getId()] = [ + "rowcol" => $column->getRowid(), + "idcol" => $column->getId(), + "nmcol" => $column->getName(), + "gicol" => $column->getGiteaid(), + "nbjrs" => 0, + "jalons" => [], + ]; + } + + // On ajoute les jalons sans issues + foreach($giteamilestones as $milestone) { + if(!in_array($column->getId()."|".$milestone->id,$tbjals)) { + $tbissues[$column->getId()]["jalons"][$milestone->id] = [ + "rowjal" => $milestone->title, + "idjal" => $milestone->id, + "nmjal" => $milestone->title, + "gijal" => $milestone->id, + "nbjrs" => 0, + "sprints" => [], + ]; + } + } + + // On ajoute le jalon aucun si sans issue + if(!in_array($column->getId()."|-100",$tbjals)) { + $tbissues[$column->getId()]["jalons"][-100] = [ + "rowjal" => -100, + "idjal" => -100, + "nmjal" => "Aucun", + "gijal" => null, + "nbjrs" => 0, + "sprints" => [], + ]; + } + + // On ajoutes les sprints sans issues + foreach($tbissues[$column->getId()]["jalons"] as $jalon) { + $sprints=$em->getRepository("App:Scrumsprint")->findBy(["scrum"=>$scrum,"giteamilestone"=>$jalon["idjal"]]); + foreach($sprints as $sprint) { + if(!in_array($column->getId()."|".$jalon["idjal"]."|".$sprint->getId(),$tbsprs)) { + $tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][$sprint->getId()] = [ + "rowspr" => $sprint->getRowid(), + "idspr" => $sprint->getId(), + "nmspr" => $sprint->getName(), + "nbjrs" => 0, + "issues" => [], + ]; + } + } + + // On ajoute les sprint aucun sans issue + if(!in_array($column->getId()."|".$jalon["idjal"]."|-100",$tbsprs)) { + $tbissues[$column->getId()]["jalons"][$jalon["idjal"]]["sprints"][-100] = [ + "rowspr" => -100, + "idspr" => -100, + "nmspr" => "Aucun", + "nbjrs" => 0, + "issues" => [], + ]; + } + } + } + + // Tri des issues par colonne/jalon/sprint/issue + $rowcol = array_column($tbissues, 'rowcol'); + array_multisort($rowcol, SORT_ASC, $tbissues); + foreach($tbissues as $keycol=>$column) { + $rowjal = array_column($tbissues[$keycol]["jalons"], 'rowjal'); + array_multisort($rowjal, SORT_DESC, $tbissues[$keycol]["jalons"]); + foreach($tbissues[$keycol]["jalons"] as $keyjal=>$jalon) { + $rowspr = array_column($tbissues[$keycol]["jalons"][$keyjal]["sprints"], 'rowspr'); + array_multisort($rowspr, SORT_DESC, $tbissues[$keycol]["jalons"][$keyjal]["sprints"]); + } + } + } + protected function getErrorForm($id,$form,$request,$data,$mode) { if ($form->get('submit')->isClicked()&&$mode=="delete") { } diff --git a/src/Controller/ScrumissueController.php b/src/Controller/ScrumissueController.php index 54c97fe..e31fc76 100755 --- a/src/Controller/ScrumissueController.php +++ b/src/Controller/ScrumissueController.php @@ -31,8 +31,10 @@ class ScrumissueController extends AbstractController $newcolumn=$request->get('newcolumn'); $oldmilestone=$request->get('oldmilestone'); $newmilestone=$request->get('newmilestone'); + $oldsprint=$request->get('oldsprint'); + $newsprint=$request->get('newsprint'); - if($oldcolumn!=$newcolumn||$oldmilestone!=$newmilestone) { + if($oldcolumn!=$newcolumn||$oldmilestone!=$newmilestone||$oldsprint!=$newsprint) { // Rechercher l'issue en cours $scrumissue=$em->getRepository("App:Scrumissue")->find($id); if(!$scrumissue) return new JsonResponse(['message' => 'No Issue'], 403); @@ -68,16 +70,31 @@ class ScrumissueController extends AbstractController $return=$this->giteaservice->patchIssue($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber(),$patchs); if(!$return) return new JsonResponse(['message' => 'No API patchIssue'], 403); } + + // Mettre à jour le sprint + if($oldsprint!=$newsprint) { + $scrumissue->setScrumsprint(null); + $sprint=$em->getRepository("App:Scrumsprint")->find($newsprint); + if($sprint) { + $scrumissue->setScrumsprint($sprint); + } + $em->flush(); + } // Récupérer l'issue modifiée pour mettre à jour la date de modification gitea $giteaissue=$this->giteaservice->getIssue($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber()); if(!$giteaissue) return new JsonResponse(['message' => 'No API getIssue'], 403); - $updatedate=new \DateTime($giteaissue->updated_at); - if($updatedate > $scrumissue->getScrum()->getUpdatedate()) { - $scrumissue->getScrum()->setUpdatedate(new \DateTime($giteaissue->updated_at)); + $updateissue=new \DateTime($giteaissue->updated_at); + $updateissue->setTimezone(new \DateTimeZone("UTC")); + + $lastupdate=$scrumissue->getScrum()->getUpdatedate(); + + + if($updateissue > $lastupdate) { + $scrumissue->getScrum()->setUpdatedate($updateissue); $em->persist($scrumissue->getScrum()); $em->flush(); - return new JsonResponse($updatedate->format("Ymd H:i:s")); + return new JsonResponse($lastupdate->format("Ymd H:i:s")); } } return new JsonResponse(false); @@ -159,10 +176,10 @@ class ScrumissueController extends AbstractController $em = $this->getDoctrine()->getManager(); $id=$request->get('id'); - $lastupdate=new \DateTime($request->get('lastupdate')); - + $scrum=$em->getRepository("App:Scrum")->find($id); if(!$scrum) return new JsonResponse(['message' => 'No Scrum'], 403); + $lastupdate=$scrum->getUpdatedate(); $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); if(!is_array($giteaissues)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); @@ -174,12 +191,15 @@ class ScrumissueController extends AbstractController $scrumissue=$em->getRepository("App:Scrumissue")->findOneBy(["scrum"=>$scrum,"giteaid"=>$giteaissue->id]); - if(!$scrumissue) + if(!$scrumissue) { return new JsonResponse(true); + } $fgissueupdated=false; - $updatedate=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]); - if($updatedate>$lastupdate) { + $updateissue=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]); + $updateissue->setTimezone(new \DateTimeZone("UTC")); + + if($updateissue>$lastupdate) { $fgissueupdated=true; } diff --git a/src/Controller/ScrumsprintController.php b/src/Controller/ScrumsprintController.php new file mode 100755 index 0000000..7a4c63f --- /dev/null +++ b/src/Controller/ScrumsprintController.php @@ -0,0 +1,194 @@ +giteaservice = $giteaservice; } + + public function submit($scrumid, Request $request) + { + // Initialisation de l'enregistrement + $em = $this->getDoctrine()->getManager(); + $scrum=$em->getRepository("App:Scrum")->find($scrumid); + $data = new Entity(); + $data->setScrum($scrum); + + $last = $em->getRepository('App:Scrumsprint')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']); + if(!$last) $data->setRowid(0); + else $data->setRowid($last->getRowid()+1); + + // Récupérer les repos de gitea + $giteamilestones=$this->giteaservice->getmilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + if(!is_array($giteamilestones)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + + // Création du formulaire + $form = $this->createForm(Form::class,$data,array("mode"=>"submit","giteamilestones"=>$giteamilestones)); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null,$form,$request,$data,"submit"); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $getmilestone=$this->giteaservice->getmilestone($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$data->getGiteamilestone()); + $data->setGiteamilestonename($getmilestone->title); + + $em->persist($data); + $em->flush(); + + // Retour à la liste + return $this->render($this->render.'close.html.twig'); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => false, + 'usesidebar' => false, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView() + ]); + } + + public function update($id,Request $request) + { + // Initialisation de l'enregistrement + $em = $this->getDoctrine()->getManager(); + $data=$em->getRepository($this->entity)->find($id); + $scrum=$data->getScrum(); + + // Récupérer les repos de gitea + $giteamilestones=$this->giteaservice->getmilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + + // Création du formulaire + $form = $this->createForm(Form::class,$data,array("mode"=>"update","giteamilestones"=>$giteamilestones)); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null,$form,$request,$data,"update"); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $getmilestone=$this->giteaservice->getmilestone($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$data->getGiteamilestone()); + $data->setGiteamilestonename($getmilestone->title); + + $em->persist($data); + $em->flush(); + + // Retour à la liste + return $this->render($this->render.'close.html.twig'); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => false, + 'usesidebar' => false, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView() + ]); + } + + public function delete($id,Request $request) + { + // Initialisation de l'enregistrement + $em = $this->getDoctrine()->getManager(); + $data=$em->getRepository($this->entity)->find($id); + + // Controle avant suppression + $error=false; + if($id<0) $error=true; + + if($error) + return $this->redirectToRoute($this->route."_update",["id"=>$id]); + else { + $em->remove($data); + $em->flush(); + + // Retour à la liste + return $this->render($this->render.'close.html.twig'); + } + } + + public function select($scrumid, Request $request) + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(array('message' => 'Interdit'), 400); + } + + $em = $this->getDoctrine()->getManager(); + $scrum=$em->getRepository("App:Scrum")->find($scrumid); + + $scrumsprints = $scrum->getScrumsprints(); + $output=array(); + foreach($scrumsprints as $scrumsprint) { + array_push($output,array("id"=>$scrumsprint->getId(),"name"=>"".$scrumsprint->getName()."
liè au jalon gitea ".$scrumsprint->getGiteamilestonename()."")); + } + + $response = new Response(json_encode($output)); + $response->headers->set('Content-Type', 'application/json'); + return $response; + } + + public function order($scrumid, Request $request) + { + $em = $this->getDoctrine()->getManager(); + $scrumsprintids=explode(",",$request->get('lstordered')); + $i=1; + foreach($scrumsprintids as $id) { + $scrumsprint=$em->getRepository($this->entity)->find($id); + if($scrumsprint) { + $scrumsprint->setRowid($i); + $em->persist($scrumsprint); + $em->flush(); + } + $i++; + } + $response = new Response(); + $response->headers->set('Content-Type', 'application/json'); + return $response; + } + + protected function getErrorForm($id,$form,$request,$data,$mode) { + if ($form->get('submit')->isClicked()&&$mode=="delete") { + } + + if ($form->get('submit')->isClicked() && $mode=="submit") { + } + + if ($form->get('submit')->isClicked() && ($mode=="submit" || $mode=="update")) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach( $errors as $error ) { + $request->getSession()->getFlashBag()->add("error", $error->getMessage()); + } + } + } +} diff --git a/src/Entity/Scrum.php b/src/Entity/Scrum.php index 295c1a1..e5f1e7b 100644 --- a/src/Entity/Scrum.php +++ b/src/Entity/Scrum.php @@ -67,6 +67,12 @@ class Scrum */ private $scrumcolumns; + /** + * @ORM\OneToMany(targetEntity="Scrumsprint", mappedBy="scrum", cascade={"persist"}, orphanRemoval=true) + * @ORM\OrderBy({"rowid" = "ASC"}) + */ + private $scrumsprints; + /** * @ORM\OneToMany(targetEntity="Scrumissue", mappedBy="scrum", cascade={"persist"}, orphanRemoval=true) * @ORM\OrderBy({"giteamilestonename" = "DESC", "rowid" = "ASC"}) @@ -117,6 +123,7 @@ class Scrum $this->scrumteams = new ArrayCollection(); $this->scrumprioritys = new ArrayCollection(); $this->scrumtypes = new ArrayCollection(); + $this->scrumsprints = new ArrayCollection(); } public function getId(): ?int @@ -378,4 +385,35 @@ class Scrum return $this; } + + /** + * @return Collection|Scrumsprint[] + */ + public function getScrumsprints(): Collection + { + return $this->scrumsprints; + } + + public function addScrumsprint(Scrumsprint $scrumsprint): self + { + if (!$this->scrumsprints->contains($scrumsprint)) { + $this->scrumsprints[] = $scrumsprint; + $scrumsprint->setScrum($this); + } + + return $this; + } + + public function removeScrumsprint(Scrumsprint $scrumsprint): self + { + if ($this->scrumsprints->contains($scrumsprint)) { + $this->scrumsprints->removeElement($scrumsprint); + // set the owning side to null (unless already changed) + if ($scrumsprint->getScrum() === $this) { + $scrumsprint->setScrum(null); + } + } + + return $this; + } } \ No newline at end of file diff --git a/src/Entity/Scrumcolumn.php b/src/Entity/Scrumcolumn.php index 9a86bd5..b06d356 100644 --- a/src/Entity/Scrumcolumn.php +++ b/src/Entity/Scrumcolumn.php @@ -49,8 +49,8 @@ class Scrumcolumn private $scrum; /** - * @ORM\OneToMany(targetEntity="Scrumissue", mappedBy="scrumcolumn", cascade={"persist"}, orphanRemoval=true) - * @ORM\OrderBy({"giteamilestonename" = "DESC", "rowid" = "ASC"}) + * @ORM\OneToMany(targetEntity="Scrumissue", mappedBy="scrumcolumn", cascade={"persist"}, orphanRemoval=false) + * @ORM\OrderBy({"giteamilestonename" = "DESC", "scrumsprint" = "DESC", "rowid" = "ASC"}) */ private $scrumissues; diff --git a/src/Entity/Scrumissue.php b/src/Entity/Scrumissue.php index 401f24b..0abea4f 100644 --- a/src/Entity/Scrumissue.php +++ b/src/Entity/Scrumissue.php @@ -75,9 +75,16 @@ class Scrumissue /** * @ORM\ManyToOne(targetEntity="Scrumcolumn", inversedBy="Scrumissues") + * @ORM\JoinColumn(nullable=true, onDelete="SET NULL") */ private $scrumcolumn; + /** + * @ORM\ManyToOne(targetEntity="Scrumsprint", inversedBy="Scrumissues") + * @ORM\JoinColumn(nullable=true, onDelete="SET NULL") + */ + private $scrumsprint; + public function getId(): ?int { return $this->id; @@ -215,6 +222,18 @@ class Scrumissue return $this; } + public function getScrumsprint(): ?Scrumsprint + { + return $this->scrumsprint; + } + + public function setScrumsprint(?Scrumsprint $scrumsprint): self + { + $this->scrumsprint = $scrumsprint; + + return $this; + } + } \ No newline at end of file diff --git a/src/Entity/Scrumsprint.php b/src/Entity/Scrumsprint.php new file mode 100644 index 0000000..b280875 --- /dev/null +++ b/src/Entity/Scrumsprint.php @@ -0,0 +1,159 @@ +scrumissues = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getRowid(): ?int + { + return $this->rowid; + } + + public function setRowid(int $rowid): self + { + $this->rowid = $rowid; + + return $this; + } + + public function getGiteamilestone(): ?int + { + return $this->giteamilestone; + } + + public function setGiteamilestone(?int $giteamilestone): self + { + $this->giteamilestone = $giteamilestone; + + return $this; + } + + public function getGiteamilestonename(): ?string + { + return $this->giteamilestonename; + } + + public function setGiteamilestonename(?string $giteamilestonename): self + { + $this->giteamilestonename = $giteamilestonename; + + return $this; + } + + public function getScrum(): ?Scrum + { + return $this->scrum; + } + + public function setScrum(?Scrum $scrum): self + { + $this->scrum = $scrum; + + return $this; + } + + /** + * @return Collection|Scrumissue[] + */ + public function getScrumissues(): Collection + { + return $this->scrumissues; + } + + public function addScrumissue(Scrumissue $scrumissue): self + { + if (!$this->scrumissues->contains($scrumissue)) { + $this->scrumissues[] = $scrumissue; + $scrumissue->setScrumsprint($this); + } + + return $this; + } + + public function removeScrumissue(Scrumissue $scrumissue): self + { + if ($this->scrumissues->contains($scrumissue)) { + $this->scrumissues->removeElement($scrumissue); + // set the owning side to null (unless already changed) + if ($scrumissue->getScrumsprint() === $this) { + $scrumissue->setScrumsprint(null); + } + } + + return $this; + } + + +} \ No newline at end of file diff --git a/src/Form/ScrumsprintType.php b/src/Form/ScrumsprintType.php new file mode 100644 index 0000000..651553c --- /dev/null +++ b/src/Form/ScrumsprintType.php @@ -0,0 +1,58 @@ +add('submit', + SubmitType::class, [ + "label" => "Valider", + "attr" => ["class" => "btn btn-success no-print"], + ] + ); + + $builder->add('name', + TextType::class, [ + "label" =>"Nom", + ] + ); + + $choices=[]; + foreach($options["giteamilestones"] as $milestone) { + $choices[$milestone->title]=$milestone->id; + } + + $builder->add('giteamilestone', + ChoiceType::class, [ + "label" => "Jalon Gitea", + "choices" => $choices, + "disabled" => ($options["mode"]=="submit"?false:true), + "placeholder" => "Selectionnez un label gitea", + ] + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'App\Entity\Scrumsprint', + 'mode' => 'string', + 'giteamilestones' => 'string', + )); + } +} diff --git a/src/Repository/ScrumRepository.php b/src/Repository/ScrumRepository.php index ef3d960..d0e8869 100644 --- a/src/Repository/ScrumRepository.php +++ b/src/Repository/ScrumRepository.php @@ -39,6 +39,60 @@ class ScrumRepository extends ServiceEntityRepository public function getGitea($scrum,&$giteaassignees,&$giteacolumns,&$giteamilestones,&$giteateams,&$giteaprioritys,&$giteatypes,&$gitealabels, $forcereload=false) { $viewclosed = $this->session->get("viewclosed"); + // Récupérer les labels de gitea + $gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + + // S'assurer que nos colonnes existes toujours + $scrumcolumns=$scrum->getScrumcolumns(); + foreach($scrumcolumns as $scrumcolumn) { + $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumcolumn->getGiteaid()); + if(!$gitealabel) { + $this->_em->remove($scrumcolumn); + $this->_em->flush(); + } + } + + // S'assurer que nos teams existes toujours + $scrumteams=$scrum->getScrumteams(); + foreach($scrumteams as $scrumteam) { + $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumteam->getGiteaid()); + if(!$gitealabel) { + $this->_em->remove($scrumteam); + $this->_em->flush(); + } + } + + // S'assurer que nos prioritys existes toujours + $scrumprioritys=$scrum->getScrumprioritys(); + foreach($scrumprioritys as $scrumpriority) { + $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumpriority->getGiteaid()); + if(!$gitealabel) { + $this->_em->remove($scrumpriority); + $this->_em->flush(); + } + } + + // S'assurer que nos types existes toujours + $scrumtypes=$scrum->getScrumtypes(); + foreach($scrumtypes as $scrumtype) { + $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumtype->getGiteaid()); + if(!$gitealabel) { + $this->_em->remove($scrumtype); + $this->_em->flush(); + } + } + + // S'assurer que nos sprint sont toujours lié à un jalon existant + $scrumsprints=$scrum->getScrumsprints(); + foreach($scrumsprints as $scrumsprint) { + $giteamilestone=$this->giteaservice->getMilestone($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumsprint->getGiteamilestone()); + if(!$giteamilestone) { + $this->_em->remove($scrumsprint); + $this->_em->flush(); + } + } + // Récupérer le dernier order $last = $this->_em->getRepository('App:Scrumissue')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']); if(!$last) $lastrowid=-1; @@ -110,7 +164,7 @@ class ScrumRepository extends ServiceEntityRepository // Récupérer les labels de gitea $gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); - if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + // Formatter les labels non colomn/team/priority/type foreach($gitealabels as $key => $gitealabel) { if(in_array($gitealabel->id,$giteacolumns)||in_array($gitealabel->id,$giteateams)||in_array($gitealabel->id,$giteaprioritys)||in_array($gitealabel->id,$giteatypes)) unset($gitealabels[$key]); @@ -126,10 +180,6 @@ class ScrumRepository extends ServiceEntityRepository $this->datescrumupdate=new \DateTime(); foreach($giteaissues as $giteaissue) { - // On ne prend pas les pull request - if(!is_null($giteaissue->pull_request)) { - continue; - } $scrumissue=$this->_em->getRepository("App:Scrumissue")->findOneBy(["scrum"=>$scrum,"giteaid"=>$giteaissue->id]); @@ -139,42 +189,51 @@ class ScrumRepository extends ServiceEntityRepository $scrumissue->setScrum($scrum); $scrumissue->setRowid($lastrowid); $scrumissue->setGiteaid($giteaissue->id); + $this->majissue($scrumissue,$giteaissue,true); } + else { + $fgissueupdated=false; + if($scrumissue->getGiteajson()["updated_at"]!=json_decode(json_encode($giteaissue), true)["updated_at"]) + $fgissueupdated=true; + if($scrumissue->getGiteajson()["closed_at"]!=json_decode(json_encode($giteaissue), true)["closed_at"]) + $fgissueupdated=true; + if($giteaissue->milestone&&$scrumissue->getGiteamilestonename()!=$giteaissue->milestone->title) + $fgissueupdated=true; + if(!$giteaissue->milestone&&!is_null($scrumissue->getGiteamilestone())) + $fgissueupdated=true; - $fgissueupdated=false; - if($scrumissue->getGiteajson()["updated_at"]!=json_decode(json_encode($giteaissue), true)["updated_at"]) - $fgissueupdated=true; - if($scrumissue->getGiteajson()["closed_at"]!=json_decode(json_encode($giteaissue), true)["closed_at"]) - $fgissueupdated=true; - if($giteaissue->milestone&&$scrumissue->getGiteamilestonename()!=$giteaissue->milestone->title) - $fgissueupdated=true; - if(!$giteaissue->milestone&&!is_null($scrumissue->getGiteamilestone())) - $fgissueupdated=true; + if($forcereload) { + $fgissueupdated=true; + } - if($forcereload) { - $fgissueupdated=true; - } - - if($fgissueupdated) { - $fgscrumupdate=true; - $this->majissue($scrumissue,$giteaissue); + if($fgissueupdated) { + $fgscrumupdate=true; + $this->majissue($scrumissue,$giteaissue,false); + } } array_push($tbgiteaissues,$giteaissue->number); } - // Bug faudrait placer à closed l'ensemble des issues vu comme open mais qui ne le sont plus + // Placer à closed l'ensemble des issues vu comme open mais qui ne le sont plus if($viewclosed=="false") { $scrumissues=$scrum->getScrumissues(); foreach($scrumissues as $scrumissue) { if($scrumissue->getGiteastate()=="open"&&!in_array($scrumissue->getGiteanumber(),$tbgiteaissues)) { $giteaissue=$this->giteaservice->getIssue($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumissue->getGiteanumber()); $fgscrumupdate=true; - $this->majissue($scrumissue,$giteaissue); + + // S'il ne trouve pas d'issue c'est qu'elle n'existe plus + if(!$giteaissue) { + // Faudrait supprimer mais pour l'instant pas touche + //dump("netrouvepasissue alors"); + //dump($scrumissue->getGiteanumber()); + } + // Sinon mise + else $this->majissue($scrumissue,$giteaissue,false); } } } - if($fgscrumupdate) { $scrum->setUpdatedate($this->datescrumupdate); $this->_em->persist($scrum); @@ -182,13 +241,11 @@ class ScrumRepository extends ServiceEntityRepository } } - function majissue($scrumissue,$giteaissue) { - if($scrumissue->getGiteajson()["updated_at"]>$this->datescrumupdate) - $this->datescrumupdate=$scrumissue->getGiteajson()["updated_at"]; - + function majissue($scrumissue,$giteaissue,$issubmit) { $scrumissue->setGiteanumber($giteaissue->number); $scrumissue->setGiteastate($giteaissue->state); $scrumissue->setGiteatitle($giteaissue->title); + if($giteaissue->milestone) { $scrumissue->setGiteamilestone($giteaissue->milestone->id); $scrumissue->setGiteamilestonename($giteaissue->milestone->title); diff --git a/src/Service/giteaService.php b/src/Service/giteaService.php index 8072cd3..91c4944 100644 --- a/src/Service/giteaService.php +++ b/src/Service/giteaService.php @@ -202,8 +202,15 @@ class giteaService else return $response->body; } + public function getmilestone($owner,$name,$id) { + $apiurl = $this->url."/repos/$owner/$name/milestones/".$id; + $response=$this->api("GET",$apiurl,null,$this->session->get("giteatoken")); + if(!$response||$response->code!="200") return false; + else return $response->body; + } + public function getissues($owner,$name,$state="?state=open") { - $apiurl = $this->url."/repos/$owner/$name/issues".$state; + $apiurl = $this->url."/repos/$owner/$name/issues".$state."&type=issues"; $page=1; $limit=20; diff --git a/templates/Scrum/edit.html.twig b/templates/Scrum/edit.html.twig index 24ad434..c9cc02d 100755 --- a/templates/Scrum/edit.html.twig +++ b/templates/Scrum/edit.html.twig @@ -45,7 +45,7 @@
-
+
Informations
@@ -57,6 +57,21 @@ {{ form_row(form.users) }}
+ + {% if mode=="update" %} +
+
+ Sprints + +
+ +
+
    + +
+
+
+ {% endif %}
{% if mode=="update" %} @@ -185,6 +200,23 @@
+ + {% endblock %} {% block localjavascript %} @@ -196,6 +228,7 @@ loadscrumteams(); loadscrumprioritys(); loadscrumtypes(); + loadscrumsprints(); {%endif%} }); @@ -375,7 +408,67 @@ }, }); } - + + $("#addsprint").click(function() { + ModalLoad('mymodalsprint','Ajouter un sprint','{{path('app_scrumsprint_submit',{scrumid:scrum.id})}}'); + }); + + $('#scrumsprints').on('click', '.modsprint', function(event) { + url="{{path('app_scrumsprint_update',{id:'xxx'})}}"; + url=url.replace("xxx",$(this).data("id")); + ModalLoad('mymodalsprint','Modifier un sprint',url); + }); + + $('#mymodalsprint').on('hidden.bs.modal', function () { + loadscrumsprints(); + }); + + function loadscrumsprints() { + $("#scrumsprints").empty(); + $.ajax({ + method: "POST", + url: "{{path("app_scrumsprint_select",{scrumid:scrum.id})}}", + success: function(datas, dataType) + { + jQuery.each(datas, function(i, wid) { + html ='
  • '; + html+='
    '; + html+='
    '; + html+='
    '; + html+=wid.name; + html+='
    '; + html+='
    '; + html+=''; + html+='
  • '; + $("#scrumsprints").append(html); + + }); + + $( "#scrumsprints" ).sortable({ + axis: "y", + handle: ".fa-arrows-alt-v", + update: function( event, ui ) { + lstordered=""; + $( "#scrumsprints li" ).each(function( index ) { + if(index==0) lstordered=$(this).data("id"); + else lstordered=lstordered+","+$(this).data("id"); + }); + $.ajax({ + method: "POST", + url: "{{path("app_scrumsprint_order",{scrumid:scrum.id})}}", + data: { + lstordered:lstordered + } + }); + } + }); + }, + }); + } + + + + $("#addtype").click(function() { ModalLoad('mymodaltype','Ajouter une colonne','{{path('app_scrumtype_submit',{scrumid:scrum.id})}}'); }); diff --git a/templates/Scrum/list.html.twig b/templates/Scrum/list.html.twig index 7f4718e..eca8cc4 100644 --- a/templates/Scrum/list.html.twig +++ b/templates/Scrum/list.html.twig @@ -5,10 +5,9 @@ {% block body %}
    -
    {% if app.user and is_granted('ROLE_MASTER') %} - Ajouter un Scrum + Ajouter un Scrum {% endif %}
    @@ -47,7 +46,7 @@ - + {% if is_granted('ROLE_ADMIN') or is_granted('ROLE_MODO') or is_granted('ROLE_MASTER') %} diff --git a/templates/Scrum/stat.html.twig b/templates/Scrum/stat.html.twig index 4fcf533..3903523 100644 --- a/templates/Scrum/stat.html.twig +++ b/templates/Scrum/stat.html.twig @@ -18,7 +18,7 @@ .flot-chart-subcontent { height: 200px; - width: 40%; + width: 350px; } {% endblock %} @@ -35,54 +35,61 @@ {% endfor %} -
    - -
    - - -
    +
    - +

    {{ scrum.name }}

    - {% for milestone in tbstat %} -
    -

    {{milestone.name}}

    -
    -
    -
    - -
    - {% for column in milestone.stat %} -
    -
    {{ column.label }} = {{ column.total }}
    - -
    - {% for label in column.labels %} -
  • {{label.label}} = {{label.total}}
  • - {% endfor %} -
    -
    + + {% for jalon in tbestim %} + {% if jalon.nbjrs>0 %} +
    +
    {{jalon.nmjal}}
    +
    +
    +
    +
    +
    + {% for column in jalon.columns %} +
    {{column.nmcol}}{{column.nbjrs}}
    + {% endfor %} +
    TOTAL{{jalon.nbjrs}}
    +
    - {%endfor%} +
    + {% for sprint in jalon.sprints %} + {% if jalon.nbjrs != sprint.nbjrs and sprint.nbjrs>0 %} +
    +
    {{sprint.nmspr}}
    +
    +
    +
    + {% for column in sprint.columns %} +
    {{column.nmcol}}{{column.nbjrs}}
    + {% endfor %} +
    TOTAL{{sprint.nbjrs}}
    +
    +
    +
    + + {% endif %} + {% endfor %} +
    +
    -
    -
    -
    - {% endfor %} +
    + + {% endif %} + {% endfor %}
    @@ -134,15 +141,6 @@ }); } - if($("#filterteams").val().length!==0) { - data = $("#filterteams").select2('data'); - textfilters=textfilters+"    EQUIPES ="; - $.each($("#filterteams").val(), function( index, value ) { - if(index>0)textfilters=textfilters+" &"; - textfilters=textfilters+" "+data[index].text; - }); - } - $("#textfilters").html(textfilters); } @@ -173,48 +171,20 @@ }); $('#filtermilestones').on("select2:unselect", function(e) { filtermilestones(); - }); + }); - // Filter Teams - function filterteams() { - $.ajax({ - method: "POST", - url: "{{ path('app_user_preference') }}", - data: { - key:'filterteams', - id:{{scrum.id}}, - value: $("#filterteams").val() - } - }); - - location.reload(); - } - $('#filterteams').select2(); - {% if filterteams %} - {% for team in filterteams %} - $("#filterteams").val($("#filterteams").val().concat("{{team}}")); - {%endfor%} - $('#filterteams').trigger('change'); - {% endif %} - $('#filterteams').on("select2:select", function(e) { - filterteams(); - }); - $('#filterteams').on("select2:unselect", function(e) { - filterteams(); - }); - - {% for milestone in tbstat %} + {% for jalon in tbestim %} var data = [ - {% for data in milestone.stat %} + {% for column in jalon.columns %} { - label: "{{ data.label}}", - data: {{ data.total }}, - color: "{{ data.color }}", + label: "{{ column.nmcol}}", + data: {{ column.nbjrs }}, + color: "#{{ column.color }}", }, {% endfor %} ]; - var plotObj = $.plot($("#floatdonut{{ milestone.id }}"), data, { + var plotObj = $.plot($("#floatdonut{{ jalon.idjal }}"), data, { series: { pie: { show: true, @@ -238,39 +208,42 @@ }, }); - {% for data in milestone.stat %} - {% for data in milestone.stat %} - var data = [ - {% for label in data.labels %} - { - label: "{{ label.label}}", - data: {{ label.total }}, - color: "{{ label.color }}", - }, - {% endfor %} - ]; - var plotObj = $.plot($("#floatsubdonut{{ milestone.id }}-{{ data.id }}"), data, { - series: { - pie: { - show: true, - label: { - show: false, - radius: 3/4, - threshold: 0.1, - background: { - opacity: 0.5, - color: '#cdcdcd', - }, - } - } - }, - legend: { - show: false, - }, - }); + {% for sprint in jalon.sprints %} + var data = [ + {% for column in sprint.columns %} + { + label: "{{ column.nmcol}}", + data: {{ column.nbjrs }}, + color: "#{{ column.color }}", + }, {% endfor %} + ]; + + var plotObj = $.plot($("#floatdonut{{ jalon.idjal~"-"~sprint.idspr }}"), data, { + series: { + pie: { + show: true, + radius: 1, + label: { + show: true, + radius: 1, + threshold: 0.1, + background: { + opacity: 0.5, + color: '#cdcdcd', + }, + formatter: function(label, series) { + return '' + label + ''; + } + } + } + }, + legend: { + show: false, + }, + }); {% endfor %} - {% endfor %} + {% endfor %} {% if not showfilters %} $("#filters").addClass("d-none"); diff --git a/templates/Issue/list.html.twig b/templates/Scrum/table.html.twig similarity index 89% rename from templates/Issue/list.html.twig rename to templates/Scrum/table.html.twig index 6b9d81f..2547fba 100644 --- a/templates/Issue/list.html.twig +++ b/templates/Scrum/table.html.twig @@ -37,26 +37,6 @@
    - {% if id == 0 %} -
    - - -
    - -
    - - -
    - {% endif %} -
    +
    + + +
    +
    +
    + + +
    +