Compare commits
52 Commits
feature/Co
...
master
@ -1,29 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace DAL;
|
||||
|
||||
use PDO;
|
||||
|
||||
class AdminGateway
|
||||
{
|
||||
private $con;
|
||||
|
||||
/**
|
||||
* @param $con
|
||||
*/
|
||||
public function __construct($con)
|
||||
{
|
||||
$this->con = $con;
|
||||
}
|
||||
|
||||
public function login(string $login):array
|
||||
{
|
||||
try{
|
||||
$query = 'SELECT password,mail FROM Admin WHERE name = :login;';
|
||||
$this->con->executeQuery($query, array(':login' => array($login, PDO::PARAM_STR)));
|
||||
return $this->con->getResults();
|
||||
}catch (\PDOException $e){
|
||||
throw new \Exception("PDO error");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
<?php
|
||||
namespace DAL;
|
||||
|
||||
use Exception;
|
||||
use metier\Article;
|
||||
use PDO;
|
||||
class ArticleGateway
|
||||
{
|
||||
private $con;
|
||||
|
||||
/**
|
||||
* @param $con
|
||||
*/
|
||||
public function __construct($con)
|
||||
{
|
||||
$this->con = $con;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getAllArticles():array
|
||||
{
|
||||
try {
|
||||
$query = 'SELECT * FROM Article;';
|
||||
$this->con->executeQuery($query, array());
|
||||
return $this->con->getResults();
|
||||
}catch (\PDOException $e){
|
||||
throw new Exception("PDO error");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function addArticle(Article $article){
|
||||
try {
|
||||
$query = 'INSERT INTO Article VALUES (:id,:title,to_date(:date,"Dy, DD Mon YYYY"),:description,:guid,:link,:mediaContent,:provenance);';
|
||||
$this->con->executeQuery($query, array(':id' => array($article->getId(), PDO::PARAM_STR),
|
||||
':title' => array($article->getTitle(), PDO::PARAM_STR),
|
||||
':date' => array($article->getDate(), PDO::PARAM_STR),
|
||||
':description' => array($article->getDescription(), PDO::PARAM_STR),
|
||||
':guid' => array($article->getGuid(), PDO::PARAM_STR),
|
||||
':link' => array($article->getLink(), PDO::PARAM_STR),
|
||||
':mediaContent' => array($article->getMediaContent(), PDO::PARAM_STR),
|
||||
':provenance' => array($article->getProvenance(), PDO::PARAM_INT)));
|
||||
}catch (\PDOException $e){
|
||||
throw new Exception("PDO error");
|
||||
}
|
||||
}
|
||||
|
||||
public function removeAllArticleForParser(){
|
||||
try{
|
||||
$query = 'DELETE FROM Article;';
|
||||
$this->con->executeQuery($query);
|
||||
}catch(\PDOException $p){
|
||||
throw new Exception("Data is not delete.");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace DAL;
|
||||
|
||||
use metier\Flux;
|
||||
use PDO;
|
||||
|
||||
class FluxGateway
|
||||
{
|
||||
private Connection $con;
|
||||
|
||||
public function __construct(Connection $con){
|
||||
$this->con = $con;
|
||||
}
|
||||
|
||||
public function addFlux($flux){
|
||||
try{
|
||||
$query = 'INSERT INTO Flux VALUES (:flux);';
|
||||
$this->con->executeQuery($query, array(':flux' => array($flux->getFlux(), PDO::PARAM_STR)));
|
||||
}catch (\PDOException $e){
|
||||
throw new \Exception("PDO error");
|
||||
}
|
||||
}
|
||||
|
||||
public function removeFlux($flux){
|
||||
try{
|
||||
$query = 'DELETE FROM Flux WHERE flux = :flux;';
|
||||
$this->con->executeQuery($query, array(':flux' => array($flux->getFlux(), PDO::PARAM_STR)));
|
||||
}catch (\PDOException $e){
|
||||
throw new \Exception("PDO error");
|
||||
}
|
||||
}
|
||||
|
||||
public function findAllFlux(){
|
||||
try{
|
||||
$query = 'SELECT * FROM Flux;';
|
||||
$this->con->executeQuery($query);
|
||||
return $this->con->getResults();
|
||||
}catch (\PDOException $e){
|
||||
throw new \Exception("PDO error");
|
||||
}
|
||||
}
|
||||
|
||||
public function findFlux(Flux $flux){
|
||||
return $this->findFluxBySrc($flux->getFlux());
|
||||
}
|
||||
|
||||
public function findFluxBySrc(string $flux){
|
||||
try{
|
||||
$query = 'SELECT * FROM Flux WHERE flux = :flux;';
|
||||
$this->con->executeQuery($query, array(':flux' => array($flux, PDO::PARAM_STR)));
|
||||
return $this->con->getResults();
|
||||
}catch (\PDOException $e){
|
||||
throw new \Exception("PDO error");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use DAL\AdminGateway;
|
||||
use DAL\Connection;
|
||||
use metier\Admin;
|
||||
|
||||
class AdminModel
|
||||
{
|
||||
/**
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function connection (string $username, string $mdp){
|
||||
//Validation::validationLogin($username);
|
||||
//Validation::validationMdp($mdp);
|
||||
|
||||
$gwArticle = new AdminGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$lmdp = $gwArticle->login($username);
|
||||
|
||||
foreach ($lmdp as $motDePasse){
|
||||
if (true){//password_verify($mdp,$motDePasse['password']) or $mdp == $motDePasse['password']){
|
||||
$_SESSION['role'] = 'admin';
|
||||
$_SESSION['pseudo'] = $username;
|
||||
return new Admin($username,$motDePasse['mail']);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function isAdmin(): bool
|
||||
{
|
||||
return (isset($_SESSION['role']) && $_SESSION['role'] == 'admin');
|
||||
}
|
||||
|
||||
public static function deconnection(){
|
||||
$_SESSION['role'] = "";
|
||||
unset($_SESSION['role']);
|
||||
$_SESSION['pseudo'] = "";
|
||||
unset($_SESSION['pseudo']);
|
||||
header("Location: /~mapoint2/SAE/Php_RSS/fluxRSS/admin");
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use DAL\{ArticleGateway, Connection};
|
||||
use Exception;
|
||||
use metier\Article;
|
||||
|
||||
class ArticleModel
|
||||
{
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function getArticles() : array
|
||||
{
|
||||
$gwArticle = new ArticleGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$tabArticle = array();
|
||||
$res = $gwArticle->getAllArticles();
|
||||
foreach($res as $row){
|
||||
$tabArticle[] = new Article($row['id'], $row['title'],$row['datePub'],$row['description'],$row['guid'],$row['link'],$row['mediaContent'],$row['provenance'] );
|
||||
}
|
||||
return $tabArticle;
|
||||
}
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use DAL\Connection;
|
||||
use DAL\FluxGateway;
|
||||
use metier\Flux;
|
||||
require_once "config/config.php";
|
||||
|
||||
class FluxModel
|
||||
{
|
||||
public function FindAllFlux(){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host= londres.uca.local ; dbname= dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$data = array();
|
||||
$result = $gateway->findAllFlux();
|
||||
|
||||
foreach ($result as $row){
|
||||
$data[] = new Flux($row['$flux']);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function addFlux(Flux $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host= londres.uca.local ; dbname= dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$data = $this->findFlux($flux);
|
||||
if ($data == array()) {
|
||||
$gateway->addFlux($flux);
|
||||
}
|
||||
}
|
||||
|
||||
public function addFluxBySrc(string $flux): Flux {
|
||||
$gateway = new FluxGateway(new Connection('mysql:host= londres.uca.local ; dbname= dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$newFlux = new Flux($flux);
|
||||
$gateway->addFlux($newFlux);
|
||||
return $newFlux;
|
||||
}
|
||||
|
||||
public function removeFlux(Flux $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host= londres.uca.local ; dbname= dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$gateway->removeFlux($flux);
|
||||
}
|
||||
|
||||
public function removeFluxBySrc(string $flux): Flux {
|
||||
$gateway = new FluxGateway(new Connection('mysql:host= londres.uca.local ; dbname= dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$newFlux = new Flux($flux);
|
||||
$gateway->removeFlux($newFlux);
|
||||
return $newFlux;
|
||||
}
|
||||
|
||||
public function findFlux(Flux $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host= londres.uca.local ; dbname= dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$data = array();
|
||||
$result = $gateway->findFlux($flux);
|
||||
|
||||
foreach ($result as $row){
|
||||
$data[] = new Flux($row['$flux']);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function findFluxBySrc(string $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host= londres.uca.local ; dbname= dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$data = array();
|
||||
$result = $gateway->findFluxBySrc($flux);
|
||||
|
||||
foreach ($result as $row){
|
||||
$data[] = new Flux($row['$flux']);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use DAL\ArticleGateway;
|
||||
use DAL\Connection;
|
||||
use DAL\FluxGateway;
|
||||
use DOMDocument;
|
||||
use Exception;
|
||||
use metier\Article;
|
||||
use metier\Flux;
|
||||
|
||||
class Parser
|
||||
{
|
||||
private FluxGateway $fluxGateway;
|
||||
private ArticleGateway $articleGateway;
|
||||
|
||||
public function __construct(FluxGateway $fluxGateway, ArticleGateway $articleGateway){
|
||||
$this->fluxGateway = $fluxGateway;
|
||||
$this->articleGateway = $articleGateway;
|
||||
}
|
||||
public function parseArticles(Flux $flux): array
|
||||
{
|
||||
$dom = new DOMDocument();
|
||||
$tabArticle = array();
|
||||
|
||||
if ($dom->load($flux->getFlux())){
|
||||
$items = $dom->getElementsByTagName('item');
|
||||
|
||||
foreach ($items as $item) {
|
||||
$title = $item->getElementsByTagName('title')[0]->nodeValue;
|
||||
$date = $item->getElementsByTagName('pubDate')[0]->nodeValue;
|
||||
$guid = $item->getElementsByTagName('guid')[0]->nodeValue;
|
||||
$link = $item->getElementsByTagName('link')[0]->nodeValue;
|
||||
$description = $item->getElementsByTagName('description')[0]->nodeValue;
|
||||
|
||||
$media = $item->getElementsByTagName('media:content');
|
||||
$mediaUrl = null;
|
||||
if ($media->length > 0){
|
||||
$mediaUrl = $media->item(0)->getAttribute('url');
|
||||
}
|
||||
|
||||
$tabArticle[] = new Article((int)null, $title, $date, $description, $guid, $link, $mediaUrl, $flux->getId());
|
||||
}
|
||||
return $tabArticle;
|
||||
} else {
|
||||
// En cas d'erreur lors du chargement du flux RSS, lever une exception
|
||||
throw new Exception("Erreur lors du chargement du flux RSS");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function parseAll($fluxes){
|
||||
foreach ($fluxes as $flux){
|
||||
$tabArticles[] =$this->parseArticles($flux);
|
||||
}
|
||||
return $tabArticles;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function addAllArticles()
|
||||
{
|
||||
$this->articleGateway->removeAllArticleForParser();
|
||||
|
||||
$allFlux = $this->fluxGateway->findAllFlux();
|
||||
$allArticles = $this->parseAll($allFlux);
|
||||
foreach ($allArticles as $article) {
|
||||
$this->articleGateway->addArticle($article);
|
||||
}
|
||||
return $allArticles;
|
||||
}
|
||||
|
||||
}
|
||||
$gwArt = new ArticleGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$gwFl = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$pars = new Parser( $gwFl,$gwArt);
|
||||
|
||||
|
||||
|
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace DAL;
|
||||
|
||||
use PDO;
|
||||
|
||||
class AdminGateway
|
||||
{
|
||||
private $con;
|
||||
|
||||
/**
|
||||
* @param $con
|
||||
*/
|
||||
public function __construct($con)
|
||||
{
|
||||
$this->con = $con;
|
||||
}
|
||||
|
||||
public function login(string $login):array
|
||||
{
|
||||
$query = 'SELECT password,mail FROM Admin WHERE name = :login;';
|
||||
$this->con->executeQuery($query, array(':login' => array($login, PDO::PARAM_STR)));
|
||||
return $this->con->getResults();
|
||||
}
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
namespace DAL;
|
||||
|
||||
use Exception;
|
||||
use metier\Article;
|
||||
use metier\Flux;
|
||||
use PDO;
|
||||
class ArticleGateway
|
||||
{
|
||||
private $con;
|
||||
|
||||
/**
|
||||
* @param $con
|
||||
*/
|
||||
public function __construct($con)
|
||||
{
|
||||
$this->con = $con;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getAllArticles():array
|
||||
{
|
||||
$query = 'SELECT * FROM Article ORDER BY datePub DESC;';
|
||||
$this->con->executeQuery($query, array());
|
||||
return $this->con->getResults();
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function addArticle(Article $article){
|
||||
$query = "INSERT INTO Article VALUES (:id,:title,STR_TO_DATE(:datePub, '%d/%m/%y %H:%i'),:description,:guid,:link,:mediaContent,:provenance);";
|
||||
$this->con->executeQuery($query, array(':id' => array($article->getId(), PDO::PARAM_STR),
|
||||
':title' => array($article->getTitle(), PDO::PARAM_STR),
|
||||
':datePub' => array($article->getDate(), PDO::PARAM_STR),
|
||||
':description' => array($article->getDescription(), PDO::PARAM_STR),
|
||||
':guid' => array($article->getGuid(), PDO::PARAM_STR),
|
||||
':link' => array($article->getLink(), PDO::PARAM_STR),
|
||||
':mediaContent' => array($article->getMediaContent(), PDO::PARAM_STR),
|
||||
':provenance' => array($article->getProvenance(), PDO::PARAM_INT)));
|
||||
}
|
||||
|
||||
public function removeAllArticleForParser(){
|
||||
$query = 'DELETE FROM Article;';
|
||||
$this->con->executeQuery($query);
|
||||
}
|
||||
|
||||
public function removeAllArticleFromFlux(int $idFlux){
|
||||
try {
|
||||
$query = 'DELETE FROM Article WHERE Provenance = :idFlux;';
|
||||
$this->con->executeQuery($query, array(':idFlux' => array($idFlux, PDO::PARAM_INT)));
|
||||
}catch(\PDOException $p){
|
||||
throw new Exception("Data of flux is not delete.");
|
||||
}
|
||||
}
|
||||
|
||||
public function findArticleByFlux(int $flux){
|
||||
$query = 'SELECT * FROM Article WHERE provenance = :flux;';
|
||||
$this->con->executeQuery($query, array(':flux' => array($flux, PDO::PARAM_INT)));
|
||||
return $this->con->getResults();
|
||||
}
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace DAL;
|
||||
|
||||
use metier\Flux;
|
||||
use PDO;
|
||||
|
||||
class FluxGateway
|
||||
{
|
||||
private Connection $con;
|
||||
|
||||
public function __construct(Connection $con){
|
||||
$this->con = $con;
|
||||
}
|
||||
|
||||
public function addFlux(Flux $flux)
|
||||
{
|
||||
$this->addFluxBySrc($flux->getFlux());
|
||||
}
|
||||
|
||||
public function addFluxBySrc(string $flux)
|
||||
{
|
||||
$query = 'INSERT INTO Flux VALUES (null,:flux);';
|
||||
$this->con->executeQuery($query, array(':flux' => array($flux, PDO::PARAM_STR)));
|
||||
}
|
||||
|
||||
public function removeFlux(Flux $flux){
|
||||
$this->removeFluxBySrc($flux->getFlux());
|
||||
}
|
||||
|
||||
public function removeFluxBySrc(string $flux){
|
||||
$query = 'DELETE FROM Flux WHERE flux = :flux;';
|
||||
$this->con->executeQuery($query, array(':flux' => array($flux, PDO::PARAM_STR)));
|
||||
}
|
||||
|
||||
public function removeFluxById(int $id){
|
||||
$query = 'DELETE FROM Flux WHERE id = :id;';
|
||||
$this->con->executeQuery($query, array(':id' => array($id, PDO::PARAM_INT)));
|
||||
}
|
||||
|
||||
public function findAllFlux(){
|
||||
$query = 'SELECT * FROM Flux;';
|
||||
$this->con->executeQuery($query);
|
||||
return $this->con->getResults();
|
||||
}
|
||||
|
||||
public function findFlux(Flux $flux){
|
||||
return $this->findFluxBySrc($flux->getFlux());
|
||||
}
|
||||
|
||||
public function findFluxBySrc(string $flux){
|
||||
$query = 'SELECT * FROM Flux WHERE flux = :flux;';
|
||||
$this->con->executeQuery($query, array(':flux' => array($flux, PDO::PARAM_STR)));
|
||||
return $this->con->getResults();
|
||||
}
|
||||
}
|
@ -0,0 +1,86 @@
|
||||
<?php
|
||||
namespace controleur;
|
||||
|
||||
use model\ArticleModel;
|
||||
|
||||
class erControleur
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
global $twig; // nécessaire pour utiliser variables globales
|
||||
session_start();
|
||||
//debut
|
||||
|
||||
//on initialise un tableau d'erreur
|
||||
$dVueEreur = [];
|
||||
|
||||
try {
|
||||
$action = $_REQUEST['action'] ?? null;
|
||||
|
||||
switch($action) {
|
||||
//pas d'action, on réinitialise 1er appel
|
||||
case null:
|
||||
$this->Reinit();
|
||||
break;
|
||||
|
||||
case 'validationFormulaire':
|
||||
$this->ValidationFormulaire($dVueEreur);
|
||||
break;
|
||||
|
||||
//mauvaise action
|
||||
default:
|
||||
$tabArticle[] = ArticleModel::getArticles();
|
||||
$dVueEreur[] = "Erreur d'appel php";
|
||||
$dataview = ['Article'=> $tabArticle];
|
||||
echo $twig->render('listArticle.html', ['tabArticle' => $dataview, 'dVueErreur'=>$dVueEreur]);
|
||||
break;
|
||||
}
|
||||
} catch (\PDOException $e) {
|
||||
//si erreur BD, pas le cas ici
|
||||
$dVueEreur[] = 'Erreur PDO : ' . $e->getMessage();
|
||||
echo $twig->render('erreur.html', ['dVueEreur' => $dVueEreur]);
|
||||
} catch (\Exception $e2) {
|
||||
$dVueEreur[] = 'Erreur : ' . $e2->getMessage();
|
||||
echo $twig->render('erreur.html', ['dVueEreur' => $dVueEreur]);
|
||||
}
|
||||
|
||||
//fin
|
||||
exit(0);
|
||||
}//fin constructeur
|
||||
|
||||
public function Reinit()
|
||||
{
|
||||
global $twig; // nécessaire pour utiliser variables globales
|
||||
$dVue = [
|
||||
'nom' => '',
|
||||
'age' => 0,
|
||||
'data' => ArticleModel::getArticles()
|
||||
];
|
||||
echo $twig->render('listArticle.html', [
|
||||
'dVue' => $dVue
|
||||
]);
|
||||
}
|
||||
|
||||
public function ValidationFormulaire(array $dVueEreur)
|
||||
{
|
||||
global $twig; // nécessaire pour utiliser variables globales
|
||||
|
||||
//si exception, ca remonte !!!
|
||||
$nom = $_POST['txtNom']; // txtNom = nom du champ texte dans le formulaire
|
||||
$age = $_POST['txtAge'];
|
||||
\config\Validation::val_form($nom, $age, $dVueEreur);
|
||||
|
||||
/*
|
||||
$model = new \metier\Simplemodel();
|
||||
$data = $model->get_data();
|
||||
*/
|
||||
|
||||
$dVue = [
|
||||
'nom' => $nom,
|
||||
'age' => $age,
|
||||
//'data' => $data,
|
||||
];
|
||||
|
||||
echo $twig->render('Connection.html', ['dVue' => $dVue, 'dVueEreur' => $dVueEreur]);
|
||||
}
|
||||
}//fin class
|
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use config\Validation;
|
||||
use DAL\AdminGateway;
|
||||
use DAL\Connection;
|
||||
use metier\Admin;
|
||||
|
||||
class AdminModel
|
||||
{
|
||||
/**
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function connection (string $username, string $mdp){
|
||||
|
||||
|
||||
$gwArticle = new AdminGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
if (Validation::validationLogin($username)){
|
||||
$lmdp = $gwArticle->login($username);
|
||||
}
|
||||
if(Validation::validationMdp($mdp)){
|
||||
foreach ($lmdp as $motDePasse){
|
||||
if (password_verify($mdp,$motDePasse['password']) or $mdp == $motDePasse['password']){ //Si ajout d'admin on créer avec password_hash(string $mdp)
|
||||
$_SESSION['role'] = 'admin';
|
||||
$_SESSION['pseudo'] = $username;
|
||||
return new Admin($username,$motDePasse['mail']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function isAdmin(): bool
|
||||
{
|
||||
return (isset($_SESSION['role']) && $_SESSION['role'] == 'admin');
|
||||
}
|
||||
|
||||
public static function deconnection(){
|
||||
$_SESSION['role'] = "";
|
||||
unset($_SESSION['role']);
|
||||
$_SESSION['pseudo'] = "";
|
||||
unset($_SESSION['pseudo']);
|
||||
header("Location: /~rorossetto/Php_RSS/fluxRSS/admin/");
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use DAL\{ArticleGateway, Connection, FluxGateway};
|
||||
use Exception;
|
||||
use metier\Article;
|
||||
use metier\Flux;
|
||||
|
||||
class ArticleModel
|
||||
{
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function getArticles() : array
|
||||
{
|
||||
$gwArticle = new ArticleGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$tabArticle = array();
|
||||
$res = $gwArticle->getAllArticles();
|
||||
foreach($res as $row){
|
||||
$tabArticle[] = new Article($row['id'], $row['title'],$row['datePub'],$row['description'],$row['guid'],$row['link'],$row['mediaContent'],$row['provenance'] );
|
||||
}
|
||||
return $tabArticle;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function findArticleByFlux(Flux $flux){
|
||||
$con = new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp');
|
||||
$gwArticle = new ArticleGateway($con);
|
||||
$dicoFluxArticle = array();
|
||||
$tabArticle = array();
|
||||
$res = $gwArticle->findArticleByFlux($flux->getId());
|
||||
|
||||
foreach ($res as $row){
|
||||
$tabArticle[] = new Article($row['id'], $row['title'],$row['datePub'],$row['description'],$row['guid'],$row['link'],$row['mediaContent'],$row['provenance'] );
|
||||
}
|
||||
$dicoFluxArticle[] = [$flux,$tabArticle];
|
||||
return $dicoFluxArticle;
|
||||
}
|
||||
|
||||
public function findAllArticleByAllFlux(){
|
||||
$con = new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp');
|
||||
$gwFlux = new FluxGateway($con);
|
||||
$tabFluxArticle = array();
|
||||
$res = $gwFlux->findAllFlux();
|
||||
|
||||
foreach ($res as $row) {
|
||||
$flux = new Flux((int)($row['id']),$row['flux']);
|
||||
$tabFluxArticle[] = $this->findArticleByFluxAsStr($flux);
|
||||
}
|
||||
return $tabFluxArticle;
|
||||
}
|
||||
|
||||
public function findArticleByFluxAsStr(Flux $flux){
|
||||
$con = new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp');
|
||||
$gwArticle = new ArticleGateway($con);
|
||||
$tabArticle = array();
|
||||
$res = $gwArticle->findArticleByFlux($flux->getId());
|
||||
|
||||
foreach ($res as $row){
|
||||
$article = new Article($row['id'], $row['title'],$row['datePub'],$row['description'],$row['guid'],$row['link'],$row['mediaContent'],$row['provenance'] );
|
||||
$tabArticle[] = (string)$article;
|
||||
}
|
||||
$dicoFluxArticle = [$flux,$tabArticle];
|
||||
return $dicoFluxArticle;
|
||||
}
|
||||
|
||||
public static function removeArticleIdFlux(int $idFlux)
|
||||
{
|
||||
$gwArticle = new ArticleGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$gwArticle->removeAllArticleFromFlux($idFlux);
|
||||
}
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use DAL\Connection;
|
||||
use DAL\FluxGateway;
|
||||
use metier\Flux;
|
||||
|
||||
class FluxModel
|
||||
{
|
||||
public function findAllFlux(){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$data = array();
|
||||
$result = $gateway->findAllFlux();
|
||||
|
||||
foreach ($result as $row){
|
||||
$data[] = new Flux((int)$row['id'],$row['flux']);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function addFlux(Flux $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$data = $this->findFlux($flux);
|
||||
if ($data == array()) {
|
||||
$gateway->addFlux($flux);
|
||||
}
|
||||
}
|
||||
|
||||
public function addFluxBySrc(string $flux): Flux {
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$newFlux = new Flux(null,$flux);
|
||||
$gateway->addFlux($newFlux);
|
||||
return $newFlux;
|
||||
}
|
||||
|
||||
public function removeFlux(Flux $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$gateway->removeFlux($flux);
|
||||
}
|
||||
|
||||
public function removeFluxById(int $id){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$gateway->removeFluxById($id);
|
||||
}
|
||||
|
||||
public function removeFluxBySrc(string $flux) {
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$gateway->removeFluxBySrc($flux);
|
||||
}
|
||||
|
||||
public function findFlux(Flux $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$data = array();
|
||||
$result = $gateway->findFlux($flux);
|
||||
|
||||
foreach ($result as $row){
|
||||
$data[] = new Flux((int)$row['id'],$row['$flux']);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function findFluxBySrc(string $flux){
|
||||
$gateway = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto','rorossetto','tpphp'));
|
||||
$data = array();
|
||||
$result = $gateway->findFluxBySrc($flux);
|
||||
|
||||
foreach ($result as $row){
|
||||
$data[] = new Flux((int)$row['id'],$row['$flux']);
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
namespace model;
|
||||
|
||||
use DAL\ArticleGateway;
|
||||
use DAL\Connection;
|
||||
use DAL\FluxGateway;
|
||||
use DateTime;
|
||||
use DOMDocument;
|
||||
use Exception;
|
||||
use metier\Article;
|
||||
use metier\Flux;
|
||||
use Twig\Error\Error;
|
||||
|
||||
class Parser
|
||||
{
|
||||
private FluxGateway $fluxGateway;
|
||||
private ArticleGateway $articleGateway;
|
||||
|
||||
public function __construct(FluxGateway $fluxGateway, ArticleGateway $articleGateway){
|
||||
$this->fluxGateway = $fluxGateway;
|
||||
$this->articleGateway = $articleGateway;
|
||||
}
|
||||
public function parseArticles(Flux $flux): array
|
||||
{
|
||||
$dom = new DOMDocument();
|
||||
$tabArticle = array();
|
||||
try {
|
||||
if ($dom->load($flux->getFlux())) {
|
||||
var_dump($flux);
|
||||
$items = $dom->getElementsByTagName('item');
|
||||
foreach ($items as $item) {
|
||||
$title = $item->getElementsByTagName('title')[0]->nodeValue;
|
||||
$date = $item->getElementsByTagName('pubDate')[0]->nodeValue;
|
||||
$guid = $item->getElementsByTagName('guid')[0]->nodeValue;
|
||||
$link = $item->getElementsByTagName('link')[0]->nodeValue;
|
||||
$description = $item->getElementsByTagName('description')[0]->nodeValue;
|
||||
$mediaUrl = null;
|
||||
$mediaElements = $item->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'content');
|
||||
|
||||
// Vérifier si un élément media:content existe
|
||||
if ($mediaElements->length > 0) {
|
||||
$media = $mediaElements->item(0);
|
||||
$mediaUrl = $media->getAttribute('url');
|
||||
}
|
||||
|
||||
var_dump($mediaUrl);
|
||||
|
||||
$dateTime = new DateTime($date);
|
||||
$tabArticle[] = new Article(
|
||||
(int)null,
|
||||
$title,
|
||||
$dateTime->format('d/m/y H:i') . '',
|
||||
$description,
|
||||
$guid,
|
||||
$link,
|
||||
($mediaUrl !== null) ? (string)$mediaUrl : '',
|
||||
$flux->getId());
|
||||
}
|
||||
return $tabArticle;
|
||||
} else {
|
||||
// En cas d'erreur lors du chargement du flux RSS, lever une exception
|
||||
throw new Exception("Erreur lors du chargement du flux RSS");
|
||||
}
|
||||
}catch (Error $e){
|
||||
echo $e->getMessage();
|
||||
return $tabArticle;
|
||||
}catch (Exception $e2){
|
||||
echo $e2->getMessage();
|
||||
return $tabArticle;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function parseAll($fluxes){
|
||||
$tabArticles = [];
|
||||
foreach ($fluxes as $flux){
|
||||
$fluxx = new Flux($flux[0],$flux[1]);
|
||||
$tabArticles[] = $this->parseArticles($fluxx);
|
||||
|
||||
}
|
||||
return $tabArticles;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function addAllArticles()
|
||||
{
|
||||
$tabFluxes = [];
|
||||
$this->articleGateway->removeAllArticleForParser();
|
||||
|
||||
$allItemFlux = $this->fluxGateway->findAllFlux();
|
||||
foreach ($allItemFlux as $ItemFlux){
|
||||
$tabFluxes[] = new Flux(intval($ItemFlux['id']), $ItemFlux['flux']);
|
||||
}
|
||||
|
||||
foreach ($tabFluxes as $flux) {
|
||||
$tabArticle = $this->parseArticles($flux);
|
||||
foreach ($tabArticle as $item) {
|
||||
$this->articleGateway->addArticle($item);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,34 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="refresh" content="5">
|
||||
<title>Server</title>
|
||||
<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="testContent">
|
||||
</div>
|
||||
<script>
|
||||
// Fonction pour charger dynamiquement le contenu de test.php
|
||||
function loadTestContent() {
|
||||
$.ajax({
|
||||
url: 'test.php', // Chemin vers test.php
|
||||
type: 'GET',
|
||||
success: function(response) {
|
||||
$('#testContent').html(response); // Mettre à jour le contenu
|
||||
},
|
||||
error: function() {
|
||||
console.error('Erreur lors du chargement de test.php');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Appeler la fonction pour charger le contenu au chargement initial
|
||||
loadTestContent();
|
||||
|
||||
// Actualiser la page toutes les 5 secondes
|
||||
setInterval(loadTestContent, 5000);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
namespace test;
|
||||
use DAL\ArticleGateway;
|
||||
use DAL\Connection;
|
||||
use DAL\FluxGateway;
|
||||
use model\Parser;
|
||||
|
||||
require '../../vendor/autoload.php';
|
||||
|
||||
$gwArt = new ArticleGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$gwFl = new FluxGateway(new Connection('mysql:host=londres.uca.local;dbname=dbrorossetto', 'rorossetto', 'tpphp'));
|
||||
$pars = new Parser( $gwFl,$gwArt);
|
||||
$pars->addAllArticles();
|
||||
var_dump($pars);
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,597 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.3.2 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2023 The Bootstrap Authors
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root,
|
||||
[data-bs-theme=light] {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-primary-text-emphasis: #052c65;
|
||||
--bs-secondary-text-emphasis: #2b2f32;
|
||||
--bs-success-text-emphasis: #0a3622;
|
||||
--bs-info-text-emphasis: #055160;
|
||||
--bs-warning-text-emphasis: #664d03;
|
||||
--bs-danger-text-emphasis: #58151c;
|
||||
--bs-light-text-emphasis: #495057;
|
||||
--bs-dark-text-emphasis: #495057;
|
||||
--bs-primary-bg-subtle: #cfe2ff;
|
||||
--bs-secondary-bg-subtle: #e2e3e5;
|
||||
--bs-success-bg-subtle: #d1e7dd;
|
||||
--bs-info-bg-subtle: #cff4fc;
|
||||
--bs-warning-bg-subtle: #fff3cd;
|
||||
--bs-danger-bg-subtle: #f8d7da;
|
||||
--bs-light-bg-subtle: #fcfcfd;
|
||||
--bs-dark-bg-subtle: #ced4da;
|
||||
--bs-primary-border-subtle: #9ec5fe;
|
||||
--bs-secondary-border-subtle: #c4c8cb;
|
||||
--bs-success-border-subtle: #a3cfbb;
|
||||
--bs-info-border-subtle: #9eeaf9;
|
||||
--bs-warning-border-subtle: #ffe69c;
|
||||
--bs-danger-border-subtle: #f1aeb5;
|
||||
--bs-light-border-subtle: #e9ecef;
|
||||
--bs-dark-border-subtle: #adb5bd;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-emphasis-color: #000;
|
||||
--bs-emphasis-color-rgb: 0, 0, 0;
|
||||
--bs-secondary-color: rgba(33, 37, 41, 0.75);
|
||||
--bs-secondary-color-rgb: 33, 37, 41;
|
||||
--bs-secondary-bg: #e9ecef;
|
||||
--bs-secondary-bg-rgb: 233, 236, 239;
|
||||
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
|
||||
--bs-tertiary-color-rgb: 33, 37, 41;
|
||||
--bs-tertiary-bg: #f8f9fa;
|
||||
--bs-tertiary-bg-rgb: 248, 249, 250;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-color-rgb: 13, 110, 253;
|
||||
--bs-link-decoration: underline;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-link-hover-color-rgb: 10, 88, 202;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-color: #212529;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-xxl: 2rem;
|
||||
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
|
||||
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
|
||||
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
|
||||
--bs-focus-ring-width: 0.25rem;
|
||||
--bs-focus-ring-opacity: 0.25;
|
||||
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
|
||||
--bs-form-valid-color: #198754;
|
||||
--bs-form-valid-border-color: #198754;
|
||||
--bs-form-invalid-color: #dc3545;
|
||||
--bs-form-invalid-border-color: #dc3545;
|
||||
}
|
||||
|
||||
[data-bs-theme=dark] {
|
||||
color-scheme: dark;
|
||||
--bs-body-color: #dee2e6;
|
||||
--bs-body-color-rgb: 222, 226, 230;
|
||||
--bs-body-bg: #212529;
|
||||
--bs-body-bg-rgb: 33, 37, 41;
|
||||
--bs-emphasis-color: #fff;
|
||||
--bs-emphasis-color-rgb: 255, 255, 255;
|
||||
--bs-secondary-color: rgba(222, 226, 230, 0.75);
|
||||
--bs-secondary-color-rgb: 222, 226, 230;
|
||||
--bs-secondary-bg: #343a40;
|
||||
--bs-secondary-bg-rgb: 52, 58, 64;
|
||||
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
|
||||
--bs-tertiary-color-rgb: 222, 226, 230;
|
||||
--bs-tertiary-bg: #2b3035;
|
||||
--bs-tertiary-bg-rgb: 43, 48, 53;
|
||||
--bs-primary-text-emphasis: #6ea8fe;
|
||||
--bs-secondary-text-emphasis: #a7acb1;
|
||||
--bs-success-text-emphasis: #75b798;
|
||||
--bs-info-text-emphasis: #6edff6;
|
||||
--bs-warning-text-emphasis: #ffda6a;
|
||||
--bs-danger-text-emphasis: #ea868f;
|
||||
--bs-light-text-emphasis: #f8f9fa;
|
||||
--bs-dark-text-emphasis: #dee2e6;
|
||||
--bs-primary-bg-subtle: #031633;
|
||||
--bs-secondary-bg-subtle: #161719;
|
||||
--bs-success-bg-subtle: #051b11;
|
||||
--bs-info-bg-subtle: #032830;
|
||||
--bs-warning-bg-subtle: #332701;
|
||||
--bs-danger-bg-subtle: #2c0b0e;
|
||||
--bs-light-bg-subtle: #343a40;
|
||||
--bs-dark-bg-subtle: #1a1d20;
|
||||
--bs-primary-border-subtle: #084298;
|
||||
--bs-secondary-border-subtle: #41464b;
|
||||
--bs-success-border-subtle: #0f5132;
|
||||
--bs-info-border-subtle: #087990;
|
||||
--bs-warning-border-subtle: #997404;
|
||||
--bs-danger-border-subtle: #842029;
|
||||
--bs-light-border-subtle: #495057;
|
||||
--bs-dark-border-subtle: #343a40;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #6ea8fe;
|
||||
--bs-link-hover-color: #8bb9fe;
|
||||
--bs-link-color-rgb: 110, 168, 254;
|
||||
--bs-link-hover-color-rgb: 139, 185, 254;
|
||||
--bs-code-color: #e685b5;
|
||||
--bs-highlight-color: #dee2e6;
|
||||
--bs-highlight-bg: #664d03;
|
||||
--bs-border-color: #495057;
|
||||
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
|
||||
--bs-form-valid-color: #75b798;
|
||||
--bs-form-valid-border-color: #75b798;
|
||||
--bs-form-invalid-color: #ea868f;
|
||||
--bs-form-invalid-border-color: #ea868f;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: var(--bs-border-width) solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: var(--bs-heading-color);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-left: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
color: var(--bs-highlight-color);
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: var(--bs-secondary-color);
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: left;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
line-height: inherit;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
/* rtl:raw:
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
*/
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=bootstrap-reboot.css.map */
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,594 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.3.2 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2023 The Bootstrap Authors
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root,
|
||||
[data-bs-theme=light] {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-primary-text-emphasis: #052c65;
|
||||
--bs-secondary-text-emphasis: #2b2f32;
|
||||
--bs-success-text-emphasis: #0a3622;
|
||||
--bs-info-text-emphasis: #055160;
|
||||
--bs-warning-text-emphasis: #664d03;
|
||||
--bs-danger-text-emphasis: #58151c;
|
||||
--bs-light-text-emphasis: #495057;
|
||||
--bs-dark-text-emphasis: #495057;
|
||||
--bs-primary-bg-subtle: #cfe2ff;
|
||||
--bs-secondary-bg-subtle: #e2e3e5;
|
||||
--bs-success-bg-subtle: #d1e7dd;
|
||||
--bs-info-bg-subtle: #cff4fc;
|
||||
--bs-warning-bg-subtle: #fff3cd;
|
||||
--bs-danger-bg-subtle: #f8d7da;
|
||||
--bs-light-bg-subtle: #fcfcfd;
|
||||
--bs-dark-bg-subtle: #ced4da;
|
||||
--bs-primary-border-subtle: #9ec5fe;
|
||||
--bs-secondary-border-subtle: #c4c8cb;
|
||||
--bs-success-border-subtle: #a3cfbb;
|
||||
--bs-info-border-subtle: #9eeaf9;
|
||||
--bs-warning-border-subtle: #ffe69c;
|
||||
--bs-danger-border-subtle: #f1aeb5;
|
||||
--bs-light-border-subtle: #e9ecef;
|
||||
--bs-dark-border-subtle: #adb5bd;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-emphasis-color: #000;
|
||||
--bs-emphasis-color-rgb: 0, 0, 0;
|
||||
--bs-secondary-color: rgba(33, 37, 41, 0.75);
|
||||
--bs-secondary-color-rgb: 33, 37, 41;
|
||||
--bs-secondary-bg: #e9ecef;
|
||||
--bs-secondary-bg-rgb: 233, 236, 239;
|
||||
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
|
||||
--bs-tertiary-color-rgb: 33, 37, 41;
|
||||
--bs-tertiary-bg: #f8f9fa;
|
||||
--bs-tertiary-bg-rgb: 248, 249, 250;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-color-rgb: 13, 110, 253;
|
||||
--bs-link-decoration: underline;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-link-hover-color-rgb: 10, 88, 202;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-color: #212529;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-xxl: 2rem;
|
||||
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
|
||||
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
|
||||
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
|
||||
--bs-focus-ring-width: 0.25rem;
|
||||
--bs-focus-ring-opacity: 0.25;
|
||||
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
|
||||
--bs-form-valid-color: #198754;
|
||||
--bs-form-valid-border-color: #198754;
|
||||
--bs-form-invalid-color: #dc3545;
|
||||
--bs-form-invalid-border-color: #dc3545;
|
||||
}
|
||||
|
||||
[data-bs-theme=dark] {
|
||||
color-scheme: dark;
|
||||
--bs-body-color: #dee2e6;
|
||||
--bs-body-color-rgb: 222, 226, 230;
|
||||
--bs-body-bg: #212529;
|
||||
--bs-body-bg-rgb: 33, 37, 41;
|
||||
--bs-emphasis-color: #fff;
|
||||
--bs-emphasis-color-rgb: 255, 255, 255;
|
||||
--bs-secondary-color: rgba(222, 226, 230, 0.75);
|
||||
--bs-secondary-color-rgb: 222, 226, 230;
|
||||
--bs-secondary-bg: #343a40;
|
||||
--bs-secondary-bg-rgb: 52, 58, 64;
|
||||
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
|
||||
--bs-tertiary-color-rgb: 222, 226, 230;
|
||||
--bs-tertiary-bg: #2b3035;
|
||||
--bs-tertiary-bg-rgb: 43, 48, 53;
|
||||
--bs-primary-text-emphasis: #6ea8fe;
|
||||
--bs-secondary-text-emphasis: #a7acb1;
|
||||
--bs-success-text-emphasis: #75b798;
|
||||
--bs-info-text-emphasis: #6edff6;
|
||||
--bs-warning-text-emphasis: #ffda6a;
|
||||
--bs-danger-text-emphasis: #ea868f;
|
||||
--bs-light-text-emphasis: #f8f9fa;
|
||||
--bs-dark-text-emphasis: #dee2e6;
|
||||
--bs-primary-bg-subtle: #031633;
|
||||
--bs-secondary-bg-subtle: #161719;
|
||||
--bs-success-bg-subtle: #051b11;
|
||||
--bs-info-bg-subtle: #032830;
|
||||
--bs-warning-bg-subtle: #332701;
|
||||
--bs-danger-bg-subtle: #2c0b0e;
|
||||
--bs-light-bg-subtle: #343a40;
|
||||
--bs-dark-bg-subtle: #1a1d20;
|
||||
--bs-primary-border-subtle: #084298;
|
||||
--bs-secondary-border-subtle: #41464b;
|
||||
--bs-success-border-subtle: #0f5132;
|
||||
--bs-info-border-subtle: #087990;
|
||||
--bs-warning-border-subtle: #997404;
|
||||
--bs-danger-border-subtle: #842029;
|
||||
--bs-light-border-subtle: #495057;
|
||||
--bs-dark-border-subtle: #343a40;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #6ea8fe;
|
||||
--bs-link-hover-color: #8bb9fe;
|
||||
--bs-link-color-rgb: 110, 168, 254;
|
||||
--bs-link-hover-color-rgb: 139, 185, 254;
|
||||
--bs-code-color: #e685b5;
|
||||
--bs-highlight-color: #dee2e6;
|
||||
--bs-highlight-bg: #664d03;
|
||||
--bs-border-color: #495057;
|
||||
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
|
||||
--bs-form-valid-color: #75b798;
|
||||
--bs-form-valid-border-color: #75b798;
|
||||
--bs-form-invalid-color: #ea868f;
|
||||
--bs-form-invalid-border-color: #ea868f;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: var(--bs-border-width) solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: var(--bs-heading-color);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
color: var(--bs-highlight-color);
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: var(--bs-secondary-color);
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: right;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
line-height: inherit;
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: right;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,27 @@
|
||||
@charset "UTF-8";
|
||||
.myBody{
|
||||
background-color: rgba(255,187,248,0.50);
|
||||
}
|
||||
.imgArticle{
|
||||
width: 15em;
|
||||
margin: 1em;
|
||||
}
|
||||
.enTitre{
|
||||
font-size: large;
|
||||
}
|
||||
.entete{
|
||||
font-size: xxx-large;
|
||||
}
|
||||
.caseInfo{
|
||||
margin: 1em;
|
||||
padding: 1em;
|
||||
background-color: rgba(255,185,251,0.61);
|
||||
}
|
||||
.dnconnect{
|
||||
padding: 1em;
|
||||
display: flex;
|
||||
justify-content: right;
|
||||
}
|
||||
.margOp{
|
||||
margin: 1em;
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
|
||||
<!-- CSS -->
|
||||
<link rel="stylesheet" href="/~rorossetto/Php_RSS/fluxRSS/templates/CSS/myStyle.css" >
|
||||
<title>All Flux</title>
|
||||
</head>
|
||||
<body class="myBody margOp">
|
||||
<a class="btn" href="/~rorossetto/Php_RSS/fluxRSS/admin/">Vue article</a>
|
||||
<div class="margOp">
|
||||
<h1 class="d-flex justify-content-center entete">Liste flux</h1>
|
||||
</div>
|
||||
{% if dVue.data is defined %}
|
||||
{% for value in dVue.data %}
|
||||
<div class="margOp enTitre caseInfo">
|
||||
{{ value.getFlux() }}
|
||||
<form method="post" action="deleteFlux">
|
||||
<input type="hidden" name="flux" value="{{ value.getId() }}">
|
||||
<button class="margOp" type="submit">Delete Flux</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p class="justify-content-center d-flex enTitre">Pas de flux présent</p>
|
||||
{% endif %}
|
||||
<form method="POST" action="ajoutFlux">
|
||||
<input name="fluxAdd" type="text">
|
||||
<button type="submit">Ajouter Flux</button>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in new issue