From a5b6ef51a4340c4c20750832cd513ebda7592a6b Mon Sep 17 00:00:00 2001 From: afornerot Date: Wed, 30 Aug 2023 11:15:33 +0200 Subject: [PATCH] export csv et filtre type --- src/ninegitea-1.0/config/routes.yaml | 21 ++ .../src/Controller/IssueController.php | 73 ++++++- .../src/Controller/ScrumController.php | 8 +- .../src/Controller/ScrumtypeController.php | 194 ++++++++++++++++++ src/ninegitea-1.0/src/Entity/Scrum.php | 38 ++++ src/ninegitea-1.0/src/Entity/Scrumtype.php | 116 +++++++++++ src/ninegitea-1.0/src/Form/ScrumtypeType.php | 58 ++++++ .../src/Repository/ScrumRepository.php | 13 +- .../templates/Issue/list.html.twig | 78 ++++++- .../templates/Scrum/edit.html.twig | 88 ++++++++ .../templates/Scrum/view.html.twig | 75 ++++++- .../templates/Scrumtype/close.html.twig | 11 + .../templates/Scrumtype/edit.html.twig | 51 +++++ 13 files changed, 801 insertions(+), 23 deletions(-) create mode 100755 src/ninegitea-1.0/src/Controller/ScrumtypeController.php create mode 100644 src/ninegitea-1.0/src/Entity/Scrumtype.php create mode 100644 src/ninegitea-1.0/src/Form/ScrumtypeType.php create mode 100755 src/ninegitea-1.0/templates/Scrumtype/close.html.twig create mode 100755 src/ninegitea-1.0/templates/Scrumtype/edit.html.twig 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 @@ +
+ + +
+
{% for gitealabel in gitealabels %} - {% if gitealabel not in giteacolumns and gitealabel not in giteateams and gitealabel not in giteaprioritys %} + {% if gitealabel not in giteacolumns and gitealabel not in giteateams and gitealabel not in giteaprioritys and gitealabel not in giteatypes %} {% endif %} {% endfor %} @@ -118,7 +127,7 @@
+
+ + +
+