From 3fe78d7e7ce2f2bcd0a4852198b295dc5810ff2f Mon Sep 17 00:00:00 2001 From: afornerot Date: Sat, 22 Jan 2022 11:18:42 +0100 Subject: [PATCH] svg --- src/ninegitea-1.0/config/packages/twig.yaml | 1 + src/ninegitea-1.0/config/routes.yaml | 15 +- .../src/Controller/IssueController.php | 116 +++++ .../src/Controller/ScrumController.php | 201 ++------- .../src/Controller/ScrumcolumnController.php | 1 + .../src/Controller/ScrumissueController.php | 112 +++-- src/ninegitea-1.0/src/Entity/Scrum.php | 40 +- src/ninegitea-1.0/src/Form/ScrumType.php | 6 + .../src/Repository/ScrumRepository.php | 149 ++++++- .../src/Service/giteaService.php | 7 + .../templates/Issue/list.html.twig | 421 ++++++++++++++++++ .../templates/Scrum/edit.html.twig | 2 + .../templates/Scrum/list.html.twig | 187 ++++++-- .../templates/Scrum/view.html.twig | 34 +- src/ninegitea-1.0/templates/base.html.twig | 4 +- 15 files changed, 1058 insertions(+), 238 deletions(-) create mode 100755 src/ninegitea-1.0/src/Controller/IssueController.php create mode 100644 src/ninegitea-1.0/templates/Issue/list.html.twig diff --git a/src/ninegitea-1.0/config/packages/twig.yaml b/src/ninegitea-1.0/config/packages/twig.yaml index bff4ae8..b68321c 100644 --- a/src/ninegitea-1.0/config/packages/twig.yaml +++ b/src/ninegitea-1.0/config/packages/twig.yaml @@ -13,6 +13,7 @@ twig: appCron: '%appCron%' wssuse: '%wssuse%' wssurl: '%wssurl%' + giteaUrl: '%giteaUrl%' diff --git a/src/ninegitea-1.0/config/routes.yaml b/src/ninegitea-1.0/config/routes.yaml index ddc4c8f..985eda1 100644 --- a/src/ninegitea-1.0/config/routes.yaml +++ b/src/ninegitea-1.0/config/routes.yaml @@ -207,7 +207,7 @@ app_scrumcolumn_order: path: /master/scrumcolumn/order/{scrumid} defaults: { _controller: App\Controller\ScrumcolumnController:order } -#== Scrumoissue ======================================================================================================== +#== Scrumissue ======================================================================================================== app_scrumissue_change: path: /user/scrumissue/change defaults: { _controller: App\Controller\ScrumissueController:change } @@ -215,3 +215,16 @@ app_scrumissue_change: app_scrumissue_order: path: /user/scrumissue/order defaults: { _controller: App\Controller\ScrumissueController:order } + +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/src/ninegitea-1.0/src/Controller/IssueController.php b/src/ninegitea-1.0/src/Controller/IssueController.php new file mode 100755 index 0000000..8b8308d --- /dev/null +++ b/src/ninegitea-1.0/src/Controller/IssueController.php @@ -0,0 +1,116 @@ +giteaservice = $giteaservice; } + + public function list($id, Request $request) + { + $em = $this->getDoctrine()->getManager(); + + // 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=[]; + $gitealabels=[]; + $giteaassignees=$em->getRepository("App:User")->findBy([],["username"=>"ASC"]); + + 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"]); + 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"]); + $json=$scrum->getGiteajson(); + $json["issues"]=$giteaissues; + $json["category"]=$scrum->getCategory(); + + $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($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($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); + $filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id); + $filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id); + + return $this->render($this->render.'list.html.twig',[ + "useheader" => true, + "usesidebar" => false, + "id" => $id, + "giteacategorys" => $giteacategorys, + "gitearepos" => $gitearepos, + "giteamilestones" => $giteamilestones, + "giteacolumns" => $giteacolumns, + "gitealabels" => $gitealabels, + "giteaassignees" => $giteaassignees, + "filtercategorys" => $filtercategorys, + "filterrepos" => $filterrepos, + "filtermilestones" => $filtermilestones, + "filtercolumns" => $filtercolumns, + "filterlabels" => $filterlabels, + "filterassignees" => $filterassignees, + ]); + } + +} diff --git a/src/ninegitea-1.0/src/Controller/ScrumController.php b/src/ninegitea-1.0/src/Controller/ScrumController.php index 6cbed3e..7e13633 100755 --- a/src/ninegitea-1.0/src/Controller/ScrumController.php +++ b/src/ninegitea-1.0/src/Controller/ScrumController.php @@ -13,31 +13,6 @@ use App\Form\ScrumType as Form; use App\Service\giteaService; -class ExecutionTime -{ - private $startTime; - private $endTime; - - public function start(){ - $this->startTime = getrusage(); - } - - public function end(){ - $this->endTime = getrusage(); - } - - private function runTime($ru, $rus, $index) { - return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000)) - - ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000)); - } - - public function __toString(){ - return "This process used " . $this->runTime($this->endTime, $this->startTime, "utime") . - " ms for its computations\nIt spent " . $this->runTime($this->endTime, $this->startTime, "stime") . - " ms in system calls\n"; - } - } - class ScrumController extends AbstractController { private $data = "scrum"; @@ -50,18 +25,40 @@ class ScrumController extends AbstractController public function list(Request $request) { $em = $this->getDoctrine()->getManager(); - $datas = $em->getRepository($this->entity)->findAll(); - /* - foreach($datas as $data) { - dump($data->getGiteajson()["name"]); - dump($this->giteaservice->getRepoNotifications($data->getGiteajson()["owner"]["login"],$data->getGiteajson()["name"])); + $scrums = $em->getRepository($this->entity)->findBy([],["name"=>"ASC"]); + + $giteacategorys=[]; + $gitearepos=[]; + + 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(); + } + + array_push($gitearepos,$gitearepo); } - */ + sort($giteacategorys); + + $filtercategorys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercategorys",0); + $filterrepos = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterrepos",0); return $this->render($this->render.'list.html.twig',[ - $this->data."s" => $datas, - "useheader" => true, - "usesidebar" => false, + $this->data."s" => $scrums, + "giteacategorys" => $giteacategorys, + "gitearepos" => $gitearepos, + "filtercategorys" => $filtercategorys, + "filterrepos" => $filterrepos, + "useheader" => true, + "usesidebar" => false, ]); } @@ -174,144 +171,18 @@ class ScrumController extends AbstractController public function view($id,Request $request) { - $executionTime = new ExecutionTime(); - $executionTime->start(); - // Initialisation de l'enregistrement $em = $this->getDoctrine()->getManager(); $data=$em->getRepository($this->entity)->find($id); if(!$data) return $this->redirectToRoute($this->route); - - // Récupérer le dernier order - $last = $em->getRepository('App:Scrumissue')->findOneBy(["scrum"=>$data], ['rowid' => 'DESC']); - if(!$last) $lastrowid=-1; - else $lastrowid=$last->getRowid(); - - // Récupérer la premier column scrum - $firstcolumn=$em->getRepository('App:Scrumcolumn')->findOneBy(["scrum"=>$data], ['rowid' => 'ASC']); - if(!$firstcolumn) return $this->redirectToRoute($this->route."_update",["id"=>$data->getId()]); - - // Récupérer la premier column scrum - $columns=$em->getRepository('App:Scrumcolumn')->findBy(["scrum"=>$data], ['rowid' => 'ASC']); - $giteacolumns=[]; - foreach($columns as $column) { - array_push($giteacolumns,$column->getGiteaid()); - } - - // Récupérer la orga de gitea - if(!empty($data->getGiteajson()["owner"]["email"])) - $giteaassignees=[$data->getGiteajson()["owner"]]; - else - $giteaassignees=[]; - - $giteateams=$this->giteaservice->getOrgateams($data->getGiteajson()["owner"]["login"]); - if($giteateams&&is_array($giteateams)) { - foreach($giteateams as $team) { - $giteamembers=$this->giteaservice->getTeammembers($team->id); - if($giteamembers&&is_array($giteamembers)) { - foreach($giteamembers as $giteamember) { - if(!in_array($giteamember,$giteaassignees)) - array_push($giteaassignees,$giteamember); - } - } - } - } - $giteacollaborators=$this->giteaservice->getCollaborators($data->getGiteajson()["owner"]["login"],$data->getGiteajson()["name"]); - if(!is_array($giteacollaborators)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); - foreach($giteacollaborators as $giteacollaborator) { - if(!in_array($giteacollaborator,$giteaassignees)) - array_push($giteaassignees,$giteacollaborator); - } - - // Récupérer les milestones de gitea - $giteamilestones=$this->giteaservice->getMilestones($data->getGiteajson()["owner"]["login"],$data->getGiteajson()["name"]); - if(!is_array($giteamilestones)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); - $keysort = array_column($giteamilestones, 'title'); - array_multisort($keysort, SORT_DESC, $giteamilestones); - // Récupérer les labels de gitea - $gitealabels=$this->giteaservice->getLabels($data->getGiteajson()["owner"]["login"],$data->getGiteajson()["name"]); - if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); - foreach($gitealabels as $key => $gitealabel) { - if(in_array($gitealabel->id,$giteacolumns)) - unset($gitealabels[$key]); - } - - // Récupérer les issues de gitea - - $giteaissues=$this->giteaservice->getIssues($data->getGiteajson()["owner"]["login"],$data->getGiteajson()["name"]); - if(!is_array($giteaissues)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); - - // Génération des issues - $tbgiteaissues=[]; - foreach($giteaissues as $giteaissue) { - // On ne prend pas les pull request - if(!is_null($giteaissue->pull_request)) { - continue; - } - - $scrumissue=$em->getRepository("App:Scrumissue")->findOneBy(["scrum"=>$data,"giteaid"=>$giteaissue->id]); - - if(!$scrumissue) { - $lastrowid++; - $scrumissue=new Scrumissue(); - $scrumissue->setScrum($data); - $scrumissue->setRowid($lastrowid); - $scrumissue->setGiteaid($giteaissue->id); - } - - if($scrumissue->getGiteajson()["updated_at"]!=json_decode(json_encode($giteaissue), true)["updated_at"]) { - $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); - } - else { - $scrumissue->setGiteamilestone(null); - $scrumissue->setGiteamilestonename(null); - } - $scrumissue->setGiteajson(json_decode(json_encode($giteaissue), true)); - - $em->persist($scrumissue); - $em->flush(); - - $havecolumn=false; - foreach($giteaissue->labels as $gitealabel) { - $scrumcolumn=$em->getRepository('App:Scrumcolumn')->findOneBy(["giteaid"=>$gitealabel->id]); - if($scrumcolumn) { - $havecolumn=true; - $scrumissue->setScrumcolumn($scrumcolumn); - break; - } - } - if(!$havecolumn) $scrumissue->setScrumcolumn($firstcolumn); - - // Sauvegarde de l'issue - $em->persist($scrumissue); - $em->flush(); - } - array_push($tbgiteaissues,$giteaissue->number); - } - - $scrumissues=$data->getScrumissues(); - foreach($scrumissues as $scrumissue) { - if(!in_array($scrumissue->getGiteanumber(),$tbgiteaissues)) { - $em->remove($scrumissue); - $em->flush(); - } - } - + $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$gitealabels); // Préférences utilisateur $filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id); $filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id); $filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id); - - $executionTime->end(); - //dump($executionTime->__toString()); - + return $this->render($this->render.'view.html.twig', [ 'useheader' => true, 'usesidebar' => false, @@ -335,12 +206,6 @@ class ScrumController extends AbstractController } if ($form->get('submit')->isClicked() && ($mode=="submit" || $mode=="update")) { - // On s'assure que le label ne contient pas des caractères speciaux - $string = preg_replace('~[^ éèêôöàïî\'@a-zA-Z0-9._-]~', '', $data->getName()); - if($string!=$data->getName()) - { - $form->addError(new FormError('Caractères interdit dans ce label')); - } } if ($form->get('submit')->isClicked() && !$form->isValid()) { diff --git a/src/ninegitea-1.0/src/Controller/ScrumcolumnController.php b/src/ninegitea-1.0/src/Controller/ScrumcolumnController.php index 3591c6a..7197ecd 100755 --- a/src/ninegitea-1.0/src/Controller/ScrumcolumnController.php +++ b/src/ninegitea-1.0/src/Controller/ScrumcolumnController.php @@ -35,6 +35,7 @@ class ScrumcolumnController extends AbstractController // Récupérer les repos 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"); // Création du formulaire $form = $this->createForm(Form::class,$data,array("mode"=>"submit","gitealabels"=>$gitealabels)); diff --git a/src/ninegitea-1.0/src/Controller/ScrumissueController.php b/src/ninegitea-1.0/src/Controller/ScrumissueController.php index 0089d57..3c30ed1 100755 --- a/src/ninegitea-1.0/src/Controller/ScrumissueController.php +++ b/src/ninegitea-1.0/src/Controller/ScrumissueController.php @@ -32,39 +32,55 @@ class ScrumissueController extends AbstractController $oldmilestone=$request->get('oldmilestone'); $newmilestone=$request->get('newmilestone'); - // Rechercher l'issue en cours - $scrumissue=$em->getRepository("App:Scrumissue")->find($id); - if(!$scrumissue) return new JsonResponse(['message' => 'No Issue'], 403); + if($oldcolumn!=$newcolumn||$oldmilestone!=$newmilestone) { + // Rechercher l'issue en cours + $scrumissue=$em->getRepository("App:Scrumissue")->find($id); + if(!$scrumissue) return new JsonResponse(['message' => 'No Issue'], 403); - // Récupérer la liste des labels de l'issue - $gitealabels=$this->giteaservice->getIssuelabels($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber()); - if(!is_array($gitealabels)) return new JsonResponse(['message' => 'No API getIssuelabels'], 403); + // Récupérer la liste des labels de l'issue + $gitealabels=$this->giteaservice->getIssuelabels($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber()); + if(!is_array($gitealabels)) return new JsonResponse(['message' => 'No API getIssuelabels'], 403); - // Remplacer l'ancien column par la nouvelle - $newgitelabels=[]; - $haveold=false; - foreach($gitealabels as $gitealabel) { - if($gitealabel->id!=$oldcolumn) array_push($newgitelabels,$gitealabel->id); - else $haveold=true; + // Remplacer l'ancien column par la nouvelle + if($oldcolumn!=$newcolumn) { + $newgitelabels=[]; + $haveold=false; + foreach($gitealabels as $gitealabel) { + if($gitealabel->id!=$oldcolumn) array_push($newgitelabels,$gitealabel->id); + else $haveold=true; + } + if(!in_array($newcolumn,$newgitelabels)) array_push($newgitelabels,intval($newcolumn)); + + // Supprimer l'ancien label + if($haveold) { + $return=$this->giteaservice->deleteIssuelabel($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber(),$oldcolumn); + if(!$return) return new JsonResponse(['message' => 'No API deleteIssuelabel'], 403); + } + + // Mettre à jour les labels + $return=$this->giteaservice->putIssuelabels($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber(),$newgitelabels); + if(!$return) return new JsonResponse(['message' => 'No API putIssuelabels'], 403); + } + + // Mettre à jour le milestone + if($oldmilestone!=$newmilestone) { + $patchs=["milestone"=>intval($newmilestone)]; + $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); + } + + // 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)); + $em->persist($scrumissue->getScrum()); + $em->flush(); + return new JsonResponse($updatedate->format("Ymd H:i:s")); + } } - if(!in_array($newcolumn,$newgitelabels)) array_push($newgitelabels,intval($newcolumn)); - - // Supprimer l'ancien label - if($haveold) { - $return=$this->giteaservice->deleteIssuelabel($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber(),$oldcolumn); - if(!$return) return new JsonResponse(['message' => 'No API deleteIssuelabel'], 403); - } - - // Mettre à jour les labels - $return=$this->giteaservice->putIssuelabels($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber(),$newgitelabels); - if(!$return) return new JsonResponse(['message' => 'No API putIssuelabels'], 403); - - // Mettre à jour le milestone - $patchs=["milestone"=>intval($newmilestone)]; - $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); - - return new JsonResponse(); + return new JsonResponse(false); } public function order(Request $request) @@ -92,4 +108,40 @@ class ScrumissueController extends AbstractController return new JsonResponse(); } + + public function ctrlchange(Request $request) + { + $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); + + $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + if(!is_array($giteaissues)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + + foreach($giteaissues as $giteaissue) { + // On ne prend pas les pull request + if(!is_null($giteaissue->pull_request)) + continue; + + $scrumissue=$em->getRepository("App:Scrumissue")->findOneBy(["scrum"=>$scrum,"giteaid"=>$giteaissue->id]); + + if(!$scrumissue) + return new JsonResponse(true); + + $fgissueupdated=false; + $updatedate=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]); + if($updatedate>$lastupdate) { + $fgissueupdated=true; + } + + if($fgissueupdated) + return new JsonResponse(true); + } + + return new JsonResponse(false); + } } diff --git a/src/ninegitea-1.0/src/Entity/Scrum.php b/src/ninegitea-1.0/src/Entity/Scrum.php index 42883ac..8252eb8 100644 --- a/src/ninegitea-1.0/src/Entity/Scrum.php +++ b/src/ninegitea-1.0/src/Entity/Scrum.php @@ -29,6 +29,18 @@ class Scrum */ private $name; + /** + * @ORM\Column(name="category", type="string", nullable=true) + * + */ + private $category; + + /** + * @ORM\Column(name="updatedate", type="datetime", nullable=true) + * + */ + private $updatedate; + /** * @ORM\Column(type="integer") */ @@ -70,9 +82,9 @@ class Scrum if($id!=$issue->getGiteamilestone()) { $id=$issue->getGiteamilestone(); $label=($issue->getGiteamilestonename()?$issue->getGiteamilestonename():"Aucun"); - $tab[$id]=[$label,0]; + $tab[$id]=["Jalon",$label,0]; } - $tab[$id][1]=$tab[$id][1]+1; + $tab[$id][2]=$tab[$id][2]+1; } return $tab; @@ -228,4 +240,28 @@ class Scrum return $this; } + + public function getUpdatedate(): ?\DateTimeInterface + { + return $this->updatedate; + } + + public function setUpdatedate(?\DateTimeInterface $updatedate): self + { + $this->updatedate = $updatedate; + + return $this; + } + + public function getCategory(): ?string + { + return $this->category; + } + + public function setCategory(?string $category): self + { + $this->category = $category; + + return $this; + } } \ No newline at end of file diff --git a/src/ninegitea-1.0/src/Form/ScrumType.php b/src/ninegitea-1.0/src/Form/ScrumType.php index ede9860..b3c019c 100644 --- a/src/ninegitea-1.0/src/Form/ScrumType.php +++ b/src/ninegitea-1.0/src/Form/ScrumType.php @@ -26,6 +26,12 @@ class ScrumType extends AbstractType ] ); + $builder->add('category', + TextType::class, [ + "label" =>"Categorie", + ] + ); + $builder->add('name', TextType::class, [ "label" =>"Nom", diff --git a/src/ninegitea-1.0/src/Repository/ScrumRepository.php b/src/ninegitea-1.0/src/Repository/ScrumRepository.php index 5125d5f..e508f94 100644 --- a/src/ninegitea-1.0/src/Repository/ScrumRepository.php +++ b/src/ninegitea-1.0/src/Repository/ScrumRepository.php @@ -5,11 +5,158 @@ namespace App\Repository; use App\Entity\Scrum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Persistence\ManagerRegistry; +use App\Service\giteaService; +use App\Entity\Scrumissue as Scrumissue; class ScrumRepository extends ServiceEntityRepository { - public function __construct(ManagerRegistry $registry) + public function __construct(ManagerRegistry $registry,giteaService $giteaservice) { parent::__construct($registry, Scrum::class); + $this->giteaservice = $giteaservice; + } + + public function getGitea($scrum,&$giteaassignees,&$giteacolumns,&$giteamilestones,&$gitealabels) { + // Récupérer le dernier order + $last = $this->_em->getRepository('App:Scrumissue')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']); + if(!$last) $lastrowid=-1; + else $lastrowid=$last->getRowid(); + + // Récupérer la premier column scrum + $firstcolumn=$this->_em->getRepository('App:Scrumcolumn')->findOneBy(["scrum"=>$scrum], ['rowid' => 'ASC']); + if(!$firstcolumn) return $this->redirectToRoute($this->route."_update",["id"=>$scrum->getId()]); + + // Récupérer la premier column scrum + $columns=$this->_em->getRepository('App:Scrumcolumn')->findBy(["scrum"=>$scrum], ['rowid' => 'ASC']); + $giteacolumns=[]; + foreach($columns as $column) { + array_push($giteacolumns,$column->getGiteaid()); + } + + // Récupérer la orga de gitea + if(!empty($scrum->getGiteajson()["owner"]["email"])) + $giteaassignees=[$scrum->getGiteajson()["owner"]]; + else + $giteaassignees=[]; + + $giteateams=$this->giteaservice->getOrgateams($scrum->getGiteajson()["owner"]["login"]); + if($giteateams&&is_array($giteateams)) { + foreach($giteateams as $team) { + $giteamembers=$this->giteaservice->getTeammembers($team->id); + if($giteamembers&&is_array($giteamembers)) { + foreach($giteamembers as $giteamember) { + if(!in_array($giteamember,$giteaassignees)) + array_push($giteaassignees,$giteamember); + } + } + } + } + $giteacollaborators=$this->giteaservice->getCollaborators($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + if(!is_array($giteacollaborators)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + foreach($giteacollaborators as $giteacollaborator) { + if(!in_array($giteacollaborator,$giteaassignees)) + array_push($giteaassignees,$giteacollaborator); + } + + // Récupérer les milestones 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"); + $keysort = array_column($giteamilestones, 'title'); + array_multisort($keysort, SORT_DESC, $giteamilestones); + + // 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"); + foreach($gitealabels as $key => $gitealabel) { + if(in_array($gitealabel->id,$giteacolumns)) + unset($gitealabels[$key]); + } + + // Récupérer les issues de gitea + $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + if(!is_array($giteaissues)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + + // Génération des issues + $tbgiteaissues=[]; + $fgscrumupdate=false; + $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]); + + if(!$scrumissue) { + $lastrowid++; + $scrumissue=new Scrumissue(); + $scrumissue->setScrum($scrum); + $scrumissue->setRowid($lastrowid); + $scrumissue->setGiteaid($giteaissue->id); + } + + $fgissueupdated=false; + if($scrumissue->getGiteajson()["updated_at"]!=json_decode(json_encode($giteaissue), true)["updated_at"]) + $fgissueupdated=true; + if($giteaissue->milestone&&$scrumissue->getGiteamilestonename()!=$giteaissue->milestone->title) + $fgissueupdated=true; + if(!$giteaissue->milestone&&!is_null($scrumissue->getGiteamilestone())) + $fgissueupdated=true; + + //$fgissueupdated=true; + if($fgissueupdated) { + $fgscrumupdate=true; + if($scrumissue->getGiteajson()["updated_at"]>$datescrumupdate) + $datescrumupdate=$scrumissue->getGiteajson()["updated_at"]; + + $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); + } + else { + $scrumissue->setGiteamilestone(null); + $scrumissue->setGiteamilestonename(null); + } + $scrumissue->setGiteajson(json_decode(json_encode($giteaissue), true)); + + $this->_em->persist($scrumissue); + $this->_em->flush(); + + $havecolumn=false; + foreach($giteaissue->labels as $gitealabel) { + $scrumcolumn=$this->_em->getRepository('App:Scrumcolumn')->findOneBy(["giteaid"=>$gitealabel->id]); + if($scrumcolumn) { + $havecolumn=true; + $scrumissue->setScrumcolumn($scrumcolumn); + break; + } + } + if(!$havecolumn) $scrumissue->setScrumcolumn($firstcolumn); + + // Sauvegarde de l'issue + $this->_em->persist($scrumissue); + $this->_em->flush(); + } + array_push($tbgiteaissues,$giteaissue->number); + } + + $scrumissues=$scrum->getScrumissues(); + foreach($scrumissues as $scrumissue) { + if(!in_array($scrumissue->getGiteanumber(),$tbgiteaissues)) { + $this->_em->remove($scrumissue); + $this->_em->flush(); + } + } + + if($fgscrumupdate) { + $scrum->setUpdatedate($datescrumupdate); + $this->_em->persist($scrum); + $this->_em->flush(); + } } } diff --git a/src/ninegitea-1.0/src/Service/giteaService.php b/src/ninegitea-1.0/src/Service/giteaService.php index ec66c92..7452b3d 100644 --- a/src/ninegitea-1.0/src/Service/giteaService.php +++ b/src/ninegitea-1.0/src/Service/giteaService.php @@ -176,6 +176,13 @@ class giteaService } + public function getissue($owner,$name,$index) { + $apiurl = $this->url."/repos/$owner/$name/issues/$index"; + $response=$this->api("GET",$apiurl,null,$this->session->get("giteatoken")); + if(!$response||$response->code!="200") return false; + else return $response->body; + } + public function getissuelabels($owner,$name,$index) { $apiurl = $this->url."/repos/$owner/$name/issues/$index/labels"; $response=$this->api("GET",$apiurl,null,$this->session->get("giteatoken")); diff --git a/src/ninegitea-1.0/templates/Issue/list.html.twig b/src/ninegitea-1.0/templates/Issue/list.html.twig new file mode 100644 index 0000000..7172784 --- /dev/null +++ b/src/ninegitea-1.0/templates/Issue/list.html.twig @@ -0,0 +1,421 @@ +{% extends "base.html.twig" %} + +{% block localstyle %} + .tag { + border-radius: 5px; + padding: 8px 8px; + margin-bottom: 5px; + display: inline-block; + min-width: 35px; + text-align: center; + color: #ffffff !important; + zoom: 80%; + } + + .tag i { + margin-right:5px; + } + + .assignee { + width:30px; + margin: 5px 5px 0px 0px; + } + +{% endblock %} + +{% block body %} +
+
+ + +
+ + {% if id == 0 %} +
+ + +
+ +
+ + +
+ {% endif %} + +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+
+ +
+ + + + + {%if id==0 %}{%endif%} + + + + + + + + + + + {% for gitearepo in gitearepos %} + {% for giteaissue in gitearepo.issues %} + {% set dataticket = giteaissue.number %} + {% set datarepo = gitearepo.id %} + + {% if giteaissue.milestone %} + {% set datamilestone = giteaissue.milestone.id %} + {%else%} + {% set datamilestone = gitearepo.full_name %} + {%endif%} + + {% set statut = "Backlog" %} + {% set labels = "" %} + {% set datalabels = "" %} + {% for label in giteaissue.labels %} + {% if label.id in gitearepo.columns %} + {% set statut= label.name %} + {% else %} + {% set labels=labels~''~label.name~'' %} + {% set datalabels=datalabels~','~label.name %} + {% endif %} + {% endfor %} + + {% set dataassignees="" %} + {% for assignee in giteaissue.assignees %} + {% set dataassignees=dataassignees~','~assignee.username %} + {% endfor %} + + + + {%if id==0 %}{%endif%} + + + + + + + + {% endfor %} + {% endfor %} + +
ProjetJalonStatutTitreAffecté àEtiquettes
+ + {{ gitearepo.full_name }}{% if giteaissue.milestone %}{{ giteaissue.milestone.title }} {%endif%}{{ statut }}{{ giteaissue.number }}{{ giteaissue.title }} + {% for assignee in giteaissue.assignees %} + + {% endfor %} + {{ labels|raw }}
+
+{% endblock %} + +{% block localjavascript %} + var table; + + function showhide() { + ticketfilter=$("#filterticket").val(); + categoryfilters=$("#filtercategorys").val(); + repofilters=$("#filterrepos").val(); + milestonefilters=$("#filtermilestones").val(); + columnfilters=$("#filtercolumns").val(); + labelfilters=$("#filterlabels").val(); + assigneefilters=$("#filterassignees").val(); + + $.fn.dataTable.ext.search.push(function(settings, data, dataIndex, rowObj, counter) { + el=table.row(dataIndex).nodes().to$(); + + {% if id == 0 %} + category = $(el).data('category'); + repo = $(el).data('repo'); + {% endif %} + ticket= $(el).data('ticket'); + milestone = $(el).data('milestone'); + column = $(el).data('column'); + labels = $(el).data('labels').split(','); + assignees = $(el).data('assignees').split(','); + + toreturn=true; + + {% if id == 0 %} + if(categoryfilters.length!==0 && jQuery.inArray(category.toString(), categoryfilters )<0) { + toreturn=false; + } + + if(repofilters.length!==0 && jQuery.inArray(repo.toString(), repofilters )<0) { + toreturn=false; + } + {% endif %} + + if(ticketfilter.length!==0 && ticket.toString()!=ticketfilter) { + toreturn=false; + } + + if(milestonefilters.length!==0 && jQuery.inArray(milestone.toString(), milestonefilters )<0) { + toreturn=false; + } + + if(columnfilters.length!==0 && jQuery.inArray(column.toString(), columnfilters )<0) { + toreturn=false; + } + + if(toreturn&&(labelfilters.length!==0||assigneefilters.length!==0)) { + if(labelfilters.length!==0) { + toreturn=false; + $.each(labelfilters, function( index, value ) { + if(jQuery.inArray(value, labels )>0) { + toreturn=true; + } + }); + } + + if(assigneefilters.length!==0&&toreturn) { + toreturn=false; + $.each(assigneefilters, function( index, value ) { + if(jQuery.inArray(value, assignees )>0) { + toreturn=true; + } + }); + } + } + + return toreturn; + }); + + table.draw(); + } + + {% if id == 0 %} + function filtercategorys() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filtercategorys', + id:{{id}}, + value: $("#filtercategorys").val() + } + }); + + showhide(); + } + + function filterrepos() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filterrepos', + id:{{id}}, + value: $("#filterrepos").val() + } + }); + + showhide(); + } + {% endif %} + + function filtermilestones() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filtermilestones', + id:{{id}}, + value: $("#filtermilestones").val() + } + }); + + showhide(); + } + + function filtercolumns() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filtercolumns', + id:{{id}}, + value: $("#filtercolumns").val() + } + }); + + showhide(); + } + + function filterlabels() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filterlabels', + id:{{id}}, + value: $("#filterlabels").val() + } + }); + + showhide(); + } + + function filterassignees() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filterassignees', + id:{{id}}, + value: $("#filterassignees").val() + } + }); + + showhide(); + } + + $(document).ready(function() { + {% if id== 0 %} + $('#filtercategorys').select2(); + {% if filtercategorys %} + {% for category in filtercategorys %} + $("#filtercategorys").val($("#filtercategorys").val().concat("{{category}}")); + {%endfor%} + $('#filtercategorys').trigger('change'); + {% endif %} + $('#filtercategorys').on("select2:select", function(e) { + filtercategorys(); + }); + $('#filtercategorys').on("select2:unselect", function(e) { + filtercategorys(); + }); + + $('#filterrepos').select2(); + {% if filterrepos %} + {% for repo in filterrepos %} + $("#filterrepos").val($("#filterrepos").val().concat("{{repo}}")); + {%endfor%} + $('#filterrepos').trigger('change'); + {% endif %} + $('#filterrepos').on("select2:select", function(e) { + filterrepos(); + }); + $('#filterrepos').on("select2:unselect", function(e) { + filterrepos(); + }); + {% endif %} + + $("#filterticket").on("keyup", function() { + showhide(); + }); + + $('#filtermilestones').select2(); + {% if filtermilestones %} + {% for milestone in filtermilestones %} + $("#filtermilestones").val($("#filtermilestones").val().concat("{{milestone}}")); + {%endfor%} + $('#filtermilestones').trigger('change'); + {% endif %} + $('#filtermilestones').on("select2:select", function(e) { + filtermilestones(); + }); + $('#filtermilestones').on("select2:unselect", function(e) { + filtermilestones(); + }); + + $('#filtercolumns').select2(); + {% if filtercolumns %} + {% for column in filtercolumns %} + $("#filtercolumns").val($("#filtercolumns").val().concat("{{column}}")); + {%endfor%} + $('#filtercolumns').trigger('change'); + {% endif %} + $('#filtercolumns').on("select2:select", function(e) { + filtercolumns(); + }); + $('#filtercolumns').on("select2:unselect", function(e) { + filtercolumns(); + }); + + $('#filterlabels').select2(); + {% if filterlabels %} + {% for label in filterlabels %} + $("#filterlabels").val($("#filterlabels").val().concat("{{label}}")); + {%endfor%} + $('#filterlabels').trigger('change'); + {% endif %} + $('#filterlabels').on("select2:select", function(e) { + filterlabels(); + }); + $('#filterlabels').on("select2:unselect", function(e) { + filterlabels(); + }); + + $('#filterassignees').select2(); + {% if filterassignees %} + {% for assignee in filterassignees %} + $("#filterassignees").val($("#filterassignees").val().concat("{{assignee}}")); + {%endfor%} + $('#filterassignees').trigger('change'); + {% endif %} + $('#filterassignees').on("select2:select", function(e) { + filterassignees(); + }); + $('#filterassignees').on("select2:unselect", function(e) { + filterassignees(); + }); + + table = $('#dataTables').DataTable({ + columnDefs: [ { "targets": "no-sort", "orderable": false }, { "targets": "no-string", "type" : "num" } ], + responsive: true, + iDisplayLength: 100, + order: [[ 1, "asc" ]], + }); + + showhide(); + }); +{% endblock %} \ No newline at end of file diff --git a/src/ninegitea-1.0/templates/Scrum/edit.html.twig b/src/ninegitea-1.0/templates/Scrum/edit.html.twig index 561c472..dfd6492 100755 --- a/src/ninegitea-1.0/templates/Scrum/edit.html.twig +++ b/src/ninegitea-1.0/templates/Scrum/edit.html.twig @@ -51,6 +51,7 @@
+ {{ form_row(form.category) }} {{ form_row(form.name) }} {{ form_row(form.giteaid) }} {{ form_row(form.users) }} @@ -81,6 +82,7 @@ {% block localjavascript %} $(document).ready(function() { + $("#scrum_giteaid").select2(); $("#scrum_name").focus(); {% if mode=="update" %} loadscrumcolumns(); diff --git a/src/ninegitea-1.0/templates/Scrum/list.html.twig b/src/ninegitea-1.0/templates/Scrum/list.html.twig index d7e3ccd..d113889 100644 --- a/src/ninegitea-1.0/templates/Scrum/list.html.twig +++ b/src/ninegitea-1.0/templates/Scrum/list.html.twig @@ -1,47 +1,168 @@ {% extends "base.html.twig" %} {% block localstyle %} - hr { margin:5px 0px 5px 0px; } {% endblock %} {% block body %} -
- Ajouter un Scrum +
+ + + +
+ + +
+ +
+ + +
-
- - {% for scrum in scrums %} -
- - -
- -

- {{scrum.giteajson.description}}

- Nombre de tickets = {{ scrum.scrumissues|length}}
- {% for statistique in scrum.statistique %} - {% if loop.first %}
{%endif%} - {{ statistique[0] }} = {{ statistique[1] }}
- {% endfor %} - -
-
- - -
- {% endfor %} +
+ + + + + + + + + + + + {% for scrum in scrums %} + + + + + + + + {% endfor %} + +
CatégorieProjetDescriptionTickets
+ + + + + {{scrum.category}} + + {{scrum.name}} + + {{scrum.giteajson.description}} + + {{scrum.giteajson.open_issues_count}} +
+
{% endblock %} {% block localjavascript %} - $(document).ready(function() { - $('#grid').masonry({ - itemSelector: '.card', + var table; + + function showhide() { + categoryfilters=$("#filtercategorys").val(); + repofilters=$("#filterrepos").val(); + + $.fn.dataTable.ext.search.push(function(settings, data, dataIndex, rowObj, counter) { + el=table.row(dataIndex).nodes().to$(); + + category = $(el).data('category'); + repo = $(el).data('repo'); + + toreturn=true; + if(categoryfilters.length!==0 && jQuery.inArray(category.toString(), categoryfilters )<0) { + toreturn=false; + } + + if(repofilters.length!==0 && jQuery.inArray(repo.toString(), repofilters )<0) { + toreturn=false; + } + + + return toreturn; }); + + table.draw(); + //$.fn.dataTable.ext.search.pop(); + + } + + function filtercategorys() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filtercategorys', + id:0, + value: $("#filtercategorys").val() + } + }); + + showhide(); + } + + function filterrepos() { + $.ajax({ + method: "POST", + url: "{{ path('app_user_preference') }}", + data: { + key:'filterrepos', + id:0, + value: $("#filterrepos").val() + } + }); + + showhide(); + } + + $(document).ready(function() { + + $('#filtercategorys').select2(); + {% if filtercategorys %} + {% for category in filtercategorys %} + $("#filtercategorys").val($("#filtercategorys").val().concat("{{category}}")); + {%endfor%} + $('#filtercategorys').trigger('change'); + {% endif %} + $('#filtercategorys').on("select2:select", function(e) { + filtercategorys(); + }); + $('#filtercategorys').on("select2:unselect", function(e) { + filtercategorys(); + }); + + $('#filterrepos').select2(); + {% if filterrepos %} + {% for repo in filterrepos %} + $("#filterrepos").val($("#filterrepos").val().concat("{{repo}}")); + {%endfor%} + $('#filterrepos').trigger('change'); + {% endif %} + $('#filterrepos').on("select2:select", function(e) { + filterrepos(); + }); + $('#filterrepos').on("select2:unselect", function(e) { + filterrepos(); + }); + + table = $('#dataTables').DataTable({ + columnDefs: [ { "targets": "no-sort", "orderable": false }, { "targets": "no-string", "type" : "num" } ], + responsive: true, + iDisplayLength: 100, + order: [[ 1, "asc" ]], + }); + + showhide(); }); {% endblock %} \ No newline at end of file diff --git a/src/ninegitea-1.0/templates/Scrum/view.html.twig b/src/ninegitea-1.0/templates/Scrum/view.html.twig index 200b4ca..6f87c42 100644 --- a/src/ninegitea-1.0/templates/Scrum/view.html.twig +++ b/src/ninegitea-1.0/templates/Scrum/view.html.twig @@ -38,6 +38,11 @@ {% endblock %} {% block body %} + +
@@ -66,6 +71,8 @@ {% endfor %}
+ + Nouveau
Ticket
{% for column in scrum.scrumcolumns %} @@ -285,6 +292,8 @@ // Appliy filters showhide(); + lastupdate="{{scrum.updatedate|date("Ymd H:i:s")}}"; + // Sort columns $( ".scrumcolumn" ).sortable({ handle: ".fa-arrows-alt", @@ -299,6 +308,7 @@ console.log("ID = "+id+" = Column : "+oldcolumn+">>"+newcolumn+" = Milestone : "+oldmilestone+">>"+newmilestone ); if(oldcolumn!=newcolumn||oldmilestone!=newmilestone) { + $.ajax({ method: "POST", url: "{{path("app_scrumissue_change")}}", @@ -309,9 +319,10 @@ newcolumn:newcolumn, newmilestone:newmilestone, }, - success: function() { + success: function(data) { $(ui.item).data("column",newcolumn); $(ui.item).data("milestone",newmilestone); + if(data) lastupdate=data; }, error: function (request, status, error) { $( ".scrumcolumn" ).sortable('cancel'); @@ -337,6 +348,25 @@ } }); } - }); + }); + + + var intervalId = window.setInterval(function(){ + console.log(lastupdate); + $.ajax({ + method: "POST", + url: "{{path("app_scrumissue_ctrlchange")}}", + data: { + id:{{scrum.id}}, + lastupdate:lastupdate + }, + success: function(fgupdated) { + if(fgupdated) { + $("#haveupdate").show(); + } + } + }); + }, 60000); + }); {% endblock %} \ No newline at end of file diff --git a/src/ninegitea-1.0/templates/base.html.twig b/src/ninegitea-1.0/templates/base.html.twig index fd7ff5a..b94d8f1 100644 --- a/src/ninegitea-1.0/templates/base.html.twig +++ b/src/ninegitea-1.0/templates/base.html.twig @@ -65,7 +65,9 @@ {% endif %}