From 1ce44c3664f98a60951aa4a7ccaae8c2a556ca88 Mon Sep 17 00:00:00 2001 From: "martin.devaux" Date: Wed, 25 Jun 2025 19:40:26 +0200 Subject: [PATCH] several changes --- traque-front/app/admin/layout.js | 13 +--- traque-front/app/admin/page.js | 75 ++++++++++++++------ traque-front/app/admin/parameters/page.js | 4 ++ traque-front/components/admin/mapPicker.jsx | 47 +++++++++++- traque-front/public/icons/arrows.png | Bin 464 -> 514 bytes traque-front/public/icons/fullscreen.png | Bin 0 -> 149 bytes traque-front/public/icons/informations.png | Bin 1768 -> 1772 bytes traque-front/public/icons/mapstyle.png | Bin 960 -> 974 bytes traque-front/public/icons/names.png | Bin 590 -> 606 bytes 9 files changed, 103 insertions(+), 36 deletions(-) create mode 100644 traque-front/public/icons/fullscreen.png diff --git a/traque-front/app/admin/layout.js b/traque-front/app/admin/layout.js index b2097d4..18f1d8e 100644 --- a/traque-front/app/admin/layout.js +++ b/traque-front/app/admin/layout.js @@ -6,17 +6,8 @@ export default function AdminLayout({ children}) { return ( -
-
-
    -
  • Admin
  • -
  • Teams
  • -
  • Parameters
  • -
-
-
- {children} -
+
+ {children}
diff --git a/traque-front/app/admin/page.js b/traque-front/app/admin/page.js index 5def44c..6b74993 100644 --- a/traque-front/app/admin/page.js +++ b/traque-front/app/admin/page.js @@ -3,18 +3,19 @@ import { useAdminConnexion } from "@/context/adminConnexionContext"; import useAdmin from "@/hook/useAdmin"; import dynamic from "next/dynamic"; import TeamList from '@/components/admin/teamList'; -import TeamAddForm from '@/components/admin/teamAdd'; import React, { useState } from 'react' import TeamEdit from '@/components/admin/teamEdit'; +import TeamAddForm from '@/components/admin/teamAdd'; +import Link from "next/link"; const LiveMap = dynamic(() => import('@/components/admin/mapPicker').then((mod) => mod.LiveMap), { ssr: false }); + export default function AdminPage() { const { useProtect } = useAdminConnexion(); - const { gameState, changeState } = useAdmin(); - const { addTeam } = useAdmin(); const [selectedTeamId, setSelectedTeamId] = useState(null); + const { addTeam, gameState, changeState, teams } = useAdmin(); useProtect(); return (
@@ -27,19 +28,30 @@ export default function AdminPage() {

Contrôle

- - - - -
@@ -54,28 +66,45 @@ export default function AdminPage() {
-
+
-
- - - - - - +
diff --git a/traque-front/app/admin/parameters/page.js b/traque-front/app/admin/parameters/page.js index 3d5f318..503fe91 100644 --- a/traque-front/app/admin/parameters/page.js +++ b/traque-front/app/admin/parameters/page.js @@ -3,16 +3,20 @@ import { GameSettings } from "@/components/admin/gameSettings"; import { PenaltySettings } from "@/components/admin/penaltySettings"; import { useAdminConnexion } from "@/context/adminConnexionContext"; import dynamic from "next/dynamic"; +import TeamAddForm from '@/components/admin/teamAdd'; +import useAdmin from '@/hook/useAdmin'; const ZoneSelector = dynamic(() => import('@/components/admin/zoneSelector').then((mod) => mod.ZoneSelector), { ssr: false }); export default function AdminPage() { + const { addTeam } = useAdmin(); const { useProtect } = useAdminConnexion(); useProtect(); return (
+
diff --git a/traque-front/components/admin/mapPicker.jsx b/traque-front/components/admin/mapPicker.jsx index 7cfbc7c..177db2f 100644 --- a/traque-front/components/admin/mapPicker.jsx +++ b/traque-front/components/admin/mapPicker.jsx @@ -1,11 +1,41 @@ "use client"; import { useLocation } from "@/hook/useLocation"; -import { useEffect, useState } from "react"; +import { useEffect, useState, useRef, useCallback } from "react"; import "leaflet/dist/leaflet.css"; import { Circle, MapContainer, Marker, TileLayer, useMap, Tooltip, Polyline } from "react-leaflet"; import { useMapCircleDraw } from "@/hook/mapDrawing"; import useAdmin from "@/hook/useAdmin"; import { GameState } from "@/util/gameState"; +import L from "leaflet"; + + +function MapActionControl({ onClick, children }) { + const map = useMap(); + + useEffect(() => { + const controlDiv = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom'); + controlDiv.style.background = 'rgba(0,0,0,0.5)'; + controlDiv.style.borderRadius = '9999px'; + controlDiv.style.padding = '8px'; + controlDiv.title = "Plein écran"; + controlDiv.style.display = "flex"; + controlDiv.style.alignItems = "center"; + controlDiv.style.justifyContent = "center"; + controlDiv.style.width = "56px"; + controlDiv.style.height = "56px"; + controlDiv.onclick = onClick; + controlDiv.innerHTML = ``; + const customControl = L.control({ position: 'bottomleft' }); + customControl.onAdd = () => controlDiv; + customControl.addTo(map); + + return () => { + customControl.remove(); + }; + }, [map, onClick, children]); + + return null; +} const positionIcon = new L.Icon({ iconUrl: '/icons/location.png', @@ -112,6 +142,18 @@ export function LiveMap() { const [timeLeftNextZone, setTimeLeftNextZone] = useState(null); const { zone, zoneExtremities, teams, nextZoneDate, isShrinking , getTeam, gameState } = useAdmin(); + const mapWrapperRef = useRef(null); + + const handleFullscreen = useCallback(() => { + const el = mapWrapperRef.current; + if (!el) return; + if (!document.fullscreenElement) { + el.requestFullscreen(); + } else { + document.exitFullscreen(); + } + }, []); + // Remaining time before sending position useEffect(() => { const updateTime = () => { @@ -143,7 +185,7 @@ export function LiveMap() { } return ( -
+
{gameState == GameState.PLAYING &&

{`${isShrinking ? "Fin" : "Début"} du rétrécissement de la zone dans : ${formatTime(timeLeftNextZone)}`}

} )} +
) diff --git a/traque-front/public/icons/arrows.png b/traque-front/public/icons/arrows.png index 2550032bced3ca6242d23f702f51c36c4ea2e630..b5bcba38675a5d7817430d8864e60a1d338a775a 100644 GIT binary patch delta 501 zcmVx>VY|{JPT4DvC@P8g>o93UWd5F_N971PS zg(Nm-%Z{T=tjMKngqgz(J3yxv4$i0J`giK(trIG+*Yrbwsf$F`QrH#Tu%3^c-kP>bLw87RB44fDQHps>6^r~wdFL% z-G=^O_cf?;z@S0rTEw(vrxSR zy&NL`(y-haOL*+xgKR^6=nkzK7I0Y6GBfy<$Xnt^ny`_%3%W_uLaC|MkJFR|^wcf1 rDeK*au_HAFK@bE%5ClOG>{)&TFI=_t^a2bV00000NkvXXu0mjfD%I|I delta 451 zcmV;!0X+VK1keMJ7k>^21^@s6X>y-h0004(Nkl9!6{AE6f!@uga;L2Poehxnq&hxoySL;SUYuil98d1qDIXE{yQnCO)ww2NLY-G7afSa>A(qh|mB002ovPDHLkV1h{L+=T!D diff --git a/traque-front/public/icons/fullscreen.png b/traque-front/public/icons/fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7fa7ca1398e70514f5db603bb8161e97edae5a GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ7*7|+kcif|*EVt@!PC{xWt~$(695grH5>o{ literal 0 HcmV?d00001 diff --git a/traque-front/public/icons/informations.png b/traque-front/public/icons/informations.png index 1841b753efbf0f0c672e6773dde8985848a48092..af75c7a81955857b265e22c6dfb51fe8b81e3f04 100644 GIT binary patch delta 1747 zcmV;^1}ypL4eSk&7Zo)K1^@s6;pU@o000KFNklOb##<7yKxHCF*GN1aO23ZO4= z9H;==W)u|A2{;8D0$S8c2|S~Nvn11?o>fDh2x%JtY}9`lIIn!Cb*aq(vOWGLK&j4F zlT3p8Sq;9*q2&Ub6~rOn4PXi|9GIyd@|*&^&y)AM_8XoNPx*4o1kUsnYN(9e@GUzg$o`h8q~b0c)7uSCpLOJr0xI<&xXEOuxH zcmX+-dpq>&fq#LcK(5k;X#YhuE+1$N><5;mZTYF-qd*zZz@g1U4${5AxR5^iz}v`v zECsqbZI3CasR@9}R^GMg2K9joF7)UFkRUd21YJuBQ88Ma9fS8LP9l_HS zm_haHi(7vHhSds`DjTdLd>FVUMNo^>sIMd1$0DB5B4OEbV48mK0A>MO9dKK50)nJL zsnUNZRoH%@e-dCCBKIzGFh#L-2)6mZoG>SPiR%~ zGN5IMtO9L695z76IaLfSjj&~c>Iii_$?kuT9ON3YJI;nasmr8a966hmcTh6=JsBUW zj0t{Q(%Gb-7-M=MuDUJI9NBY!BT>kSIQ_Z==uT5Ee=)R^i>)nbH$ zaBEB&WNlDc7cJqafc8?Bf%>~HioqDu)fltX7&FTl6VJvk^|!xEY?z1@#+Y_U^0I$F z&;{{M<;dRp7Fc7gt%&G5265d%>8!t7jWGdjv9)%I!?WJuD@S6^K;9;xm3}tY-y&no zu?xLxnBLC7yTBQu9fL*UzBxei5E&DZ13aifAD1@6>r>|N&Gg##JN>GNdD@t~IDp0i z|9QrjAtBFdBy6eh+V|kxf+OSxfo*?w9G(Hdk4SV8nbSZH>}ugx6!U}5s8#`=AbY`h zd{+Q>E5IOXA5sITIm&xS8XUzcmDN5jC?wtsmfJC4WCFsofT_T!1bF)rC;CqUP%d(_ zE~(b$F=i8s2u=aFc1{ygh_;=oqem@31##u0HGz8A*&lz?ytX@$ zoQ1oG4gkGE6!r$rBI&dSA?>$n|33-2DGMhndK1O-Wx4cV2vo|_819QX! zWr>Kkwa;{7o^~ISoeHk=TY&MvdpbK7Np1J3VZYH0_?*~7nMGXmD)h`j@&;#glxFJ^ z2-3(G)-|z*0KZm6&6f7-1ibI8l(2dTx$0EgLt&r_2#*-f12;R2UqpW>o9FPf0!9+s zFBX`jgHYpB5aJ*T5zlIoFl;g*m&~|wRM>(LW8d@?4i4ct1#}8A?nP}sLkh1Pq$5R! z1coKvRJRUMw%P;rN(hfZLL3WhOUbBo<^7OYFEDmugtBhL;=R2NLW&+eg$H+?L!C)NF6G<%gLjEi9DHk6J>%#V0 zT>;esdA)FNtMTe-ux@Q_pP!luG`x#@hfg6w~oTi9t p-wph3tv#ENkordR$W{s)#ysE%UR5l8?4002ovPDHLkV1jQ&E?)ou delta 1743 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 diff --git a/traque-front/public/icons/names.png b/traque-front/public/icons/names.png index 5b7e8f8844253543132ac2efb078c793f48ccde2..bae60e2df1526652e854bad199ca593689d6226e 100644 GIT binary patch delta 594 zcmV-Y0O;67d1D%}NkVR$@SWfryv5FuG6-MvdYHUBoFD)1x(= zi6-e`CWiUoz|_~pIe&`kIj8BUqmDMHVvN57gP6cPVjE%}cYkoAjw=DYib|W{ic!Jk zI!K&d2Vjk2B*rM956`hBxdn^(qV?K}u4Mfchv2+=`WYNZ??kHt2l1@Ha}FL9%)xd5 zCZIzFp8EkG(3>CcN9>6C?sh1IkYNGaa_fDD?a7|E?F57vV+C`G)tezpj7n>fmQ~7; zWy@|`NBVCd(|wnto$1FV}G(LvMyNcz?OZq|*h+={4qgff0mSuF$Ae zhY$vLMJ&x`s g=I*GYjy9xz0Re44R4Kz*eEZ1%Zp9Wh3Yz#t|tkJy2j$32{C;z|Ioqkq;RxIAjO+60O7n*eO3 z7>O|o=)+5Fv!q3Q(|&D7SF-+&BXChO{R|GJccNW^!+4SLT!2TJIoJun1av6lc^L2s zz2)(K#;#cI?u0@J1s1TQv_2Ntne2JrNkE7()-ab?y#r2hso zy@R1sAemB*SbyMaV)WV^+MWFVQeZYQ_Jt4z+6>gB5W-39Nvzod53+r?LkL^jhqa`# z?ybz83OI`A*pfVWtKOd0q6J)wF+N$L=m0KR`!(vv!DPLN{zfahsoJ#i20dAO>nZ&z zd2ghnS~u=iOgNlD4p+=~2VMElTi_gCZ!qa}206XKJb$k+g3!nnR%+EDg#9?M>_M{% zOlp1;hhmIVA%xSKU&s$Qh(3ktO4BukL|)J9tY*eKAFP;af{>TmZrx?7d|4+va8REa;f Qd;kCd07*qoM6N<$g0x2!761SM