diff --git a/src/ninegitea-1.0/config/routes.yaml b/src/ninegitea-1.0/config/routes.yaml
index a9525da..8b8616f 100644
--- a/src/ninegitea-1.0/config/routes.yaml
+++ b/src/ninegitea-1.0/config/routes.yaml
@@ -273,6 +273,27 @@ app_scrumpriority_order:
defaults: { _controller: App\Controller\ScrumpriorityController:order }
+#== Scrumtype ========================================================================================================
+app_scrumtype_submit:
+ path: /master/scrumtype/submit/{scrumid}
+ defaults: { _controller: App\Controller\ScrumtypeController:submit }
+
+app_scrumtype_update:
+ path: /master/scrumtype/update/{id}
+ defaults: { _controller: App\Controller\ScrumtypeController:update }
+
+app_scrumtype_delete:
+ path: /master/scrumtype/delete/{id}
+ defaults: { _controller: App\Controller\ScrumtypeController:delete }
+
+app_scrumtype_select:
+ path: /master/scrumtype/select/{scrumid}
+ defaults: { _controller: App\Controller\ScrumtypeController:select }
+
+app_scrumtype_order:
+ path: /master/scrumtype/order/{scrumid}
+ defaults: { _controller: App\Controller\ScrumtypeController:order }
+
#== Scrumissue ========================================================================================================
app_scrumissue_change:
path: /user/scrumissue/change
diff --git a/src/ninegitea-1.0/src/Controller/IssueController.php b/src/ninegitea-1.0/src/Controller/IssueController.php
index 64e6452..cbc463a 100755
--- a/src/ninegitea-1.0/src/Controller/IssueController.php
+++ b/src/ninegitea-1.0/src/Controller/IssueController.php
@@ -4,28 +4,31 @@ 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 Symfony\Component\HttpKernel\KernelInterface;
+use Symfony\Component\HttpFoundation\BinaryFileResponse;
+use Symfony\Component\Filesystem\Filesystem;
+use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use App\Service\giteaService;
class IssueController extends AbstractController
{
+ private $appKernel;
private $data = "issue";
private $route = "app_issue";
private $render = "Issue/";
private $entity = "App:Issue";
- public function __construct(giteaService $giteaservice) { $this->giteaservice = $giteaservice; }
+ public function __construct(KernelInterface $appKernel,giteaService $giteaservice) {
+ $this->appKernel = $appKernel;
+ $this->giteaservice = $giteaservice;
+ }
public function list($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
-
+ $fgcsv = $request->get("fgcsv");
+
// Récupérer les repos de gitea
if($id==0) $scrums=$em->getRepository("App:Scrum")->findBy([],["name"=>"ASC"]);
else $scrums=$em->getRepository("App:Scrum")->findBy(["id"=>$id],["name"=>"ASC"]);
@@ -36,6 +39,7 @@ class IssueController extends AbstractController
$giteacolumns=[];
$giteateams=[];
$giteaprioritys=[];
+ $giteatypes=[];
$gitealabels=[];
$giteaassignees=$em->getRepository("App:User")->findBy([],["username"=>"ASC"]);
$viewclosed = $request->getSession()->get("viewclosed");
@@ -98,6 +102,11 @@ class IssueController extends AbstractController
array_push($giteaprioritys,$priority->getGiteajson()["name"]);
}
+ foreach($scrum->getScrumtypes() as $type) {
+ if(!in_array($type->getGiteajson()["name"],$giteatypes))
+ array_push($giteatypes,$type->getGiteajson()["name"]);
+ }
+
foreach($giteaissues as $giteaissue) {
foreach($giteaissue->labels as $label) {
if(!in_array($label->name,$gitealabels))
@@ -112,6 +121,7 @@ class IssueController extends AbstractController
sort($giteacolumns);
sort($giteateams);
sort($giteaprioritys);
+ sort($giteatypes);
sort($gitealabels);
sort($giteacategorys);
@@ -122,11 +132,56 @@ class IssueController extends AbstractController
$filtercolumns = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtercolumns",$id);
$filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id);
$filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id);
+ $filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$id);
$filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id);
$filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id);
$filterexcludes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterexcludes",$id);
$showfilters = $em->getRepository("App:User")->getUserpreference($this->getUser(),"showfilters",$id);
+ if($fgcsv) {
+ $dir = $this->appKernel->getProjectDir() . '/uploads/issues/';
+ $file = "issues-".$id.".csv";
+ $fs = new Filesystem();
+ $fs->mkdir($dir);
+ $csvh = fopen($dir.$file, 'w');
+ $d = ';'; // this is the default but i like to be explicit
+ $e = '"'; // this is the default but i like to be explicit
+
+ $tmp=["Projet","Jalon","Type","Id","Titre","Statut","Label"];
+ fputcsv($csvh, $tmp, $d, $e);
+
+ foreach($gitearepos as $gitearepo) {
+ foreach($gitearepo["issues"] as $giteaissue) {
+ $statut="";
+ $type="";
+ $labels="";
+ foreach($giteaissue->labels as $label) {
+ if(in_array($label->id,$gitearepo["columns"]))
+ $statut=$label->name;
+ elseif(in_array($label->name,$giteatypes))
+ $type=$label->name;
+ else
+ $labels=$labels.($labels!=""?"\n":"").$label->name;
+ }
+ $tmp=[
+ $gitearepo["name"],
+ (isset($giteaissue->milestone->title)?$giteaissue->milestone->title:""),
+ $type,
+ $giteaissue->number,
+ $giteaissue->title,
+ $statut,
+ $labels
+ ];
+ fputcsv($csvh, $tmp, $d, $e);
+ }
+ }
+ fclose($csvh);
+
+ $response = new BinaryFileResponse($dir.$file);
+ $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
+ return $response;
+ }
+
return $this->render($this->render.'list.html.twig',[
"useheader" => true,
"usesidebar" => false,
@@ -137,6 +192,7 @@ class IssueController extends AbstractController
"giteacolumns" => $giteacolumns,
"giteateams" => $giteateams,
"giteaprioritys" => $giteaprioritys,
+ "giteatypes" => $giteatypes,
"gitealabels" => $gitealabels,
"giteaassignees" => $giteaassignees,
"filtercategorys" => $filtercategorys,
@@ -145,6 +201,7 @@ class IssueController extends AbstractController
"filtercolumns" => $filtercolumns,
"filterteams" => $filterteams,
"filterprioritys" => $filterprioritys,
+ "filtertypes" => $filtertypes,
"filterlabels" => $filterlabels,
"filterexcludes" => $filterexcludes,
"filterassignees" => $filterassignees,
diff --git a/src/ninegitea-1.0/src/Controller/ScrumController.php b/src/ninegitea-1.0/src/Controller/ScrumController.php
index 2cafa37..4ebdd71 100755
--- a/src/ninegitea-1.0/src/Controller/ScrumController.php
+++ b/src/ninegitea-1.0/src/Controller/ScrumController.php
@@ -176,12 +176,13 @@ class ScrumController extends AbstractController
$data=$em->getRepository($this->entity)->find($id);
if(!$data) return $this->redirectToRoute($this->route);
- $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$gitealabels);
+ $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$giteatypes,$gitealabels);
// Préférences utilisateur
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
$filterteams = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterteams",$id);
$filterprioritys = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterprioritys",$id);
+ $filtertypes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtertypes",$id);
$filterlabels = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterlabels",$id);
$filterassignees = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterassignees",$id);
$filterexcludes = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filterexcludes",$id);
@@ -196,10 +197,12 @@ class ScrumController extends AbstractController
'giteamilestones' => $giteamilestones,
'giteateams' => $giteateams,
'giteaprioritys' => $giteaprioritys,
+ 'giteatypes' => $giteatypes,
'gitealabels' => $gitealabels,
'filtermilestones' => $filtermilestones,
'filterteams' => $filterteams,
'filterprioritys' => $filterprioritys,
+ 'filtertypes' => $filtertypes,
'filterlabels' => $filterlabels,
'filterassignees' => $filterassignees,
'filterexcludes' => $filterexcludes,
@@ -215,7 +218,7 @@ class ScrumController extends AbstractController
$data=$em->getRepository($this->entity)->find($id);
if(!$data) return $this->redirectToRoute($this->route);
- $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$gitealabels);
+ $em->getRepository("App:Scrum")->getGitea($data,$giteaassignees,$giteacolumns,$giteamilestones,$giteateams,$giteaprioritys,$giteatypes,$gitealabels);
// Préférences utilisateur
$filtermilestones = $em->getRepository("App:User")->getUserpreference($this->getUser(),"filtermilestones",$id);
@@ -298,6 +301,7 @@ class ScrumController extends AbstractController
'giteamilestones' => $giteamilestones,
'giteateams' => $giteateams,
'giteaprioritys' => $giteaprioritys,
+ 'giteatypes' => $giteatypes,
'gitealabels' => $gitealabels,
'filtermilestones' => $filtermilestones,
'filterteams' => $filterteams,
diff --git a/src/ninegitea-1.0/src/Controller/ScrumtypeController.php b/src/ninegitea-1.0/src/Controller/ScrumtypeController.php
new file mode 100755
index 0000000..3057475
--- /dev/null
+++ b/src/ninegitea-1.0/src/Controller/ScrumtypeController.php
@@ -0,0 +1,194 @@
+giteaservice = $giteaservice; }
+
+ public function submit($scrumid, Request $request)
+ {
+ // Initialisation de l'enregistrement
+ $em = $this->getDoctrine()->getManager();
+ $scrum=$em->getRepository("App:Scrum")->find($scrumid);
+ $data = new Entity();
+ $data->setScrum($scrum);
+
+ $last = $em->getRepository('App:Scrumtype')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']);
+ if(!$last) $data->setRowid(0);
+ else $data->setRowid($last->getRowid()+1);
+
+ // 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));
+
+ // Récupération des data du formulaire
+ $form->handleRequest($request);
+
+ // Sur erreur
+ $this->getErrorForm(null,$form,$request,$data,"submit");
+
+ // Sur validation
+ if ($form->get('submit')->isClicked() && $form->isValid()) {
+ $data = $form->getData();
+ $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$data->getGiteaid());
+ $data->setGiteajson(json_decode(json_encode($gitealabel), true));
+
+ $em->persist($data);
+ $em->flush();
+
+ // Retour à la liste
+ return $this->render($this->render.'close.html.twig');
+ }
+
+ // Affichage du formulaire
+ return $this->render($this->render.'edit.html.twig', [
+ 'useheader' => false,
+ 'usesidebar' => false,
+ $this->data => $data,
+ 'mode' => 'submit',
+ 'form' => $form->createView()
+ ]);
+ }
+
+ public function update($id,Request $request)
+ {
+ // Initialisation de l'enregistrement
+ $em = $this->getDoctrine()->getManager();
+ $data=$em->getRepository($this->entity)->find($id);
+ $scrum=$data->getScrum();
+
+ // Récupérer les repos de gitea
+ $gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]);
+
+ // Création du formulaire
+ $form = $this->createForm(Form::class,$data,array("mode"=>"submit","gitealabels"=>$gitealabels));
+
+ // Récupération des data du formulaire
+ $form->handleRequest($request);
+
+ // Sur erreur
+ $this->getErrorForm(null,$form,$request,$data,"update");
+
+ // Sur validation
+ if ($form->get('submit')->isClicked() && $form->isValid()) {
+ $data = $form->getData();
+ $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$data->getGiteaid());
+ $data->setGiteajson(json_decode(json_encode($gitealabel), true));
+
+ $em->persist($data);
+ $em->flush();
+
+ // Retour à la liste
+ return $this->render($this->render.'close.html.twig');
+ }
+
+ // Affichage du formulaire
+ return $this->render($this->render.'edit.html.twig', [
+ 'useheader' => false,
+ 'usesidebar' => false,
+ $this->data => $data,
+ 'mode' => 'update',
+ 'form' => $form->createView()
+ ]);
+ }
+
+ public function delete($id,Request $request)
+ {
+ // Initialisation de l'enregistrement
+ $em = $this->getDoctrine()->getManager();
+ $data=$em->getRepository($this->entity)->find($id);
+
+ // Controle avant suppression
+ $error=false;
+ if($id<0) $error=true;
+
+ if($error)
+ return $this->redirectToRoute($this->route."_update",["id"=>$id]);
+ else {
+ $em->remove($data);
+ $em->flush();
+
+ // Retour à la liste
+ return $this->render($this->render.'close.html.twig');
+ }
+ }
+
+ public function select($scrumid, Request $request)
+ {
+ // S'assurer que c'est un appel ajax
+ if (!$request->isXmlHttpRequest()) {
+ return new JsonResponse(array('message' => 'Interdit'), 400);
+ }
+
+ $em = $this->getDoctrine()->getManager();
+ $scrum=$em->getRepository("App:Scrum")->find($scrumid);
+
+ $scrumtypes = $scrum->getScrumtypes();
+ $output=array();
+ foreach($scrumtypes as $scrumtype) {
+ array_push($output,array("id"=>$scrumtype->getId(),"name"=>"".$scrumtype->getName()."
liè au label gitea ".$scrumtype->getGiteajson()["name"].""));
+ }
+
+ $response = new Response(json_encode($output));
+ $response->headers->set('Content-Type', 'application/json');
+ return $response;
+ }
+
+ public function order($scrumid, Request $request)
+ {
+ $em = $this->getDoctrine()->getManager();
+ $scrumtypeids=explode(",",$request->get('lstordered'));
+ $i=1;
+ foreach($scrumtypeids as $id) {
+ $scrumtype=$em->getRepository($this->entity)->find($id);
+ if($scrumtype) {
+ $scrumtype->setRowid($i);
+ $em->persist($scrumtype);
+ $em->flush();
+ }
+ $i++;
+ }
+ $response = new Response();
+ $response->headers->set('Content-Type', 'application/json');
+ return $response;
+ }
+
+ protected function getErrorForm($id,$form,$request,$data,$mode) {
+ if ($form->get('submit')->isClicked()&&$mode=="delete") {
+ }
+
+ if ($form->get('submit')->isClicked() && $mode=="submit") {
+ }
+
+ if ($form->get('submit')->isClicked() && ($mode=="submit" || $mode=="update")) {
+ }
+
+ if ($form->get('submit')->isClicked() && !$form->isValid()) {
+ $this->get('session')->getFlashBag()->clear();
+
+ $errors = $form->getErrors();
+ foreach( $errors as $error ) {
+ $request->getSession()->getFlashBag()->add("error", $error->getMessage());
+ }
+ }
+ }
+}
diff --git a/src/ninegitea-1.0/src/Entity/Scrum.php b/src/ninegitea-1.0/src/Entity/Scrum.php
index 486441d..d7b3524 100644
--- a/src/ninegitea-1.0/src/Entity/Scrum.php
+++ b/src/ninegitea-1.0/src/Entity/Scrum.php
@@ -85,6 +85,12 @@ class Scrum
*/
private $scrumprioritys;
+ /**
+ * @ORM\OneToMany(targetEntity="Scrumtype", mappedBy="scrum", cascade={"persist"}, orphanRemoval=true)
+ * @ORM\OrderBy({"rowid" = "ASC"})
+ */
+ private $scrumtypes;
+
public function getStatistique()
{
$id=-100;
@@ -110,6 +116,7 @@ class Scrum
$this->scrumissues = new ArrayCollection();
$this->scrumteams = new ArrayCollection();
$this->scrumprioritys = new ArrayCollection();
+ $this->scrumtypes = new ArrayCollection();
}
public function getId(): ?int
@@ -340,4 +347,35 @@ class Scrum
return $this;
}
+
+ /**
+ * @return Collection|Scrumtype[]
+ */
+ public function getScrumtypes(): Collection
+ {
+ return $this->scrumtypes;
+ }
+
+ public function addScrumtype(Scrumtype $scrumtype): self
+ {
+ if (!$this->scrumtypes->contains($scrumtype)) {
+ $this->scrumtypes[] = $scrumtype;
+ $scrumtype->setScrum($this);
+ }
+
+ return $this;
+ }
+
+ public function removeScrumtype(Scrumtype $scrumtype): self
+ {
+ if ($this->scrumtypes->contains($scrumtype)) {
+ $this->scrumtypes->removeElement($scrumtype);
+ // set the owning side to null (unless already changed)
+ if ($scrumtype->getScrum() === $this) {
+ $scrumtype->setScrum(null);
+ }
+ }
+
+ return $this;
+ }
}
\ No newline at end of file
diff --git a/src/ninegitea-1.0/src/Entity/Scrumtype.php b/src/ninegitea-1.0/src/Entity/Scrumtype.php
new file mode 100644
index 0000000..d546be6
--- /dev/null
+++ b/src/ninegitea-1.0/src/Entity/Scrumtype.php
@@ -0,0 +1,116 @@
+id;
+ }
+
+ public function getName(): ?string
+ {
+ return $this->name;
+ }
+
+ public function setName(string $name): self
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ public function getRowid(): ?int
+ {
+ return $this->rowid;
+ }
+
+ public function setRowid(int $rowid): self
+ {
+ $this->rowid = $rowid;
+
+ return $this;
+ }
+
+ public function getGiteaid(): ?int
+ {
+ return $this->giteaid;
+ }
+
+ public function setGiteaid(int $giteaid): self
+ {
+ $this->giteaid = $giteaid;
+
+ return $this;
+ }
+
+ public function getGiteajson(): ?array
+ {
+ return $this->giteajson;
+ }
+
+ public function setGiteajson(array $giteajson): self
+ {
+ $this->giteajson = $giteajson;
+
+ return $this;
+ }
+
+ public function getScrum(): ?Scrum
+ {
+ return $this->scrum;
+ }
+
+ public function setScrum(?Scrum $scrum): self
+ {
+ $this->scrum = $scrum;
+
+ return $this;
+ }
+
+}
\ No newline at end of file
diff --git a/src/ninegitea-1.0/src/Form/ScrumtypeType.php b/src/ninegitea-1.0/src/Form/ScrumtypeType.php
new file mode 100644
index 0000000..fe1a616
--- /dev/null
+++ b/src/ninegitea-1.0/src/Form/ScrumtypeType.php
@@ -0,0 +1,58 @@
+add('submit',
+ SubmitType::class, [
+ "label" => "Valider",
+ "attr" => ["class" => "btn btn-success no-print"],
+ ]
+ );
+
+ $builder->add('name',
+ TextType::class, [
+ "label" =>"Nom",
+ ]
+ );
+
+ $choices=[];
+ foreach($options["gitealabels"] as $label) {
+ $choices[$label->name]=$label->id;
+ }
+
+ $builder->add('giteaid',
+ ChoiceType::class, [
+ "label" => "Label Gitea",
+ "choices" => $choices,
+ "disabled" => ($options["mode"]=="submit"?false:true),
+ "placeholder" => "Selectionnez un label gitea",
+ ]
+ );
+ }
+
+ public function configureOptions(OptionsResolver $resolver)
+ {
+ $resolver->setDefaults(array(
+ 'data_class' => 'App\Entity\Scrumtype',
+ 'mode' => 'string',
+ 'gitealabels' => 'string',
+ ));
+ }
+}
diff --git a/src/ninegitea-1.0/src/Repository/ScrumRepository.php b/src/ninegitea-1.0/src/Repository/ScrumRepository.php
index 2a29856..5c02020 100644
--- a/src/ninegitea-1.0/src/Repository/ScrumRepository.php
+++ b/src/ninegitea-1.0/src/Repository/ScrumRepository.php
@@ -36,7 +36,7 @@ class ScrumRepository extends ServiceEntityRepository
return $scrums;
}
}
- public function getGitea($scrum,&$giteaassignees,&$giteacolumns,&$giteamilestones,&$giteateams,&$giteaprioritys,&$gitealabels) {
+ public function getGitea($scrum,&$giteaassignees,&$giteacolumns,&$giteamilestones,&$giteateams,&$giteaprioritys,&$giteatypes,&$gitealabels) {
$viewclosed = $this->session->get("viewclosed");
// Récupérer le dernier order
@@ -69,6 +69,13 @@ class ScrumRepository extends ServiceEntityRepository
array_push($giteaprioritys,$priority->getGiteaid());
}
+ // Récupérer les types
+ $types=$this->_em->getRepository('App:Scrumtype')->findBy(["scrum"=>$scrum], ['rowid' => 'ASC']);
+ $giteatypes=[];
+ foreach($types as $type) {
+ array_push($giteatypes,$type->getGiteaid());
+ }
+
// Récupérer la orga de gitea
if(!empty($scrum->getGiteajson()["owner"]["email"]))
$giteaassignees=[$scrum->getGiteajson()["owner"]];
@@ -105,7 +112,7 @@ class ScrumRepository extends ServiceEntityRepository
if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous reconnecter");
foreach($gitealabels as $key => $gitealabel) {
- if(in_array($gitealabel->id,$giteacolumns)||in_array($gitealabel->id,$giteateams)||in_array($gitealabel->id,$giteaprioritys))
+ if(in_array($gitealabel->id,$giteacolumns)||in_array($gitealabel->id,$giteateams)||in_array($gitealabel->id,$giteaprioritys)||in_array($gitealabel->id,$giteatypes))
unset($gitealabels[$key]);
}
@@ -144,7 +151,7 @@ class ScrumRepository extends ServiceEntityRepository
if(!$giteaissue->milestone&&!is_null($scrumissue->getGiteamilestone()))
$fgissueupdated=true;
- $fgissueupdated=true;
+ //$fgissueupdated=true;
if($fgissueupdated) {
$fgscrumupdate=true;
$this->majissue($scrumissue,$giteaissue);
diff --git a/src/ninegitea-1.0/templates/Issue/list.html.twig b/src/ninegitea-1.0/templates/Issue/list.html.twig
index bb53f90..6b9d81f 100644
--- a/src/ninegitea-1.0/templates/Issue/list.html.twig
+++ b/src/ninegitea-1.0/templates/Issue/list.html.twig
@@ -75,6 +75,15 @@
+