This commit is contained in:
2025-07-06 21:36:09 +02:00
parent 77160b1905
commit b1df69696f
13 changed files with 955 additions and 51 deletions

View File

@ -2,6 +2,7 @@
namespace App\Controller;
use App\Repository\IssueRepository;
use App\Service\RedmineService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
@ -49,4 +50,14 @@ class HomeController extends AbstractController
'usesidebar' => false,
]);
}
#[Route('/user/issue/{id}', name: 'issue_view')]
public function view(int $id, IssueRepository $issueRepository): Response
{
$issue = $issueRepository->find($id);
return $this->render('issue/view.html.twig', [
'issue' => $issue,
]);
}
}

View File

@ -72,13 +72,18 @@ class ProjectController extends AbstractController
return $this->redirectToRoute('app_admin_project');
}
$form = $this->createForm(ProjectType::class, $project, ['mode' => 'update', 'redmineprojects' => $this->redmineService->getProjects($this->getParameter('redmineApikey'))]);
$redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey'));
$project->setRedmine($redmine);
$em->persist($project);
$em->flush();
$form = $this->createForm(ProjectType::class, $project, ['mode' => 'update', 'redmineprojects' => $this->redmineService->getProjects($this->getParameter('redmineApikey')), 'redmine' => $redmine]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey'));
$project->setRedmine($redmine);
$em->flush();
$this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), true);
$this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false);
return $this->redirectToRoute('app_admin_project');
}
@ -91,6 +96,7 @@ class ProjectController extends AbstractController
'routedelete' => 'app_admin_project_delete',
'mode' => 'update',
'form' => $form,
'project' => $project,
]);
}

View File

@ -27,6 +27,15 @@ class Project
#[ORM\Column(nullable: false)]
private array $redmine;
#[ORM\Column(nullable: true)]
private ?array $hiddenstatuses = null;
#[ORM\Column(nullable: true)]
private ?array $hiddensprints = null;
#[ORM\Column(nullable: true)]
private ?array $hiddenversions = null;
/**
* @var Collection<int, User>
*/
@ -112,6 +121,42 @@ class Project
return $this;
}
public function getHiddenstatuses(): ?array
{
return $this->hiddenstatuses;
}
public function setHiddenstatuses(array $hiddenstatuses): static
{
$this->hiddenstatuses = $hiddenstatuses;
return $this;
}
public function getHiddensprints(): ?array
{
return $this->hiddensprints;
}
public function setHiddensprints(array $hiddensprints): static
{
$this->hiddensprints = $hiddensprints;
return $this;
}
public function getHiddenversions(): ?array
{
return $this->hiddenversions;
}
public function setHiddenversions(array $hiddenversions): static
{
$this->hiddenversions = $hiddenversions;
return $this;
}
/**
* @return Collection<int, User>
*/

View File

@ -21,11 +21,13 @@ class ProjectType extends AbstractType
foreach ($options['redmineprojects'] as $redmine) {
$redmines[$redmine['name']] = $redmine['id'];
}
$builder
->add('id', ChoiceType::class, [
'label' => 'Projet Redmine',
'choices' => $redmines,
'placeholder' => 'Sélectionnez un projet',
'disabled' => ('update' == $options['mode']),
])
->add('submit', SubmitType::class, [
@ -48,6 +50,50 @@ class ProjectType extends AbstractType
'required' => false,
'by_reference' => false,
]);
if ('update' == $options['mode']) {
$redmines = [];
foreach ($options['redmine']['issue_statuses'] as $redmine) {
$redmines[$redmine['name']] = $redmine['id'];
}
$builder
->add('hiddenstatuses', ChoiceType::class, [
'label' => 'Statuts Cachés',
'choices' => $redmines,
'placeholder' => 'Sélectionnez un statut',
'multiple' => true,
'attr' => ['class' => 'select2'],
]);
$redmines = [];
foreach ($options['redmine']['sprints'] as $redmine) {
$redmines[$redmine['name']] = $redmine['id'];
}
$builder
->add('hiddensprints', ChoiceType::class, [
'label' => 'Sprints Cachés',
'choices' => $redmines,
'placeholder' => 'Sélectionnez un sprint',
'multiple' => true,
'attr' => ['class' => 'select2'],
]);
$redmines = [];
foreach ($options['redmine']['versions'] as $redmine) {
$redmines[$redmine['name']] = $redmine['id'];
}
$builder
->add('hiddenversions', ChoiceType::class, [
'label' => 'Versions Cachés',
'choices' => $redmines,
'placeholder' => 'Sélectionnez une version',
'multiple' => true,
'attr' => ['class' => 'select2'],
]);
}
}
public function configureOptions(OptionsResolver $resolver): void
@ -56,6 +102,7 @@ class ProjectType extends AbstractType
'data_class' => Project::class,
'mode' => 'submit',
'redmineprojects' => [],
'redmine' => [],
]);
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Twig;
use Netcarver\Textile\Parser;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
class TextileExtension extends AbstractExtension
{
public function getFilters(): array
{
return [
new TwigFilter('textile_to_html', [$this, 'textileToHtml'], ['is_safe' => ['html']]),
];
}
public function textileToHtml(string $text): string
{
$text = $this->fixTextileTable($text);
$parser = new Parser();
return $parser->parse($text);
}
private function fixTextileTable(string $text): string
{
$lines = explode("\n", $text);
$fixed = [];
foreach ($lines as $line) {
$line = trim($line);
if (!$line) {
$fixed[] = '';
continue;
}
if (preg_match('/^\|.*\|$/', $line)) {
$fixed[] = $line;
continue;
}
// Ligne mal formée potentiellement issue dun tableau
$columns = array_map('trim', explode('|', $line));
$columns = array_filter($columns);
if (count($columns)) {
$fixed[] = '|'.implode('|', $columns).'|';
} else {
$fixed[] = $line;
}
}
return implode("\n", $fixed);
}
}