essai de réparation
This commit is contained in:
commit
f7964bf9d7
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@ -1,8 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
###> doctrine/doctrine-bundle ###
|
###> doctrine/doctrine-bundle ###
|
||||||
database:
|
database:
|
||||||
@ -16,3 +15,4 @@ services:
|
|||||||
MP_SMTP_AUTH_ACCEPT_ANY: 1
|
MP_SMTP_AUTH_ACCEPT_ANY: 1
|
||||||
MP_SMTP_AUTH_ALLOW_INSECURE: 1
|
MP_SMTP_AUTH_ALLOW_INSECURE: 1
|
||||||
###< symfony/mailer ###
|
###< symfony/mailer ###
|
||||||
|
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
###> doctrine/doctrine-bundle ###
|
###> doctrine/doctrine-bundle ###
|
||||||
database:
|
database:
|
||||||
image: postgres:${POSTGRES_VERSION:-16}-alpine
|
image: postgres:${POSTGRES_VERSION:-16}-alpine
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: ${POSTGRES_DB:-app}
|
POSTGRES_DB: ${POSTGRES_DB:-hegresphere}
|
||||||
# You should definitely change the password in production
|
# You should definitely change the password in production
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!}
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-Btssio2024}
|
||||||
POSTGRES_USER: ${POSTGRES_USER:-app}
|
POSTGRES_USER: ${POSTGRES_USER:-bourgoino}
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "pg_isready", "-d", "${POSTGRES_DB:-app}", "-U", "${POSTGRES_USER:-app}"]
|
test: ["CMD", "pg_isready", "-d", "${POSTGRES_DB:-app}", "-U", "${POSTGRES_USER:-app}"]
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
@ -23,3 +22,4 @@ volumes:
|
|||||||
###> doctrine/doctrine-bundle ###
|
###> doctrine/doctrine-bundle ###
|
||||||
database_data:
|
database_data:
|
||||||
###< doctrine/doctrine-bundle ###
|
###< doctrine/doctrine-bundle ###
|
||||||
|
|
||||||
|
@ -42,8 +42,10 @@
|
|||||||
"symfony/validator": "7.1.*",
|
"symfony/validator": "7.1.*",
|
||||||
"symfony/web-link": "7.1.*",
|
"symfony/web-link": "7.1.*",
|
||||||
"symfony/yaml": "7.1.*",
|
"symfony/yaml": "7.1.*",
|
||||||
|
"symfonycasts/sass-bundle": "^0.7.0",
|
||||||
"twig/extra-bundle": "^2.12|^3.0",
|
"twig/extra-bundle": "^2.12|^3.0",
|
||||||
"twig/twig": "^2.12|^3.0"
|
"twig/twig": "^2.12|^3.0",
|
||||||
|
"ext-http": "*"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"allow-plugins": {
|
"allow-plugins": {
|
||||||
@ -100,7 +102,7 @@
|
|||||||
"symfony/browser-kit": "7.1.*",
|
"symfony/browser-kit": "7.1.*",
|
||||||
"symfony/css-selector": "7.1.*",
|
"symfony/css-selector": "7.1.*",
|
||||||
"symfony/debug-bundle": "7.1.*",
|
"symfony/debug-bundle": "7.1.*",
|
||||||
"symfony/maker-bundle": "^1.0",
|
"symfony/maker-bundle": "^1.61",
|
||||||
"symfony/phpunit-bridge": "^7.1",
|
"symfony/phpunit-bridge": "^7.1",
|
||||||
"symfony/stopwatch": "7.1.*",
|
"symfony/stopwatch": "7.1.*",
|
||||||
"symfony/web-profiler-bundle": "7.1.*"
|
"symfony/web-profiler-bundle": "7.1.*"
|
||||||
|
63
composer.lock
generated
63
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "1bc99d81c026aaf4e662ffffde457d04",
|
"content-hash": "39f4377209acc13ab9e977a5301faef0",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "composer/semver",
|
"name": "composer/semver",
|
||||||
@ -7423,6 +7423,61 @@
|
|||||||
],
|
],
|
||||||
"time": "2025-01-07T12:50:05+00:00"
|
"time": "2025-01-07T12:50:05+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "symfonycasts/sass-bundle",
|
||||||
|
"version": "v0.7.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/SymfonyCasts/sass-bundle.git",
|
||||||
|
"reference": "d88601c50eff716d9273dffbd736adefdc19e2fc"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/SymfonyCasts/sass-bundle/zipball/d88601c50eff716d9273dffbd736adefdc19e2fc",
|
||||||
|
"reference": "d88601c50eff716d9273dffbd736adefdc19e2fc",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.1",
|
||||||
|
"symfony/asset-mapper": "^6.3|^7.0",
|
||||||
|
"symfony/console": "^5.4|^6.3|^7.0",
|
||||||
|
"symfony/filesystem": "^5.4|^6.3|^7.0",
|
||||||
|
"symfony/http-client": "^5.4|^6.3|^7.0",
|
||||||
|
"symfony/process": "^5.4|^6.3|^7.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"matthiasnoback/symfony-config-test": "^5.0",
|
||||||
|
"phpstan/phpstan-symfony": "^1.4",
|
||||||
|
"symfony/framework-bundle": "^6.3|^7.0",
|
||||||
|
"symfony/phpunit-bridge": "^6.3|^7.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfonycasts\\SassBundle\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Mathéo Daninos",
|
||||||
|
"homepage": "https://github.com/WebMamba"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Delightful Sass Support for Symfony + AssetMapper",
|
||||||
|
"keywords": [
|
||||||
|
"asset-mapper",
|
||||||
|
"sass"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/SymfonyCasts/sass-bundle/issues",
|
||||||
|
"source": "https://github.com/SymfonyCasts/sass-bundle/tree/v0.7.0"
|
||||||
|
},
|
||||||
|
"time": "2024-05-22T14:59:07+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/extra-bundle",
|
"name": "twig/extra-bundle",
|
||||||
"version": "v3.21.0",
|
"version": "v3.21.0",
|
||||||
@ -9914,7 +9969,7 @@
|
|||||||
],
|
],
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"minimum-stability": "stable",
|
"minimum-stability": "stable",
|
||||||
"stability-flags": {},
|
"stability-flags": [],
|
||||||
"prefer-stable": true,
|
"prefer-stable": true,
|
||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": {
|
"platform": {
|
||||||
@ -9922,6 +9977,6 @@
|
|||||||
"ext-ctype": "*",
|
"ext-ctype": "*",
|
||||||
"ext-iconv": "*"
|
"ext-iconv": "*"
|
||||||
},
|
},
|
||||||
"platform-dev": {},
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.6.0"
|
"plugin-api-version": "2.3.0"
|
||||||
}
|
}
|
||||||
|
@ -13,4 +13,5 @@ return [
|
|||||||
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
|
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
|
||||||
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
|
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
|
||||||
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
|
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
|
||||||
|
Symfonycasts\SassBundle\SymfonycastsSassBundle::class => ['all' => true],
|
||||||
];
|
];
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
security:
|
security:
|
||||||
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
|
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
|
||||||
password_hashers:
|
password_hashers:
|
||||||
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'plaintext' # à mettre en auto pour sécuriser les mdp
|
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' # à mettre en auto pour sécuriser les mdp
|
||||||
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
|
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
|
||||||
providers:
|
providers:
|
||||||
# used to reload user from session & other features (e.g. switch_user)
|
# used to reload user from session & other features (e.g. switch_user)
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
# Put parameters here that don't need to change on each machine where the app is deployed
|
# Put parameters here that don't need to change on each machine where the app is deployed
|
||||||
# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
|
# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
|
||||||
parameters:
|
parameters:
|
||||||
|
app.jwtsecret : '%env(JWT_SECRET)%'
|
||||||
|
cv_directory: '%kernel.project_dir%/public/cv'
|
||||||
services:
|
services:
|
||||||
# default configuration for services in *this* file
|
# default configuration for services in *this* file
|
||||||
_defaults:
|
_defaults:
|
||||||
|
7
public/js/map.js
Normal file
7
public/js/map.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<script src="{{ asset('js/map.js') }}"></script>
|
||||||
|
|
||||||
|
// initialize the map on the "map" div with a given center and zoom
|
||||||
|
var map = L.map('map', {
|
||||||
|
center: [51.505, -0.09],
|
||||||
|
zoom: 13
|
||||||
|
});
|
@ -5,6 +5,7 @@ namespace App\Controller;
|
|||||||
use App\Entity\Announcement;
|
use App\Entity\Announcement;
|
||||||
use App\Form\AnnouncementType;
|
use App\Form\AnnouncementType;
|
||||||
use App\Repository\AnnouncementRepository;
|
use App\Repository\AnnouncementRepository;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
@ -14,13 +15,17 @@ use Symfony\Component\Routing\Attribute\Route;
|
|||||||
#[Route('/announcement')]
|
#[Route('/announcement')]
|
||||||
final class AnnouncementController extends AbstractController
|
final class AnnouncementController extends AbstractController
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly AnnouncementRepository $announcementRepository,
|
||||||
|
){}
|
||||||
#[Route('/', name: 'app_announcement_index')]
|
#[Route('/', name: 'app_announcement_index')]
|
||||||
public function list(Request $request, AnnouncementRepository $announcementRepository): Response
|
public function list(Request $request,): Response
|
||||||
{
|
{
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
$announcements = [];
|
$announcements = [];
|
||||||
|
|
||||||
// Récupérer les paramètres de recherche
|
|
||||||
$companyName = $request->query->get('company_name');
|
$companyName = $request->query->get('company_name');
|
||||||
$location = $request->query->get('location');
|
$location = $request->query->get('location');
|
||||||
$category = $request->query->get('category');
|
$category = $request->query->get('category');
|
||||||
@ -29,9 +34,9 @@ final class AnnouncementController extends AbstractController
|
|||||||
$showNonValidated = $request->query->get('show_non_validated');
|
$showNonValidated = $request->query->get('show_non_validated');
|
||||||
|
|
||||||
if ($showNonValidated) {
|
if ($showNonValidated) {
|
||||||
$announcements = $announcementRepository->findBy(['status' => 'notVerified']);
|
$announcements = $this->announcementRepository->findBy(['status' => 'notVerified']);
|
||||||
} else {
|
} else {
|
||||||
$announcements = $announcementRepository->findAll();
|
$announcements = $this->announcementRepository->findAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,28 +44,37 @@ final class AnnouncementController extends AbstractController
|
|||||||
$company = $user->getCompany();
|
$company = $user->getCompany();
|
||||||
|
|
||||||
if ($company) {
|
if ($company) {
|
||||||
$announcements = $announcementRepository->findBy(['company' => $company]);
|
$announcements = $this->announcementRepository->findBy(['company' => $company]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array('ROLE_INTERN', $user->getRoles())) {
|
if (in_array('ROLE_INTERN', $user->getRoles())) {
|
||||||
$announcements = $announcementRepository->findBy(['status' => 'Verified']);
|
$announcements = $this->announcementRepository->findBy(['status' => 'Verified']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filtrer les annonces en fonction des critères de recherche
|
|
||||||
if ($companyName || $location || $category) {
|
if ($companyName || $location || $category) {
|
||||||
$announcements = $announcementRepository->searchAnnouncements($companyName, $location, $category);
|
$announcements = $this->announcementRepository->searchAnnouncements($companyName, $location, $category);
|
||||||
|
}
|
||||||
|
|
||||||
|
$favorites = [];
|
||||||
|
if (in_array('ROLE_INTERN', $user->getRoles())) {
|
||||||
|
$favorites = array_map(
|
||||||
|
fn($f) => $f->getAnnouncement()->getId(),
|
||||||
|
$user->getFavorites()->toArray()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('announcement/index.html.twig', [
|
return $this->render('announcement/index.html.twig', [
|
||||||
'announcements' => $announcements,
|
'announcements' => $announcements,
|
||||||
|
'favorites' => $favorites,
|
||||||
'showNonValidated' => $request->query->get('show_non_validated', false),
|
'showNonValidated' => $request->query->get('show_non_validated', false),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[Route('/new', name: 'app_announcement_new', methods: ['GET', 'POST'])]
|
#[Route('/new', name: 'app_announcement_new', methods: ['GET', 'POST'])]
|
||||||
public function new(Request $request, EntityManagerInterface $entityManager): Response
|
public function new(Request $request,): Response
|
||||||
{
|
{
|
||||||
/*$user = $this->getUser();
|
/*$user = $this->getUser();
|
||||||
|
|
||||||
@ -81,8 +95,8 @@ final class AnnouncementController extends AbstractController
|
|||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$announcement->setCreationDate(new \DateTime());
|
$announcement->setCreationDate(new \DateTime());
|
||||||
$announcement->setStatus('notVerified');
|
$announcement->setStatus('notVerified');
|
||||||
$entityManager->persist($announcement);
|
$this->entityManager->persist($announcement);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_announcement_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_announcement_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -102,13 +116,13 @@ final class AnnouncementController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_announcement_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_announcement_edit', methods: ['GET', 'POST'])]
|
||||||
public function edit(Request $request, Announcement $announcement, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, Announcement $announcement,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(AnnouncementType::class, $announcement);
|
$form = $this->createForm(AnnouncementType::class, $announcement);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_announcement_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_announcement_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -120,23 +134,23 @@ final class AnnouncementController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_announcement_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_announcement_delete', methods: ['POST'])]
|
||||||
public function delete(Request $request, Announcement $announcement, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, Announcement $announcement,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$announcement->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$announcement->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($announcement);
|
$this->entityManager->remove($announcement);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_announcement_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_announcement_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}/validate', name: 'app_announcement_validate', methods: ['POST'])]
|
#[Route('/{id}/validate', name: 'app_announcement_validate', methods: ['POST'])]
|
||||||
public function validate(Request $request, Announcement $announcement, EntityManagerInterface $entityManager): Response
|
public function validate(Request $request, Announcement $announcement,): Response
|
||||||
{
|
{
|
||||||
if ($announcement->getStatus() !== 'Verified')
|
if ($announcement->getStatus() !== 'Verified')
|
||||||
{
|
{
|
||||||
$announcement->setStatus('Verified');
|
$announcement->setStatus('Verified');
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
return $this->redirectToRoute('app_announcement_show',
|
return $this->redirectToRoute('app_announcement_show',
|
||||||
['id' => $announcement->getId()], Response::HTTP_SEE_OTHER);
|
['id' => $announcement->getId()], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -4,7 +4,9 @@ namespace App\Controller;
|
|||||||
|
|
||||||
use App\Entity\Company;
|
use App\Entity\Company;
|
||||||
use App\Form\CompanyType;
|
use App\Form\CompanyType;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
use App\Repository\CompanyRepository;
|
use App\Repository\CompanyRepository;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
@ -15,25 +17,29 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
|
|||||||
#[Route('/company')]
|
#[Route('/company')]
|
||||||
final class CompanyController extends AbstractController
|
final class CompanyController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly CompanyRepository $companyRepository,
|
||||||
|
){}
|
||||||
#[Route(name: 'app_company_index', methods: ['GET'])]
|
#[Route(name: 'app_company_index', methods: ['GET'])]
|
||||||
public function index(CompanyRepository $companyRepository): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('company/index.html.twig', [
|
return $this->render('company/index.html.twig', [
|
||||||
'companies' => $companyRepository->findAll(),
|
'companies' => $this->companyRepository->findAll(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/new', name: 'app_company_new', methods: ['GET', 'POST'])]
|
#[Route('/new', name: 'app_company_new', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function new(Request $request, EntityManagerInterface $entityManager): Response
|
public function new(Request $request,): Response
|
||||||
{
|
{
|
||||||
$company = new Company();
|
$company = new Company();
|
||||||
$form = $this->createForm(CompanyType::class, $company);
|
$form = $this->createForm(CompanyType::class, $company);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->persist($company);
|
$this->entityManager->persist($company);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -54,13 +60,13 @@ final class CompanyController extends AbstractController
|
|||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_company_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_company_edit', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function edit(Request $request, Company $company, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, Company $company,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(CompanyType::class, $company);
|
$form = $this->createForm(CompanyType::class, $company);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -72,11 +78,11 @@ final class CompanyController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_company_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_company_delete', methods: ['POST'])]
|
||||||
public function delete(Request $request, Company $company, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, Company $company,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$company->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$company->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($company);
|
$this->entityManager->remove($company);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_company_index', [], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -5,7 +5,9 @@ namespace App\Controller;
|
|||||||
use App\Entity\Degree;
|
use App\Entity\Degree;
|
||||||
use App\Entity\InternDegree;
|
use App\Entity\InternDegree;
|
||||||
use App\Form\DegreeType;
|
use App\Form\DegreeType;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
use App\Repository\DegreeRepository;
|
use App\Repository\DegreeRepository;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
@ -15,24 +17,28 @@ use Symfony\Component\Routing\Attribute\Route;
|
|||||||
#[Route('/degree')]
|
#[Route('/degree')]
|
||||||
final class DegreeController extends AbstractController
|
final class DegreeController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly DegreeRepository $degreeRepository,
|
||||||
|
){}
|
||||||
#[Route(name: 'app_degree_index', methods: ['GET'])]
|
#[Route(name: 'app_degree_index', methods: ['GET'])]
|
||||||
public function index(DegreeRepository $degreeRepository): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('degree/index.html.twig', [
|
return $this->render('degree/index.html.twig', [
|
||||||
'degrees' => $degreeRepository->findAll(),
|
'degrees' => $this->degreeRepository->findAll(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/new', name: 'app_degree_new', methods: ['GET', 'POST'])]
|
#[Route('/new', name: 'app_degree_new', methods: ['GET', 'POST'])]
|
||||||
public function new(Request $request, EntityManagerInterface $entityManager): Response
|
public function new(Request $request,): Response
|
||||||
{
|
{
|
||||||
$degree = new Degree();
|
$degree = new Degree();
|
||||||
$form = $this->createForm(DegreeType::class, $degree);
|
$form = $this->createForm(DegreeType::class, $degree);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->persist($degree);
|
$this->entityManager->persist($degree);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -52,13 +58,13 @@ final class DegreeController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_degree_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_degree_edit', methods: ['GET', 'POST'])]
|
||||||
public function edit(Request $request, Degree $degree, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, Degree $degree,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(DegreeType::class, $degree);
|
$form = $this->createForm(DegreeType::class, $degree);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -70,11 +76,11 @@ final class DegreeController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_degree_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_degree_delete', methods: ['POST'])]
|
||||||
public function delete(Request $request, Degree $degree, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, Degree $degree,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$degree->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$degree->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($degree);
|
$this->entityManager->remove($degree);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_degree_index', [], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -33,7 +33,7 @@ final class EmployeeController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_employee_show', methods: ['GET'])]
|
#[Route('/{id}', name: 'app_employee_show', requirements: ['id' => '\d+'], methods: ['GET'])]
|
||||||
public function show(Employee $employee): Response
|
public function show(Employee $employee): Response
|
||||||
{
|
{
|
||||||
return $this->render('employee/show.html.twig', [
|
return $this->render('employee/show.html.twig', [
|
||||||
@ -41,7 +41,7 @@ final class EmployeeController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_employee_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_employee_edit', requirements: ['id' => '\d+'], methods: ['GET', 'POST'])]
|
||||||
public function edit(Request $request, Employee $employee): Response
|
public function edit(Request $request, Employee $employee): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(EmployeeType::class, $employee);
|
$form = $this->createForm(EmployeeType::class, $employee);
|
||||||
@ -59,7 +59,7 @@ final class EmployeeController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_employee_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_employee_delete', requirements: ['id' => '\d+'], methods: ['POST'])]
|
||||||
public function delete(Request $request, Employee $employee): Response
|
public function delete(Request $request, Employee $employee): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$employee->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$employee->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
@ -70,7 +70,7 @@ final class EmployeeController extends AbstractController
|
|||||||
return $this->redirectToRoute('app_employee_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_employee_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/seeApplications', name: 'app_employee_applications')]
|
#[Route('/seeApplications', name: 'app_employee_seeApplications')]
|
||||||
public function seeApplications(): Response
|
public function seeApplications(): Response
|
||||||
{
|
{
|
||||||
$employee = $this->getUser();
|
$employee = $this->getUser();
|
||||||
@ -85,12 +85,38 @@ final class EmployeeController extends AbstractController
|
|||||||
->findBy(['company' => $company]);
|
->findBy(['company' => $company]);
|
||||||
|
|
||||||
$applications = $this->internApplicationRepository
|
$applications = $this->internApplicationRepository
|
||||||
->findBy(['announcement' => $announcements]);
|
->findBy(['application' => $announcements]);
|
||||||
|
|
||||||
return $this->render('employee/applications.html.twig', [
|
return $this->render('employee/applications.html.twig', [
|
||||||
'applications' => $applications,
|
'applications' => $applications,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/application/{id}/update-status/{status}', name: 'app_employee_update_application_status', methods: ['POST'])]
|
||||||
|
public function updateApplicationStatus(int $id, string $status): Response
|
||||||
|
{
|
||||||
|
$employee = $this->getUser();
|
||||||
|
|
||||||
|
if (!$employee instanceof Employee) {
|
||||||
|
throw $this->createAccessDeniedException('Seuls les employés peuvent accéder à cette action.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$application = $this->internApplicationRepository->find($id);
|
||||||
|
|
||||||
|
if (!$application) {
|
||||||
|
throw $this->createNotFoundException('Candidature introuvable.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$company = $employee->getCompany();
|
||||||
|
if ($application->getApplication()->getCompany() !== $company) {
|
||||||
|
throw $this->createAccessDeniedException('Cette candidature ne vous appartient pas.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$application->setStatus($status);
|
||||||
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
$this->addFlash('success', 'Le statut de la candidature a bien été mis à jour.');
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_employee_seeApplications');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,9 @@ namespace App\Controller;
|
|||||||
|
|
||||||
use App\Entity\FAQ;
|
use App\Entity\FAQ;
|
||||||
use App\Form\FAQType;
|
use App\Form\FAQType;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
use App\Repository\FAQRepository;
|
use App\Repository\FAQRepository;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
@ -15,17 +17,21 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
|
|||||||
#[Route('/faq')]
|
#[Route('/faq')]
|
||||||
final class FAQController extends AbstractController
|
final class FAQController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly FaqRepository $faqRepository,
|
||||||
|
){}
|
||||||
#[Route(name: 'app_faq_index', methods: ['GET'])]
|
#[Route(name: 'app_faq_index', methods: ['GET'])]
|
||||||
public function index(FAQRepository $fAQRepository): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('faq/index.html.twig', [
|
return $this->render('faq/index.html.twig', [
|
||||||
'faqs' => $fAQRepository->findAll(),
|
'faqs' => $this->faqRepository->findAll(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/new', name: 'app_faq_new', methods: ['GET', 'POST'])]
|
#[Route('/new', name: 'app_faq_new', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function new(Request $request, EntityManagerInterface $entityManager): Response
|
public function new(Request $request,): Response
|
||||||
{
|
{
|
||||||
$fAQ = new FAQ();
|
$fAQ = new FAQ();
|
||||||
$form = $this->createForm(FAQType::class, $fAQ);
|
$form = $this->createForm(FAQType::class, $fAQ);
|
||||||
@ -33,8 +39,8 @@ final class FAQController extends AbstractController
|
|||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$fAQ->setUpdateDate(new \DateTime());
|
$fAQ->setUpdateDate(new \DateTime());
|
||||||
$entityManager->persist($fAQ);
|
$this->entityManager->persist($fAQ);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -55,14 +61,14 @@ final class FAQController extends AbstractController
|
|||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_faq_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_faq_edit', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function edit(Request $request, FAQ $fAQ, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, FAQ $fAQ,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(FAQType::class, $fAQ);
|
$form = $this->createForm(FAQType::class, $fAQ);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$fAQ->setUpdateDate(new \DateTime());
|
$fAQ->setUpdateDate(new \DateTime());
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -75,11 +81,11 @@ final class FAQController extends AbstractController
|
|||||||
|
|
||||||
#[Route('/{id}', name: 'app_faq_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_faq_delete', methods: ['POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function delete(Request $request, FAQ $fAQ, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, FAQ $fAQ,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$fAQ->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$fAQ->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($fAQ);
|
$this->entityManager->remove($fAQ);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_faq_index', [], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
namespace App\Controller;
|
namespace App\Controller;
|
||||||
|
|
||||||
use App\Entity\UserApp;
|
use App\Entity\UserApp;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
use App\Repository\CompanyRepository;
|
use App\Repository\CompanyRepository;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
@ -7,22 +7,43 @@ use App\Entity\Degree;
|
|||||||
use App\Entity\Intern;
|
use App\Entity\Intern;
|
||||||
use App\Entity\InternApplication;
|
use App\Entity\InternApplication;
|
||||||
use App\Entity\InternDegree;
|
use App\Entity\InternDegree;
|
||||||
|
use App\Entity\InternSkill;
|
||||||
|
use App\Entity\Skill;
|
||||||
use App\Form\InternType;
|
use App\Form\InternType;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
|
use App\Repository\DegreeRepository;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
|
use App\Repository\InternDegreeRepository;
|
||||||
use App\Repository\InternRepository;
|
use App\Repository\InternRepository;
|
||||||
|
use App\Repository\InternSkillRepository;
|
||||||
|
use App\Repository\SkillRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\FileType;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
|
use Symfony\Component\Validator\Constraints\File;
|
||||||
|
|
||||||
#[Route('/intern')]
|
#[Route('/intern')]
|
||||||
final class InternController extends AbstractController
|
final class InternController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly AnnouncementRepository $announcementRepository,
|
||||||
|
private readonly InternRepository $internRepository,
|
||||||
|
private readonly InternApplicationRepository $internApplicationRepository,
|
||||||
|
private readonly InternDegreeRepository $internDegreeRepository,
|
||||||
|
private readonly InternSkillRepository $internSkillRepository,
|
||||||
|
private readonly DegreeRepository $degreeRepository,
|
||||||
|
private readonly SkillRepository $skillRepository,
|
||||||
|
){}
|
||||||
#[Route(name: 'app_intern_index', methods: ['GET'])]
|
#[Route(name: 'app_intern_index', methods: ['GET'])]
|
||||||
public function index(InternRepository $internRepository): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('intern/index.html.twig', [
|
return $this->render('intern/index.html.twig', [
|
||||||
'interns' => $internRepository->findAll(),
|
'interns' => $this->internRepository->findAll(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,13 +56,13 @@ final class InternController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_intern_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_intern_edit', methods: ['GET', 'POST'])]
|
||||||
public function edit(Request $request, Intern $intern, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, Intern $intern,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(InternType::class, $intern);
|
$form = $this->createForm(InternType::class, $intern);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -52,19 +73,76 @@ final class InternController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/{id}/resume', name: 'app_intern_resume', methods: ['GET', 'POST'])]
|
||||||
|
public function addResume(Request $request, Intern $intern, EntityManagerInterface $entityManager, #[Autowire('%cv_directory%')] string $cvDirectory): Response
|
||||||
|
{
|
||||||
|
// Création d'un formulaire spécifique pour le CV plutôt que d'utiliser InternType entier
|
||||||
|
$form = $this->createFormBuilder($intern)
|
||||||
|
->add('resume', FileType::class, [
|
||||||
|
'label' => 'CV : ',
|
||||||
|
'mapped' => false, // Ne pas lier directement à l'entité
|
||||||
|
'constraints' => [
|
||||||
|
new File([
|
||||||
|
'maxSize' => '1024k',
|
||||||
|
'mimeTypes' => [
|
||||||
|
'application/pdf',
|
||||||
|
'application/x-pdf',
|
||||||
|
],
|
||||||
|
'mimeTypesMessage' => 'Merci de bien vouloir envoyer un fichier PDF valide.',
|
||||||
|
])
|
||||||
|
],
|
||||||
|
])
|
||||||
|
->getForm();
|
||||||
|
|
||||||
|
$form->handleRequest($request);
|
||||||
|
|
||||||
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
|
$cvFile = $form->get('resume')->getData();
|
||||||
|
|
||||||
|
if ($cvFile) {
|
||||||
|
// Génération d'un nom de fichier unique
|
||||||
|
$newFilename = $intern->getId().'_'.date("d-m-Y").'_'.random_int(0,99999999).'.pdf';
|
||||||
|
|
||||||
|
// Déplacement vers le répertoire de stockage
|
||||||
|
$cvFile->move(
|
||||||
|
$cvDirectory,
|
||||||
|
$newFilename
|
||||||
|
);
|
||||||
|
|
||||||
|
if($intern->getResume() !== null){
|
||||||
|
unlink($cvDirectory.'/'.$intern->getResume());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mise à jour de l'entité avec le nom du fichier
|
||||||
|
$intern->setResume($newFilename);
|
||||||
|
$intern->setResumeName($cvFile->getClientOriginalName()); // Conserver le nom original du fichier
|
||||||
|
}
|
||||||
|
|
||||||
|
$entityManager->flush();
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_profile', [], Response::HTTP_SEE_OTHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('intern/resume.html.twig', [
|
||||||
|
'intern' => $intern,
|
||||||
|
'form' => $form->createView(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_intern_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_intern_delete', methods: ['POST'])]
|
||||||
public function delete(Request $request, Intern $intern, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, Intern $intern,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$intern->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$intern->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($intern);
|
$this->entityManager->remove($intern);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_intern_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/degrees/add', name:'app_intern_add_degrees', methods:['POST'])]
|
#[Route('/degrees/add', name:'app_intern_add_degrees', methods:['POST'])]
|
||||||
public function addDegrees(Request $request, EntityManagerInterface $entityManager): Response
|
public function addDegrees(Request $request): Response
|
||||||
{
|
{
|
||||||
$intern = $this->getUser();
|
$intern = $this->getUser();
|
||||||
|
|
||||||
@ -79,17 +157,14 @@ final class InternController extends AbstractController
|
|||||||
return $this->redirectToRoute('app_degree_index');
|
return $this->redirectToRoute('app_degree_index');
|
||||||
}
|
}
|
||||||
|
|
||||||
$degreeRepository = $entityManager->getRepository(Degree::class);
|
|
||||||
$internDegreeRepository = $entityManager->getRepository(InternDegree::class);
|
|
||||||
|
|
||||||
foreach ($selectedDegreeIds as $degreeId) {
|
foreach ($selectedDegreeIds as $degreeId) {
|
||||||
$degree = $degreeRepository->find($degreeId);
|
$degree = $this->degreeRepository->find($degreeId);
|
||||||
|
|
||||||
if (!$degree) {
|
if (!$degree) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$existingInternDegree = $internDegreeRepository->findOneBy([
|
$existingInternDegree = $this->internDegreeRepository->findOneBy([
|
||||||
'intern' => $intern,
|
'intern' => $intern,
|
||||||
'degree' => $degree
|
'degree' => $degree
|
||||||
]);
|
]);
|
||||||
@ -100,11 +175,11 @@ final class InternController extends AbstractController
|
|||||||
$internDegree->setDegree($degree);
|
$internDegree->setDegree($degree);
|
||||||
$internDegree->setGraduationDate(new \DateTime());
|
$internDegree->setGraduationDate(new \DateTime());
|
||||||
|
|
||||||
$entityManager->persist($internDegree);
|
$this->entityManager->persist($internDegree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
$this->addFlash('success', 'Les diplômes ont été ajoutés avec succès.');
|
$this->addFlash('success', 'Les diplômes ont été ajoutés avec succès.');
|
||||||
|
|
||||||
@ -112,20 +187,17 @@ final class InternController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/application/send', name:'app_intern_send_application', methods:['POST'])]
|
#[Route('/application/send', name:'app_intern_send_application', methods:['POST'])]
|
||||||
public function sendApplication(Request $request, EntityManagerInterface $entityManager): Response
|
public function sendApplication(Request $request,): Response
|
||||||
{
|
{
|
||||||
$intern = $this->getUser();
|
$intern = $this->getUser();
|
||||||
if (!$intern instanceof Intern) {
|
if (!$intern instanceof Intern) {
|
||||||
throw $this->createAccessDeniedException("Seuls les stagiaires peuvent envoyer des candidatures.");
|
throw $this->createAccessDeniedException("Seuls les stagiaires peuvent envoyer des candidatures.");
|
||||||
}
|
}
|
||||||
|
|
||||||
$announcementRepository = $entityManager->getRepository(Announcement::class);
|
|
||||||
$internApplicationRepository = $entityManager->getRepository(InternApplication::class);
|
|
||||||
|
|
||||||
$announcementId = $request->request->get('announcement_id');
|
$announcementId = $request->request->get('announcement_id');
|
||||||
$announcement = $announcementRepository->find($announcementId);
|
$announcement = $this->announcementRepository->find($announcementId);
|
||||||
|
|
||||||
$existingInternApplication = $internApplicationRepository->findOneBy([
|
$existingInternApplication = $this->internApplicationRepository->findOneBy([
|
||||||
'intern' => $intern,
|
'intern' => $intern,
|
||||||
'application' => $announcement
|
'application' => $announcement
|
||||||
]);
|
]);
|
||||||
@ -137,13 +209,56 @@ final class InternController extends AbstractController
|
|||||||
$internApplication->setApplicationDate(new \DateTime());
|
$internApplication->setApplicationDate(new \DateTime());
|
||||||
$internApplication->setStatus("En Attente");
|
$internApplication->setStatus("En Attente");
|
||||||
|
|
||||||
$entityManager->persist($internApplication);
|
$this->entityManager->persist($internApplication);
|
||||||
}
|
}
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
$this->addFlash('success', 'La candidature à bien été envoyée.');
|
$this->addFlash('success', 'La candidature à bien été envoyée.');
|
||||||
|
|
||||||
return $this->redirectToRoute('app_profile');
|
return $this->redirectToRoute('app_profile');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/skills/add', name:'app_intern_add_skills', methods:['POST'])]
|
||||||
|
public function addSkills(Request $request,): Response
|
||||||
|
{
|
||||||
|
$intern = $this->getUser();
|
||||||
|
|
||||||
|
if (!$intern instanceof Intern) {
|
||||||
|
throw $this->createAccessDeniedException("Seuls les stagiaires peuvent sélectionner des compétences.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$selectedSkillIds = $request->request->all('selected_skills');
|
||||||
|
|
||||||
|
if ($selectedSkillIds == []) {
|
||||||
|
$this->addFlash('error', "Aucune sélection valide n'a été effectuée.");
|
||||||
|
return $this->redirectToRoute('app_skill_index');
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($selectedSkillIds as $skillId) {
|
||||||
|
$skill = $this->skillRepository->find($skillId);
|
||||||
|
|
||||||
|
if (!$skill) continue;
|
||||||
|
|
||||||
|
$existingInternSkill = $this->internSkillRepository->findOneBy([
|
||||||
|
'intern' => $intern,
|
||||||
|
'skill' => $skill
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!$existingInternSkill) {
|
||||||
|
$internSkill = new InternSkill();
|
||||||
|
$internSkill->setIntern($intern);
|
||||||
|
$internSkill->setSkill($skill);
|
||||||
|
|
||||||
|
$this->entityManager->persist($internSkill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
$this->addFlash('success', 'Les compétences ont été ajoutées avec succès.');
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_profile');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
138
src/Controller/InternFavoriteController.php
Normal file
138
src/Controller/InternFavoriteController.php
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use App\Entity\Announcement;
|
||||||
|
use App\Entity\Intern;
|
||||||
|
use App\Entity\InternFavorite;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
|
use App\Repository\InternFavoriteRepository;
|
||||||
|
use App\Repository\InternRepository;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Bundle\SecurityBundle\Security;
|
||||||
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
class InternFavoriteController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly InternFavoriteRepository $internFavoriteRepository,
|
||||||
|
){}
|
||||||
|
#[Route('/favorite/toggle/{id}', name: 'toggle_favorite')]
|
||||||
|
public function toggleFavorite(Announcement $announcement): RedirectResponse {
|
||||||
|
$intern = $this->getUser();
|
||||||
|
|
||||||
|
$existing = $this->internFavoriteRepository->findOneBy([
|
||||||
|
'intern' => $intern,
|
||||||
|
'announcement' => $announcement
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($existing) {
|
||||||
|
$this->entityManager->remove($existing);
|
||||||
|
} else {
|
||||||
|
$favorite = new InternFavorite();
|
||||||
|
$favorite->setIntern($intern);
|
||||||
|
$favorite->setAnnouncement($announcement);
|
||||||
|
$this->entityManager->persist($favorite);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_announcement_index');
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/announcement/{id}/favorite/toggle', name: 'app_favorite_toggle', methods: ['POST'])]
|
||||||
|
public function toggle(Announcement $announcement,Security $security): RedirectResponse
|
||||||
|
{
|
||||||
|
$user = $this->getUser();
|
||||||
|
|
||||||
|
if (!$user instanceof Intern) {
|
||||||
|
throw new AccessDeniedHttpException('Seuls les stagiaires peuvent ajouter aux favoris.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$favorite = $this->entityManager->getRepository(InternFavorite::class)->findOneBy([
|
||||||
|
'intern' => $user,
|
||||||
|
'announcement' => $announcement
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($favorite) {
|
||||||
|
$this->entityManager->remove($favorite);
|
||||||
|
} else {
|
||||||
|
$favorite = new InternFavorite();
|
||||||
|
$favorite->setIntern($user);
|
||||||
|
$favorite->setAnnouncement($announcement);
|
||||||
|
$this->entityManager->persist($favorite);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
return new RedirectResponse($_SERVER['HTTP_REFERER'] ?? '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/announcement/{id}', name: 'app_announcement_show')]
|
||||||
|
public function show(Announcement $announcement,): Response
|
||||||
|
{
|
||||||
|
$user = $this->getUser();
|
||||||
|
$isFavorite = false;
|
||||||
|
|
||||||
|
if (in_array('ROLE_INTERN', $user->getRoles())) {
|
||||||
|
$favorite = $this->internFavoriteRepository->findOneBy([
|
||||||
|
'announcement' => $announcement,
|
||||||
|
'intern' => $user,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$isFavorite = $favorite ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('announcement/show.html.twig', [
|
||||||
|
'announcement' => $announcement,
|
||||||
|
'isFavorite' => $isFavorite,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/favorite/add/{id}', name: 'app_favorite_add')]
|
||||||
|
public function addFavorite(Announcement $announcement,): Response
|
||||||
|
{
|
||||||
|
$user = $this->getUser();
|
||||||
|
|
||||||
|
// Vérifier si l'intern a déjà ce favori
|
||||||
|
$existingFavorite = $this->entityManager->getRepository(InternFavorite::class)->findOneBy([
|
||||||
|
'announcement' => $announcement,
|
||||||
|
'intern' => $user,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!$existingFavorite) {
|
||||||
|
$favorite = new InternFavorite();
|
||||||
|
$favorite->setAnnouncement($announcement);
|
||||||
|
$favorite->setIntern($user);
|
||||||
|
|
||||||
|
$this->entityManager->persist($favorite);
|
||||||
|
$this->entityManager->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_announcement_show', ['id' => $announcement->getId()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/favorite/remove/{id}', name: 'app_favorite_remove')]
|
||||||
|
public function removeFavorite(Announcement $announcement,): Response
|
||||||
|
{
|
||||||
|
$user = $this->getUser();
|
||||||
|
|
||||||
|
$favorite = $this->entityManager->getRepository(InternFavorite::class)->findOneBy([
|
||||||
|
'announcement' => $announcement,
|
||||||
|
'intern' => $user,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($favorite) {
|
||||||
|
$this->entityManager->remove($favorite);
|
||||||
|
$this->entityManager->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_announcement_show', ['id' => $announcement->getId()]);
|
||||||
|
}
|
||||||
|
}
|
@ -5,22 +5,33 @@ namespace App\Controller;
|
|||||||
use App\Entity\Message;
|
use App\Entity\Message;
|
||||||
use App\Entity\UserApp;
|
use App\Entity\UserApp;
|
||||||
use App\Form\MessageType;
|
use App\Form\MessageType;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
|
use App\Repository\InternSkillRepository;
|
||||||
use App\Repository\MessageRepository;
|
use App\Repository\MessageRepository;
|
||||||
use App\Repository\UserRepository;
|
use App\Repository\UserRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
|
|
||||||
#[Route('/message')]
|
#[Route('/message')]
|
||||||
final class MessageController extends AbstractController
|
final class MessageController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly MessageRepository $messageRepository,
|
||||||
|
private readonly UserRepository $userRepository,
|
||||||
|
){}
|
||||||
#[Route(name: 'app_message_index', methods: ['GET'])]
|
#[Route(name: 'app_message_index', methods: ['GET'])]
|
||||||
public function index(MessageRepository $messageRepository): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
$messages = $messageRepository->findLatestMessagesByUser($user);
|
if (!$user instanceof UserApp) {
|
||||||
|
throw new AccessDeniedHttpException("erreur");
|
||||||
|
}
|
||||||
|
$messages = $this->messageRepository->findLatestMessagesByUser($user);
|
||||||
|
|
||||||
return $this->render('message/index.html.twig', [
|
return $this->render('message/index.html.twig', [
|
||||||
'messages' => $messages,
|
'messages' => $messages,
|
||||||
@ -28,12 +39,12 @@ final class MessageController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/conversation/{id}', name: 'app_message_conversation', methods: ['GET'])]
|
#[Route('/conversation/{id}', name: 'app_message_conversation', methods: ['GET'])]
|
||||||
public function conversation(Message $message, MessageRepository $messageRepository): Response
|
public function conversation(Message $message,): Response
|
||||||
{
|
{
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
$otherUser = $message->getSender() === $user ? $message->getReceiver() : $message->getSender();
|
$otherUser = $message->getSender() === $user ? $message->getReceiver() : $message->getSender();
|
||||||
|
|
||||||
$conversation = $messageRepository->findByConversation($user, $otherUser);
|
$conversation = $this->messageRepository->findByConversation($user, $otherUser);
|
||||||
|
|
||||||
return $this->render('message/conversation.html.twig', [
|
return $this->render('message/conversation.html.twig', [
|
||||||
'conversation' => $conversation,
|
'conversation' => $conversation,
|
||||||
@ -44,12 +55,12 @@ final class MessageController extends AbstractController
|
|||||||
|
|
||||||
|
|
||||||
#[Route('/new/{receiverId}', name: 'app_message_new', methods: ['GET', 'POST'])]
|
#[Route('/new/{receiverId}', name: 'app_message_new', methods: ['GET', 'POST'])]
|
||||||
public function new(Request $request, EntityManagerInterface $entityManager, ?int $receiverId = null, UserRepository $userRepository): Response
|
public function new(Request $request, ?int $receiverId = null,): Response
|
||||||
{
|
{
|
||||||
$message = new Message();
|
$message = new Message();
|
||||||
|
|
||||||
if ($receiverId) {
|
if ($receiverId) {
|
||||||
$receiver = $userRepository->find($receiverId);
|
$receiver = $this->userRepository->find($receiverId);
|
||||||
if ($receiver) {
|
if ($receiver) {
|
||||||
$message->setReceiver($receiver);
|
$message->setReceiver($receiver);
|
||||||
}
|
}
|
||||||
@ -62,8 +73,8 @@ final class MessageController extends AbstractController
|
|||||||
$message->setSendingDate(new \DateTime());
|
$message->setSendingDate(new \DateTime());
|
||||||
$message->setSender($this->getUser());
|
$message->setSender($this->getUser());
|
||||||
|
|
||||||
$entityManager->persist($message);
|
$this->entityManager->persist($message);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_message_index');
|
return $this->redirectToRoute('app_message_index');
|
||||||
}
|
}
|
||||||
@ -82,14 +93,14 @@ final class MessageController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_message_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_message_edit', methods: ['GET', 'POST'])]
|
||||||
public function edit(Request $request, Message $message, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, Message $message,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(MessageType::class, $message);
|
$form = $this->createForm(MessageType::class, $message);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$message->setSendingDate(new \DateTime());
|
$message->setSendingDate(new \DateTime());
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -101,11 +112,11 @@ final class MessageController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_message_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_message_delete', methods: ['POST'])]
|
||||||
public function delete(Request $request, Message $message, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, Message $message,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$message->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$message->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($message);
|
$this->entityManager->remove($message);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_message_index', [], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -7,6 +7,8 @@ use App\Entity\Intern;
|
|||||||
use App\Entity\InternApplication;
|
use App\Entity\InternApplication;
|
||||||
use App\Entity\UserApp;
|
use App\Entity\UserApp;
|
||||||
use App\Form\UserAppType;
|
use App\Form\UserAppType;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
|
use App\Repository\SkillRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
@ -15,20 +17,25 @@ use Symfony\Component\Routing\Attribute\Route;
|
|||||||
|
|
||||||
class ProfileController extends AbstractController
|
class ProfileController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly InternApplicationRepository $internApplicationRepository,
|
||||||
|
){}
|
||||||
#[Route('/profile', name: 'app_profile')]
|
#[Route('/profile', name: 'app_profile')]
|
||||||
public function profile(EntityManagerInterface $entityManager): Response
|
public function profile(): Response
|
||||||
{
|
{
|
||||||
|
// Charger l'utilisateur connecté
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
|
|
||||||
|
// Vérifiez les rôles si nécessaire
|
||||||
if (!$user) {
|
if (!$user) {
|
||||||
throw $this->createAccessDeniedException('Vous devez être connecté pour accéder à cette page.');
|
throw $this->createAccessDeniedException('Vous devez être connecté pour accéder à cette page.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($user instanceof Intern)
|
if ($user instanceof Intern)
|
||||||
{
|
{
|
||||||
$internApplicationRepository = $entityManager->getRepository(InternApplication::class);
|
|
||||||
|
|
||||||
$internApplications = $internApplicationRepository->findBy([
|
$internApplications = $this->internApplicationRepository->findBy([
|
||||||
'intern' => $user,
|
'intern' => $user,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@ -45,13 +52,13 @@ class ProfileController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('profile/{id}/edit', name: 'app_profile_edit', methods: ['GET', 'POST'])]
|
#[Route('profile/{id}/edit', name: 'app_profile_edit', methods: ['GET', 'POST'])]
|
||||||
public function edit(Request $request, UserApp $userApp, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, UserApp $userApp,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(UserAppType::class, $userApp);
|
$form = $this->createForm(UserAppType::class, $userApp);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_profile', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_profile', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -62,17 +69,17 @@ class ProfileController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/profile/{id}/visit', name: 'app_profile_visit')]
|
#[Route('/profile/visit/{id}', name: 'app_profile_visit')]
|
||||||
public function visitProfile(EntityManagerInterface $entityManager, int $id): Response
|
public function visitProfile(int $id): Response
|
||||||
{
|
{
|
||||||
$user = $entityManager->getRepository(Intern::class)->find($id);
|
$candidat = $this->entityManager->getRepository(Intern::class)->find($id);
|
||||||
|
|
||||||
if (!$user) {
|
if (!$candidat) {
|
||||||
throw $this->createNotFoundException('Utilisateur non trouvé.');
|
throw $this->createNotFoundException('Utilisateur non trouvé.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('profile/index.html.twig', [
|
return $this->render('profile/visit.html.twig', [
|
||||||
'user' => $user,
|
'candidat' => $candidat,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,4 +91,16 @@ class ProfileController extends AbstractController
|
|||||||
'user_app' => $userApp,
|
'user_app' => $userApp,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/profile/pickSkill', name: 'app_profile_pickSkill', methods: ['GET'])]
|
||||||
|
public function pickSkill(UserApp $userApp): Response
|
||||||
|
{
|
||||||
|
|
||||||
|
return $this->render('skill/index.html.twig', [
|
||||||
|
'user_app' => $userApp,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -6,19 +6,25 @@ use App\Entity\Employee;
|
|||||||
use App\Entity\Intern;
|
use App\Entity\Intern;
|
||||||
use App\Entity\UserApp;
|
use App\Entity\UserApp;
|
||||||
use App\Form\RegistrationFormType;
|
use App\Form\RegistrationFormType;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Bundle\SecurityBundle\Security;
|
use Symfony\Bundle\SecurityBundle\Security;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
|
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
|
use App\Entity\Company;
|
||||||
|
|
||||||
#[Route('/register', name: 'app_register')]
|
#[Route('/register', name: 'app_register')]
|
||||||
class RegistrationController extends AbstractController
|
class RegistrationController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
){}
|
||||||
#[Route('/', name: '_intern')]
|
#[Route('/', name: '_intern')]
|
||||||
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, Security $security, EntityManagerInterface $entityManager): Response
|
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, Security $security): Response
|
||||||
{
|
{
|
||||||
$user = new Intern();
|
$user = new Intern();
|
||||||
$form = $this->createForm(RegistrationFormType::class, $user);
|
$form = $this->createForm(RegistrationFormType::class, $user);
|
||||||
@ -32,44 +38,52 @@ class RegistrationController extends AbstractController
|
|||||||
// encode the plain password
|
// encode the plain password
|
||||||
$user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword));
|
$user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword));
|
||||||
|
|
||||||
$entityManager->persist($user);
|
$this->entityManager->persist($user);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
// do anything else you need here, like send an email
|
|
||||||
|
|
||||||
return $security->login($user, 'form_login', 'main');
|
return $security->login($user, 'form_login', 'main');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('registration/register.html.twig', [
|
return $this->render('registration/register.html.twig', [
|
||||||
'registrationForm' => $form,
|
'registrationForm' => $form,
|
||||||
|
'employee' => False,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/employee', name: '_employee')]
|
#[Route('/employee', name: '_employee')]
|
||||||
public function registerEmployee(Request $request, UserPasswordHasherInterface $userPasswordHasher, Security $security, EntityManagerInterface $entityManager): Response
|
public function registerEmployee(Request $request, UserPasswordHasherInterface $userPasswordHasher, Security $security): Response
|
||||||
{
|
{
|
||||||
$user = new Employee();
|
$user = new Employee();
|
||||||
$form = $this->createForm(RegistrationFormType::class, $user);
|
$form = $this->createForm(RegistrationFormType::class, $user)
|
||||||
|
->add('company', EntityType::class, [
|
||||||
|
'class' => Company::class,
|
||||||
|
'choice_label' => 'name',
|
||||||
|
'placeholder' => 'Sélectionnez une entreprise',
|
||||||
|
'label' => 'Entreprise',
|
||||||
|
]);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
/** @var string $plainPassword */
|
/** @var string $plainPassword */
|
||||||
$plainPassword = $form->get('plainPassword')->getData();
|
$plainPassword = $form->get('plainPassword')->getData();
|
||||||
|
|
||||||
|
$company = $form->get('company')->getData();
|
||||||
|
$user->setCompany($company);
|
||||||
|
|
||||||
$user->setRoles(['ROLE_EMPLOYEE']);
|
$user->setRoles(['ROLE_EMPLOYEE']);
|
||||||
// encode the plain password
|
// Encoder le mot de passe
|
||||||
$user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword));
|
$user->setPassword($userPasswordHasher->hashPassword($user, $plainPassword));
|
||||||
|
|
||||||
$entityManager->persist($user);
|
$this->entityManager->persist($user);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
// do anything else you need here, like send an email
|
|
||||||
|
|
||||||
return $security->login($user, 'form_login', 'main');
|
return $security->login($user, 'form_login', 'main');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('registration/register.html.twig', [
|
return $this->render('registration/register.html.twig', [
|
||||||
'registrationForm' => $form,
|
'registrationForm' => $form,
|
||||||
|
'employee' => True,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
namespace App\Controller;
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Bundle\SecurityBundle\Security;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
|
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
|
||||||
|
@ -4,6 +4,8 @@ namespace App\Controller;
|
|||||||
|
|
||||||
use App\Entity\Skill;
|
use App\Entity\Skill;
|
||||||
use App\Form\SkillType;
|
use App\Form\SkillType;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
|
use App\Repository\InternApplicationRepository;
|
||||||
use App\Repository\SkillRepository;
|
use App\Repository\SkillRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
@ -15,25 +17,29 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
|
|||||||
#[Route('/skill')]
|
#[Route('/skill')]
|
||||||
final class SkillController extends AbstractController
|
final class SkillController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly SkillRepository $skillRepository,
|
||||||
|
){}
|
||||||
#[Route(name: 'app_skill_index', methods: ['GET'])]
|
#[Route(name: 'app_skill_index', methods: ['GET'])]
|
||||||
public function index(SkillRepository $skillRepository): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('skill/index.html.twig', [
|
return $this->render('skill/index.html.twig', [
|
||||||
'skills' => $skillRepository->findAll(),
|
'skills' => $this->skillRepository->findAll(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/new', name: 'app_skill_new', methods: ['GET', 'POST'])]
|
#[Route('/new', name: 'app_skill_new', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function new(Request $request, EntityManagerInterface $entityManager): Response
|
public function new(Request $request,): Response
|
||||||
{
|
{
|
||||||
$skill = new Skill();
|
$skill = new Skill();
|
||||||
$form = $this->createForm(SkillType::class, $skill);
|
$form = $this->createForm(SkillType::class, $skill);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->persist($skill);
|
$this->entityManager->persist($skill);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -54,13 +60,13 @@ final class SkillController extends AbstractController
|
|||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_skill_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_skill_edit', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function edit(Request $request, Skill $skill, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, Skill $skill,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(SkillType::class, $skill);
|
$form = $this->createForm(SkillType::class, $skill);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -73,11 +79,11 @@ final class SkillController extends AbstractController
|
|||||||
|
|
||||||
#[Route('/{id}', name: 'app_skill_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_skill_delete', methods: ['POST'])]
|
||||||
#[IsGranted('ROLE_ADMIN')]
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
public function delete(Request $request, Skill $skill, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, Skill $skill,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$skill->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$skill->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($skill);
|
$this->entityManager->remove($skill);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_skill_index', [], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -4,6 +4,7 @@ namespace App\Controller;
|
|||||||
|
|
||||||
use App\Entity\UserApp;
|
use App\Entity\UserApp;
|
||||||
use App\Form\UserAppType;
|
use App\Form\UserAppType;
|
||||||
|
use App\Repository\AnnouncementRepository;
|
||||||
use App\Repository\UserRepository;
|
use App\Repository\UserRepository;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
@ -14,11 +15,15 @@ use Symfony\Component\Routing\Attribute\Route;
|
|||||||
#[Route('/user')]
|
#[Route('/user')]
|
||||||
final class UserAppController extends AbstractController
|
final class UserAppController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly UserRepository $userRepository,
|
||||||
|
){}
|
||||||
#[Route(name: 'app_user_index', methods: ['GET'])]
|
#[Route(name: 'app_user_index', methods: ['GET'])]
|
||||||
public function index(UserRepository $userRepository): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('user_app/index.html.twig', [
|
return $this->render('user_app/index.html.twig', [
|
||||||
'user_apps' => $userRepository->findAll(),
|
'user_apps' => $this->userRepository->findAll(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,13 +36,13 @@ final class UserAppController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}/edit', name: 'app_user_edit', methods: ['GET', 'POST'])]
|
#[Route('/{id}/edit', name: 'app_user_edit', methods: ['GET', 'POST'])]
|
||||||
public function edit(Request $request, UserApp $userApp, EntityManagerInterface $entityManager): Response
|
public function edit(Request $request, UserApp $userApp,): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(UserAppType::class, $userApp);
|
$form = $this->createForm(UserAppType::class, $userApp);
|
||||||
$form->handleRequest($request);
|
$form->handleRequest($request);
|
||||||
|
|
||||||
if ($form->isSubmitted() && $form->isValid()) {
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
|
||||||
}
|
}
|
||||||
@ -49,11 +54,11 @@ final class UserAppController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/{id}', name: 'app_user_delete', methods: ['POST'])]
|
#[Route('/{id}', name: 'app_user_delete', methods: ['POST'])]
|
||||||
public function delete(Request $request, UserApp $userApp, EntityManagerInterface $entityManager): Response
|
public function delete(Request $request, UserApp $userApp,): Response
|
||||||
{
|
{
|
||||||
if ($this->isCsrfTokenValid('delete'.$userApp->getId(), $request->getPayload()->getString('_token'))) {
|
if ($this->isCsrfTokenValid('delete'.$userApp->getId(), $request->getPayload()->getString('_token'))) {
|
||||||
$entityManager->remove($userApp);
|
$this->entityManager->remove($userApp);
|
||||||
$entityManager->flush();
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
|
return $this->redirectToRoute('app_user_index', [], Response::HTTP_SEE_OTHER);
|
||||||
|
@ -7,6 +7,7 @@ use Doctrine\Common\Collections\ArrayCollection;
|
|||||||
use Doctrine\Common\Collections\Collection;
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: CompanyRepository::class)]
|
#[ORM\Entity(repositoryClass: CompanyRepository::class)]
|
||||||
class Company
|
class Company
|
||||||
{
|
{
|
||||||
|
@ -7,17 +7,21 @@ use Doctrine\Common\Collections\ArrayCollection;
|
|||||||
use Doctrine\Common\Collections\Collection;
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
use App\Entity\Company;
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: InternRepository::class)]
|
#[ORM\Entity(repositoryClass: InternRepository::class)]
|
||||||
class Intern extends UserApp
|
class Intern extends UserApp
|
||||||
{
|
{
|
||||||
|
|
||||||
#[ORM\Column(type: Types::TEXT,nullable: true)]
|
#[ORM\Column(type: Types::TEXT, length: 255, nullable: true)]
|
||||||
private ?string $coverLetter = null;
|
private ?string $coverLetter = null;
|
||||||
|
|
||||||
#[ORM\Column(length: 255,nullable: true)]
|
#[ORM\Column(type: Types::TEXT, length: 255, nullable: true)]
|
||||||
private ?string $resume = null;
|
private ?string $resume = null;
|
||||||
|
|
||||||
|
#[ORM\Column(type: Types::TEXT, length: 255, nullable: true)]
|
||||||
|
private ?string $resumeName = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Collection<int, InternDegree>
|
* @var Collection<int, InternDegree>
|
||||||
*/
|
*/
|
||||||
@ -74,6 +78,18 @@ class Intern extends UserApp
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getResumeName(): ?string
|
||||||
|
{
|
||||||
|
return $this->resumeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setResumeName(string $resumeName): static
|
||||||
|
{
|
||||||
|
$this->resumeName = $resumeName;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Collection<int, InternDegree>
|
* @return Collection<int, InternDegree>
|
||||||
*/
|
*/
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Entity;
|
|
||||||
|
|
||||||
use App\Repository\StatusRepository;
|
|
||||||
use Doctrine\Common\Collections\ArrayCollection;
|
|
||||||
use Doctrine\Common\Collections\Collection;
|
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: StatusRepository::class)]
|
|
||||||
class Status
|
|
||||||
{
|
|
||||||
#[ORM\Id]
|
|
||||||
#[ORM\GeneratedValue]
|
|
||||||
#[ORM\Column]
|
|
||||||
private ?int $id = null;
|
|
||||||
|
|
||||||
#[ORM\Column(length: 255)]
|
|
||||||
private ?string $label = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var Collection<int, Announcement>
|
|
||||||
*/
|
|
||||||
#[ORM\OneToMany(targetEntity: Announcement::class, mappedBy: 'status')]
|
|
||||||
private Collection $announcements;
|
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->announcements = new ArrayCollection();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getId(): ?int
|
|
||||||
{
|
|
||||||
return $this->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLabel(): ?string
|
|
||||||
{
|
|
||||||
return $this->label;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLabel(string $label): static
|
|
||||||
{
|
|
||||||
$this->label = $label;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Collection<int, Announcement>
|
|
||||||
*/
|
|
||||||
public function getAnnouncements(): Collection
|
|
||||||
{
|
|
||||||
return $this->announcements;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addAnnouncement(Announcement $announcement): static
|
|
||||||
{
|
|
||||||
if (!$this->announcements->contains($announcement)) {
|
|
||||||
$this->announcements->add($announcement);
|
|
||||||
$announcement->setStatus($this);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function removeAnnouncement(Announcement $announcement): static
|
|
||||||
{
|
|
||||||
if ($this->announcements->removeElement($announcement)) {
|
|
||||||
// set the owning side to null (unless already changed)
|
|
||||||
if ($announcement->getStatus() === $this) {
|
|
||||||
$announcement->setStatus(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,7 +10,7 @@ use Symfony\Component\Security\Core\User\UserInterface;
|
|||||||
|
|
||||||
#[ORM\Entity(repositoryClass: UserRepository::class)]
|
#[ORM\Entity(repositoryClass: UserRepository::class)]
|
||||||
#[ORM\Table(name: 'userApp')]
|
#[ORM\Table(name: 'userApp')]
|
||||||
#[ORM\InheritanceType('JOINED')]
|
#[ORM\InheritanceType('SINGLE_TABLE')]
|
||||||
#[ORM\DiscriminatorColumn(name: 'DISCRIMINATOR', type: 'string')]
|
#[ORM\DiscriminatorColumn(name: 'DISCRIMINATOR', type: 'string')]
|
||||||
#[ORM\DiscriminatorMap(['employee' => Employee::class, 'intern' => Intern::class])]
|
#[ORM\DiscriminatorMap(['employee' => Employee::class, 'intern' => Intern::class])]
|
||||||
#[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NICKNAME', fields: ['nickname'])]
|
#[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_NICKNAME', fields: ['nickname'])]
|
||||||
@ -186,6 +186,7 @@ class UserApp implements UserInterface, PasswordAuthenticatedUserInterface
|
|||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,8 +4,11 @@ namespace App\Form;
|
|||||||
|
|
||||||
use App\Entity\Intern;
|
use App\Entity\Intern;
|
||||||
use Symfony\Component\Form\AbstractType;
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\FileType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
use Symfony\Component\Validator\Constraints\File;
|
||||||
|
|
||||||
class InternType extends AbstractType
|
class InternType extends AbstractType
|
||||||
{
|
{
|
||||||
@ -20,7 +23,9 @@ class InternType extends AbstractType
|
|||||||
->add('tel')
|
->add('tel')
|
||||||
->add('address')
|
->add('address')
|
||||||
->add('mail')
|
->add('mail')
|
||||||
->add('coverLetter')
|
->add('coverLetter', TextareaType::class, [
|
||||||
|
'required' => false,
|
||||||
|
])
|
||||||
->add('resume')
|
->add('resume')
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -15,12 +15,19 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
|||||||
use Symfony\Component\Validator\Constraints\IsTrue;
|
use Symfony\Component\Validator\Constraints\IsTrue;
|
||||||
use Symfony\Component\Validator\Constraints\Length;
|
use Symfony\Component\Validator\Constraints\Length;
|
||||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||||
|
use App\Entity\Company;
|
||||||
|
use App\Entity\Intern;
|
||||||
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
|
use Doctrine\ORM\EntityRepository;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
|
|
||||||
|
|
||||||
class RegistrationFormType extends AbstractType
|
class RegistrationFormType extends AbstractType
|
||||||
{
|
{
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
{
|
{
|
||||||
$builder
|
$builder
|
||||||
|
|
||||||
->add('nickname', TextType::class, [
|
->add('nickname', TextType::class, [
|
||||||
'label' => 'Utilisateur : ',
|
'label' => 'Utilisateur : ',
|
||||||
])
|
])
|
||||||
@ -45,10 +52,7 @@ class RegistrationFormType extends AbstractType
|
|||||||
new NotBlank(),
|
new NotBlank(),
|
||||||
]
|
]
|
||||||
])
|
])
|
||||||
//
|
|
||||||
->add('plainPassword', PasswordType::class, [
|
->add('plainPassword', PasswordType::class, [
|
||||||
// instead of being set onto the object directly,
|
|
||||||
// this is read and encoded in the controller
|
|
||||||
'mapped' => false,
|
'mapped' => false,
|
||||||
'attr' => ['autocomplete' => 'new-password'],
|
'attr' => ['autocomplete' => 'new-password'],
|
||||||
'constraints' => [
|
'constraints' => [
|
||||||
@ -58,12 +62,10 @@ class RegistrationFormType extends AbstractType
|
|||||||
new Length([
|
new Length([
|
||||||
'min' => 6,
|
'min' => 6,
|
||||||
'minMessage' => 'Votre mot de passe doit avoir au moins {{ limit }} caractères',
|
'minMessage' => 'Votre mot de passe doit avoir au moins {{ limit }} caractères',
|
||||||
// max length allowed by Symfony for security reasons
|
|
||||||
'max' => 4096,
|
'max' => 4096,
|
||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
])
|
]);
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver): void
|
public function configureOptions(OptionsResolver $resolver): void
|
||||||
|
25
src/Form/ResetPasswordRequestFormType.php
Normal file
25
src/Form/ResetPasswordRequestFormType.php
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Form;
|
||||||
|
|
||||||
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
|
||||||
|
class ResetPasswordRequestFormType extends AbstractType
|
||||||
|
{
|
||||||
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->add('email', EmailType::class)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function configureOptions(OptionsResolver $resolver): void
|
||||||
|
{
|
||||||
|
$resolver->setDefaults([
|
||||||
|
// Configure your form options here
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -1,43 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Repository;
|
|
||||||
|
|
||||||
use App\Entity\Status;
|
|
||||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
|
||||||
use Doctrine\Persistence\ManagerRegistry;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @extends ServiceEntityRepository<Status>
|
|
||||||
*/
|
|
||||||
class StatusRepository extends ServiceEntityRepository
|
|
||||||
{
|
|
||||||
public function __construct(ManagerRegistry $registry)
|
|
||||||
{
|
|
||||||
parent::__construct($registry, Status::class);
|
|
||||||
}
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * @return Status[] Returns an array of Status objects
|
|
||||||
// */
|
|
||||||
// public function findByExampleField($value): array
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('v')
|
|
||||||
// ->andWhere('v.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->orderBy('v.id', 'ASC')
|
|
||||||
// ->setMaxResults(10)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public function findOneBySomeField($value): ?Status
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('v')
|
|
||||||
// ->andWhere('v.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getOneOrNullResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
}
|
|
60
src/Security/UserAuthenticator.php
Normal file
60
src/Security/UserAuthenticator.php
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Security;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||||
|
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||||
|
use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
|
||||||
|
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
|
||||||
|
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
|
||||||
|
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
|
||||||
|
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
|
||||||
|
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
|
||||||
|
use Symfony\Component\Security\Http\SecurityRequestAttributes;
|
||||||
|
use Symfony\Component\Security\Http\Util\TargetPathTrait;
|
||||||
|
|
||||||
|
class UserAuthenticator extends AbstractLoginFormAuthenticator
|
||||||
|
{
|
||||||
|
use TargetPathTrait;
|
||||||
|
|
||||||
|
public const LOGIN_ROUTE = 'app_login';
|
||||||
|
|
||||||
|
public function __construct(private UrlGeneratorInterface $urlGenerator)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function authenticate(Request $request): Passport
|
||||||
|
{
|
||||||
|
$nickname = $request->getPayload()->getString('nickname');
|
||||||
|
|
||||||
|
$request->getSession()->set(SecurityRequestAttributes::LAST_USERNAME, $nickname);
|
||||||
|
|
||||||
|
return new Passport(
|
||||||
|
new UserBadge($nickname),
|
||||||
|
new PasswordCredentials($request->getPayload()->getString('password')),
|
||||||
|
[
|
||||||
|
new CsrfTokenBadge('authenticate', $request->getPayload()->getString('_csrf_token')),
|
||||||
|
new RememberMeBadge(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
|
||||||
|
{
|
||||||
|
if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {
|
||||||
|
return new RedirectResponse($targetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For example:
|
||||||
|
return new RedirectResponse($this->urlGenerator->generate('index'));
|
||||||
|
//throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getLoginUrl(Request $request): string
|
||||||
|
{
|
||||||
|
return $this->urlGenerator->generate(self::LOGIN_ROUTE);
|
||||||
|
}
|
||||||
|
}
|
@ -288,6 +288,9 @@
|
|||||||
"config/packages/messenger.yaml"
|
"config/packages/messenger.yaml"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"symfonycasts/sass-bundle": {
|
||||||
|
"version": "v0.7.0"
|
||||||
|
},
|
||||||
"twig/extra-bundle": {
|
"twig/extra-bundle": {
|
||||||
"version": "v3.13.0"
|
"version": "v3.13.0"
|
||||||
}
|
}
|
||||||
|
@ -7,84 +7,66 @@
|
|||||||
<h1 class="text-3xl font-bold mb-6 text-center">Liste des Annonces</h1>
|
<h1 class="text-3xl font-bold mb-6 text-center">Liste des Annonces</h1>
|
||||||
|
|
||||||
{% if 'ROLE_ADMIN' in app.user.roles %}
|
{% if 'ROLE_ADMIN' in app.user.roles %}
|
||||||
<!-- Formulaire pour afficher uniquement les annonces non validées -->
|
<form method="get" class="mb-6 text-center">
|
||||||
<form method="get" class="mb-6 text-center">
|
<label class="flex items-center justify-center space-x-2">
|
||||||
<label class="flex items-center justify-center space-x-2">
|
<input type="checkbox" name="show_non_validated" value="1" {% if showNonValidated %}checked{% endif %} class="rounded text-teal-500">
|
||||||
<input
|
<span class="text-gray-700">Afficher uniquement les annonces non validées</span>
|
||||||
type="checkbox"
|
</label>
|
||||||
name="show_non_validated"
|
<button type="submit" class="ml-4 bg-teal-500 text-white px-4 py-2 rounded mt-2">Appliquer</button>
|
||||||
value="1"
|
</form>
|
||||||
{% if showNonValidated %}checked{% endif %}
|
|
||||||
class="rounded text-teal-500"
|
|
||||||
>
|
|
||||||
<span class="text-gray-700">Afficher uniquement les annonces non validées</span>
|
|
||||||
</label>
|
|
||||||
<button type="submit" class="ml-4 bg-teal-500 text-white px-4 py-2 rounded mt-2">
|
|
||||||
Appliquer
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if 'ROLE_EMPLOYEE' in app.user.roles %}
|
{% if 'ROLE_EMPLOYEE' in app.user.roles %}
|
||||||
<!-- Bouton pour créer une annonce -->
|
<div class="text-center mb-6">
|
||||||
<div class="text-center mb-6">
|
<a href="{{ path('app_announcement_new') }}" class="bg-teal-500 text-white px-6 py-3 rounded-md hover:bg-teal-600">
|
||||||
<a href="{{ path('app_announcement_new') }}" class="bg-teal-500 text-white px-6 py-3 rounded-md hover:bg-teal-600">
|
Créer une annonce
|
||||||
Créer une annonce
|
</a>
|
||||||
</a>
|
</div>
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<!-- Liste des annonces -->
|
|
||||||
<div class="max-w-4xl mx-auto">
|
<div class="max-w-4xl mx-auto">
|
||||||
<div class="bg-white rounded-lg shadow-lg p-6 inline-block text-center my-10">
|
<div class="bg-white rounded-lg shadow-lg p-6 inline-block text-center my-10">
|
||||||
<form method="get" class="flex flex-col md:flex-row space-y-4 md:space-y-0 md:space-x-4 text-black">
|
<form method="get" class="flex flex-col md:flex-row space-y-4 md:space-y-0 md:space-x-4 text-black">
|
||||||
<label>
|
<input class="border border-gray-300 rounded py-2 px-4 w-full md:w-auto" placeholder="Rechercher par entreprise" type="text" name="company_name" value="{{ app.request.query.get('company_name') }}"/>
|
||||||
<input class="border border-gray-300 rounded py-2 px-4 w-full md:w-auto" placeholder="Rechercher par entreprise" type="text" name="company_name" value="{{ app.request.query.get('company_name') }}"/>
|
<input class="border border-gray-300 rounded py-2 px-4 w-full md:w-auto" placeholder="Rechercher par lieu" type="text" name="location" value="{{ app.request.query.get('location') }}"/>
|
||||||
</label>
|
<input class="border border-gray-300 rounded py-2 px-4 w-full md:w-auto" placeholder="Autre recherche" type="text" name="category" value="{{ app.request.query.get('category') }}"/>
|
||||||
<label>
|
|
||||||
<input class="border border-gray-300 rounded py-2 px-4 w-full md:w-auto" placeholder="Rechercher par lieu" type="text" name="location" value="{{ app.request.query.get('location') }}"/>
|
|
||||||
</label>
|
|
||||||
<label>
|
|
||||||
<input class="border border-gray-300 rounded py-2 px-4 w-full md:w-auto" placeholder="Autre recherche" type="text" name="category" value="{{ app.request.query.get('category') }}"/>
|
|
||||||
</label>
|
|
||||||
<button type="submit" class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-6 rounded">Rechercher</button>
|
<button type="submit" class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-6 rounded">Rechercher</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% for announcement in announcements %}
|
{% for announcement in announcements %}
|
||||||
<div class="bg-white p-6 rounded-lg shadow mb-4 relative">
|
<div class="bg-white p-6 rounded-lg shadow mb-4 relative">
|
||||||
<!-- Statut en haut à droite -->
|
<div class="absolute top-4 right-4 flex items-center space-x-2">
|
||||||
<div class="absolute top-4 right-4">
|
|
||||||
{% if announcement.status == 'notVerified' %}
|
{% if announcement.status == 'notVerified' %}
|
||||||
<span class="text-red-500 font-semibold">Non validée</span>
|
<span class="text-red-500 font-semibold">Non validée</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="text-green-500 font-semibold">Validée</span>
|
<span class="text-green-500 font-semibold">Validée</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
<form method="post" action="{{ path('app_favorite_toggle', {id: announcement.id}) }}">
|
||||||
|
<button type="submit" class="text-xl">
|
||||||
|
{% if announcement.id in favorites %}
|
||||||
|
⭐
|
||||||
|
{% else %}
|
||||||
|
☆
|
||||||
|
{% endif %}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Titre de l'annonce -->
|
|
||||||
<h2 class="text-3xl font-semibold mb-2">{{ announcement.title }}</h2>
|
<h2 class="text-3xl font-semibold mb-2">{{ announcement.title }}</h2>
|
||||||
|
|
||||||
<!-- Nom de l'entreprise -->
|
|
||||||
<p class="text-gray-600 mb-2">{{ announcement.company.name }}</p>
|
<p class="text-gray-600 mb-2">{{ announcement.company.name }}</p>
|
||||||
|
|
||||||
<div class="text-gray-500 text-sm mb-4">
|
<div class="text-gray-500 text-sm mb-4">
|
||||||
<!-- Date du stage -->
|
|
||||||
<div class="mb-2">
|
<div class="mb-2">
|
||||||
<i class="fas fa-calendar-alt mr-1"></i>
|
<i class="fas fa-calendar-alt mr-1"></i> <span>Date du stage : {{ announcement.date }}</span>
|
||||||
<span>Date du stage : {{ announcement.date }}</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Adresse de l'entreprise -->
|
|
||||||
<div>
|
<div>
|
||||||
<i class="fas fa-map-marker-alt mr-1"></i>
|
<i class="fas fa-map-marker-alt mr-1"></i> <span>{{ announcement.company.address }}</span>
|
||||||
<span>{{ announcement.company.address }}</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Lien vers la page de détails -->
|
<a href="{{ path('app_announcement_show', { id: announcement.id }) }}" class="bg-teal-500 text-white px-4 py-2 rounded">
|
||||||
<a href="{{ path('app_announcement_show', { id: announcement.id }) }}"
|
|
||||||
class="bg-teal-500 text-white px-4 py-2 rounded">
|
|
||||||
Détails
|
Détails
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -94,4 +76,3 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -80,6 +80,16 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<!-- Vérifier si c'est un favori -->
|
||||||
|
<form method="post" action="{{ path(isFavorite ? 'app_favorite_remove' : 'app_favorite_add', {id: announcement.id}) }}">
|
||||||
|
<button type="submit" class="text-yellow-500">
|
||||||
|
{% if isFavorite %}
|
||||||
|
⭐ Retirer des favoris
|
||||||
|
{% else %}
|
||||||
|
☆ Ajouter aux favoris
|
||||||
|
{% endif %}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Bouton de retour à la liste -->
|
<!-- Bouton de retour à la liste -->
|
||||||
|
22
templates/broadcast/FAQ.stream.html.twig
Normal file
22
templates/broadcast/FAQ.stream.html.twig
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{# Learn how to use Turbo Streams: https://github.com/symfony/ux-turbo#broadcast-doctrine-entities-update #}
|
||||||
|
{% block create %}
|
||||||
|
<turbo-stream action="append" target="f_a_qs">
|
||||||
|
<template>
|
||||||
|
<div id="{{ 'f_a_q_' ~ id }}">
|
||||||
|
#{{ id }} created
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</turbo-stream>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block update %}
|
||||||
|
<turbo-stream action="update" target="f_a_q_{{ id }}">
|
||||||
|
<template>
|
||||||
|
#{{ id }} updated
|
||||||
|
</template>
|
||||||
|
</turbo-stream>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block remove %}
|
||||||
|
<turbo-stream action="remove" target="f_a_q_{{ id }}"></turbo-stream>
|
||||||
|
{% endblock %}
|
@ -35,21 +35,19 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if 'ROLE_ADMIN' in app.user.roles %}
|
{% if 'ROLE_ADMIN' in app.user.roles %}
|
||||||
<!-- Modifier le diplôme -->
|
<!-- Modifier le diplôme -->
|
||||||
<a href="{{ path('app_degree_edit', {'id': degree.id}) }}"
|
<a href="{{ path('app_degree_edit', {'id': degree.id}) }}" class="text-yellow-500 hover:text-yellow-700 mr-3">
|
||||||
class="text-yellow-500 hover:text-yellow-700 mr-3">
|
<i class="fas fa-edit"></i> Modifier
|
||||||
<i class="fas fa-edit"></i> Modifier
|
</a>
|
||||||
</a>
|
|
||||||
|
|
||||||
<!-- Formulaire pour supprimer le diplôme -->
|
<!-- Formulaire pour supprimer le diplôme -->
|
||||||
<form method="post" action="{{ path('app_degree_delete', {'id': degree.id}) }}"
|
<form method="post" action="{{ path('app_degree_delete', {'id': degree.id}) }}" style="display:inline;">
|
||||||
style="display:inline;">
|
<input type="hidden" name="_method" value="DELETE">
|
||||||
<input type="hidden" name="_method" value="DELETE">
|
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ degree.id) }}">
|
||||||
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ degree.id) }}">
|
<button type="submit" class="text-red-500 hover:text-red-700">
|
||||||
<button type="submit" class="text-red-500 hover:text-red-700">
|
<i class="fas fa-trash-alt"></i> Supprimer
|
||||||
<i class="fas fa-trash-alt"></i> Supprimer
|
</button>
|
||||||
</button>
|
</form>
|
||||||
</form>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -68,13 +66,13 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if 'ROLE_ADMIN' in app.user.roles %}
|
{% if 'ROLE_ADMIN' in app.user.roles %}
|
||||||
<!-- Lien pour ajouter un nouveau diplôme -->
|
<!-- Lien pour ajouter un nouveau diplôme -->
|
||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<a href="{{ path('app_degree_new') }}" class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4
|
<a href="{{ path('app_degree_new') }}"
|
||||||
rounded-full">
|
class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full">
|
||||||
<i class="fas fa-plus-circle"></i> Ajouter un nouveau diplôme
|
<i class="fas fa-plus-circle"></i> Ajouter un nouveau diplôme
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -3,22 +3,41 @@
|
|||||||
{% block title %}Liste des Candidatures{% endblock %}
|
{% block title %}Liste des Candidatures{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<h2 class="text-2xl font-bold mb-6">Candidatures reçues</h2>
|
<div class="max-w-2xl mx-auto mt-8">
|
||||||
|
<h2 class="text-3xl font-semibold text-center mb-8 text-gray-800">Candidatures reçues</h2>
|
||||||
|
|
||||||
{% for app in applications %}
|
{% for app in applications %}
|
||||||
<div class="border border-gray-300 rounded-lg p-4 mb-4 shadow-sm bg-white">
|
<div class="border border-gray-200 rounded-2xl p-6 shadow-md bg-white space-y-2">
|
||||||
<p><strong>Annonce :</strong> {{ app.application.title }}</p>
|
<p><span class="font-semibold text-gray-700">Annonce :</span> {{ app.application.title }}</p>
|
||||||
<p><strong>Candidat :</strong> {{ app.intern.firstName }} {{ app.intern.lastName }}</p>
|
<p><span class="font-semibold text-gray-700">Candidat :</span> {{ app.intern.firstName }} {{ app.intern.lastName }}</p>
|
||||||
<p><strong>Date :</strong> {{ app.applicationDate|date('d/m/Y') }}</p>
|
<p><span class="font-semibold text-gray-700">Date :</span> {{ app.applicationDate|date('d/m/Y') }}</p>
|
||||||
<p><strong>Statut :</strong> {{ app.status }}</p>
|
<p><span class="font-semibold text-gray-700">Statut :</span> {{ app.status|capitalize }}</p>
|
||||||
|
|
||||||
<a href="{{ path('app_profile_visit', { id: app.intern.id }) }}"
|
<a href="{{ path('app_profile_visit', { id: app.intern.id }) }}"
|
||||||
class="inline-block mt-2 bg-teal-500 hover:bg-teal-600 text-white px-4 py-2 rounded">
|
class="inline-block mt-3 bg-teal-500 hover:bg-teal-600 text-white px-4 py-2 rounded shadow">
|
||||||
Voir le profil du candidat
|
Voir le profil du candidat
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
{% if app.status == 'En Attente' %}
|
||||||
|
<div class="flex justify-end gap-3 mt-4">
|
||||||
|
<form method="post" action="{{ path('app_employee_update_application_status',
|
||||||
|
{id: app.id, status: 'Acceptée'}) }}">
|
||||||
|
<button type="submit" class="bg-green-500 hover:bg-green-600 text-white px-4 py-2 rounded shadow">
|
||||||
|
Accepter
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form method="post" action="{{ path('app_employee_update_application_status',
|
||||||
|
{id: app.id, status: 'Refusée'}) }}">
|
||||||
|
<button type="submit" class="bg-red-500 hover:bg-red-600 text-white px-4 py-2 rounded shadow">
|
||||||
|
Refuser
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p class="text-center text-gray-600">Aucune candidature pour le moment.</p>
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
|
||||||
<p>Aucune candidature pour le moment.</p>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -1,55 +1,25 @@
|
|||||||
{% extends 'base.html.twig' %}
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
{% block title %}Liste des FAQs{% endblock %}
|
{% block title %}FAQ{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="container mx-auto p-6">
|
<div class="container mx-auto p-6">
|
||||||
<h1 class="text-3xl font-bold mb-4">Liste des FAQs</h1>
|
<h1 class="text-3xl font-bold mb-4">FAQ</h1>
|
||||||
|
|
||||||
<div class="overflow-x-auto bg-white shadow-lg rounded-lg">
|
<div class="flex flex-col gap-4">
|
||||||
<table class="min-w-full table-auto">
|
{% for faq in faqs %}
|
||||||
<thead>
|
<div>
|
||||||
<tr class="bg-gray-800 text-white">
|
<h2 class="font-bold text-4xl">Question : {{ faq.question }}</h2>
|
||||||
<th class="px-4 py-2 text-left">Question</th>
|
<p class="italic text-gray-700">Dernière modification : {{ faq.updateDate|date("d-m-y") }}</p>
|
||||||
<th class="px-4 py-2 text-left">Réponse</th>
|
<p class="text-2xl ml-10">Réponse : {{ faq.answer }}</p>
|
||||||
<th class="px-4 py-2 text-left">Denrnière modif</th>
|
</div>
|
||||||
<th class="px-4 py-2 text-left">Actions</th>
|
<hr class="border-black"/>
|
||||||
</tr>
|
{% endfor %}
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for faq in faqs %}
|
|
||||||
<tr class="border-b">
|
|
||||||
<td class="px-4 py-2">{{ faq.question }}</td>
|
|
||||||
<td class="px-4 py-2">{{ faq.answer }}</td>
|
|
||||||
<td class="px-4 py-2">{{ faq.updateDate|date("d-m-y") }}</td>
|
|
||||||
<td class="px-4 py-2">
|
|
||||||
<a href="{{ path('app_faq_show', {'id': faq.id}) }}" class="text-teal-500 hover:text-teal-700 mr-3">
|
|
||||||
<i class="fas fa-eye"></i> Voir
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="{{ path('app_faq_edit', {'id': faq.id}) }}" class="text-yellow-500 hover:text-yellow-700 mr-3">
|
|
||||||
<i class="fas fa-edit"></i> Modifier
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<form method="post" action="{{ path('app_faq_delete', {'id': faq.id}) }}" style="display:inline;">
|
|
||||||
<input type="hidden" name="_method" value="DELETE">
|
|
||||||
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ faq.id) }}">
|
|
||||||
<button type="submit" class="text-red-500 hover:text-red-700">
|
|
||||||
<i class="fas fa-trash-alt"></i> Supprimer
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<a href="{{ path('app_faq_new') }}" class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full">
|
<a href="{{ path('app_faq_new') }}" class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full">
|
||||||
<i class="fas fa-plus-circle"></i> Ajouter une FAQ
|
<i class="fas fa-plus-circle"></i> Ajouter une FAQ / Poser une question
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -48,4 +48,18 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<h3 class="text-lg font-semibold mt-6">Vos compétences :</h3>
|
||||||
|
<ul class="list-disc list-inside text-gray-800">
|
||||||
|
{% if app.user.skills|length > 0 %}
|
||||||
|
{% for internSkill in app.user.skills %}
|
||||||
|
<li>{{ internSkill.skill.label }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<li>Aucune compétence sélectionnée</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<a class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full"
|
||||||
|
href="{{ path('app_profile_pickSkill') }}">Sélectionner vos compétences</a>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
23
templates/intern/resume.html.twig
Normal file
23
templates/intern/resume.html.twig
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Resume{% endblock %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div class="container mx-auto p-6">
|
||||||
|
<h1 class="text-4xl font-semibold text-gray-800 mb-6">Ajouter / Modifier le CV</h1>
|
||||||
|
|
||||||
|
<div class="bg-white shadow-md rounded-lg p-6">
|
||||||
|
{{ form_start(form, {'attr': {'enctype': 'multipart/form-data'}}) }}
|
||||||
|
|
||||||
|
<div class="mt-6">
|
||||||
|
{{ form_widget(form) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="bg-teal-500 hover:bg-teal-600 text-white px-6 py-3 rounded-lg mt-4">
|
||||||
|
Enregistrer
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{{ form_end(form) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -8,9 +8,9 @@
|
|||||||
<p class="text-gray-600">Téléphone : {{ app.user.tel }}</p>
|
<p class="text-gray-600">Téléphone : {{ app.user.tel }}</p>
|
||||||
<p class="text-gray-600">Email : {{ app.user.mail }}</p>
|
<p class="text-gray-600">Email : {{ app.user.mail }}</p>
|
||||||
|
|
||||||
<a href="{{ path('app_employee_applications') }}"
|
|
||||||
class="bg-blue-600 hover:bg-blue-700 text-white py-2 px-4 rounded">
|
<a class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full"
|
||||||
Voir les candidatures reçues
|
href="{{ path('app_employee_seeApplications') }}"> Voir les candidatures reçues
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,11 +2,30 @@
|
|||||||
<h2 class="text-xl font-semibold mb-4">Bonjour {{ app.user.nickname }}</h2>
|
<h2 class="text-xl font-semibold mb-4">Bonjour {{ app.user.nickname }}</h2>
|
||||||
<p class="text-gray-700">Vous êtes à la recherche d'un stage.</p>
|
<p class="text-gray-700">Vous êtes à la recherche d'un stage.</p>
|
||||||
<br>
|
<br>
|
||||||
<p class="text-gray-600">Nom : {{ app.user.firstName }}</p>
|
|
||||||
<p class="text-gray-600">Prénom : {{ app.user.lastName }}</p>
|
<div class="flex flex-col gap-5">
|
||||||
<p class="text-gray-600">Adresse : {{ app.user.address }}</p>
|
<p class="text-gray-600">Nom : {{ app.user.firstName }}</p>
|
||||||
<p class="text-gray-600">Téléphone : {{ app.user.tel }}</p>
|
<p class="text-gray-600">Prénom : {{ app.user.lastName }}</p>
|
||||||
<p class="text-gray-600">Email : {{ app.user.mail }}</p>
|
<p class="text-gray-600">Adresse : {{ app.user.address }}</p>
|
||||||
|
<p class="text-gray-600">Téléphone : {{ app.user.tel }}</p>
|
||||||
|
<p class="text-gray-600">Email : {{ app.user.mail }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if app.user.resume != "" %}
|
||||||
|
<div class="flex justify-around">
|
||||||
|
<div>
|
||||||
|
<iframe height="575px" width="400px" src={{ 'cv/' ~ app.user.resume }}></iframe>
|
||||||
|
{% if app.user.resumeName != "" %}
|
||||||
|
<p class="text-gray-600 italic">Nom du fichier : {{ app.user.resumeName }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<a class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full"
|
||||||
|
href="{{ path('app_intern_resume',{id: app.user.id}) }}"> Ajouter / Modifier le CV
|
||||||
|
</a>
|
||||||
|
|
||||||
<h3 class="text-lg font-semibold mt-6">Vos diplômes :</h3>
|
<h3 class="text-lg font-semibold mt-6">Vos diplômes :</h3>
|
||||||
<ul class="list-disc list-inside text-gray-800">
|
<ul class="list-disc list-inside text-gray-800">
|
||||||
@ -26,16 +45,24 @@
|
|||||||
|
|
||||||
<h3 class="text-lg font-semibold mt-6">Vos compétences :</h3>
|
<h3 class="text-lg font-semibold mt-6">Vos compétences :</h3>
|
||||||
<ul class="list-disc list-inside text-gray-800">
|
<ul class="list-disc list-inside text-gray-800">
|
||||||
|
{% if app.user.skills|length > 0 %}
|
||||||
|
{% for internSkill in app.user.skills %}
|
||||||
|
<li>{{ internSkill.skill.label }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
<br>
|
||||||
|
Aucune pour le moment
|
||||||
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
<a class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full"
|
<a class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full"
|
||||||
href="{{ path('app_user_edit',{id: app.user.id}) }}"> Selectionner vos compétences
|
href="{{ path('app_skill_index',{id: app.user.id}) }}"> Sélectionner vos compétences
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
<div class="flex justify-center mt-6">
|
<div class="flex justify-center mt-6">
|
||||||
<a class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full"
|
<a class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full"
|
||||||
href="{{ path('app_user_edit',{id: app.user.id}) }}"> Accéder aux favoris
|
href="{{ path('app_announcement_show',{id: app.user.id}) }}"> Accéder aux favoris
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -7,18 +7,18 @@
|
|||||||
<h2 class="text-2xl font-bold mb-4">Profil du candidat</h2>
|
<h2 class="text-2xl font-bold mb-4">Profil du candidat</h2>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<p><strong>Nom :</strong> {{ user.lastName }}</p>
|
<p><strong>Nom :</strong> {{ candidat.lastName }}</p>
|
||||||
<p><strong>Prénom :</strong> {{ user.firstName }}</p>
|
<p><strong>Prénom :</strong> {{ candidat.firstName }}</p>
|
||||||
<p><strong>Email :</strong> {{ user.mail }}</p>
|
<p><strong>Email :</strong> {{ candidat.mail }}</p>
|
||||||
<p><strong>Téléphone :</strong> {{ user.tel }}</p>
|
<p><strong>Téléphone :</strong> {{ candidat.tel }}</p>
|
||||||
<p><strong>Adresse :</strong> {{ user.address }}</p>
|
<p><strong>Adresse :</strong> {{ candidat.address }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<h3 class="text-xl font-semibold">Diplômes</h3>
|
<h3 class="text-xl font-semibold">Diplômes</h3>
|
||||||
<ul class="list-disc list-inside text-gray-800 mt-2">
|
<ul class="list-disc list-inside text-gray-800 mt-2">
|
||||||
{% if user.degrees|length > 0 %}
|
{% if candidat.degrees|length > 0 %}
|
||||||
{% for deg in user.degrees %}
|
{% for deg in candidat.degrees %}
|
||||||
<li>
|
<li>
|
||||||
{{ deg.degree.label }} — Obtenu le {{ deg.graduationDate|date('d/m/Y') }}
|
{{ deg.degree.label }} — Obtenu le {{ deg.graduationDate|date('d/m/Y') }}
|
||||||
</li>
|
</li>
|
||||||
@ -32,9 +32,9 @@
|
|||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<h3 class="text-xl font-semibold">Compétences</h3>
|
<h3 class="text-xl font-semibold">Compétences</h3>
|
||||||
<ul class="list-disc list-inside text-gray-800 mt-2">
|
<ul class="list-disc list-inside text-gray-800 mt-2">
|
||||||
{% if user.skills|length > 0 %}
|
{% if candidat.skills|length > 0 %}
|
||||||
{% for skill in user.skills %}
|
{% for sk in candidat.skills %}
|
||||||
<li>{{ skill.label }}</li>
|
<li>{{ sk.skill.label }}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<p class="text-gray-500 mt-2">Aucune compétence renseignée.</p>
|
<p class="text-gray-500 mt-2">Aucune compétence renseignée.</p>
|
||||||
@ -43,9 +43,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mt-6">
|
<div class="mt-6">
|
||||||
<a href="{{ path('app_index') }}"
|
<a href="{{ path('app_employee_seeApplications') }}"
|
||||||
class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full">
|
class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full">
|
||||||
Retour à l'accueil
|
Retour à la liste des candidatures
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -36,6 +36,15 @@
|
|||||||
{{ form_errors(registrationForm.mail) }}
|
{{ form_errors(registrationForm.mail) }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if employee %}
|
||||||
|
<div class="mb-4">
|
||||||
|
{{ form_label(registrationForm.company, 'Sélectionnez une entreprise', {'label_attr': {'class': 'block text-gray-700 mb-2'}}) }}
|
||||||
|
{{ form_widget(registrationForm.company, {'attr': {'class': 'w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-teal-500'}}) }}
|
||||||
|
{{ form_errors(registrationForm.company) }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<!-- Mot de passe -->
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
{{ form_label(registrationForm.plainPassword, 'Mot de passe', {'label_attr': {'class': 'block text-gray-700 mb-2'}}) }}
|
{{ form_label(registrationForm.plainPassword, 'Mot de passe', {'label_attr': {'class': 'block text-gray-700 mb-2'}}) }}
|
||||||
{{ form_widget(registrationForm.plainPassword, {'attr': {'class': 'w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-teal-500'}}) }}
|
{{ form_widget(registrationForm.plainPassword, {'attr': {'class': 'w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-teal-500'}}) }}
|
||||||
|
14
templates/security/reset_password_request.html.twig
Normal file
14
templates/security/reset_password_request.html.twig
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Demande de réinitialisation de mot de passe{% endblock %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<section>
|
||||||
|
<h1>Demande de réinitialisation de mot de passe</h1>
|
||||||
|
{{ form_start(requestPassForm) }}
|
||||||
|
{{ form_row(requestPassForm.email) }}
|
||||||
|
<button type="submit">Envoyer</button>
|
||||||
|
|
||||||
|
{{ form_end(requestPassForm) }}
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
@ -6,47 +6,70 @@
|
|||||||
<div class="container mx-auto p-6">
|
<div class="container mx-auto p-6">
|
||||||
<h1 class="text-3xl font-bold mb-4">Liste des Compétences</h1>
|
<h1 class="text-3xl font-bold mb-4">Liste des Compétences</h1>
|
||||||
|
|
||||||
<div class="overflow-x-auto bg-white shadow-lg rounded-lg">
|
{% if 'ROLE_INTERN' in app.user.roles %}
|
||||||
<table class="min-w-full table-auto">
|
<form method="post" action="{{ path('app_intern_add_skills') }}">
|
||||||
<thead>
|
{% endif %}
|
||||||
<tr class="bg-gray-800 text-white">
|
|
||||||
<th class="px-4 py-2 text-left">ID</th>
|
|
||||||
<th class="px-4 py-2 text-left">Label</th>
|
|
||||||
<th class="px-4 py-2 text-left">Actions</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for skill in skills %}
|
|
||||||
<tr class="border-b">
|
|
||||||
<td class="px-4 py-2">{{ skill.id }}</td>
|
|
||||||
<td class="px-4 py-2">{{ skill.label }}</td>
|
|
||||||
<td class="px-4 py-2">
|
|
||||||
<a href="{{ path('app_skill_show', {'id': skill.id}) }}" class="text-teal-500 hover:text-teal-700 mr-3">
|
|
||||||
<i class="fas fa-eye"></i> Voir
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="{{ path('app_skill_edit', {'id': skill.id}) }}" class="text-yellow-500 hover:text-yellow-700 mr-3">
|
<!-- Tableau des compétences -->
|
||||||
<i class="fas fa-edit"></i> Modifier
|
<div class="overflow-x-auto bg-white shadow-lg rounded-lg">
|
||||||
</a>
|
<table class="min-w-full table-auto">
|
||||||
|
<thead>
|
||||||
<form method="post" action="{{ path('app_skill_delete', {'id': skill.id}) }}" style="display:inline;">
|
<tr class="bg-gray-800 text-white">
|
||||||
<input type="hidden" name="_method" value="DELETE">
|
<th class="px-4 py-2 text-left">ID</th>
|
||||||
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ skill.id) }}">
|
<th class="px-4 py-2 text-left">Label</th>
|
||||||
<button type="submit" class="text-red-500 hover:text-red-700">
|
<th class="px-4 py-2 text-left">Actions</th>
|
||||||
<i class="fas fa-trash-alt"></i> Supprimer
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
</thead>
|
||||||
</tbody>
|
<tbody>
|
||||||
</table>
|
{% for skill in skills %}
|
||||||
</div>
|
<tr class="border-b">
|
||||||
|
<td class="px-4 py-2">{{ skill.id }}</td>
|
||||||
|
<td class="px-4 py-2">{{ skill.label }}</td>
|
||||||
|
<td class="px-4 py-2">
|
||||||
|
{% if 'ROLE_INTERN' in app.user.roles %}
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" name="selected_skills[]" value="{{ skill.id }}" class="mr-2">
|
||||||
|
Sélectionner
|
||||||
|
</label>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="mt-4">
|
{% if 'ROLE_ADMIN' in app.user.roles %}
|
||||||
<a href="{{ path('app_skill_new') }}" class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full">
|
<!-- Modifier la compétence -->
|
||||||
<i class="fas fa-plus-circle"></i> Ajouter une nouvelle compétence
|
<a href="{{ path('app_skill_edit', {'id': skill.id}) }}" class="text-yellow-500 hover:text-yellow-700 mr-3">
|
||||||
</a>
|
<i class="fas fa-edit"></i> Modifier
|
||||||
</div>
|
</a>
|
||||||
|
|
||||||
|
<!-- Supprimer la compétence -->
|
||||||
|
<form method="post" action="{{ path('app_skill_delete', {'id': skill.id}) }}" style="display:inline;">
|
||||||
|
<input type="hidden" name="_method" value="DELETE">
|
||||||
|
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ skill.id) }}">
|
||||||
|
<button type="submit" class="text-red-500 hover:text-red-700">
|
||||||
|
<i class="fas fa-trash-alt"></i> Supprimer
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if 'ROLE_INTERN' in app.user.roles %}
|
||||||
|
<div class="mt-4">
|
||||||
|
<button type="submit" class="bg-blue-500 hover:bg-blue-600 text-white py-2 px-4 rounded-full">
|
||||||
|
<i class="fas fa-check-circle"></i> Valider la sélection
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if 'ROLE_ADMIN' in app.user.roles %}
|
||||||
|
<div class="mt-4">
|
||||||
|
<a href="{{ path('app_skill_new') }}" class="bg-teal-500 hover:bg-teal-600 text-white py-2 px-4 rounded-full">
|
||||||
|
<i class="fas fa-plus-circle"></i> Ajouter une compétence
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user