Merge branch 'merged' of https://codefirst.iut.uca.fr/git/HeartDev/Web into merged
continuous-integration/drone/push Build is failing Details

WORK-APE
antoine.perederii 1 year ago
commit c311825459

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

After

Width:  |  Height:  |  Size: 692 B

File diff suppressed because it is too large Load Diff

@ -0,0 +1,34 @@
/*!
* Start Bootstrap - New Age v6.0.7 (https://startbootstrap.com/theme/new-age)
* Copyright 2013-2023 Start Bootstrap
* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-new-age/blob/master/LICENSE)
*/
//
// Scripts
//
window.addEventListener('DOMContentLoaded', event => {
// Activate Bootstrap scrollspy on the main nav element
const mainNav = document.body.querySelector('#mainNav');
if (mainNav) {
new bootstrap.ScrollSpy(document.body, {
target: '#mainNav',
offset: 74,
});
};
// Collapse responsive navbar when toggler is visible
const navbarToggler = document.body.querySelector('.navbar-toggler');
const responsiveNavItems = [].slice.call(
document.querySelectorAll('#navbarResponsive .nav-link')
);
responsiveNavItems.map(function (responsiveNavItem) {
responsiveNavItem.addEventListener('click', () => {
if (window.getComputedStyle(navbarToggler).display !== 'none') {
navbarToggler.click();
}
});
});
});

@ -1,7 +1,15 @@
<?php <?php
namespace App\Controller;
namespace App\Controller; namespace App\Controller;
use App\Container;
use App\Router\Request\IRequest;
use App\Router\Response\Response;
use Shared\Attributes\Route;
use Twig\Environment;
use Data\Core\Preferences;
use Shared\Log;
use App\Container; use App\Container;
use App\Router\Request\IRequest; use App\Router\Request\IRequest;
use App\Router\Response\Response; use App\Router\Response\Response;
@ -13,7 +21,16 @@ use Shared\Log;
class AthleteController extends BaseController class AthleteController extends BaseController
{ {
#[Route(path: '/search-ath', name: 'search-ath', methods: ['GET'])] private Environment $twig;
private Preferences $preference;
public function __construct()
{
session_start();
$this->preference = new Preferences();
}
#[Route(path: '/search-user', name: 'search-user', methods: ['GET'])]
public function searchUser(string $username, IRequest $req): Response public function searchUser(string $username, IRequest $req): Response
{ {
$taberror = []; $taberror = [];
@ -33,26 +50,26 @@ class AthleteController extends BaseController
]; ];
// if(!Validation::val_string($name)){ // if(!Validation::val_string($name)){
try { try {
//code... //code...
// $model->userMgr->getUser($name); // $model->userMgr->getUser($name);
return $this->render('./page/addfriend.html.twig', [ return $this->render('./page/addfriend.html.twig',[
'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
'pp' => "test2", 'pp' => "test2",
'user' => "Doe", 'user' => "Doe",
'role' => "Athlète", 'role' => "Athlète",
'friendship' => [], 'friendship' => [],
'analyzes' => [], 'analyzes' => [],
'mails' => [], 'mails' => [],
'users' => $utiliArray, 'users' => $utiliArray,
'infoUser' => [], 'infoUser' => [],
'exos' => [], 'exos' => [],
'member' => [], 'member' => [],
'responce' => "Notification d'ajout envoyée à $username" 'responce' => "Notification d'ajout envoyée à $username"
]); ]);
} catch (\Throwable $th) { } catch (\Throwable $th) {
//throw $th; //throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
} }
// } // }
} }
@ -60,7 +77,7 @@ class AthleteController extends BaseController
#[Route(path: '/analyses', name: 'analyses', methods: ['GET'])] #[Route(path: '/analyses', name: 'analyses', methods: ['GET'])]
public function analyses(): Response public function analyses(): Response
{ {
return $this->render('./page/analyze.html.twig', [ return $this->render('./page/analyze.html.twig',[
'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
'pp' => "test2", 'pp' => "test2",
'user' => "Doe", 'user' => "Doe",
@ -75,12 +92,29 @@ class AthleteController extends BaseController
]); ]);
} }
#[Route(path: '/activity', name: 'activity', methods: ['GET'])]
public function activity(): Response
{
return $this->render('./page/activity.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/exercice', name: 'exercice', methods: ['GET'])] // 8 #[Route(path: '/exercice', name: 'exercice', methods: ['GET'])] // 8
public function exercice(): Response public function exercice(): Response
{ {
return $this->render('./page/exercice.html.twig', [ return $this->render('./page/exercice.html.twig',[
'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
'pp' => "test2", 'pp' => "test2",
'user' => "Doe", 'user' => "Doe",
@ -95,6 +129,32 @@ class AthleteController extends BaseController
]); ]);
} }
#[Route(path: '/exercices', name: 'exercices', methods: ['POST'])] // 8
public function exercices(String $type, String $intensite, String $date, IRequest $req): Response
{
$exercicesArray = [
[
'date' => $date,
'type' => $type,
'intensite' => $intensite,
'status' => 'A venur',
]
];
return $this->render('./page/exercice.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => $exercicesArray,
'member' => []
]);
}
#[Route(path: '/add-friend', name: 'add-friend', methods: ['POST'])] #[Route(path: '/add-friend', name: 'add-friend', methods: ['POST'])]
public function addFriend(string $username, IRequest $req): Response public function addFriend(string $username, IRequest $req): Response
{ {
@ -115,33 +175,30 @@ class AthleteController extends BaseController
]; ];
// if(!Validation::val_string($name)){ // if(!Validation::val_string($name)){
try { try {
//code... //code...
// $model->userMgr->addFriend($name); // $model->userMgr->addFriend($name);
return $this->render('./page/addfriend.html.twig', [ return $this->render('./page/addfriend.html.twig',[
'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
'pp' => "test2", 'pp' => "test2",
'user' => "Doe", 'user' => "Doe",
'role' => "Athlète", 'role' => "Athlète",
'friendship' => [], 'friendship' => [],
'analyzes' => [], 'analyzes' => [],
'mails' => [], 'mails' => [],
'users' => $utiliArray, 'users' => $utiliArray,
'infoUser' => [], 'infoUser' => [],
'exos' => [], 'exos' => [],
'member' => [], 'member' => [],
'responce' => "Notification d'ajout envoyée à $username" 'responce' => "Notification d'ajout envoyée à $username"
]); ]);
} catch (\Throwable $th) { } catch (\Throwable $th) {
//throw $th; //throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]); // return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
} }
// } // }
} }
#[Route(path: '/friend', name: 'friend', methods: ['GET'])] #[Route(path: '/friend', name: 'friend', methods: ['GET'])]
public function friend(): Response public function friend(): Response
{ {
@ -174,4 +231,78 @@ class AthleteController extends BaseController
]); ]);
} }
#[Route(path: '/friendlist', name: 'friendlist', methods: ['POST'])]
public function friendlist(string $username, IRequest $req): Response
{
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
/* TODO */
// -> Enlever ou bloquer un utilisateur en fonction de son username
return $this->render('./page/friend.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => $utiliArray,
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => [],
]);
}
#[Route(path: '/friendlist', name: 'friendlist2', methods: ['GET'])]
public function friendlist2(): Response
{
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'test',
'status' => 'johndoe',
'username' => 'jdoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'test2',
'status' => 'alicesmith',
'username' => 'asmith',
],
];
return $this->render('./page/friend.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => $utiliArray,
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => [],
]);
}
// #[Route(path: '/delete-friend', name: 'delete-friend', methods: ['POST'])]
} }
?>

@ -5,11 +5,7 @@ namespace App\Controller;
use App\Container; use App\Container;
use App\Router\Request\IRequest; use App\Router\Request\IRequest;
use App\Router\Response\Response; use App\Router\Response\Response;
use App\Router\Response\IResponse;
use Couchbase\UserManager;
use Shared\Attributes\Route; use Shared\Attributes\Route;
use Shared\Validation;
use Twig\Environment; use Twig\Environment;
use Data\Core\Preferences; use Data\Core\Preferences;
use Shared\Log; use Shared\Log;
@ -17,53 +13,105 @@ use Shared\Log;
class AuthController extends BaseController class AuthController extends BaseController
{ {
private Preferences $preference;
#[Route('/login', name: 'login',methods: ['POST'])] public function __construct(){
public function login(IRequest $request): IResponse { $this->preference = new Preferences();
}
$error = []; #[Route('/login', name: 'login')]
try { public function login(?string $username, ?string $password ,IRequest $request): Response {
$log=Validation::clean_string($request->getBody()['email']); // if user is already logged in, don't display the login page again
$mdp=Validation::clean_string($request->getBody()['password']); if ($user) {
} catch (\Throwable $th) { return $this->redirectToRoute('blog_index');
$error = "Wrong cred";
} }
if($this->container->get(UserManager::class)->login($log,$mdp)){ // this statement solves an edge-case: if you change the locale in the login
return $this->redirectToRoute('/home'); // page, after a successful login you are redirected to a page in the previous
} // locale. This code regenerates the referrer URL whenever the login page is
else{ // browsed, to ensure that its locale is always the current one.
$error [] = "Erreur de connexion. Essayez encore"; $this->saveTargetPath($request->getSession(), 'main', $this->generateUrl('admin_index'));
}
return $this->render('./page/home.html.twig', ['error' => $error]); return $this->render('security/login.html.twig', [
// last username entered by the user (if any)
'last_username' => $helper->getLastUsername(),
// last authentication error (if any)
'error' => $helper->getLastAuthenticationError(),
]);
}
// #[Route('/login', name: 'login')]
// public function login(?string $username, ?string $password ,IRequest $request): Response {
// // if user is already logged in, don't display the login page again
// if ($user) {
// return $this->redirectToRoute('blog_index');
// }
// // this statement solves an edge-case: if you change the locale in the login
// // page, after a successful login you are redirected to a page in the previous
// // locale. This code regenerates the referrer URL whenever the login page is
// // browsed, to ensure that its locale is always the current one.
// $this->saveTargetPath($request->getSession(), 'main', $this->generateUrl('admin_index'));
// return $this->render('security/login.html.twig', [
// // last username entered by the user (if any)
// 'last_username' => $helper->getLastUsername(),
// // last authentication error (if any)
// 'error' => $helper->getLastAuthenticationError(),
// ]);
// }
#[Route(path: '/register', name: 'register', methods: ['POST'])]
public function register(string $username,string $mdp,string $confirmMdp,string $nom,string $prenom,string $dateNaissance,string $sexe,string $taille,string $poids, IRequest $req): Response
{
// CONFIRMER LES DONNESS !!!!! IMPORTANT
return $this->render('./page/home.html.twig',[
'css' => $this->preference->getCookie()
]);
} }
#[Route('/log', name: 'baseLog',methods: ['GET'])] #[Route(path: '/regist', name: 'regist', methods: ['GET'])]
public function index(IRequest $request): IResponse { public function register2(): Response
{
return $this->render('./page/login.html.twig',[ // CONFIRMER LES DONNESS !!!!! IMPORTANT
'css' => $this->preference->getCookie(),
'pp' => "test2", return $this->render('./page/register.html.twig',[
'user' => "Doe", 'css' => $this->preference->getCookie()
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]); ]);
}
function inscription() {
$model = new ModelVisitor();
$log=Validation::clean_string($_POST['pseudo']);
$mdp=Validation::clean_string($_POST['password']);
if($model->createAUser($log,$mdp)){
if(ModelUser::login($log, $mdp)){
UserControler::displayView();
}
}
} }
function connexion(){
$model = new ModelVisitor();
if(!isset($_POST['pseudo']) || !isset($_POST['password'])) throw new Exception(" some wrong with credentials !!!!!");
$log=Validation::clean_string($_POST['pseudo']);
$mdp=Validation::clean_string($_POST['password']);
if(ModelUser::login($log, $mdp)){
UserControler::displayView();
}
#[Route('/logout', name: 'logout',methods: ['GET'])] }
public function logout(IRequest $request): IResponse {
return $this->render('./page/login.html.twig',[ #[Route(path: '/pass', name: 'pass', methods: ['GET'])]
public function pass(): Response
{
// CONFIRMER LES DONNESS !!!!! IMPORTANT
return $this->render('./page/password.html.twig',[
'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
'pp' => "test2", 'pp' => "test2",
'user' => "Doe", 'user' => "Doe",
@ -76,16 +124,15 @@ class AuthController extends BaseController
'exos' => [], 'exos' => [],
'member' => [] 'member' => []
]); ]);
} }
#[Route(path: '/regist', name: 'regist', methods: ['GET'])] #[Route(path: '/log', name: 'log', methods: ['GET'])]
public function register2(): Response public function login2(): Response
{ {
// CONFIRMER LES DONNESS !!!!! IMPORTANT // CONFIRMER LES DONNESS !!!!! IMPORTANT
return $this->render('./page/register.html.twig',[ return $this->render('./page/login.html.twig',[
'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
'pp' => "test2", 'pp' => "test2",
'user' => "Doe", 'user' => "Doe",
@ -100,71 +147,13 @@ class AuthController extends BaseController
]); ]);
} }
#[Route('/register', name: 'register' , methods:['GET'])] #[Route(path: '/password', name: 'password', methods: ['POST'])]
public function register(IRequest $request): IResponse public function password(string $email, IRequest $req): Response
{
if ($request->getMethod() == 'POST') {
$nom = $request->getBody()['nom'];
$prenom = $request->getBody()['prenom'];
$username = $request->getBody()['username'];
$email = $request->getBody()['email'];
$motDePasse = $request->getBody()['motDePasse'];
$sexe = $request->getBody()['sexe'];
$taille = $request->getBody()['taille'];
$poids = $request->getBody()['poids'];
$dateNaissanceStr = $request->getBody()['nom'];
$dateNaissance = new \DateTime($dateNaissanceStr);
if (!$dateNaissance) {
throw new \Exception("Date de naissance non valide. Format attendu : YYYY-MM-DD");
}
$roleName = $request->getBody()['roleName'];
$registrationData = [
'nom' => $nom,
'prenom' => $prenom,
'username' => $username,
'email' => $email,
'sexe' => $sexe,
'taille' => $taille,
'poids' => $poids,
'dateNaissance' => $dateNaissance,
'roleName' => $roleName
];
try {
if ($this->container->get(UserManager::class)->register($email, $motDePasse, $registrationData)) {
return $this->redirectToRoute('/');
} else {
$error [] = 'L\'inscription a échoué. Veuillez réessayer.';
}
} catch (\Exception $e) {
$error [] = 'Erreur lors de l\'inscription: ' . $e->getMessage();
}
}
return $this->render('./page/register.html.twig');
}
#[Route(path: '/mdp', name: 'motdepasse', methods: ['POST'])]
public function mdp(string $ancienMotDePasse,string $nouveauMotDePasse,string $confirmerMotDePasse, IRequest $req): Response
{ {
// CONFIRMER LES DONNESS !!!!! IMPORTANT // CONFIRMER LES DONNESS !!!!! IMPORTANT
return $this->render('./page/settings.html.twig',[ return $this->render('./page/login.html.twig',[
'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
'pp' => "test2", 'pp' => "test2",
'user' => "Doe", 'user' => "Doe",
@ -180,8 +169,6 @@ class AuthController extends BaseController
} }
} }
?> ?>

@ -1,49 +1,34 @@
<?php <?php
// namespace App\Controller; namespace App\Controller;
// use App\Container; use App\Container;
// use App\Router\Request\IRequest; use App\Router\Request\IRequest;
// use App\Router\Response\Response; use App\Router\Response\Response;
// use App\Router\Response\IResponse; use App\Router\Response\IResponse;
// use Shared\Attributes\Route; use Shared\Attributes\Route;
// use Twig\Environment; use Twig\Environment;
// use Data\Core\Preferences; use Data\Core\Preferences;
// use Shared\Log; use Shared\Log;
class CoachController extends BaseController
{
// #[Route(path: '/coach', name: 'coach')] private ICoachManager $coachManager;
// class CoachController extends BaseController private $security;
// { private Environment $twig;
private Preferences $preference;
// private ICoachManager $coachManager; public function __construct(DataManager $dataManager, Security $security)
// private $security; {
session_start();
$this->coachManager = $dataManager->coachMgr;
$this->security = $security;
$this->preference = new Preferences();
}
// public function __construct(DataManager $dataManager, Security $security)
// {
// $this->coachManager = $dataManager->coachMgr;
// $this->security = $security;
// }
// #[Route(path: '/', name: 'home', methods: ['GET'])]
// public function index(): Response
// {
// return $this->render('./page/home.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route('/global-stats', name: 'coach_global_stats', methods: ['GET'])] // #[Route('/global-stats', name: 'coach_global_stats', methods: ['GET'])]
// public function globalStats(): Response // public function globalStats(): Response
// { // {
@ -51,41 +36,145 @@
// return $this->render('coach/global_stats.html.twig'); // return $this->render('coach/global_stats.html.twig');
// } // }
// #[Route(path: '/exercice', name: 'exercice', methods: ['GET'])] // 8
// public function exercice(): Response
// {
// return $this->render('./page/exercice.html.twig',[
// 'css' => $this->preference->getCookie(),
// 'pp' => "test2",
// 'user' => "Doe",
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [],
// 'mails' => [],
// 'users' => [],
// 'infoUser' => [],
// 'exos' => [],
// 'member' => []
// ]);
// }
// #[Route(path: '/coaching', name: 'coaching', methods: ['GET'])] #[Route(path: '/coaching', name: 'coaching', methods: ['GET'])]
// public function coaching(): Response public function coaching(): Response
// { {
// return $this->render('./page/coaching.html.twig',[ return $this->render('./page/coaching.html.twig',[
// 'css' => $this->preference->getCookie(), 'css' => $this->preference->getCookie(),
// 'pp' => "test2", 'pp' => "test2",
// 'user' => "Doe", 'user' => "Doe",
// 'role' => "Athlète", 'role' => "Coach",
// 'friendship' => [], 'friendship' => [],
// 'analyzes' => [], 'analyzes' => [],
// 'mails' => [], 'mails' => [],
// 'users' => [], 'users' => [],
// 'infoUser' => [], 'infoUser' => [],
// 'exos' => [], 'exos' => [],
// 'member' => [] 'member' => []
// ]); ]);
// } }
#[Route(path: '/search-member', name: 'search-member', methods: ['GET'])]
public function searchMember(string $username, IRequest $req): Response
{
$taberror = [];
// FILTER
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
// if(!Validation::val_string($name)){
try {
//code...
// $model->userMgr->addFriend($name);
return $this->render('./page/addmember.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
'responce' => "Notification d'ajout envoyée à $username"
]);
} catch (\Throwable $th) {
//throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
}
// }
}
#[Route(path: '/add-member', name: 'add-member', methods: ['POST'])]
public function addmember(string $username, IRequest $req): Response
{
$taberror = [];
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
// if(!Validation::val_string($name)){
try {
//code...
// $model->userMgr->addFriend($name);
return $this->render('./page/addmember.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
'responce' => "Notification d'ajout envoyée à $username"
]);
} catch (\Throwable $th) {
//throw $th;
// return $this->render("addfriend.html.twig", ['tabError' => $taberror ]);
}
// }
}
#[Route(path: '/member', name: 'member', methods: ['GET'])]
public function member(): Response
{
$utiliArray = [
[
'nom' => 'John',
'prenom' => 'Doe',
'img' => 'john_doe',
'username' => 'johndoe',
],
[
'nom' => 'Alice',
'prenom' => 'Smith',
'img' => 'alice_smith',
'username' => 'alicesmith',
],
];
return $this->render('./page/addmember.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => $utiliArray,
'infoUser' => [],
'exos' => [],
'member' => [],
]);
}
// #[Route('/list-athletes', name: 'coach_list_athletes')] // #[Route('/list-athletes', name: 'coach_list_athletes')]
// public function listAthletes(): Response // public function listAthletes(): Response
@ -121,4 +210,4 @@
// // } // // }
// } }

File diff suppressed because it is too large Load Diff

@ -1,36 +1,45 @@
<?php <?php
// namespace App\Controller; namespace App\Controller;
// use App\Container; use App\Container;
// use App\Router\Request\IRequest; use App\Router\Request\IRequest;
// use App\Router\Response\Response; use App\Router\Response\Response;
// use Shared\Attributes\Route; use Shared\Attributes\Route;
// use Twig\Environment; use Twig\Environment;
// use Data\Core\Preferences; use Data\Core\Preferences;
// use Shared\Log; use Shared\Log;
// class HeartRateController extends BaseController class HeartRateController extends BaseController
// { {
private Environment $twig;
// #[Route(path: '/import', name: 'import', methods: ['GET'])] private Preferences $preference;
// public function import(): Response
// { public function __construct()
// return $this->render('./page/import.html.twig',[ {
// 'css' => $this->preference->getCookie(), session_start();
// 'pp' => "test2", $this->preference = new Preferences();
// 'user' => "Doe", }
// 'role' => "Athlète",
// 'friendship' => [],
// 'analyzes' => [], #[Route(path: '/import', name: 'import', methods: ['GET'])]
// 'mails' => [], public function import(): Response
// 'users' => [], {
// 'infoUser' => [], return $this->render('./page/import.html.twig',[
// 'exos' => [], 'css' => $this->preference->getCookie(),
// 'member' => [] 'pp' => "test2",
// ]); 'user' => "Doe",
// } 'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
// } 'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
}

@ -1,19 +1,45 @@
<?php <?php
// namespace App\Controller; namespace App\Controller;
// use App\Container; use App\Container;
// use App\Router\Request\IRequest; use App\Router\Request\IRequest;
// use App\Router\Response\Response; use App\Router\Response\Response;
// use App\Router\Response\IResponse; use Shared\Attributes\Route;
use Twig\Environment;
use Data\Core\Preferences;
use Shared\Log;
// use Shared\Attributes\Route; class SocialController extends BaseController
// use Twig\Environment; {
// use Data\Core\Preferences;
// use Shared\Log;
private Environment $twig;
private Preferences $preference;
public function __construct()
{
session_start();
$this->preference = new Preferences();
}
// #[Route(path: '/coach', name: 'coach')]
// class CoachController extends BaseController #[Route(path: '/mail', name: 'mail', methods: ['GET'])]
// { public function mail(): Response
{
return $this->render('./page/mail.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
}

@ -13,6 +13,15 @@ use Shared\Log;
class UserController extends BaseController class UserController extends BaseController
{ {
private Environment $twig;
private Preferences $preference;
public function __construct()
{
session_start();
$this->preference = new Preferences();
}
#[Route(path: '/', name: 'index', methods: ['GET'])] #[Route(path: '/', name: 'index', methods: ['GET'])]
public function index(): Response public function index(): Response
@ -69,10 +78,28 @@ class UserController extends BaseController
]); ]);
} }
#[Route(path: '/profile', name: 'profile', methods: ['GET'])]
public function profile(): Response
{
return $this->render('./page/profile.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/preferences', name: 'preferences', methods: ['POST'])] #[Route(path: '/preferences', name: 'preferences', methods: ['POST'])]
public function preferences(string $theme, IRequest $req): Response public function preferences(string $theme, IRequest $req): Response
{ {
/*TODO*/
// VALIDER LES DONNEES // VALIDER LES DONNEES
$this->preference->majCookie($theme); $this->preference->majCookie($theme);
@ -92,4 +119,45 @@ class UserController extends BaseController
]); ]);
} }
#[Route(path: '/psettings', name: 'psettings', methods: ['POST'])]
public function psettings(string $nom,string $prenom,string $dateNaissance,string $mail,string $tel, IRequest $req): Response
{
return $this->render('./page/settings.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => $prenom,
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
#[Route(path: '/mdp', name: 'mdp', methods: ['POST'])]
public function mdp(string $ancienMotDePasse,string $nouveauMotDePasse,string $confirmerMotDePasse, IRequest $req): Response
{
// CONFIRMER LES DONNESS !!!!! IMPORTANT
return $this->render('./page/settings.html.twig',[
'css' => $this->preference->getCookie(),
'pp' => "test2",
'user' => "Doe",
'role' => "Athlète",
'friendship' => [],
'analyzes' => [],
'mails' => [],
'users' => [],
'infoUser' => [],
'exos' => [],
'member' => []
]);
}
} }

@ -1,292 +1,292 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="index page du site web" /> <meta name="description" content="index page du site web" />
<meta name="author" content="PINAGOT Antoine" /> <meta name="author" content="PINAGOT Antoine" />
<title>HearthTrack - Getting Started</title> <title>HeartTrack - Getting Started</title>
<link rel="icon" type="image/x-icon" href="assets/favicon.ico" /> <link rel="icon" type="image/x-icon" href="assets/favicon.ico" />
<!-- Bootstrap icons--> <!-- Bootstrap icons-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" /> <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
<!-- Google fonts--> <!-- Google fonts-->
<link rel="preconnect" href="https://fonts.gstatic.com" /> <link rel="preconnect" href="https://fonts.gstatic.com" />
<link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,wght@0,600;1,600&amp;display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,wght@0,600;1,600&amp;display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Mulish:ital,wght@0,300;0,500;0,600;0,700;1,300;1,500;1,600;1,700&amp;display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Mulish:ital,wght@0,300;0,500;0,600;0,700;1,300;1,500;1,600;1,700&amp;display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Kanit:ital,wght@0,400;1,400&amp;display=swap" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Kanit:ital,wght@0,400;1,400&amp;display=swap" rel="stylesheet" />
<!-- Core theme CSS (includes Bootstrap)--> <!-- Core theme CSS (includes Bootstrap)-->
<link href="/css/styles2.css" rel="stylesheet" /> <link href="css/styles2.css" rel="stylesheet" />
</head> </head>
<body id="page-top"> <body id="page-top">
<!-- Navigation--> <!-- Navigation-->
<nav class="navbar navbar-expand-lg navbar-light fixed-top shadow-sm" id="mainNav"> <nav class="navbar navbar-expand-lg navbar-light fixed-top shadow-sm" id="mainNav">
<div class="container px-5"> <div class="container px-5">
<a class="navbar-brand fw-bold" href="#page-top">HearthTrack</a> <a class="navbar-brand fw-bold" href="/">HeartTrack</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
Menu Menu
<i class="bi-list"></i> <i class="bi-list"></i>
</button> </button>
<div class="collapse navbar-collapse" id="navbarResponsive"> <div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ms-auto me-4 my-3 my-lg-0"> <ul class="navbar-nav ms-auto me-4 my-3 my-lg-0">
<li class="nav-item"><a class="nav-link me-lg-3" href="/log">Se connecter</a></li> <li class="nav-item"><a class="nav-link me-lg-3" href="/log">Se connecter</a></li>
<li class="nav-item"><a class="nav-link me-lg-3" href="/regist">S'inscire</a></li> <li class="nav-item"><a class="nav-link me-lg-3" href="/regist">S'inscire</a></li>
</ul> </ul>
<button class="btn btn-primary rounded-pill px-3 mb-2 mb-lg-0" data-bs-toggle="modal" data-bs-target="#feedbackModal"> <button class="btn btn-primary rounded-pill px-3 mb-2 mb-lg-0" data-bs-toggle="modal" data-bs-target="#feedbackModal">
<span class="d-flex align-items-center"> <span class="d-flex align-items-center">
<i class="bi-chat-text-fill me-2"></i> <i class="bi-chat-text-fill me-2"></i>
<span class="small">Donnez votre avis</span> <span class="small">Donnez votre avis</span>
</span> </span>
</button> </button>
</div>
</div>
</nav>
<!-- Mashead header-->
<header class="masthead">
<div class="container px-5">
<div class="row gx-5 align-items-center">
<div class="col-lg-6">
<!-- Mashead text and app badges-->
<div class="mb-5 mb-lg-0 text-center text-lg-start">
<h1 class="display-1 lh-1 mb-3">HearthTrack pour mobile !</h1>
<p class="lead fw-normal text-muted mb-5">Une application pour suivre vos analyses en direct, est en cours de développement.</p>
<!-- <div class="d-flex flex-column flex-lg-row align-items-center">
<a class="me-lg-3 mb-4 mb-lg-0" href="#!"><img class="app-badge" src="assets/img/google-play-badge.svg" alt="..." /></a>
<a href="#!"><img class="app-badge" src="assets/img/app-store-badge.svg" alt="..." /></a>
</div> -->
</div> </div>
</div> </div>
<div class="col-lg-6"> </nav>
<!-- Masthead device mockup feature--> <!-- Mashead header-->
<div class="masthead-device-mockup"> <header class="masthead">
<svg class="circle" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <div class="container px-5">
<defs> <div class="row gx-5 align-items-center">
<linearGradient id="circleGradient" gradientTransform="rotate(45)"> <div class="col-lg-6">
<stop class="gradient-start-color" offset="0%"></stop> <!-- Mashead text and app badges-->
<stop class="gradient-end-color" offset="100%"></stop> <div class="mb-5 mb-lg-0 text-center text-lg-start">
</linearGradient> <h1 class="display-1 lh-1 mb-3">HeartTrack pour mobile !</h1>
</defs> <p class="lead fw-normal text-muted mb-5">Une application pour suivre vos analyses en direct, est en cours de développement.</p>
<circle cx="50" cy="50" r="50"></circle></svg <!-- <div class="d-flex flex-column flex-lg-row align-items-center">
><svg class="shape-1 d-none d-sm-block" viewBox="0 0 240.83 240.83" xmlns="http://www.w3.org/2000/svg"> <a class="me-lg-3 mb-4 mb-lg-0" href="#!"><img class="app-badge" src="assets/img/google-play-badge.svg" alt="..." /></a>
<rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(120.42 -49.88) rotate(45)"></rect> <a href="#!"><img class="app-badge" src="assets/img/app-store-badge.svg" alt="..." /></a>
<rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(-49.88 120.42) rotate(-45)"></rect></svg </div> -->
><svg class="shape-2 d-none d-sm-block" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"></circle></svg> </div>
<div class="device-wrapper"> </div>
<div class="device" data-device="iPhoneX" data-orientation="portrait" data-color="black"> <div class="col-lg-6">
<div class="screen bg-black"> <!-- Masthead device mockup feature-->
<!-- PUT CONTENTS HERE:--> <div class="masthead-device-mockup">
<!-- * * This can be a video, image, or just about anything else.--> <svg class="circle" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<!-- * * Set the max width of your media to 100% and the height to--> <defs>
<!-- * * 100% like the demo example below.--> <linearGradient id="circleGradient" gradientTransform="rotate(45)">
<video muted="muted" autoplay="" loop="" style="max-width: 100%; height: 100%"><source src="assets/img/demo-screen.mp4" type="video/mp4" /></video> <stop class="gradient-start-color" offset="0%"></stop>
<stop class="gradient-end-color" offset="100%"></stop>
</linearGradient>
</defs>
<circle cx="50" cy="50" r="50"></circle></svg
><svg class="shape-1 d-none d-sm-block" viewBox="0 0 240.83 240.83" xmlns="http://www.w3.org/2000/svg">
<rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(120.42 -49.88) rotate(45)"></rect>
<rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(-49.88 120.42) rotate(-45)"></rect></svg
><svg class="shape-2 d-none d-sm-block" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"></circle></svg>
<div class="device-wrapper">
<div class="device" data-device="iPhoneX" data-orientation="portrait" data-color="black">
<div class="screen bg-black">
<!-- PUT CONTENTS HERE:-->
<!-- * * This can be a video, image, or just about anything else.-->
<!-- * * Set the max width of your media to 100% and the height to-->
<!-- * * 100% like the demo example below.-->
<video muted="muted" autoplay="" loop="" style="max-width: 100%; height: 100%"><source src="assets/img/demo-screen.mp4" type="video/mp4" /></video>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </header>
</div> <!-- Quote/testimonial aside-->
</header> <aside class="text-center bg-gradient-primary-to-secondary">
<!-- Quote/testimonial aside--> <div class="container px-5">
<aside class="text-center bg-gradient-primary-to-secondary"> <div class="row gx-5 justify-content-center">
<div class="container px-5"> <div class="col-xl-8">
<div class="row gx-5 justify-content-center"> <div class="h2 fs-1 text-white mb-4">"Une solution gratuite pour analyser vos données de fréquences cardiaques !"</div>
<div class="col-xl-8"> <img src="assets/img/tnw-logo.svg" alt="..." style="height: 3rem" />
<div class="h2 fs-1 text-white mb-4">"Une solution gratuite pour analyser vos données de fréquences cardiaques !"</div> </div>
<img src="assets/img/tnw-logo.svg" alt="..." style="height: 3rem" /> </div>
</div> </div>
</div> </aside>
</div> <!-- App features section-->
</aside> <section id="features">
<!-- App features section--> <div class="container px-5">
<section id="features"> <div class="row gx-5 align-items-center">
<div class="container px-5"> <div class="col-lg-8 order-lg-1 mb-5 mb-lg-0">
<div class="row gx-5 align-items-center"> <div class="container-fluid px-5">
<div class="col-lg-8 order-lg-1 mb-5 mb-lg-0"> <div class="row gx-5">
<div class="container-fluid px-5"> <div class="col-md-6 mb-5">
<div class="row gx-5"> <!-- Feature item-->
<div class="col-md-6 mb-5"> <div class="text-center">
<!-- Feature item--> <i class="bi-phone icon-feature text-gradient d-block mb-3"></i>
<div class="text-center"> <h3 class="font-alt">Web/Mobile</h3>
<i class="bi-phone icon-feature text-gradient d-block mb-3"></i> <p class="text-muted mb-0">Gardez les informations tant bien dans l'application que sur le site web avec la synchronisation des données !</p>
<h3 class="font-alt">Web/Mobile</h3> </div>
<p class="text-muted mb-0">Gardez les informations tant bien dans l'application que sur le site web avec la synchronisation des données !</p> </div>
<div class="col-md-6 mb-5">
<!-- Feature item-->
<div class="text-center">
<i class="bi-cast icon-feature text-gradient d-block mb-3"></i>
<h3 class="font-alt">Importez vos données</h3>
<p class="text-muted mb-0">Importez vos données directement depuis un fichier .FIT !</p>
</div>
</div>
</div> </div>
</div> <div class="row">
<div class="col-md-6 mb-5"> <div class="col-md-6 mb-5 mb-md-0">
<!-- Feature item--> <!-- Feature item-->
<div class="text-center"> <div class="text-center">
<i class="bi-cast icon-feature text-gradient d-block mb-3"></i> <i class="bi-gift icon-feature text-gradient d-block mb-3"></i>
<h3 class="font-alt">Importez vos données</h3> <h3 class="font-alt">Gratuit</h3>
<p class="text-muted mb-0">Importez vos données directement depuis un fichier .FIT !</p> <p class="text-muted mb-0">Ce site et cette application sont entièrement gratuites !</p>
</div>
</div>
<div class="col-md-6">
<!-- Feature item-->
<div class="text-center">
<i class="bi-patch-check icon-feature text-gradient d-block mb-3"></i>
<h3 class="font-alt">Open Source</h3>
<p class="text-muted mb-0">Ce projet est fait en Open Source, tout le monde peut y accéder !</p>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="col-lg-4 order-lg-0">
<div class="col-md-6 mb-5 mb-md-0"> <!-- Features section device mockup-->
<!-- Feature item--> <div class="features-device-mockup">
<div class="text-center"> <svg class="circle" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<i class="bi-gift icon-feature text-gradient d-block mb-3"></i> <defs>
<h3 class="font-alt">Gratuit</h3> <linearGradient id="circleGradient" gradientTransform="rotate(45)">
<p class="text-muted mb-0">Ce site et cette application sont entièrement gratuites !</p> <stop class="gradient-start-color" offset="0%"></stop>
</div> <stop class="gradient-end-color" offset="100%"></stop>
</div> </linearGradient>
<div class="col-md-6"> </defs>
<!-- Feature item--> <circle cx="50" cy="50" r="50"></circle></svg
<div class="text-center"> ><svg class="shape-1 d-none d-sm-block" viewBox="0 0 240.83 240.83" xmlns="http://www.w3.org/2000/svg">
<i class="bi-patch-check icon-feature text-gradient d-block mb-3"></i> <rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(120.42 -49.88) rotate(45)"></rect>
<h3 class="font-alt">Open Source</h3> <rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(-49.88 120.42) rotate(-45)"></rect></svg
<p class="text-muted mb-0">Ce projet est fait en Open Source, tout le monde peut y accéder !</p> ><svg class="shape-2 d-none d-sm-block" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"></circle></svg>
<div class="device-wrapper">
<div class="device" data-device="iPhoneX" data-orientation="portrait" data-color="black">
<div class="screen bg-black">
<!-- PUT CONTENTS HERE:-->
<!-- * * This can be a video, image, or just about anything else.-->
<!-- * * Set the max width of your media to 100% and the height to-->
<!-- * * 100% like the demo example below.-->
<video muted="muted" autoplay="" loop="" style="max-width: 100%; height: 100%"><source src="assets/img/demo-screen.mp4" type="video/mp4" /></video>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-4 order-lg-0"> </section>
<!-- Features section device mockup--> <!-- Basic features section-->
<div class="features-device-mockup"> <section class="bg-light">
<svg class="circle" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <div class="container px-5">
<defs> <div class="row gx-5 align-items-center justify-content-center justify-content-lg-between">
<linearGradient id="circleGradient" gradientTransform="rotate(45)"> <div class="col-12 col-lg-5">
<stop class="gradient-start-color" offset="0%"></stop> <h2 class="display-4 lh-1 mb-4">Fonctionnalité supplémentaire de notre application</h2>
<stop class="gradient-end-color" offset="100%"></stop> <p class="lead fw-normal text-muted mb-5 mb-lg-0">Notre application propose un service de coaching personnalisé en fonction du besoin que vous avez en tant qu'athelète. Vous pouvez aussi fournir un service de coaching aux autres utilisateurs en vous inscrivant en tant que coach sportif.</p>
</linearGradient> </div>
</defs> <div class="col-sm-8 col-md-6">
<circle cx="50" cy="50" r="50"></circle></svg <div class="px-5 px-sm-0"><img class="img-fluid rounded-circle" src="./assets/img/bg1.png" alt="..." /></div>
><svg class="shape-1 d-none d-sm-block" viewBox="0 0 240.83 240.83" xmlns="http://www.w3.org/2000/svg">
<rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(120.42 -49.88) rotate(45)"></rect>
<rect x="-32.54" y="78.39" width="305.92" height="84.05" rx="42.03" transform="translate(-49.88 120.42) rotate(-45)"></rect></svg
><svg class="shape-2 d-none d-sm-block" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"></circle></svg>
<div class="device-wrapper">
<div class="device" data-device="iPhoneX" data-orientation="portrait" data-color="black">
<div class="screen bg-black">
<!-- PUT CONTENTS HERE:-->
<!-- * * This can be a video, image, or just about anything else.-->
<!-- * * Set the max width of your media to 100% and the height to-->
<!-- * * 100% like the demo example below.-->
<video muted="muted" autoplay="" loop="" style="max-width: 100%; height: 100%"><source src="assets/img/demo-screen.mp4" type="video/mp4" /></video>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </section>
</div> <!-- Call to action section-->
</section> <section class="cta">
<!-- Basic features section--> <div class="cta-content">
<section class="bg-light"> <div class="container px-5">
<div class="container px-5"> <h2 class="text-white display-1 lh-1 mb-4">
<div class="row gx-5 align-items-center justify-content-center justify-content-lg-between"> Arrêtez d'attendre...
<div class="col-12 col-lg-5"> <br />
<h2 class="display-4 lh-1 mb-4">Fonctionnalité supplémentaire de notre application</h2> Inscrivez-vous !
<p class="lead fw-normal text-muted mb-5 mb-lg-0">Notre application propose un service de coaching personnalisé en fonction du besoin que vous avez en tant qu'athelète. Vous pouvez aussi fournir un service de coaching aux autres utilisateurs en vous inscrivant en tant que coach sportif.</p> </h2>
<!-- <a class="btn btn-outline-light py-3 px-4 rounded-pill" href="#" target="_blank">Download for free</a> -->
</div>
</div> </div>
<div class="col-sm-8 col-md-6"> </section>
<div class="px-5 px-sm-0"><img class="img-fluid rounded-circle" src="./assets/img/bg1.png" alt="..." /></div> <!-- App badge section-->
<section class="bg-gradient-primary-to-secondary" id="download">
<div class="container px-5">
<h2 class="text-center text-white font-alt mb-4">Application bientôt disponible !</h2>
<!-- <div class="d-flex flex-column flex-lg-row align-items-center justify-content-center">
<a class="me-lg-3 mb-4 mb-lg-0" href="#!"><img class="app-badge" src="assets/img/google-play-badge.svg" alt="..." /></a>
<a href="#!"><img class="app-badge" src="assets/img/app-store-badge.svg" alt="..." /></a>
</div> -->
</div> </div>
</div> </section>
</div> <!-- Footer-->
</section> <footer class="bg-black text-center py-5">
<!-- Call to action section--> <div class="container px-5">
<section class="cta"> <div class="text-white-50 small">
<div class="cta-content"> <div class="mb-2">&copy; HeartTrack 2023. Tous droits réservé.</div>
<div class="container px-5"> <a href="#!">Politique de confidentialité</a>
<h2 class="text-white display-1 lh-1 mb-4"> <span class="mx-1">&middot;</span>
Arrêtez d'attendre... <a href="#!">Termes & Conditions d'utilisation</a>
<br /> </div>
Inscrivez-vous !
</h2>
<!-- <a class="btn btn-outline-light py-3 px-4 rounded-pill" href="#" target="_blank">Download for free</a> -->
</div>
</div>
</section>
<!-- App badge section-->
<section class="bg-gradient-primary-to-secondary" id="download">
<div class="container px-5">
<h2 class="text-center text-white font-alt mb-4">Application bientôt disponible !</h2>
<!-- <div class="d-flex flex-column flex-lg-row align-items-center justify-content-center">
<a class="me-lg-3 mb-4 mb-lg-0" href="#!"><img class="app-badge" src="assets/img/google-play-badge.svg" alt="..." /></a>
<a href="#!"><img class="app-badge" src="assets/img/app-store-badge.svg" alt="..." /></a>
</div> -->
</div>
</section>
<!-- Footer-->
<footer class="bg-black text-center py-5">
<div class="container px-5">
<div class="text-white-50 small">
<div class="mb-2">&copy; HearthTrack 2023. Tous droits réservé.</div>
<a href="#!">Politique de confidentialité</a>
<span class="mx-1">&middot;</span>
<a href="#!">Termes & Conditions d'utilisation</a>
</div>
</div>
</footer>
<!-- Feedback Modal-->
<div class="modal fade" id="feedbackModal" tabindex="-1" aria-labelledby="feedbackModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-gradient-primary-to-secondary p-4">
<h5 class="modal-title font-alt text-white" id="feedbackModalLabel">Envoyez votre avis</h5>
<button class="btn-close btn-close-white" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body border-0 p-4"> </footer>
<!-- * * * * * * * * * * * * * * *--> <!-- Feedback Modal-->
<!-- * * SB Forms Contact Form * *--> <div class="modal fade" id="feedbackModal" tabindex="-1" aria-labelledby="feedbackModalLabel" aria-hidden="true">
<!-- * * * * * * * * * * * * * * *--> <div class="modal-dialog modal-dialog-centered">
<!-- This form is pre-integrated with SB Forms.--> <div class="modal-content">
<!-- To make this form functional, sign up at--> <div class="modal-header bg-gradient-primary-to-secondary p-4">
<!-- https://startbootstrap.com/solution/contact-forms--> <h5 class="modal-title font-alt text-white" id="feedbackModalLabel">Envoyez votre avis</h5>
<!-- to get an API token!--> <button class="btn-close btn-close-white" type="button" data-bs-dismiss="modal" aria-label="Close"></button>
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Name input-->
<div class="form-floating mb-3">
<input class="form-control" id="name" type="text" placeholder="Entrez votre nom complet..." data-sb-validations="required" />
<label for="name">Nom complet</label>
<div class="invalid-feedback" data-sb-feedback="name:required">Un nom est requis.</div>
</div>
<!-- Email address input-->
<div class="form-floating mb-3">
<input class="form-control" id="email" type="email" placeholder="nom@exemple.com" data-sb-validations="required,email" />
<label for="email">Adresse email</label>
<div class="invalid-feedback" data-sb-feedback="email:required">Adresse email requis.</div>
<div class="invalid-feedback" data-sb-feedback="email:email">L'adresse email n'est pas valide.</div>
</div>
<!-- Phone number input-->
<div class="form-floating mb-3">
<input class="form-control" id="phone" type="tel" placeholder="06 12 34 56 78" data-sb-validations="required" />
<label for="phone">Numéro de téléphone</label>
<div class="invalid-feedback" data-sb-feedback="phone:required">Numéro de téléphone requis.</div>
</div>
<!-- Message input-->
<div class="form-floating mb-3">
<textarea class="form-control" id="message" type="text" placeholder="Entrez votre message..." style="height: 10rem" data-sb-validations="required"></textarea>
<label for="message">Message</label>
<div class="invalid-feedback" data-sb-feedback="message:required">Un message est requis.</div>
</div> </div>
<!-- Submit success message--> <div class="modal-body border-0 p-4">
<!----> <!-- * * * * * * * * * * * * * * *-->
<!-- This is what your users will see when the form--> <!-- * * SB Forms Contact Form * *-->
<!-- has successfully submitted--> <!-- * * * * * * * * * * * * * * *-->
<div class="d-none" id="submitSuccessMessage"> <!-- This form is pre-integrated with SB Forms.-->
<div class="text-center mb-3"> <!-- To make this form functional, sign up at-->
<div class="fw-bolder">Avis envoyé !</div> <!-- https://startbootstrap.com/solution/contact-forms-->
</div> <!-- to get an API token!-->
<form id="contactForm" data-sb-form-api-token="API_TOKEN">
<!-- Name input-->
<div class="form-floating mb-3">
<input class="form-control" id="name" type="text" placeholder="Entrez votre nom complet..." data-sb-validations="required" />
<label for="name">Nom complet</label>
<div class="invalid-feedback" data-sb-feedback="name:required">Un nom est requis.</div>
</div>
<!-- Email address input-->
<div class="form-floating mb-3">
<input class="form-control" id="email" type="email" placeholder="nom@exemple.com" data-sb-validations="required,email" />
<label for="email">Adresse email</label>
<div class="invalid-feedback" data-sb-feedback="email:required">Adresse email requis.</div>
<div class="invalid-feedback" data-sb-feedback="email:email">L'adresse email n'est pas valide.</div>
</div>
<!-- Phone number input-->
<div class="form-floating mb-3">
<input class="form-control" id="phone" type="tel" placeholder="06 12 34 56 78" data-sb-validations="required" />
<label for="phone">Numéro de téléphone</label>
<div class="invalid-feedback" data-sb-feedback="phone:required">Numéro de téléphone requis.</div>
</div>
<!-- Message input-->
<div class="form-floating mb-3">
<textarea class="form-control" id="message" type="text" placeholder="Entrez votre message..." style="height: 10rem" data-sb-validations="required"></textarea>
<label for="message">Message</label>
<div class="invalid-feedback" data-sb-feedback="message:required">Un message est requis.</div>
</div>
<!-- Submit success message-->
<!---->
<!-- This is what your users will see when the form-->
<!-- has successfully submitted-->
<div class="d-none" id="submitSuccessMessage">
<div class="text-center mb-3">
<div class="fw-bolder">Avis envoyé !</div>
</div>
</div>
<!-- Submit error message-->
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-none" id="submitErrorMessage"><div class="text-center text-danger mb-3">Erreur du formulaire !</div></div>
<!-- Submit Button-->
<div class="d-grid"><button class="btn btn-primary rounded-pill btn-lg disabled" id="submitButton" type="submit">Envoyer</button></div>
</form>
</div> </div>
<!-- Submit error message--> </div>
<!---->
<!-- This is what your users will see when there is-->
<!-- an error submitting the form-->
<div class="d-none" id="submitErrorMessage"><div class="text-center text-danger mb-3">Erreur du formulaire !</div></div>
<!-- Submit Button-->
<div class="d-grid"><button class="btn btn-primary rounded-pill btn-lg disabled" id="submitButton" type="submit">Envoyer</button></div>
</form>
</div> </div>
</div> </div>
</div> <!-- Bootstrap core JS-->
</div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- Bootstrap core JS--> <!-- Core theme JS-->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script> <script src="js/scripts2.js"></script>
<!-- Core theme JS--> <script src="https://cdn.startbootstrap.com/sb-forms-latest.js"></script>
<script src="js/scripts2.js"></script> </body>
<script src="https://cdn.startbootstrap.com/sb-forms-latest.js"></script>
</body>
</html> </html>

Loading…
Cancel
Save