svg
This commit is contained in:
@ -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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -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>
|
||||
*/
|
||||
|
@ -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' => [],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
55
src/Twig/TextileExtension.php
Normal file
55
src/Twig/TextileExtension.php
Normal 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 d’un tableau
|
||||
$columns = array_map('trim', explode('|', $line));
|
||||
$columns = array_filter($columns);
|
||||
if (count($columns)) {
|
||||
$fixed[] = '|'.implode('|', $columns).'|';
|
||||
} else {
|
||||
$fixed[] = $line;
|
||||
}
|
||||
}
|
||||
|
||||
return implode("\n", $fixed);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user