From f7de5f8f9cb2f0e9a033cddc7cb026be4ce10756 Mon Sep 17 00:00:00 2001 From: afornerot Date: Mon, 7 Jul 2025 17:30:12 +0200 Subject: [PATCH] svg --- src/Controller/HomeController.php | 59 +--- src/Controller/IssueController.php | 85 +++++ src/Controller/ProjectController.php | 63 +++- src/EventListener/SessionListener.php | 49 --- templates/base.html.twig | 15 +- templates/home/home.html.twig | 438 +---------------------- templates/home/noproject.html.twig | 4 - templates/issue/view.html.twig | 2 +- templates/project/view.html.twig | 486 ++++++++++++++++++++++++++ 9 files changed, 639 insertions(+), 562 deletions(-) create mode 100644 src/Controller/IssueController.php delete mode 100644 src/EventListener/SessionListener.php delete mode 100644 templates/home/noproject.html.twig create mode 100644 templates/project/view.html.twig diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 9a7729d..3ca3aa5 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -2,8 +2,6 @@ namespace App\Controller; -use App\Repository\IssueRepository; -use App\Service\RedmineService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -11,49 +9,15 @@ use Symfony\Component\Routing\Attribute\Route; class HomeController extends AbstractController { - private RedmineService $redmineService; - - public function __construct(RedmineService $redmineService) - { - $this->redmineService = $redmineService; - } - #[Route('/', name: 'app_home')] public function home(Request $request): Response { - $project = $request->getSession()->get('project'); - if (!$project) { - return $this->noproject(); - } - - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); - $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false); - - $predmine = $project->getRedmine(); - - foreach ($project->getIssues() as $issue) { - foreach ($predmine['sprints'] as $key => $sprint) { - if ($sprint['id'] === $issue->getRedmine()['sprint']['agile_sprint_id']) { - if (!array_key_exists('story_points', $predmine['sprints'][$key])) { - $predmine['sprints'][$key]['story_points']['total'] = 0; - } - $predmine['sprints'][$key]['story_points']['total'] += $issue->getRedmine()['sprint']['story_points']; - - if (!array_key_exists($issue->getRedmine()['status']['id'], $predmine['sprints'][$key]['story_points'])) { - $predmine['sprints'][$key]['story_points'][$issue->getRedmine()['status']['id']] = 0; - } - $predmine['sprints'][$key]['story_points'][$issue->getRedmine()['status']['id']] += $issue->getRedmine()['sprint']['story_points']; - } - } - } - - $project->setRedmine($predmine); + $projects = $this->getUser()->getProjects(); return $this->render('home/home.html.twig', [ 'usemenu' => true, 'usesidebar' => false, - 'project' => $project, + 'projects' => $projects, ]); } @@ -65,23 +29,4 @@ class HomeController extends AbstractController 'usesidebar' => true, ]); } - - #[Route('/noproject', name: 'app_noproject')] - public function noproject(): Response - { - return $this->render('home/noproject.html.twig', [ - 'usemenu' => true, - '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, - ]); - } } diff --git a/src/Controller/IssueController.php b/src/Controller/IssueController.php new file mode 100644 index 0000000..418bbca --- /dev/null +++ b/src/Controller/IssueController.php @@ -0,0 +1,85 @@ +redmineService = $redmineService; + } + + #[Route('/user/issue/{id}', name: 'app_issue_view')] + public function viewIssue(int $id, IssueRepository $issueRepository): Response + { + $issue = $issueRepository->find($id); + if (!$issue) { + throw new NotFoundHttpException('La ressource demandée est introuvable.'); + } + if (!$issue->getProject()->getUsers()->contains($this->getUser())) { + throw new AccessDeniedException('Vous n\'avez pas accès à cette ressource.'); + } + + return $this->render('issue/view.html.twig', [ + 'issue' => $issue, + ]); + } + + #[Route('/user/issue/order/{id}', name: 'app_issue_order', methods: ['POST'])] + public function orderIssue(int $id, Request $request): JsonResponse + { + $data = $request->request; + + $sourceIssues = $data->all('sourceIssues'); + $source = explode('|', $data->get('source')); + $sourceStatus = $source[0]; + $sourceSprint = $source[1]; + $sourceVersion = $source[2]; + + $target = explode('|', $data->get('target')); + $targetStatus = $target[0]; + $targetSprint = $target[1]; + $targetVersion = $target[2]; + + $targetIssues = $data->all('targetIssues'); + + if (!$sourceIssues || !$source || !$targetIssues || !$target) { + return new JsonResponse(['error' => 'Données incomplètes.'], 400); + } + + $payload = [ + 'fixed_version_id' => $target, + ]; + + // $redmineService->updateIssue($id, $payload); + + // ✅ Tu peux stocker l’ordre si besoin dans Redmine via custom field (optionnel) + // ou en interne selon ta logique métier + + return new JsonResponse([ + 'message' => 'Ordre mis à jour', + 'moved' => $id, + 'sourceIssues' => $sourceIssues, + 'sourceStatus' => $targetStatus, + 'sourceSprint' => $sourceSprint, + 'sourceVersion' => $sourceVersion, + + 'targetIssues' => $targetIssues, + 'targetStatus' => $targetStatus, + 'targetSprint' => $targetSprint, + 'targetVersion' => $targetVersion, + ]); + } +} diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php index 94112f2..3055a66 100644 --- a/src/Controller/ProjectController.php +++ b/src/Controller/ProjectController.php @@ -9,8 +9,10 @@ use App\Repository\ProjectRepository; use App\Service\RedmineService; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Attribute\Route; class ProjectController extends AbstractController @@ -22,6 +24,48 @@ class ProjectController extends AbstractController $this->redmineService = $redmineService; } + #[Route('/user/project/{id}', name: 'app_project_view')] + public function viewProject(int $id, ProjectRepository $projectRepository): Response + { + $project = $projectRepository->find($id); + if (!$project) { + throw new NotFoundHttpException('La ressource demandée est introuvable.'); + } + if (!$project->getUsers()->contains($this->getUser())) { + throw new AccessDeniedException('Vous n\'avez pas accès à cette ressource.'); + } + + $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); + $project->setRedmine($redmine); + $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false); + + $predmine = $project->getRedmine(); + + foreach ($project->getIssues() as $issue) { + foreach ($predmine['sprints'] as $key => $sprint) { + if ($sprint['id'] === $issue->getRedmine()['sprint']['agile_sprint_id']) { + if (!array_key_exists('story_points', $predmine['sprints'][$key])) { + $predmine['sprints'][$key]['story_points']['total'] = 0; + } + $predmine['sprints'][$key]['story_points']['total'] += $issue->getRedmine()['sprint']['story_points']; + + if (!array_key_exists($issue->getRedmine()['status']['id'], $predmine['sprints'][$key]['story_points'])) { + $predmine['sprints'][$key]['story_points'][$issue->getRedmine()['status']['id']] = 0; + } + $predmine['sprints'][$key]['story_points'][$issue->getRedmine()['status']['id']] += $issue->getRedmine()['sprint']['story_points']; + } + } + } + + $project->setRedmine($predmine); + + return $this->render('project/view.html.twig', [ + 'usemenu' => true, + 'usesidebar' => false, + 'project' => $project, + ]); + } + #[Route('/admin/project', name: 'app_admin_project')] public function list(ProjectRepository $projectRepository): Response { @@ -66,11 +110,11 @@ class ProjectController extends AbstractController } #[Route('/admin/project/update/{id}', name: 'app_admin_project_update')] - public function update(int $id, Request $request, EntityManagerInterface $em): Response + public function update(int $id, Request $request, ProjectRepository $projectRepository, EntityManagerInterface $em): Response { - $project = $em->getRepository(Project::class)->find($id); + $project = $projectRepository->find($id); if (!$project) { - return $this->redirectToRoute('app_admin_project'); + throw new NotFoundHttpException('La ressource demandée est introuvable.'); } $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); @@ -102,11 +146,11 @@ class ProjectController extends AbstractController } #[Route('/admin/project/reclone/{id}', name: 'app_admin_project_reclone')] - public function reclone(int $id, EntityManagerInterface $em): Response + public function reclone(int $id, ProjectRepository $projectRepository, EntityManagerInterface $em): Response { - $project = $em->getRepository(Project::class)->find($id); + $project = $projectRepository->find($id); if (!$project) { - return $this->redirectToRoute('app_admin_project'); + throw new NotFoundHttpException('La ressource demandée est introuvable.'); } $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); @@ -118,12 +162,11 @@ class ProjectController extends AbstractController } #[Route('/admin/project/delete/{id}', name: 'app_admin_project_delete')] - public function delete(int $id, EntityManagerInterface $em): Response + public function delete(int $id, ProjectRepository $projectRepository, EntityManagerInterface $em): Response { - // Récupération de l'enregistrement courant - $project = $em->getRepository(Project::class)->find($id); + $project = $projectRepository->find($id); if (!$project) { - return $this->redirectToRoute('app_admin_project'); + throw new NotFoundHttpException('La ressource demandée est introuvable.'); } $users = $em->getRepository(User::class)->findBy(['project' => $project]); diff --git a/src/EventListener/SessionListener.php b/src/EventListener/SessionListener.php deleted file mode 100644 index 4611092..0000000 --- a/src/EventListener/SessionListener.php +++ /dev/null @@ -1,49 +0,0 @@ -security = $security; - $this->router = $router; - } - - #[AsEventListener(event: KernelEvents::REQUEST)] - public function onKernelRequest(RequestEvent $event): void - { - $request = $event->getRequest(); - $session = $request->getSession(); - - $user = $this->security->getUser(); - if ($user instanceof User) { - // Intialisation de la compagnie en cours - if (!$user->getProject()) { - if ($user->getProjects()) { - $user->setProject($user->getProjects()[0]); - } - } - - $session->set('project', $user->getProject()); - $session->set('projects', $user->getProjects()); - - $currentPath = $request->getPathInfo(); - $noProjectPath = $this->router->generate('app_noproject'); - if (!$user->getProject() && 0 === stripos($currentPath, 'noproject')) { - $event->setResponse(new RedirectResponse($noProjectPath)); - } - } - } -} diff --git a/templates/base.html.twig b/templates/base.html.twig index c801bf1..05a7046 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -43,11 +43,7 @@