diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAO.java b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAO.java index 3360e69..971a915 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAO.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/database/dao/DAO.java @@ -6,6 +6,11 @@ package uppa.project.database.dao; +import jakarta.persistence.EntityManager; +import jakarta.persistence.TypedQuery; +import java.util.List; +import uppa.project.database.pojo.Player; + /** * DAO abstrait et générique pour tout type de données * @@ -79,4 +84,14 @@ public abstract class DAO { * @see D */ public abstract D[] findByField(String field, Object value) throws DAOException; + + public Player[] findPlayerForPagination(int userId, int firstData) throws DAOException { + EntityManager entityManager = EntityManagerProvider.getInstance(); + TypedQuery query = entityManager.createQuery("SELECT p FROM Player p WHERE p.user.id = (:user) ORDER BY p.id DESC", Player.class); + query.setParameter("user", userId); + query.setFirstResult(firstData); + query.setMaxResults(5); + List results = query.getResultList(); + return results.toArray(new Player[0]); + } } diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/SimplePlayer.java b/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/SimplePlayer.java index 8de4683..120bfcd 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/SimplePlayer.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/SimplePlayer.java @@ -1,13 +1,19 @@ package uppa.project.json.websocket; +import java.text.SimpleDateFormat; +import java.util.Date; import uppa.project.database.pojo.Card; import uppa.project.database.pojo.Player; +import uppa.project.web.translation.Translator; public class SimplePlayer { private final SimpleUser user; + private final int gameId; private final int score; private final boolean winner; + private final String winnerUsername; + private final String createdDate; private final int clickCount; private final int rightClickCount; private final int partialRightClickCount; @@ -18,11 +24,48 @@ public class SimplePlayer { this.user = new SimpleUser(player.getUser()); this.score = player.getScore(); this.winner = player.isWinner(); + this.winnerUsername = ""; this.clickCount = player.getClickCount(); this.rightClickCount = player.getRightClickCount(); this.rapidClickCount = player.getRapidClickCount(); this.partialRightClickCount = player.getPartialRightClickCount(); this.currentCard = player.getDeck().getCards().get((partialRightClickCount+rightClickCount) % player.getDeck().getCards().size()); + this.createdDate = ""; + this.gameId = -1; + } + + + /** + * Constructeur pour la pagination + * + * @param player le joueur + * @param translator le traducteur + */ + public SimplePlayer(Player player, Translator translator) { + this.user = new SimpleUser(player.getUser()); + this.gameId = player.getGame().getId().intValue(); + this.score = player.getScore(); + this.winner = player.isWinner(); + this.winnerUsername = player.getGame().getWinner().getUser().getUsername(); + this.clickCount = player.getClickCount(); + this.rightClickCount = player.getRightClickCount(); + this.rapidClickCount = player.getRapidClickCount(); + this.partialRightClickCount = player.getPartialRightClickCount(); + this.currentCard = null; + Date date = player.getGame().getCreatedAt(); + String language = translator.getLanguage(); + SimpleDateFormat sdfDay; + SimpleDateFormat sdfHour; + if (translator.getLanguage().equals("EN")) { + sdfDay = new SimpleDateFormat("MM/dd/yyyy"); + sdfHour = new SimpleDateFormat("HH:mm"); + } else { + sdfDay = new SimpleDateFormat("dd/MM/yyyy"); + sdfHour = new SimpleDateFormat("HH:mm"); + } + String day = sdfDay.format(date); + String hour = sdfHour.format(date); + this.createdDate = day + ',' + hour ; } public SimplePlayer(Player player) { @@ -34,6 +77,10 @@ public class SimplePlayer { this.partialRightClickCount = player.getPartialRightClickCount(); this.rapidClickCount = player.getRapidClickCount(); this.currentCard = null; + this.winnerUsername = ""; + this.createdDate = "" ; + this.gameId = -1; + } public Card getCurrentCard() { diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ProfileServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ProfileServlet.java index 4b2979d..787b750 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ProfileServlet.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/ProfileServlet.java @@ -22,6 +22,7 @@ import uppa.project.database.pojo.Player; import uppa.project.database.pojo.User; import uppa.project.json.HttpResponse; import uppa.project.json.HttpResponseCode; +import uppa.project.json.websocket.SimplePlayer; import uppa.project.web.translation.Translator; @WebServlet(name = "profileServlet", value = "/profile") @@ -96,6 +97,37 @@ public class ProfileServlet extends HttpServlet { out.flush(); } + public void doPut(HttpServletRequest request, HttpServletResponse response) throws IOException { + Translator translator = (Translator) request.getSession().getAttribute("translator"); + int userID =Integer.parseInt(request.getParameter("userId")); + int firstData = Integer.parseInt(request.getParameter("pageNumber")) * 5; + try { + DAO playerDAO = new Game_JPA_DAO_Factory().getDAOPlayer(); + Player[] players = playerDAO.findPlayerForPagination(userID, firstData); + SimplePlayer[] simplePlayers = new SimplePlayer[players.length]; + for (int i = 0; i < players.length; i++) { + simplePlayers[i] = new SimplePlayer(players[i], translator); + } + Gson gson = new Gson(); + System.out.println("players"); + String jsonPlayers = gson.toJson(simplePlayers); + System.out.println("players"); + System.out.println("json: "+jsonPlayers); + + // Configurer la réponse + response.setContentType("application/json"); + response.setCharacterEncoding("UTF-8"); + + // Envoyer la réponse JSON + PrintWriter out = response.getWriter(); + out.println(jsonPlayers); + out.flush(); + + } catch (DAOException e) { + throw new RuntimeException(e); + } + } + public void destroy() { } } diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/pages/profile.jsp b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/pages/profile.jsp index f310052..ab2b144 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/pages/profile.jsp +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/pages/profile.jsp @@ -9,6 +9,7 @@ + diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/statistics.tag b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/statistics.tag index 437408d..abe37fd 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/statistics.tag +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/statistics.tag @@ -1,11 +1,10 @@ -<%@ tag import="uppa.project.database.pojo.Player" %> <%@ tag import="uppa.project.web.translation.Translator" %> -<%@ tag import="java.util.Date" %> -<%@ tag import="java.text.SimpleDateFormat" %> <%@tag description="component/statistics" pageEncoding="UTF-8" %> <% Translator translator = (Translator) request.getSession().getAttribute("translator"); %> - +<% int currentPage = request.getParameter("currentPage") == null ? 1 : Integer.parseInt(request.getParameter("currentPage")); %> + +

${translator.translate("global_statistics")}

@@ -35,7 +34,7 @@

${translator.translate("statistics_games_played")}

- +
@@ -44,31 +43,12 @@ - - <% for (int i = 0; i < user.getPlayedGames().size(); i++) { - Player player = user.getPlayedGames().get(i); - %> - - <% Date date = player.getGame().getCreatedAt(); - String language = translator.getLanguage(); - SimpleDateFormat sdfDay; - SimpleDateFormat sdfHour; - if (language.equals("EN")) { - sdfDay = new SimpleDateFormat("MM/dd/yyyy"); - sdfHour = new SimpleDateFormat("HH:mm"); - } else { - sdfDay = new SimpleDateFormat("dd/MM/yyyy"); - sdfHour = new SimpleDateFormat("HH:mm"); - } - - String day = sdfDay.format(date); - String hour = sdfHour.format(date); - %> - - - - - - <% } %> - +
${translator.translate("statistics_game_date")}
<%=day%>, <%=hour%> <%= player.getScore() %><%= player.getGame().getWinner().getUser().getUsername() %>${translator.translate("statistics_game_show")}
+ diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/forms/profile.tag b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/forms/profile.tag index af8986e..92a2334 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/forms/profile.tag +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/forms/profile.tag @@ -7,6 +7,7 @@
+
diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json index 00702f8..f966231 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json @@ -630,5 +630,13 @@ "game_statistics_win": { "EN": "Win", "FR": "Victoire" + }, + "pagination_previous": { + "EN": "Previous", + "FR": "Précédent" + }, + "pagination_next": { + "EN": "Next", + "FR": "Suivant" } } diff --git a/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js b/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js index 4add707..dd27dfa 100644 --- a/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js +++ b/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js @@ -22,6 +22,7 @@ languageSelector.addEventListener('change', function() { const action = contextPath + "/translate"; console.log(action); const method = "PUT"; + const pagination = document.querySelector('#current-page'); const url = new URL(action); url.searchParams.append("language", languageSelector.value); diff --git a/S2/DevWeb/Projet/src/main/webapp/static/js/pagination/statistics-pagination.js b/S2/DevWeb/Projet/src/main/webapp/static/js/pagination/statistics-pagination.js new file mode 100644 index 0000000..cab9c8d --- /dev/null +++ b/S2/DevWeb/Projet/src/main/webapp/static/js/pagination/statistics-pagination.js @@ -0,0 +1,109 @@ +const table = document.querySelector('#pagination-players tbody'); +const userId = document.querySelector('#user-id'); +const url = new URL(window.location.href); +const contextPath = url.pathname.substring(0, url.pathname.indexOf("/", 1) + 1) +const languageSelector = document.getElementById('language-select'); +const currentPage = document.querySelector('input#current-page'); +const nbPages = document.querySelector('#nb-pages'); +console.log("nbPages:" + nbPages.value); +let showLabel; +if (languageSelector.value === 'EN') { + showLabel = 'Show'; +} else { + showLabel = 'Voir'; +} + +const paginationPrevious = document.querySelector('.pagination-previous'); +const paginationNext = document.querySelector('.pagination-next'); +const paginationCurrent = document.querySelector('.pagination-current'); + +function updatePagination(pageNumber) { + document.querySelectorAll('.played-game-row').forEach(row => table.removeChild(row)); + const url = new URL(window.location.href); + url.searchParams.set('userId', userId.value); + url.searchParams.set('pageNumber', pageNumber-1); + const method = 'PUT'; + fetch(url, {headers: {"Content-Type": "application/json"}, method}) + .then(res => res.json()) + .then(data => { + for (let i = 0; i < 5; i++) { + if (data[i] === undefined) { + const row = document.createElement('tr'); + row.classList.add('played-game-row'); + row.innerHTML = ` + + + + +` + table.appendChild(row); + } else { + const row = document.createElement('tr'); + row.classList.add('played-game-row'); + row.innerHTML = ` + ${data[i].createdDate} + ${data[i].score} + ${data[i].winnerUsername} + ${showLabel}` + table.appendChild(row); + } + } + + + // data.forEach(player => { + // const row = document.createElement('tr'); + // row.classList.add('played-game-row'); + // row.innerHTML = ` + // ${player.createdDate} + // ${player.score} + // ${player.winnerUsername} + // ${showLabel}` + // table.appendChild(row); + // }); + }) +} + +function updateButtons(oldPageNumber,newPageNumber) { + console.log("old: " + oldPageNumber +", new: " + newPageNumber) + + if (oldPageNumber === "1") { + console.log("previous - not disable") + paginationPrevious.classList.remove('is-disable'); + } + if (newPageNumber === "1") { + console.log("previous - disable") + paginationPrevious.classList.add('is-disable'); + } + if (oldPageNumber === nbPages.value.toString()) { + console.log("next - not disable") + paginationNext.classList.remove('is-disable'); + } + if (newPageNumber === nbPages.value.toString()) { + console.log("next - disable") + paginationNext.classList.add('is-disable'); + } + paginationCurrent.textContent = `${newPageNumber}`; + console.log(paginationCurrent) + + +} + +updatePagination(currentPage.value); +updateButtons(currentPage.value, currentPage.value) + + +paginationPrevious.addEventListener('click', () => { + const newPageNumber = (parseInt(currentPage.value) - 1).toString(); + const oldPageNumber = currentPage.value.toString(); + currentPage.value = newPageNumber; + updatePagination(newPageNumber); + updateButtons(oldPageNumber, newPageNumber); +}) + +paginationNext.addEventListener('click', () => { + const newPageNumber = (parseInt(currentPage.value) + 1).toString(); + const oldPageNumber = currentPage.value.toString(); + currentPage.value = newPageNumber; + updatePagination(newPageNumber); + updateButtons(oldPageNumber, newPageNumber); +}) diff --git a/S2/DevWeb/Projet/src/main/webapp/static/js/websockets/game-management-websocket.js b/S2/DevWeb/Projet/src/main/webapp/static/js/websockets/game-management-websocket.js index 3d84175..4a9727d 100644 --- a/S2/DevWeb/Projet/src/main/webapp/static/js/websockets/game-management-websocket.js +++ b/S2/DevWeb/Projet/src/main/webapp/static/js/websockets/game-management-websocket.js @@ -20,11 +20,9 @@ const buttons = document.querySelectorAll('a#start-game-button, a#invite-player' function updateButtons(user) { buttons.forEach(button => { if (user.id !== gameAdminID ) { - console.log("not admin" + user.username) button.classList.add('is-disable'); button.setAttribute('title', 'Accessible uniquement par l\'admin'); } else { - console.log("is admin" + user.username) button.classList.remove('is-disable'); button.removeAttribute('title'); } @@ -44,7 +42,6 @@ function updateAdmin(user) { } onInfo(titleInfo, messageInfo) } - console.log("admin:" + user.username) gameAdminID = user.id; } let havePlayed = false; @@ -102,15 +99,11 @@ wsgame.onOpen(() => { }); wsgame.onMessage("updatePlayerList", (data) => { players = data; - console.log(players) if (gameAdminID === -1 || players[0].user.id !== gameAdminID) { updateAdmin(players[0].user) } players.forEach((player) => { - console.log("player:" + player.user.id) - console.log("user:" + userSessionId.value) - console.log( player.user.id.toString() == userSessionId.value) if (player.user.id.toString() === userSessionId.value) { updateButtons(player.user) } @@ -141,7 +134,7 @@ wsgame.onMessage("start", (game) => { // Show other player cards game.players - .filter(p => p.user.id !== userSessionId.value) + .filter(p => p.user.id.toString() !== userSessionId.value) .forEach(p => { const playerHand = new PlayerHand(p); otherCards.innerHTML += playerHand.render({ @@ -151,7 +144,7 @@ wsgame.onMessage("start", (game) => { }); // Show my card - const me = game.players.find(p => p.user.id === userSessionId.value); + const me = game.players.find(p => p.user.id.toString() === userSessionId.value); const playerHand = new PlayerHand(me); myCard.innerHTML += playerHand.render({ @@ -206,8 +199,9 @@ wsgame.onMessage("nextRound", (game) => { // Show other player cards game.players - .filter(p => p.user.id !== userSessionId.value) + .filter(p => p.user.id.toString() !== userSessionId.value) .forEach(p => { + console.log('adversaire:', p) const playerHand = new PlayerHand(p); otherCards.innerHTML += playerHand.render({ textPosition: PlayerHand.TextPosition.TOP, @@ -216,7 +210,7 @@ wsgame.onMessage("nextRound", (game) => { }); // Show my card - const me = game.players.find(p => p.user.id === userSessionId.value); + const me = game.players.find(p => p.user.id.toString() === userSessionId.value); const playerHand = new PlayerHand(me); myCard.innerHTML += playerHand.render({ @@ -231,7 +225,7 @@ wsgame.onMessage("nextRound", (game) => { wsgame.onMessage("end", (game) => { clearInterval(timerInterval); - window.location.href = "${pageContext.request.contextPath}/game-statistics?id=${game.id}&endGame=true"; + window.location.href = contextPath+"/game-statistics?id="+gameId.value+"&endGame=true"; }) // Close handling