diff --git a/public/assets/css/style.css b/public/assets/css/style.css index 2156e6d..8fcb5cc 100755 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -432,31 +432,88 @@ ul { } .recette-form { - height: 100%; - width: 100%; + height: 80%; + width: 80%; margin: 10px; padding: 10px; + border: 1px solid black; + background: white; + border-radius: 20px; } .recette-form-group { display: flex; flex-direction: column; + padding: 5px; } #recette-form-div-desc { - height: 400px; + height: 300px; } #recette-form-description { height: 95%; } +.recette-add-form-all { + display: flex; + flex-direction: row; + overflow: hidden; +} + +.recette-form-add { + flex: 3; +} + +.recette-form-add-ingr { + height: 30%; +} + +.recette-form-add-tag { + height: 30%; +} + +.recette-form-add-additional{ + flex: 1; + padding-right: 10px; +} + +.err { + color: red; + display: none; + text-align: center; + padding-top: 20px; +} + +.liste-ingr-elem { + display: flex; + height: 100px; + padding:5px; + background-color: #c6fdefe0; + color: #000000; + border: 1px solid black; + border-radius: 10px; + box-shadow: 1px 1px 1px black; +} + +.liste-ingr-elem-text { + width: 100%; + height: 100%; + flex:12; + padding-left: 20px; + line-height: 100px; +} + +.ingr-image { + flex: 1; + border: 1px solid black; + border-radius: 10px; +} + /*Footer et son contenue*/ footer{ padding: 25px; background: rgb(11, 189, 144); color: white; -} - - - + border-top: 1px solid black; +} \ No newline at end of file diff --git a/public/assets/js/form.js b/public/assets/js/form.js new file mode 100644 index 0000000..a6f31f4 --- /dev/null +++ b/public/assets/js/form.js @@ -0,0 +1,169 @@ +document.addEventListener("DOMContentLoaded", function(){ + + + let compl_form = document.getElementById("recette-form-complete"); + console.log(compl_form); + + function formulaire_ingredient_update(event) { + + event.preventDefault(); + + console.log(event); + + let form = document.getElementById("recette-form-ingr-add"); + + let cible = document.getElementById("recette-form-ingr"); + let nomIngredient = document.getElementById("recette-form-ingr-nom"); + let image = document.getElementById("recette-form-ingr-photo"); + if( nomIngredient.value === "" || image.value === "" ){ + alert( "Un champ requis est manquant." ); + return; + } + + let ingr = form.nom; + + let form_data = new FormData(form); + + fetch("/api/ingredients/create", { + method : "POST", + body: form_data + }).then( reponse => { + if (!reponse.ok) { + let div_err = document.getElementById("recette-form-div-err-ingr"); + + div_err.style.display = "inherit"; + div_err.innerText = "Erreur de connection au serveur"; + + } + else { + reponse.json().then( data => { + if (data.success) { + let new_elem = document.createElement("option"); + + new_elem.setAttribute("value",document.getElementById('recette-form-ingr-nom').value); + new_elem.innerText = document.getElementById('recette-form-ingr-nom').value; + + cible.appendChild(new_elem); + + document.getElementById('recette-form-ingr-nom').value = ""; + } + }) + } + }) + + } + + function formulaire_tag_update(event){ + + event.preventDefault(); + + let form = document.getElementById("recette-form-tag-add"); + + let cible = document.getElementById("recette-form-tag"); + let nomTag = document.getElementById("recette-form-tag-nom"); + if( nomTag.value === "" ){ + alert( "Un champ requis est manquant." ); + return; + } + + let tag = form.tag; + + let form_data = new FormData(form); + + fetch("/api/tags/create", { + method : "POST", + body: form_data + }).then( reponse => { + if (!reponse.ok) { + let div_err = document.getElementById("recette-form-div-err-tag"); + + div_err.style.display = "inherit"; + div_err.innerText = "Erreur de connection au serveur"; + + } + else { + reponse.json().then( data => { + if (data.success) { + let new_elem = document.createElement("option"); + + new_elem.setAttribute("value",nomTag.value); + new_elem.innerText = nomTag.value; + + cible.appendChild(new_elem); + + nomTag.value = ""; + } + }) + } + }) + + } + + function formulaire_traitement(event){ + + event.preventDefault(); + + console.log( event ); + + let nom = document.getElementById('recette-form-nom'); + let temps = document.getElementsByName('recette-form-nom'); + let photo = document.getElementById('recette-form-photo'); + let ingredients = document.getElementById('recette-form-ingr'); + let tags = document.getElementById('recette-form-tag'); + let description = document.getElementById('recette-form-description'); + + if( nom.value === "" || temps.value == "" || ingredients.value === "" || tags.value === ""){ + console.log( "Another field" ); + alert( "Un champ requis est manquant." ); + return; + } + if( !IS_EDIT && photo.value === ""){ + console.log( "Photo field" ); + alert( "Un champ requis est manquant." ); + return; + } + + if( temps <= 0 ){ + alert( "Le temps doit être positif ou supérieur à 0." ); + return; + } + + let form_data = new FormData(compl_form); + form_data.append( "ingredients", form_data.getAll("ingr").join(",") ); + form_data.append( "tags", form_data.getAll( "tag").join(",") ); + if( RECETTE_ID !== 0 ) + form_data.append( 'id', RECETTE_ID ); + + let endpoint = IS_EDIT ? "/api/recettes/edit" : "/api/recettes/create"; + + fetch( endpoint, { + method : "POST", + body: form_data + }).then( reponse => { + if (!reponse.ok) { + alert( "Erreur survenie" ); + } + else { + reponse.json().then( data => { + if (data.success) { + alert( "Envoyé" ); + } else { + alert( data.error || "" ); + } + }) + } + }) + + } + + let ingr_form = document.getElementById("recette-form-ingr-add"); + + ingr_form.addEventListener('submit', formulaire_ingredient_update); + + let tag_form = document.getElementById("recette-form-tag-add"); + + tag_form.addEventListener('submit', formulaire_tag_update); + compl_form.addEventListener('submit', formulaire_traitement); + + +}) \ No newline at end of file diff --git a/src/Domain/Recettes/RecettesAPIController.php b/src/Domain/Recettes/RecettesAPIController.php index 7811cf2..9698c57 100644 --- a/src/Domain/Recettes/RecettesAPIController.php +++ b/src/Domain/Recettes/RecettesAPIController.php @@ -41,13 +41,17 @@ class RecettesAPIController extends Controller { $recetteRepo = new RecetteRepository(); $resp = $recetteRepo->advancedRecetteSearch( $title, $tagsId, $ingredientsId ); - $resp = array_map( function($recette) use ($recetteRepo){ - $r = $recetteRepo->getByID( $recette['num_recette'] ); - $r->url = Router::getRouteURL( 'recettes->show', $r->slug ); - $r->nb_ingredients = $r->getNumberOfIngredients(); - return $r; - }, $resp ?? [] ); - JSONResponse::sendSuccess( [ 'data' => $resp ] ); + $objResp = []; + foreach( $resp as $r ){ + $r = $recetteRepo->getByID( $r['num_recette'] ); + $r->url = Router::getRouteURL( 'recettes->show', $r->slug ); + $r->nb_ingredients = $r->getNumberOfIngredients(); + if( !in_array( $r, $objResp ) ){ + $objResp[] = $r; + } + } + + JSONResponse::sendSuccess( [ 'data' => $objResp ] ); } @@ -58,8 +62,8 @@ class RecettesAPIController extends Controller { $temps = Request::post( 'temps' ) ?? ""; $fileField = "image"; - $tagsId = explode( ",", Request::post( 'tag' ) ) ?? []; - $ingredientsId = explode( ",", Request::post( 'ingr' ) ) ?? []; + $tagsId = explode( ",", Request::post( 'tags' ) ) ?? []; + $ingredientsId = explode( ",", Request::post( 'ingredients' ) ) ?? []; if( $tagsId == [ "" ] ) $tagsId = []; @@ -83,13 +87,16 @@ class RecettesAPIController extends Controller { // Vérification d'une entrée qui existerait déjà. $slug = strtolower( $name ); - $slug = str_replace( ' ', '-', $slug ); + $slug = str_replace( ' ', '', $slug ); $recetteRepo = new RecetteRepository(); if( $recetteRepo->getBySlug( $slug ) ){ JSONResponse::sendError( [ 'error' => "Recette already exists" ] ); } + if( in_array( $slug, [ 'create', 'edit', 'delete' ] ) ){ + JSONResponse::sendError( [ 'error' => "Recette already exists" ] ); + } // Création de la recette. $recette = new Recette(); @@ -98,7 +105,7 @@ class RecettesAPIController extends Controller { $recette->titre_recette = $name; $recette->slug = $slug; - $recette->temps_de_preparation = intval( $temps ); + $recette->temps_de_preparation = intval( $temps <= 0 ? 1 : $temps ); $recette->photo = $urlOrError; $recette->description_recette = $description; $recette->publication_date = date("Y-m-d"); @@ -140,8 +147,8 @@ class RecettesAPIController extends Controller { $temps = Request::post( 'temps' ) ?? ""; $fileField = "image"; - $tagsId = explode( ",", Request::post( 'tag' ) ) ?? []; - $ingredientsId = explode( ",", Request::post( 'ingr' ) ) ?? []; + $tagsId = explode( ",", Request::post( 'tags' ) ) ?? []; + $ingredientsId = explode( ",", Request::post( 'ingredients' ) ) ?? []; if( $tagsId == [ "" ] ) $tagsId = []; @@ -173,12 +180,12 @@ class RecettesAPIController extends Controller { // Vérification d'une entrée qui existerait déjà. $slug = strtolower( $name ); - $slug = str_replace( ' ', '-', $slug ); + $slug = str_replace( ' ', '', $slug ); $recette->titre_recette = $name; $recette->slug = $slug; - $recette->temps_de_preparation = intval( $temps ); + $recette->temps_de_preparation = intval( $temps <= 0 ? 1 : $temps ); $recette->description_recette = $description; // Importation de la recette. diff --git a/src/Domain/Recettes/RecettesController.php b/src/Domain/Recettes/RecettesController.php index 6264eb0..655ce01 100644 --- a/src/Domain/Recettes/RecettesController.php +++ b/src/Domain/Recettes/RecettesController.php @@ -33,4 +33,15 @@ class RecettesController extends Controller { ] ); } + public function show( string $slug ): View { + + $recette = new RecetteRepository()->getBySlug( $slug ); + if( !$recette ) + die( "Recette not found" ); + + return new View( 'recettes/show', [ + 'recette' => $recette, + ]); + } + } \ No newline at end of file diff --git a/src/Domain/Recettes/RecettesManagementController.php b/src/Domain/Recettes/RecettesManagementController.php index 1a4cdab..698440b 100644 --- a/src/Domain/Recettes/RecettesManagementController.php +++ b/src/Domain/Recettes/RecettesManagementController.php @@ -3,6 +3,12 @@ namespace App\Domain\Recettes; use App\Domain\Controller; +use App\Domain\Ingredients\IngredientRepository; +use App\Domain\Tags\TagRepository; +use App\Helpers\Authentification; +use App\Http\JSONResponse; +use App\Http\Request; +use App\Infrastructure\View; class RecettesManagementController extends Controller { @@ -11,7 +17,69 @@ class RecettesManagementController extends Controller { return [ self::Route( routeUrl: '/recettes/create', routeName: 'recettes->create', routeAction: 'create' ), self::Route( routeUrl: '/recettes/edit/{int}', routeName: 'recettes->edit', routeAction: 'edit' ), + self::Route( routeUrl: '/recettes/delete/{int}', routeName: 'recettes->delete', routeAction: 'delete' ), ]; } + + public function create(): View { + if( !Authentification::isLoggedIn() ) + die( "Not logged in" ); + + return new View( 'recettes/create', [ + 'tags' => new TagRepository()->getAll(), + 'ingredients' => new IngredientRepository()->getAll(), + ] ); + } + + public function edit( int $idRecette ): View { + if( !Authentification::isLoggedIn() ) + die( "Not logged in" ); + + $recette = new RecetteRepository()->getByID( $idRecette ); + if( !$recette ) + die( "Recette not found" ); + + $tagsID = array_map( function($tag) { + return $tag->getId(); + } + , $recette->getAllLinkedTags() ?? [] ); + + $ingredientsID = array_map( function($tag) { + return $tag->getId(); + } + , $recette->getAllLinkedIngredients() ?? [] ); + + return new View( 'recettes/edit', [ + 'recette' => $recette, + 'recetteTags' => $tagsID, + 'recetteIngr' => $ingredientsID, + 'tags' => new TagRepository()->getAll(), + 'ingredients' => new IngredientRepository()->getAll(), + ]); + } + + public function delete( int $idRecette ): never { + if( !Authentification::isLoggedIn() ) + die( "Not logged in" ); + + $recette = new RecetteRepository()->getByID( $idRecette ); + if( !$recette ) + die( "Recette not found" ); + + $recetteRepo = new RecetteRepository(); + + // Retirer tous les liens Ingrédients/Tags. + foreach( ( $recette->getAllLinkedIngredients() ?? [] ) as $ingr ){ + $recetteRepo->removeAnIngredient( $ingr, $recette ); + } + foreach( ( $recette->getAllLinkedTags() ?? [] ) as $tag ){ + $recetteRepo->removeATag( $tag, $recette ); + } + + if( !$recetteRepo->delete( $recette ) ) + JSONResponse::sendError( [ 'error' => 'An error occured while deleting recette' ] ); + + Request::redirectTo( 'recettes->index' ); + } } \ No newline at end of file diff --git a/views/home.php b/views/home.php index 8698283..bf307b7 100644 --- a/views/home.php +++ b/views/home.php @@ -1,13 +1,2 @@