svg
This commit is contained in:
parent
dd5c13027f
commit
3fe78d7e7c
|
@ -13,6 +13,7 @@ twig:
|
||||||
appCron: '%appCron%'
|
appCron: '%appCron%'
|
||||||
wssuse: '%wssuse%'
|
wssuse: '%wssuse%'
|
||||||
wssurl: '%wssurl%'
|
wssurl: '%wssurl%'
|
||||||
|
giteaUrl: '%giteaUrl%'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -207,7 +207,7 @@ app_scrumcolumn_order:
|
||||||
path: /master/scrumcolumn/order/{scrumid}
|
path: /master/scrumcolumn/order/{scrumid}
|
||||||
defaults: { _controller: App\Controller\ScrumcolumnController:order }
|
defaults: { _controller: App\Controller\ScrumcolumnController:order }
|
||||||
|
|
||||||
#== Scrumoissue ========================================================================================================
|
#== Scrumissue ========================================================================================================
|
||||||
app_scrumissue_change:
|
app_scrumissue_change:
|
||||||
path: /user/scrumissue/change
|
path: /user/scrumissue/change
|
||||||
defaults: { _controller: App\Controller\ScrumissueController:change }
|
defaults: { _controller: App\Controller\ScrumissueController:change }
|
||||||
|
@ -215,3 +215,16 @@ app_scrumissue_change:
|
||||||
app_scrumissue_order:
|
app_scrumissue_order:
|
||||||
path: /user/scrumissue/order
|
path: /user/scrumissue/order
|
||||||
defaults: { _controller: App\Controller\ScrumissueController: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 }
|
|
@ -0,0 +1,116 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Form\FormError;
|
||||||
|
|
||||||
|
use App\Entity\Issue as Entity;
|
||||||
|
use App\Entity\Issueissue as Issueissue;
|
||||||
|
use App\Form\IssueType as Form;
|
||||||
|
|
||||||
|
use App\Service\giteaService;
|
||||||
|
|
||||||
|
class IssueController extends AbstractController
|
||||||
|
{
|
||||||
|
private $data = "issue";
|
||||||
|
private $route = "app_issue";
|
||||||
|
private $render = "Issue/";
|
||||||
|
private $entity = "App:Issue";
|
||||||
|
|
||||||
|
public function __construct(giteaService $giteaservice) { $this->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 <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
|
||||||
|
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,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -13,31 +13,6 @@ use App\Form\ScrumType as Form;
|
||||||
|
|
||||||
use App\Service\giteaService;
|
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
|
class ScrumController extends AbstractController
|
||||||
{
|
{
|
||||||
private $data = "scrum";
|
private $data = "scrum";
|
||||||
|
@ -50,18 +25,40 @@ class ScrumController extends AbstractController
|
||||||
public function list(Request $request)
|
public function list(Request $request)
|
||||||
{
|
{
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
$datas = $em->getRepository($this->entity)->findAll();
|
$scrums = $em->getRepository($this->entity)->findBy([],["name"=>"ASC"]);
|
||||||
/*
|
|
||||||
foreach($datas as $data) {
|
$giteacategorys=[];
|
||||||
dump($data->getGiteajson()["name"]);
|
$gitearepos=[];
|
||||||
dump($this->giteaservice->getRepoNotifications($data->getGiteajson()["owner"]["login"],$data->getGiteajson()["name"]));
|
|
||||||
|
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
|
||||||
|
|
||||||
|
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',[
|
return $this->render($this->render.'list.html.twig',[
|
||||||
$this->data."s" => $datas,
|
$this->data."s" => $scrums,
|
||||||
"useheader" => true,
|
"giteacategorys" => $giteacategorys,
|
||||||
"usesidebar" => false,
|
"gitearepos" => $gitearepos,
|
||||||
|
"filtercategorys" => $filtercategorys,
|
||||||
|
"filterrepos" => $filterrepos,
|
||||||
|
"useheader" => true,
|
||||||
|
"usesidebar" => false,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,144 +171,18 @@ class ScrumController extends AbstractController
|
||||||
|
|
||||||
public function view($id,Request $request)
|
public function view($id,Request $request)
|
||||||
{
|
{
|
||||||
$executionTime = new ExecutionTime();
|
|
||||||
$executionTime->start();
|
|
||||||
|
|
||||||
// Initialisation de l'enregistrement
|
// Initialisation de l'enregistrement
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
$data=$em->getRepository($this->entity)->find($id);
|
$data=$em->getRepository($this->entity)->find($id);
|
||||||
if(!$data) return $this->redirectToRoute($this->route);
|
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
|
||||||
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
|
||||||
$keysort = array_column($giteamilestones, 'title');
|
|
||||||
array_multisort($keysort, SORT_DESC, $giteamilestones);
|
|
||||||
|
|
||||||
// Récupérer les labels de gitea
|
$em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$gitealabels);
|
||||||
$gitealabels=$this->giteaservice->getLabels($data->getGiteajson()["owner"]["login"],$data->getGiteajson()["name"]);
|
|
||||||
if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous <a href='/ninegitea/logout'>reconnecter</a>");
|
|
||||||
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
|
||||||
|
|
||||||
// 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Préférences utilisateur
|
// Préférences utilisateur
|
||||||
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
|
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
|
||||||
$filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id);
|
$filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id);
|
||||||
$filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id);
|
$filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id);
|
||||||
|
|
||||||
$executionTime->end();
|
|
||||||
//dump($executionTime->__toString());
|
|
||||||
|
|
||||||
return $this->render($this->render.'view.html.twig', [
|
return $this->render($this->render.'view.html.twig', [
|
||||||
'useheader' => true,
|
'useheader' => true,
|
||||||
'usesidebar' => false,
|
'usesidebar' => false,
|
||||||
|
@ -335,12 +206,6 @@ class ScrumController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($form->get('submit')->isClicked() && ($mode=="submit" || $mode=="update")) {
|
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()) {
|
if ($form->get('submit')->isClicked() && !$form->isValid()) {
|
||||||
|
|
|
@ -35,6 +35,7 @@ class ScrumcolumnController extends AbstractController
|
||||||
|
|
||||||
// Récupérer les repos de gitea
|
// Récupérer les repos de gitea
|
||||||
$gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
|
$gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
|
||||||
|
if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
|
||||||
// Création du formulaire
|
// Création du formulaire
|
||||||
$form = $this->createForm(Form::class,$data,array("mode"=>"submit","gitealabels"=>$gitealabels));
|
$form = $this->createForm(Form::class,$data,array("mode"=>"submit","gitealabels"=>$gitealabels));
|
||||||
|
|
|
@ -32,39 +32,55 @@ class ScrumissueController extends AbstractController
|
||||||
$oldmilestone=$request->get('oldmilestone');
|
$oldmilestone=$request->get('oldmilestone');
|
||||||
$newmilestone=$request->get('newmilestone');
|
$newmilestone=$request->get('newmilestone');
|
||||||
|
|
||||||
// Rechercher l'issue en cours
|
if($oldcolumn!=$newcolumn||$oldmilestone!=$newmilestone) {
|
||||||
$scrumissue=$em->getRepository("App:Scrumissue")->find($id);
|
// Rechercher l'issue en cours
|
||||||
if(!$scrumissue) return new JsonResponse(['message' => 'No Issue'], 403);
|
$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
|
// 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());
|
$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);
|
if(!is_array($gitealabels)) return new JsonResponse(['message' => 'No API getIssuelabels'], 403);
|
||||||
|
|
||||||
// Remplacer l'ancien column par la nouvelle
|
// Remplacer l'ancien column par la nouvelle
|
||||||
$newgitelabels=[];
|
if($oldcolumn!=$newcolumn) {
|
||||||
$haveold=false;
|
$newgitelabels=[];
|
||||||
foreach($gitealabels as $gitealabel) {
|
$haveold=false;
|
||||||
if($gitealabel->id!=$oldcolumn) array_push($newgitelabels,$gitealabel->id);
|
foreach($gitealabels as $gitealabel) {
|
||||||
else $haveold=true;
|
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));
|
return new JsonResponse(false);
|
||||||
|
|
||||||
// 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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function order(Request $request)
|
public function order(Request $request)
|
||||||
|
@ -92,4 +108,40 @@ class ScrumissueController extends AbstractController
|
||||||
|
|
||||||
return new JsonResponse();
|
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,18 @@ class Scrum
|
||||||
*/
|
*/
|
||||||
private $name;
|
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")
|
* @ORM\Column(type="integer")
|
||||||
*/
|
*/
|
||||||
|
@ -70,9 +82,9 @@ class Scrum
|
||||||
if($id!=$issue->getGiteamilestone()) {
|
if($id!=$issue->getGiteamilestone()) {
|
||||||
$id=$issue->getGiteamilestone();
|
$id=$issue->getGiteamilestone();
|
||||||
$label=($issue->getGiteamilestonename()?$issue->getGiteamilestonename():"Aucun");
|
$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;
|
return $tab;
|
||||||
|
@ -228,4 +240,28 @@ class Scrum
|
||||||
|
|
||||||
return $this;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -26,6 +26,12 @@ class ScrumType extends AbstractType
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$builder->add('category',
|
||||||
|
TextType::class, [
|
||||||
|
"label" =>"Categorie",
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
$builder->add('name',
|
$builder->add('name',
|
||||||
TextType::class, [
|
TextType::class, [
|
||||||
"label" =>"Nom",
|
"label" =>"Nom",
|
||||||
|
|
|
@ -5,11 +5,158 @@ namespace App\Repository;
|
||||||
use App\Entity\Scrum;
|
use App\Entity\Scrum;
|
||||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||||
use Doctrine\Common\Persistence\ManagerRegistry;
|
use Doctrine\Common\Persistence\ManagerRegistry;
|
||||||
|
use App\Service\giteaService;
|
||||||
|
use App\Entity\Scrumissue as Scrumissue;
|
||||||
|
|
||||||
class ScrumRepository extends ServiceEntityRepository
|
class ScrumRepository extends ServiceEntityRepository
|
||||||
{
|
{
|
||||||
public function __construct(ManagerRegistry $registry)
|
public function __construct(ManagerRegistry $registry,giteaService $giteaservice)
|
||||||
{
|
{
|
||||||
parent::__construct($registry, Scrum::class);
|
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
$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 <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
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 <a href='/ninegitea/logout'>reconnecter</a>");
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
public function getissuelabels($owner,$name,$index) {
|
||||||
$apiurl = $this->url."/repos/$owner/$name/issues/$index/labels";
|
$apiurl = $this->url."/repos/$owner/$name/issues/$index/labels";
|
||||||
$response=$this->api("GET",$apiurl,null,$this->session->get("giteatoken"));
|
$response=$this->api("GET",$apiurl,null,$this->session->get("giteatoken"));
|
||||||
|
|
|
@ -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 %}
|
||||||
|
<div class="d-flex justify-content-start mt-3">
|
||||||
|
<div style="width:200px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre TICKET</label>
|
||||||
|
<input type="number" id="filterticket" class=" form-control">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if id == 0 %}
|
||||||
|
<div style="width:300px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre CATEGORIES</label>
|
||||||
|
<select id="filtercategorys" multiple="multiple" class="form-control">
|
||||||
|
{% for giteacategory in giteacategorys %}
|
||||||
|
<option value="{{giteacategory}}">{{giteacategory}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:300px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre PROJETS</label>
|
||||||
|
<select id="filterrepos" multiple="multiple" class="form-control">
|
||||||
|
{% for gitearepo in gitearepos %}
|
||||||
|
<option value="{{gitearepo.id}}">{{gitearepo.full_name}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div style="width:600px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre JALONS</label>
|
||||||
|
<select id="filtermilestones" multiple="multiple" class="form-control">
|
||||||
|
{% for giteamilestone in giteamilestones %}
|
||||||
|
<option value="{{giteamilestone.id}}">{{giteamilestone.title}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:300px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre STATUTS</label>
|
||||||
|
<select id="filtercolumns" multiple="multiple" class="form-control">
|
||||||
|
{% for giteacolumn in giteacolumns %}
|
||||||
|
<option value="{{giteacolumn}}">{{giteacolumn}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:300px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre ETIQUETTES</label>
|
||||||
|
<select id="filterlabels" multiple="multiple" class="form-control">
|
||||||
|
{% for gitealabel in gitealabels %}
|
||||||
|
{% if gitealabel not in giteacolumns %}
|
||||||
|
<option value="{{gitealabel}}">{{gitealabel}}</option>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div style="width:300px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre AFFECTATIONS</label>
|
||||||
|
<select id="filterassignees" multiple="multiple" class="form-control">
|
||||||
|
{% for giteaassignee in giteaassignees %}
|
||||||
|
<option value="{{giteaassignee.username}}">{{giteaassignee.username}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-4" style="zoom:80%">
|
||||||
|
<table class="table table-striped table-bordered table-hover" id="dataTables" style="width:100%">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="no-sort"></th>
|
||||||
|
{%if id==0 %}<th style="width:100px">Projet</th>{%endif%}
|
||||||
|
<th style="width:200px">Jalon</th>
|
||||||
|
<th>Statut</th>
|
||||||
|
<th class="no-string">N°</th>
|
||||||
|
<th>Titre</th>
|
||||||
|
<th style="width:135px">Affecté à</th>
|
||||||
|
<th>Etiquettes</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
{% 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~'<span class="btn-link tag mr-1" style="background-color:#'~label.color~'"><i class="fas fa-tag"></i>'~label.name~'</span>' %}
|
||||||
|
{% set datalabels=datalabels~','~label.name %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% set dataassignees="" %}
|
||||||
|
{% for assignee in giteaissue.assignees %}
|
||||||
|
{% set dataassignees=dataassignees~','~assignee.username %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<tr data-category="{{gitearepo.category}}" data-repo="{{datarepo}}" data-milestone="{{datamilestone}}" data-ticket="{{dataticket}}" data-column="{{statut}}" data-labels="{{datalabels}}" data-assignees="{{dataassignees}}">
|
||||||
|
<td>
|
||||||
|
<a target="_blank" class="btn btn-link fa fa-file" href="{{giteaissue.html_url}}"></a>
|
||||||
|
</td>
|
||||||
|
{%if id==0 %}<td>{{ gitearepo.full_name }}</td>{%endif%}
|
||||||
|
<td>{% if giteaissue.milestone %}{{ giteaissue.milestone.title }} {%endif%}</td>
|
||||||
|
<td>{{ statut }}</td>
|
||||||
|
<td>{{ giteaissue.number }}</td>
|
||||||
|
<td>{{ giteaissue.title }}</td>
|
||||||
|
<td>
|
||||||
|
{% for assignee in giteaissue.assignees %}
|
||||||
|
<img src="{{assignee.avatar_url}}" class="assignee" title="{{assignee.username}}">
|
||||||
|
{% endfor %}
|
||||||
|
</td>
|
||||||
|
<td>{{ labels|raw }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% 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 %}
|
|
@ -51,6 +51,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
{{ form_row(form.category) }}
|
||||||
{{ form_row(form.name) }}
|
{{ form_row(form.name) }}
|
||||||
{{ form_row(form.giteaid) }}
|
{{ form_row(form.giteaid) }}
|
||||||
{{ form_row(form.users) }}
|
{{ form_row(form.users) }}
|
||||||
|
@ -81,6 +82,7 @@
|
||||||
|
|
||||||
{% block localjavascript %}
|
{% block localjavascript %}
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
$("#scrum_giteaid").select2();
|
||||||
$("#scrum_name").focus();
|
$("#scrum_name").focus();
|
||||||
{% if mode=="update" %}
|
{% if mode=="update" %}
|
||||||
loadscrumcolumns();
|
loadscrumcolumns();
|
||||||
|
|
|
@ -1,47 +1,168 @@
|
||||||
{% extends "base.html.twig" %}
|
{% extends "base.html.twig" %}
|
||||||
|
|
||||||
{% block localstyle %}
|
{% block localstyle %}
|
||||||
hr { margin:5px 0px 5px 0px; }
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="mt-1 mb-3">
|
<div class="d-flex justify-content-start mt-3">
|
||||||
<a class="btn btn-success btn-sm" href={{ path('app_scrum_submit') }}><i class="fa fa-plus mr-2"></i>Ajouter un Scrum</a>
|
|
||||||
|
<div class="pr-2">
|
||||||
|
<a class="btn btn-success btn-sm mt-2" href={{ path('app_scrum_submit') }}><i class="fa fa-plus mr-2"></i>Ajouter un Scrum</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:300px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre CATEGORIES</label>
|
||||||
|
<select id="filtercategorys" multiple="multiple" class="form-control">
|
||||||
|
{% for giteacategory in giteacategorys %}
|
||||||
|
<option value="{{giteacategory}}">{{giteacategory}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:300px" class="pr-2">
|
||||||
|
<label class="control-label">Filtre PROJETS</label>
|
||||||
|
<select id="filterrepos" multiple="multiple" class="form-control">
|
||||||
|
{% for gitearepo in gitearepos %}
|
||||||
|
<option value="{{gitearepo.id}}">{{gitearepo.full_name}}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="grid" class="margin:auto">
|
<div class="mt-4" style="zoom:80%">
|
||||||
|
<table class="table table-striped table-bordered table-hover" id="dataTables" style="width:100%">
|
||||||
{% for scrum in scrums %}
|
<thead>
|
||||||
<div class="card float-left mb-1 mr-1" style="width:374px">
|
<tr>
|
||||||
<div class="card-header">
|
<th class="no-sort"></th>
|
||||||
<a href="{{path('app_scrum_view',{id:scrum.id})}}">{{scrum.name}}</a>
|
<th style="width:100px">Catégorie</th>
|
||||||
<a class="float-right" href="{{path('app_scrum_update',{id:scrum.id})}}"><i class="fas fa-file"></i></a>
|
<th style="width:200px">Projet</th>
|
||||||
</div>
|
<th>Description</th>
|
||||||
|
<th style="width:100px" class="no-string">Tickets</th>
|
||||||
<div class="card-body">
|
</tr>
|
||||||
<small>
|
</thead>
|
||||||
<p style="min-height:35px">
|
<tbody>
|
||||||
{{scrum.giteajson.description}}</p>
|
{% for scrum in scrums %}
|
||||||
Nombre de tickets = {{ scrum.scrumissues|length}}<br>
|
<tr data-category="{{scrum.category}}" data-repo="{{scrum.giteaid}}">
|
||||||
{% for statistique in scrum.statistique %}
|
<td>
|
||||||
{% if loop.first %}<hr>{%endif%}
|
<a href="{{path('app_scrum_view',{id:scrum.id})}}"><i class="fas fa-columns fa-2x mr-1"></i></a>
|
||||||
{{ statistique[0] }} = {{ statistique[1] }}<br>
|
<a href="{{path('app_issuescrum',{id:scrum.id})}}"><i class="fas fa-ticket-alt fa-2x mr-1"></i></a>
|
||||||
{% endfor %}
|
<a href="{{path('app_scrum_update',{id:scrum.id})}}"><i class="fas fa-file fa-2x"></i></a>
|
||||||
|
</td>
|
||||||
</small>
|
<td>
|
||||||
</div>
|
{{scrum.category}}
|
||||||
|
</td>
|
||||||
<div class="card-footer small">
|
<td>
|
||||||
<a href="{{scrum.giteajson.html_url}}" target="_blank"">{{scrum.giteajson.html_url}}</a>
|
{{scrum.name}}
|
||||||
</div>
|
</td>
|
||||||
</div>
|
<td>
|
||||||
{% endfor %}
|
{{scrum.giteajson.description}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{scrum.giteajson.open_issues_count}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block localjavascript %}
|
{% block localjavascript %}
|
||||||
$(document).ready(function() {
|
var table;
|
||||||
$('#grid').masonry({
|
|
||||||
itemSelector: '.card',
|
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 %}
|
{% endblock %}
|
|
@ -38,6 +38,11 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
<div id="haveupdate" style="display:none" class="alert alert-danger pr-2 mt-3">
|
||||||
|
Votre projet a été mise à jour par un tier. Souhaitez-vous raffraichir votre projet ?<br>
|
||||||
|
<a href="{{path('app_scrum_view',{id:scrum.id})}}" class="btn btn-success mt-3">Rafraichir</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="d-flex justify-content-start mt-3">
|
<div class="d-flex justify-content-start mt-3">
|
||||||
<div style="width:585px" class="pr-2">
|
<div style="width:585px" class="pr-2">
|
||||||
<label class="control-label">Filtre JALONS</label>
|
<label class="control-label">Filtre JALONS</label>
|
||||||
|
@ -66,6 +71,8 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<a href="{{giteaUrl}}/{{scrum.giteajson.owner.login}}/{{scrum.giteajson.name}}/issues/new" class="btn btn-success">Nouveau<br>Ticket</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% for column in scrum.scrumcolumns %}
|
{% for column in scrum.scrumcolumns %}
|
||||||
|
@ -285,6 +292,8 @@
|
||||||
// Appliy filters
|
// Appliy filters
|
||||||
showhide();
|
showhide();
|
||||||
|
|
||||||
|
lastupdate="{{scrum.updatedate|date("Ymd H:i:s")}}";
|
||||||
|
|
||||||
// Sort columns
|
// Sort columns
|
||||||
$( ".scrumcolumn" ).sortable({
|
$( ".scrumcolumn" ).sortable({
|
||||||
handle: ".fa-arrows-alt",
|
handle: ".fa-arrows-alt",
|
||||||
|
@ -299,6 +308,7 @@
|
||||||
console.log("ID = "+id+" = Column : "+oldcolumn+">>"+newcolumn+" = Milestone : "+oldmilestone+">>"+newmilestone );
|
console.log("ID = "+id+" = Column : "+oldcolumn+">>"+newcolumn+" = Milestone : "+oldmilestone+">>"+newmilestone );
|
||||||
|
|
||||||
if(oldcolumn!=newcolumn||oldmilestone!=newmilestone) {
|
if(oldcolumn!=newcolumn||oldmilestone!=newmilestone) {
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
method: "POST",
|
method: "POST",
|
||||||
url: "{{path("app_scrumissue_change")}}",
|
url: "{{path("app_scrumissue_change")}}",
|
||||||
|
@ -309,9 +319,10 @@
|
||||||
newcolumn:newcolumn,
|
newcolumn:newcolumn,
|
||||||
newmilestone:newmilestone,
|
newmilestone:newmilestone,
|
||||||
},
|
},
|
||||||
success: function() {
|
success: function(data) {
|
||||||
$(ui.item).data("column",newcolumn);
|
$(ui.item).data("column",newcolumn);
|
||||||
$(ui.item).data("milestone",newmilestone);
|
$(ui.item).data("milestone",newmilestone);
|
||||||
|
if(data) lastupdate=data;
|
||||||
},
|
},
|
||||||
error: function (request, status, error) {
|
error: function (request, status, error) {
|
||||||
$( ".scrumcolumn" ).sortable('cancel');
|
$( ".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 %}
|
{% endblock %}
|
|
@ -65,7 +65,9 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div class="collapse navbar-collapse" id="navbarNav">
|
<div class="collapse navbar-collapse" id="navbarNav">
|
||||||
<ul class="navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
|
<li class="nav-item"><a href="{{path("app_scrum")}}">Scrums</a></li>
|
||||||
|
<a href="{{path("app_issue")}}">Issues</a><
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue