Commit 9bf32454 authored by Mat's avatar Mat

Utilisateur/ajaxDisplay fonctionnelle

parent 3d08da1f
......@@ -90,11 +90,12 @@ fos_js_routing:
routes_to_expose:
- api_legume_*
- api_offre_*
- api_groupe_*
- api_depot_*
- api_lettre_*
- api_info_*
- potage_offre_legumes_ajax_display
- api_utilisateur_*
- api_groupe_*
- api_depot_*
- potage_offre_legumes_ajax_display # tester si utile ??
# VichUploaderBundle Configuration
vich_uploader:
......
......@@ -34,12 +34,21 @@ class UtilisateurAPIController extends MasterAPIController
/**
* @param Request $request
* @return \Symfony\Component\HttpFoundation\JsonResponse
*/
public function readAction()
public function readAction(Request $request)
{
// defaults
$paginate = ($request->query->get('step') !== null) ? $request->query->get('step') : 10;
$start = ($request->query->get('page') !== null) ? $request->query->get('page') : 1;
$column = ($request->query->get('column') !== null) ? $request->query->get('column') : 'id';
$order = ($request->query->get('order') !== null) ? $request->query->get('order') : 'ASC';
$utilisateurs = $this->getDoctrine()->getManager()
->getRepository('PotageBundle:Utilisateur')->findAllForRead();
->getRepository('PotageBundle:Utilisateur')
->findAllForAPIReadPaginate($paginate, $start, $column, $order);
return $this->api($utilisateurs);
}
......@@ -106,4 +115,39 @@ class UtilisateurAPIController extends MasterAPIController
return $this->api([]);
}
/**
* @return \Symfony\Component\HttpFoundation\JsonResponse
* @throws \Doctrine\ORM\NoResultException
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function countAction()
{
$nbUtilisateurs = $this->getDoctrine()->getManager()
->getRepository('PotageBundle:Utilisateur')->countRowsForAPI();
return $this->api($nbUtilisateurs);
}
/**
* @param Request $request
* @return \Symfony\Component\HttpFoundation\JsonResponse
*/
public function searchAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$requestString = $request->get('q');
$utilisateurs = $em->getRepository('PotageBundle:Utilisateur')->findRowsByString($requestString);
if ($utilisateurs === null)
{
return $this->api($utilisateurs, Response::HTTP_NOT_FOUND);
}
else
{
return $this->api($utilisateurs);
}
}
}
......@@ -352,3 +352,15 @@ api_utilisateur_delete:
_controller: APIBundle:UtilisateurAPI:delete
methods: [ DELETE ]
api_utilisateur_count:
path: /utilisateurs/compteur
defaults:
_controller: APIBundle:UtilisateurAPI:count
methods: [ GET ]
api_utilisateur_search:
path: /utilisateurs/rechercher
defaults:
_controller: APIBundle:UtilisateurAPI:search
methods: [ GET ]
......@@ -2,6 +2,8 @@
namespace PotageBundle\Repository;
use PotageBundle\Entity\Utilisateur;
/**
* UtilisateurRepository
*
......@@ -12,13 +14,20 @@ class UtilisateurRepository extends \Doctrine\ORM\EntityRepository
{
/**
* @param $paginate
* @param $start
* @param null $column
* @param null $order
* @return array
*/
public function findAllForRead()
public function findAllForAPIReadPaginate($paginate, $start, $column = null, $order = null)
{
$qb = $this->createQueryBuilder('u')
;
->setMaxResults($paginate)
->setFirstResult(($start - 1) * $paginate);
if ($column !== null) {
$qb ->orderBy(sprintf('u.%s', $column), $order);
}
return $qb->getQuery()->getResult();
}
......@@ -61,5 +70,34 @@ class UtilisateurRepository extends \Doctrine\ORM\EntityRepository
return $qb->getQuery()->getOneOrNullResult();
}
/**
* @return mixed
* @throws \Doctrine\ORM\NoResultException
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function countRowsForAPI()
{
$qb = $this->createQueryBuilder('u')
->select('count(u.id)');
return $qb->getQuery()->getSingleScalarResult();
}
/**
* Champs de recherche
* @param $string
* @return Utilisateur[]
*/
public function findRowsByString($string)
{
return $this->getEntityManager()
->createQuery(
'SELECT u
FROM PotageBundle\Entity\Utilisateur u
WHERE u.nom LIKE :string
OR u.prenom LIKE :string
OR u.email LIKE :string ')
->setParameter(':string', '%'.$string.'%')
->getResult();
}
}
......@@ -64,7 +64,7 @@
{% block sectionContent %}
<section>
<nav id="pagenav" aria-label="page navigation legume">
<nav id="pagenav" aria-label="page navigation utilisateur">
<ul class="pagination justify-content-center">
</ul>
</nav>
......@@ -88,11 +88,11 @@
</a>
</th>
<th scope="col">
<a href="javascript: void(0);" id="groupes" class="btn-sort">Groupes
<a href="javascript: void(0);" id="login" class="btn-sort">Nom d'utilisateur
</a>
</th>
<th scope="col">
<a href="javascript: void(0);" id="login" class="btn-sort">Compte FOSUser
<a href="javascript: void(0);" id="groupes" class="btn-sort">Groupe(s) de mangeurs
</a>
</th>
<th scope="col">
......@@ -113,6 +113,264 @@
<script type="text/javascript">
/*
* Recharge la table
*/
function reloadTableUtilisateur(paginate)
{
//console.log(paginate);
tbody.innerHTML = null;
refreshTotalRowsStats(countURL, 'utilisateur');
let utilisateurURL = Routing.generate('api_utilisateur_read', paginate);
displayPagination(utilisateurURL, paginate, function()
{
reloadTableUtilisateur(paginate);
});
getTableBodyUtilisateur(utilisateurURL);
}
/*
* Recharge la table avec la fonction de recherche
*/
function reloadTableSearchUtilisateur(qString)
{
removePagination();
let searchURL = Routing.generate('api_utilisateur_search', qString);
refreshSearchStats(searchURL);
tbody.innerHTML = null;
sleep(300).then(() => {
// TODO le sleep est encore buggé
getTableBodyUtilisateur(searchURL);
});
}
/*
* Rafraîchit l'affichage de la table utilisateur
*/
function getTableBodyUtilisateur(URL)
{
AJAX('GET', URL, function(request)
{
let json = JSON.parse(request.responseText);
for (let i = 0; i < json.length; i++)
{
let tr = buildRowUtilisateur(json[i]);
tbody.appendChild(tr);
}
});
}
/*
* Construit une rangée du tableau des Utilisateurs
* @param json object jsonRow
*/
function buildRowUtilisateur(jsonRow)
{
console.log(jsonRow);
let tr = document.createElement('tr');
let td1 = document.createElement('td');
td1.textContent = formatNumber(jsonRow.id, 3);
tr.appendChild(td1);
let td2 = document.createElement('td');
td2.textContent = jsonRow.nom;
tr.appendChild(td2);
let td3 = document.createElement('td');
td3.textContent = jsonRow.prenom;
tr.appendChild(td3);
let td4 = document.createElement('td');
td4.textContent = jsonRow.email;
tr.appendChild(td4);
let td6 = document.createElement('td');
td6.textContent = jsonRow.user.username;
tr.appendChild(td6);
let td5 = document.createElement('td');
jsonRow.groupes.forEach(function(groupe){
td5.textContent += groupe.nom + ', ';
});
td5.textContent = td5.textContent.replace(/, $/, '');
tr.appendChild(td5);
let td7 = document.createElement('td');
td7.appendChild(displayEditUtilisateur(jsonRow));
td7.appendChild(displayDeleteUtilisateur(jsonRow));
tr.appendChild(td7);
return tr;
}
/*
* Affiche un bouton pour éditer une rangée
* @param json object jsonRow
*/
function displayEditUtilisateur(jsonRow)
{
let editBtn = buildEditBtn();
editBtn.dataset.target = ".form-utilisateur-modal";
editBtn.dataset.utilisateurId = jsonRow.id;
editBtn.addEventListener('click', function()
{
let utilisateurId = this.dataset.utilisateurId;
submitURL = Routing.generate('api_utilisateur_update', {'id': utilisateurId});
AJAX('GET', submitURL, function(request)
{
let json = JSON.parse(request.responseText);
titleForm.textContent = 'Utilisateur # ' + formatNumber(utilisateurId, 3);
form.querySelector('#utilisateur_prenom').value = json.prenom;
form.querySelector('#utilisateur_nom').value = json.nom;
form.querySelector('#utilisateur_email').value = json.email;
let cb = form.querySelectorAll('#utilisateur_groupes input');
cb.forEach(function(input)
{
let a = false;
json.groupes.forEach(function(groupe)
{
(input.value == groupe.id) ? a = true : null;
});
input.checked = (a === true);
});
form.querySelector('select#utilisateur_user').value = json.user.id;
setFormSelectBoolValue(form, '#utilisateur_user', json.user.id);
});
});
return editBtn;
}
/*
* Affiche un bouton pour supprimer une rangée
* @param json object jsonRow
*/
function displayDeleteUtilisateur(jsonRow)
{
let deleteBtn = buildDeleteBtn();
deleteBtn.dataset.utilisateurId = jsonRow.id;
deleteBtn.addEventListener('click', function()
{
let utilisateurId = this.dataset.utilisateurId;
let r = confirm("Effacer l'utilisateur n°" + formatNumber(utilisateurId, 3)
+ "\nCette action n'est pas réversible. Souhaitez-vous continuer ?\n");
if (r === true) {
submitURL = Routing.generate('api_utilisateur_delete', {'id': utilisateurId});
AJAX('DELETE', submitURL, function()
{
reloadTableUtilisateur(paginate);
});
}
});
return deleteBtn;
}
/*
* =================================
* Initialise l'affichage de la page
* =================================
*/
let submitURL = null;
let table = document.querySelector('table#maintab.utilisateurs');
let tbody = table.querySelector('tbody');
let paginate = { 'step': 10, 'page': 1, 'column': 'id', 'order': 'ASC' };
let form = document.querySelector('form[name=utilisateur]');
let countURL = Routing.generate('api_utilisateur_count');
refreshTotalRowsStats(countURL);
reloadTableUtilisateur(paginate);
selectPaginateStep(paginate, function() {
searchField.value = null;
reloadTableUtilisateur(paginate);
});
sortToggleByColumn(paginate, function () {
reloadTableUtilisateur(paginate);
});
reloadButton(function() {
searchField.value = null;
refreshTotalRowsStats(countURL);
reloadTableUtilisateur(paginate);
});
let titleForm = document.querySelector('#form-utilisateur');
createButton(function() {
titleForm.textContent = 'Ajouter un nouvel utilisateur';
form.querySelector('#utilisateur_prenom').value = null;
form.querySelector('#utilisateur_nom').value = null;
form.querySelector('#utilisateur_email').checked = null;
form.querySelector('#utilisateur_groupes').value = null;
form.querySelector('#utilisateur_user').value = null;
submitURL = Routing.generate('api_utilisateur_create');
});
/*
* Soumission des formulaires
*/
form.addEventListener('submit', function(e)
{
let form = this;
e.preventDefault();
AJAX('POST', submitURL, function()
{
refreshTotalRowsStats(countURL);
reloadTableUtilisateur(paginate);
$('.form-utilisateur-modal').modal('hide'); // en jquery
},
form);
});
/*
* Recherche Live Ajax
*/
let searchField = document.querySelector('input#search');
let qString = null;
searchField.addEventListener('input', function()
{
qString = this.value;
if (qString.length === 0) {
reloadTableUtilisateur(paginate);
} else {
if (qString.length >= 3)
{
stepform.value = -1;
reloadTableSearchUtilisateur({'q': qString });
}
}
});
</script>
{% endblock %}
......
......@@ -18,20 +18,20 @@
<div class="form-group row">
<div class="col-sm-4">
{{ form_label(formUtilisateur.nom) }}
{{ form_label(formUtilisateur.prenom) }}
</div>
<div class="col-sm-8">
{{ form_widget(formUtilisateur.nom) }}
{{ form_errors(formUtilisateur.nom) }}
{{ form_widget(formUtilisateur.prenom) }}
{{ form_errors(formUtilisateur.prenom) }}
</div>
</div>
<div class="form-group row">
<div class="col-sm-4">
{{ form_label(formUtilisateur.prenom) }}
{{ form_label(formUtilisateur.nom) }}
</div>
<div class="col-sm-8">
{{ form_widget(formUtilisateur.prenom) }}
{{ form_errors(formUtilisateur.prenom) }}
{{ form_widget(formUtilisateur.nom) }}
{{ form_errors(formUtilisateur.nom) }}
</div>
</div>
<div class="form-group row">
......
......@@ -259,3 +259,7 @@ table span.details { /*
#sortable span.unite {
display: block;
}
#utilisateur_groupes label {
margin-right: 15px;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment