@extends('layouts.page-layout') @section('title', '{{ $pageTitle }}') @section('content') <div class="container mt-3"> <noscript> <div class="alert alert-danger">L'activation de Javascript est nécessaire sur la page.</div> </noscript> @if(!empty($insertMessage)) <div class="alert alert-{{ $insertMessage["status"] }}" role="alert"> @if(!empty($insertMessage["pdoError"])) <strong>{{ $insertMessage["message"] }}</strong> <br>{{ $insertMessage["pdoError"] }} @else {{ $insertMessage["message"] }} @endif </div> @endif <h1>{{ $pageTitle }}</h1> <div class="max-800 border rounded bg-light p-2"> <h5>Type d'objet à créer</h5> <select id="objectType" class="form-select form-select-sm" aria-label=".form-select-sm example"> <option value="dontchooseme" selected>Choisissez un objet dans la liste</option> <option value="Auteur">Auteur (oui c'est triste mais on les considère comme tel dans le code :c)</option> <option value="Adherent">Adhérent (est-ce surprenant du coup?)</option> <option value="Livre">Livre</option> <option value="Nationalite">Nationalité</option> <option value="Genre">Genre</option> <option value="Categorie">Categorie</option> </select> </div> <form action="index.php" method="post" class="max-800 mt-2" id="objectForm"> </form> </div> <script type="text/javascript"> const objectForm = document.getElementById("objectForm"); const selectObjectType = document.getElementById("objectType"); selectObjectType.addEventListener('change', function (){ if(selectObjectType.value !== 'dontchooseme') { loadObjectTypeForm(selectObjectType.value); } }) const typesList = { "int" : "number", "varchar" : "text", "date" : "date" }; async function loadObjectTypeForm(objectType){ objectForm.innerHTML = ""; await fetch('?action=creerObjet&describeTable=' + objectType) .then(res => res.json()) .then((out) => { console.log('Output: ', out); let objectName = document.createElement("input"); objectName.name = "objectName"; objectName.setAttribute("value", objectType); objectName.hidden = true; objectForm.appendChild(objectName); if(out.status === "success"){ for(let i = 0; i < out.columns.length; i++){ // On évite de proposer les clés primaires auto incrémentables if(out.columns[i].Extra !== "auto_increment"){ let columnType = out.columns[i].Type; let match = columnType.match(/([a-z]*)/); objectForm.appendChild( createInputDiv( typesList[match[1]], out.columns[i].Field ) ); } } }else{ let errorAlert = document.createElement("div"); errorAlert.classList.add("alert"); errorAlert.classList.add("alert-danger"); errorAlert.innerHTML = "<b>Erreur lors de la récupération des spécifications de l'objet " + objectType + "</b><br>" + out.message; objectForm.appendChild(errorAlert); } }).catch(err => console.error(err)); let actionInput = document.createElement("input"); actionInput.name = "action"; actionInput.value = "creerObjet"; actionInput.hidden = true; objectForm.appendChild(actionInput); let submitButton = document.createElement("button"); submitButton.type = "submit"; submitButton.classList.add("btn"); submitButton.classList.add("btn-primary"); submitButton.innerText = "Créer"; objectForm.appendChild(submitButton); } function createInputDiv(type, name){ let mainContainer = document.createElement("div"); mainContainer.classList.add("mb-3"); let label = document.createElement("label"); label.classList.add("form-label"); label.setAttribute("for", name); let showName = name.split(/(?=[A-Z])/).join(' ').toLowerCase(); showName = showName.charAt(0).toUpperCase() + showName.slice(1); label.innerText = showName; mainContainer.appendChild(label); let input = document.createElement("input"); input.classList.add("form-control"); input.type = type; input.name = name; input.required = true; mainContainer.appendChild(input); return mainContainer; } </script> @endsection