Commit 0b3703bc authored by LucMerceron's avatar LucMerceron

Merge des deux versions

parents 16eb30b8 7d102130
=== JOUEURS ===
=== TABLEAU ===
Corriger l'affichage des dates (côté API)
Mode éditions/ajout
Corriger erreur dans la pagination
Corriger l'erreur joueursTries
Remettre la fonctionnalité des filtres
Lors de la suppression des ligne ajouter une animation ?
Export des données pour réutilisation future ?
=== EQUIPES ===
Recherche au sein des tableaux
Trier les colonnes d'un tableau
Paginer un tableau
Passage en mode édition lors d'un clic
Rajouter glyph pour les alertes
Ajouter le chargement
=== GENERAL ===
Fonctionnalité de vérification du tournois avant lancement
Faire la documentation
Améliorer le code du controleur joueurEquipe
Rediriger sur l'authentification si la personne ne s'est pas authentifiée
Faire des tests sur apicall
Réorganiser le code par module
'use strict';
/**
* @ngdoc directive
* @name appApp.directive:tableau
* @description
* # tableau
*/
angular.module('appApp')
.directive('tableau', function () {
return {
template: '<div></div>',
restrict: 'E',
link: function postLink(scope, element, attrs) {
element.text('this is the tableau directive');
}
};
});
......@@ -85,11 +85,11 @@
<script src="scripts/services/apicall.js"></script>
<script src="scripts/directives/chargement.js"></script>
<script src="scripts/filters/slice.js"></script>
<script src="scripts/filters/joueurparid.js"></script>
<script src="scripts/services/constantes.js"></script>
<script src="scripts/directives/focuson.js"></script>
<script src="scripts/directives/chargementligne.js"></script>
<script src="scripts/filters/joueurselectionnes.js"></script>
<script src="scripts/services/intercepteurhttpreponses.js"></script>
<script src="scripts/directives/tableau.js"></script>
<!-- endbuild -->
<!-- Ajouts persos -->
......
......@@ -10,6 +10,7 @@
// Use x-www-form-urlencoded Content-Type
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
$httpProvider.interceptors.push('intercepteurHttpReponses');
/**
* The workhorse; converts an object to x-www-form-urlencoded serialization.
* @param {Object} obj
......@@ -53,7 +54,7 @@
});
angular
.module('panelAdminApp', ['ngRoute', 'ui.bootstrap'])
.config(function ($routeProvider) {
.config(['$routeProvider', '$httpProvider', function ($routeProvider, $httpProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
......@@ -85,3 +86,4 @@ angular
controller: 'AuthentificationCtrl'
});
});
}]);
'use strict';
/**
* @ngdoc directive
* @name controllersApp.directive:tableau
* @description
* # tableau
*/
angular.module('controllersApp')
.directive('tableau', function () {
return {
template: '<div></div>',
restrict: 'E',
link: function postLink(scope, element, attrs) {
element.text('this is the tableau directive');
}
};
});
......@@ -17,12 +17,49 @@ app.config(function(apicallProvider, urlAPI){
app.controller('EquipesCtrl', ['$scope', '$location', 'apicall', function ($scope, $location, apicall) {
//Gestion des erreurs
$scope.alertes = [];
$scope.fermerAlerte = function(index){
$scope.alertes.splice(index, 1);
};
$scope.methodeMaj = apicall.getEquipes;
$scope.infosEquipes = [
{
nomColonne:'Drapeau',
champs:'URL',
image:true,
triable:false,
filtrable:false,
tailleColonne:1
},
{
nomColonne:'Équipe',
nomTriage:'Équipe',
champs:'NameTeam',
triable:false,
filtrable:true,
tailleColonne:2
},
{
nomTriage:'Points',
nomColonne:'Points',
champs:'Points',
triable:true,
filtrable:false,
tailleColonne:1
}
];
$scope.boutonsEdition = [
{
nom:'Joueurs',
taille:1,
type:'btn-warning',
glyph:'glyphicon-th-list',
fctAssoc: function(equipe){
$location.path('/teams/'+equipe.NameTeam+'/players');
}
}
];
//Récupération des infos equipes
var chargerEquipes = function(){
......@@ -38,25 +75,10 @@ app.controller('EquipesCtrl', ['$scope', '$location', 'apicall', function ($scop
$scope.alertes.push({type : 'danger', msg: 'Impossible de récupérer la liste des equipes (cliquer pour essayer de recharger)'});
});
};
$scope.urlDrapeau = function(drapeau){
var image = drapeau+'.jpg';
return '/images/Drapeau/'+image;
};
$scope.supprimerLigne = function(index){
$scope.equipes.splice(index, 1);
};
// Utiliser $location pour le changement
$scope.listeJoueurs = function(idEquipe){
$location.path('/teams/'+idEquipe+'/players');
};
//Traitements
chargerEquipes();
}]);
......@@ -9,69 +9,69 @@
*/
var app = angular.module('panelAdminApp');
//Configuration du service d'appel à l'API
// Configuration du service d'appel à l'API
app.config(function(apicallProvider, urlAPI){
apicallProvider.setUrl(urlAPI);
apicallProvider.setUrl(urlAPI);
});
app.controller('JoueursCtrl', ['$scope', '$routeParams', '$filter', '$log', 'apicall', function ($scope, $routeParams, $filter, $log, apicall) {
// Gestion des alertes
$scope.alertes = [];
$scope.fermerAlerte = function(index){
$scope.alertes.splice(index, 1);
};
//Gestion des éléments pour le triage
$scope.entreesTri = [
{id: 'IdPlayer', nom: 'Id'},
{id: 'Team', nom: 'Nationalité'},
{id: 'Name', nom: 'Nom'},
{id: 'FirstName', nom: 'Prénom'},
{id: 'Sex', nom: 'Sexe'},
{id: 'DateBirth', nom: 'Date de naissance'}
];
$scope.colonneTri = 'Name';
$scope.inverserTri = false;
$scope.entreeTriSelection = $scope.entreesTri[2].nom;
$scope.trierPar = function(entree){
$scope.colonneTri = entree.id;
$scope.entreeTriSelection = entree.nom;
};
//Gestion de la pagination
$scope.entreesPages = [10, 20, 30, 40, 50];
$scope.choixEntreesPages = $scope.entreesPages[0];
$scope.pageCourante = 1;
$scope.changerEntreesPage = function(entree){
$scope.choixEntreesPages = entree;
};
$scope.premiereEntree = function(){
return ($scope.pageCourante-1)*$scope.choixEntreesPages + ($scope.totalElements !== 0);
};
$scope.derniereEntree = function(){
var dern = $scope.pageCourante*$scope.choixEntreesPages;
if(dern < $scope.totalElements){
return dern;
}
else{
return dern-(dern-$scope.totalElements);
app.controller('JoueursCtrl', ['$scope', 'apicall', function ($scope, apicall) {
$scope.methodeMaj = apicall.getJoueurs;
$scope.infosJoueurs = [
{
nomTriage:'Id',
nomColonne:'#',
champs:'IdPlayer',
triable:true,
filtrable:false,
tailleColonne:1
},
{
nomTriage:'Équipe',
nomColonne:'Équipe',
champs:'Team',
triable:true,
filtrable:false,
tailleColonne:1
},
{
nomTriage:'Prénom',
nomColonne:'Prénom',
champs:'FirstName',
triable:true,
filtrable:true,
tailleColonne:1,
tailleFiltre:6
},
{
nomTriage:'Nom',
nomColonne:'Nom',
champs:'Name',
triable:true,
filtrable:true,
tailleColonne:2,
tailleFiltre:6
},
{
nomTriage:'Sexe',
nomColonne:'Sexe',
champs:'Sex',
triable:true,
filtrable:false,
tailleColonne:1
},
{
nomTriage:'Date de naissance',
nomColonne:'Date de naissance',
champs:'DateBirth',
triable:true,
filtrable:false,
tailleColonne:2
}
];
};
//Gestion des filtres du tableau
......
......@@ -10,7 +10,7 @@
var app = angular.module('panelAdminApp');
// Configuration du service d'appel à l'API
app.config(function($httpProvider, $logProvider, apicallProvider, urlAPI){
app.config(function($logProvider, apicallProvider, urlAPI){
apicallProvider.setUrl(urlAPI);
$logProvider.debugEnabled(true);
......@@ -255,4 +255,62 @@ app.controller('JoueursEquipeCtrl', ['$scope', '$routeParams', '$filter', '$log'
// Traitements pour le démarrage
$scope.chargement= true;
$scope.chargerJoueurs();
app.controller('JoueursEquipeCtrl', ['$scope', '$routeParams', 'apicall', function($scope, $routeParams, apicall) {
$scope.methodeMaj = apicall.getJoueursEquipe;
$scope.paramsMaj = [$routeParams.idEquipe];
$scope.infosJoueurs = [
{
nomTriage:'Id',
nomColonne:'#',
champs:'IdPlayer',
triable:true,
filtrable:false,
tailleColonne:1
},
{
nomTriage:'Équipe',
nomColonne:'Équipe',
champs:'Team',
triable:false,
filtrable:false,
tailleColonne:1
},
{
nomTriage:'Prénom',
nomColonne:'Prénom',
champs:'FirstName',
triable:true,
filtrable:true,
tailleColonne:1,
tailleFiltre:6
},
{
nomTriage:'Nom',
nomColonne:'Nom',
champs:'Name',
triable:true,
filtrable:true,
tailleColonne:2,
tailleFiltre:6
},
{
nomTriage:'Sexe',
nomColonne:'Sexe',
champs:'Sex',
triable:true,
filtrable:false,
tailleColonne:1
},
{
nomTriage:'Date de naissance',
nomColonne:'Date de naissance',
champs:'DateBirth',
triable:true,
filtrable:false,
tailleColonne:2
}
];
}]);
'use strict';
describe('Directive: tableau', function () {
// load the directive's module
beforeEach(module('controllersApp'));
var element,
scope;
beforeEach(inject(function ($rootScope) {
scope = $rootScope.$new();
}));
it('should make hidden element visible', inject(function ($compile) {
element = angular.element('<tableau></tableau>');
element = $compile(element)(scope);
expect(element.text()).toBe('this is the tableau directive');
}));
});
......@@ -7,23 +7,36 @@
* # focusOn
*/
angular.module('panelAdminApp')
.directive('focusOn', function($timeout) {
.directive('focusOn', ['$timeout', function($timeout) {
return {
scope: { trigger: '=focusOn' },
link: function(scope, element) {
restrict:'A',
scope: {
trigger: '=focusOn'
// On surveille le trigger pour mettre l'autofocus en cas de besoin
scope.$watch('trigger', function(nouvelleValeur, ancienneValeur) {
},
link: function($scope, element, attrs) {
if(nouvelleValeur === true && nouvelleValeur !== ancienneValeur) {
// Si on a un ng-repeat, il faut alors spécifier un attribut position pour focuser seulement sur le premier élément
if(attrs.position === undefined || $scope.$eval(attrs.position) === true){
// On surveille le trigger pour mettre l'autofocus en cas de besoin
$scope.$watch('trigger', function(nouvelleValeur, ancienneValeur) {
if(nouvelleValeur === true && nouvelleValeur !== ancienneValeur) {
$timeout(function() {element[0].focus();});
}
else{
$timeout(function() {element[0].focus();});
}
else{
$timeout(function() {element[0].blur();});
}
});
$timeout(function() {element[0].blur();});
}
});
}
}
};
});
}]);
'use strict';
/**
* @ngdoc directive
* @name panelAdminApp.directive:tableau
* @description Directive définissant un tableau éditable à plusieurs entrées
* # tableau
*/
angular.module('panelAdminApp')
.directive('tableau', ['$log', '$filter', function ($log, $filter) {
return {
restrict: 'E',
scope:{
editable:'=',
boutonsEdition:'=',
infos:'=',
attrEntrees:'@',
fctMaj:'&',
paramsMaj:'='
/*fctSuppr:'&',
lienEdit:'=',
lienAjout:'='
*/
},
templateUrl: 'views/tableau.html',
link: function($scope, element, attrs) {
/* Gestion des alertes */
$scope.alertes = [];
$scope.fermerAlerte = function(index){
$log.debug('Supression d\'une alerte dans le tableau des alertes');
$scope.alertes.splice(index, 1);
};
var supprimerAlertes = function(){
$scope.alertes = [];
};
var ajouterAlerte = function(type, message){
$log.debug('Ajout d\'une alerte dans le tableau des alertes');
$scope.alertes.push({type : 'alert-'+type, msg: message});
};
/* Gestion du triage */
$scope.trierPar = function(entree){
$scope.entreeTriSelection = entree;
};
$scope.inverserTri = function(){
$scope.sensTri = !$scope.sensTri;
};
$scope.sensTri = false;
$scope.entreeTriSelection = $filter('filter')($scope.infos, {triable:true})[0];
$scope.triable = function(){
return $filter('filter')($scope.infos, {triable:true}).length > 0;
};
$scope.selEntreesPage = function(){
return $filter('filter')($filter('slice')($filter('orderBy')($scope.entrees, $scope.colonneTri, $scope.sensTri), $scope.premiereEntree(false), $scope.derniereEntree(false)), $scope.recherche);
};
/* Gestion des filtres du tableau */
$scope.affichageFiltres = false;
$scope.changerAffichageFiltres = function(){
$scope.affichageFiltres = !$scope.affichageFiltres;
};
$scope.tailleFiltres = Math.ceil(($scope.infos.length+$scope.editable*2)/$filter('filter')($scope.infos, {filtrable:true}).length);
$scope.filtrable = function(){
return $filter('filter')($scope.infos, {filtrable:true}).length > 0;
};
/* Gestion des entrées */
$scope.entrees = [];
// TODO À apeller lors d'un changement de page
$scope.$watch('entrees', function(){
var total = $scope.entrees.length;
var nbSelTotal = $filter('filter')($scope.entrees, {selection:true}).length;
var nbSelPages = $filter('filter')($scope.selEntreesPage(), {selection:true}).length;
$scope.totalElements = total;
// TODO Corriger quand la page ne contient plus que quelques éléments (dernière)
if(nbSelPages === total || nbSelPages === $scope.choixEntreesPages.valeur){
$scope.selectionGlobale = true;
}
else{
$scope.selectionGlobale = false;
}
$scope.nbSelection = nbSelTotal;
}, true);
$scope.chargerEntrees = function(){
$scope.chargement = true;
supprimerAlertes();
$scope.fctMaj().apply($scope.fctMaj, $scope.paramsMaj).success(function(data){
$scope.entrees = data[$scope.attrEntrees];
// Ajout d'un booleen selection et edition pour chaque entree
angular.forEach($scope.entrees, function(element, index){
element.selection = false;
element.chargement = false;
});
$scope.chargement = false; // Placé ici car fonction asynchrone
}).error(function(){
ajouterAlerte('danger', 'Impossible de récupérer les données (cliquez sur actualiser pour essayer de recharger)');
$scope.entrees = [];
$scope.chargement = false;
});
};
// Supprime une entrée du tableau