Spaces:
Sleeping
Sleeping
Commit ·
25b25a4
1
Parent(s): 9ad55f7
Retrait panneau latéral gauche et sélection role sur choix du role
Browse files- templates/index.html +77 -133
templates/index.html
CHANGED
|
@@ -16,53 +16,7 @@
|
|
| 16 |
<body>
|
| 17 |
<div class="main-container">
|
| 18 |
<!-- Sidebar -->
|
| 19 |
-
|
| 20 |
-
<div class="sidebar-header">
|
| 21 |
-
<h2>Les Chats De SeaTech</h2>
|
| 22 |
-
<div class="cats-logo">
|
| 23 |
-
<img src="{{ url_for('static', filename='img/franky.png') }}" alt="Franky" class="cat-avatar"
|
| 24 |
-
loading="lazy">
|
| 25 |
-
<img src="{{ url_for('static', filename='img/freddy.png') }}" alt="Freddy" class="cat-avatar"
|
| 26 |
-
loading="lazy">
|
| 27 |
-
</div>
|
| 28 |
-
</div>
|
| 29 |
-
<nav>
|
| 30 |
-
<div class="sidebar-section">
|
| 31 |
-
<h3>Liens SeaTech</h3>
|
| 32 |
-
<ul>
|
| 33 |
-
<li><a href="https://seatech.univ-tln.fr/" target="_blank" rel="noopener">SeaTech Officiel</a>
|
| 34 |
-
</li>
|
| 35 |
-
<li><a href="https://www.univ-tln.fr/" target="_blank" rel="noopener">Université de Toulon</a>
|
| 36 |
-
</li>
|
| 37 |
-
</ul>
|
| 38 |
-
</div>
|
| 39 |
-
<div class="sidebar-section">
|
| 40 |
-
<h3>Formations</h3>
|
| 41 |
-
<ul>
|
| 42 |
-
<li><a href="https://seatech.univ-tln.fr/devenir-ingenieur" target="_blank"
|
| 43 |
-
rel="noopener">Devenir Ingénieur</a></li>
|
| 44 |
-
<li><a href="https://seatech.univ-tln.fr/Formation-d-ingenieurs-Materiaux-par-apprentissage.html"
|
| 45 |
-
target="_blank" rel="noopener">Matériaux (Apprentissage)</a></li>
|
| 46 |
-
<li><a href="https://seatech.univ-tln.fr/Formation-d-ingenieurs-en-systemes-numeriques-par-apprentissage.html"
|
| 47 |
-
target="_blank" rel="noopener">Systèmes Numériques (Apprentissage)</a></li>
|
| 48 |
-
</ul>
|
| 49 |
-
</div>
|
| 50 |
-
<div class="sidebar-section">
|
| 51 |
-
<h3>Informations</h3>
|
| 52 |
-
<ul>
|
| 53 |
-
<li><a href="https://seatech.univ-tln.fr/recherche" target="_blank" rel="noopener">Recherche</a>
|
| 54 |
-
</li>
|
| 55 |
-
<li><a href="https://seatech.univ-tln.fr/international" target="_blank"
|
| 56 |
-
rel="noopener">International</a></li>
|
| 57 |
-
<li><a href="https://seatech.univ-tln.fr/Contacts.html" target="_blank"
|
| 58 |
-
rel="noopener">Contacts</a></li>
|
| 59 |
-
</ul>
|
| 60 |
-
</div>
|
| 61 |
-
</nav>
|
| 62 |
-
<div class="sidebar-footer">
|
| 63 |
-
<p>Posez-moi vos questions sur SeaTech!</p>
|
| 64 |
-
</div>
|
| 65 |
-
</aside>
|
| 66 |
|
| 67 |
<!-- Contenu principal -->
|
| 68 |
<main class="container">
|
|
@@ -128,11 +82,8 @@
|
|
| 128 |
</div>
|
| 129 |
</div>
|
| 130 |
|
| 131 |
-
<div class="confirm-role-section">
|
| 132 |
-
<p>
|
| 133 |
-
<button class="confirm-button" id="confirmRoleBtn">
|
| 134 |
-
<i class="fas fa-check"></i> Confirmer mon profil
|
| 135 |
-
</button>
|
| 136 |
</div>
|
| 137 |
</section>
|
| 138 |
{% else %}
|
|
@@ -361,12 +312,10 @@
|
|
| 361 |
|
| 362 |
// Éléments de sélection de rôle
|
| 363 |
const roleButtons = document.querySelectorAll('.role-button');
|
| 364 |
-
const confirmRoleSection = document.querySelector('.confirm-role-section');
|
| 365 |
-
const confirmRoleBtn = document.getElementById('confirmRoleBtn');
|
| 366 |
const resetRoleBtn = document.getElementById('resetRoleBtn');
|
| 367 |
-
const selectedRoleName = document.getElementById('selectedRoleName');
|
| 368 |
|
| 369 |
let selectedRole = null;
|
|
|
|
| 370 |
const savedRole = localStorage.getItem("seatech_role");
|
| 371 |
if (savedRole) {
|
| 372 |
selectedRole = savedRole;
|
|
@@ -381,95 +330,90 @@
|
|
| 381 |
"Les moustaches de Freddy frémissent... il est sur une piste!"
|
| 382 |
];
|
| 383 |
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
button.addEventListener('click', function () {
|
| 387 |
-
roleButtons.forEach(btn => btn.classList.remove('selected'));
|
| 388 |
-
this.classList.add('selected');
|
| 389 |
-
selectedRole = this.dataset.role;
|
| 390 |
-
selectedRoleName.textContent = selectedRole;
|
| 391 |
-
confirmRoleSection.classList.add('active');
|
| 392 |
-
});
|
| 393 |
-
});
|
| 394 |
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
console.log('Envoi de la sélection de rôle:', selectedRole);
|
| 399 |
-
confirmRoleBtn.disabled = true;
|
| 400 |
-
confirmRoleBtn.textContent = 'En cours...';
|
| 401 |
-
localStorage.setItem("seatech_role", selectedRole);
|
| 402 |
-
fetch('/api/ask', {
|
| 403 |
-
method: 'POST',
|
| 404 |
-
headers: { 'Content-Type': 'application/json' },
|
| 405 |
-
body: JSON.stringify({ role_selection: selectedRole }),
|
| 406 |
-
credentials: 'include'
|
| 407 |
-
})
|
| 408 |
-
.then(response => {
|
| 409 |
-
console.log('Réponse status:', response.status);
|
| 410 |
-
return response.json();
|
| 411 |
-
})
|
| 412 |
-
.then(data => {
|
| 413 |
-
console.log('Données reçues:', data);
|
| 414 |
-
if (data.status === 'role_selected') {
|
| 415 |
-
console.log('Rôle sélectionné avec succès, rechargement...');
|
| 416 |
-
sessionStorage.setItem('scroll_to_chat', '1');
|
| 417 |
-
// Attendre 500ms avant de recharger pour assurer la sauvegarde de la session
|
| 418 |
-
setTimeout(() => {
|
| 419 |
-
window.location.href = window.location.origin + '/';
|
| 420 |
-
}, 500);
|
| 421 |
-
} else {
|
| 422 |
-
console.error('Erreur: statut inattendu', data);
|
| 423 |
-
alert('Erreur lors de la sélection du rôle. Veuillez réessayer.');
|
| 424 |
-
confirmRoleBtn.disabled = false;
|
| 425 |
-
confirmRoleBtn.textContent = '✓ Confirmer mon profil';
|
| 426 |
-
}
|
| 427 |
-
})
|
| 428 |
-
.catch(error => {
|
| 429 |
-
console.error('Erreur lors de la sélection de rôle:', error);
|
| 430 |
-
alert('Erreur réseau: ' + error.message);
|
| 431 |
-
confirmRoleBtn.disabled = false;
|
| 432 |
-
confirmRoleBtn.textContent = '✓ Confirmer mon profil';
|
| 433 |
-
});
|
| 434 |
-
}
|
| 435 |
});
|
| 436 |
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
|
| 444 |
-
|
| 445 |
-
|
| 446 |
-
|
| 447 |
-
|
| 448 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 449 |
})
|
| 450 |
-
.then(
|
| 451 |
-
if (
|
| 452 |
-
|
| 453 |
-
|
|
|
|
|
|
|
|
|
|
| 454 |
setTimeout(() => {
|
| 455 |
-
window.location.
|
| 456 |
-
},
|
| 457 |
return;
|
| 458 |
}
|
| 459 |
-
|
|
|
|
| 460 |
})
|
| 461 |
-
.
|
| 462 |
-
|
| 463 |
-
|
| 464 |
-
|
| 465 |
-
|
|
|
|
| 466 |
}
|
| 467 |
})
|
| 468 |
-
.
|
| 469 |
-
|
| 470 |
-
|
|
|
|
|
|
|
| 471 |
});
|
| 472 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 473 |
}
|
| 474 |
|
| 475 |
if (resetRoleBtn) {
|
|
|
|
| 16 |
<body>
|
| 17 |
<div class="main-container">
|
| 18 |
<!-- Sidebar -->
|
| 19 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
<!-- Contenu principal -->
|
| 22 |
<main class="container">
|
|
|
|
| 82 |
</div>
|
| 83 |
</div>
|
| 84 |
|
| 85 |
+
<div class="confirm-role-section active">
|
| 86 |
+
<p><i class="fas fa-mouse-pointer"></i> Cliquez sur un profil pour le confirmer automatiquement.</p>
|
|
|
|
|
|
|
|
|
|
| 87 |
</div>
|
| 88 |
</section>
|
| 89 |
{% else %}
|
|
|
|
| 312 |
|
| 313 |
// Éléments de sélection de rôle
|
| 314 |
const roleButtons = document.querySelectorAll('.role-button');
|
|
|
|
|
|
|
| 315 |
const resetRoleBtn = document.getElementById('resetRoleBtn');
|
|
|
|
| 316 |
|
| 317 |
let selectedRole = null;
|
| 318 |
+
let isSubmittingRole = false;
|
| 319 |
const savedRole = localStorage.getItem("seatech_role");
|
| 320 |
if (savedRole) {
|
| 321 |
selectedRole = savedRole;
|
|
|
|
| 330 |
"Les moustaches de Freddy frémissent... il est sur une piste!"
|
| 331 |
];
|
| 332 |
|
| 333 |
+
function submitRoleSelection(role, isAutoSubmit = false) {
|
| 334 |
+
if (!role || isSubmittingRole) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 335 |
|
| 336 |
+
isSubmittingRole = true;
|
| 337 |
+
roleButtons.forEach(btn => {
|
| 338 |
+
btn.style.pointerEvents = 'none';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 339 |
});
|
| 340 |
|
| 341 |
+
console.log('Envoi de la sélection de rôle:', role);
|
| 342 |
+
localStorage.setItem("seatech_role", role);
|
| 343 |
+
|
| 344 |
+
fetch('/api/ask', {
|
| 345 |
+
method: 'POST',
|
| 346 |
+
headers: { 'Content-Type': 'application/json' },
|
| 347 |
+
body: JSON.stringify({ role_selection: role }),
|
| 348 |
+
credentials: 'include'
|
| 349 |
+
})
|
| 350 |
+
.then(response => {
|
| 351 |
+
console.log('Réponse status:', response.status);
|
| 352 |
+
|
| 353 |
+
if (response.status === 429) {
|
| 354 |
+
if (isAutoSubmit) {
|
| 355 |
+
console.log('Trop de requêtes, réessai dans 5 secondes...');
|
| 356 |
+
sessionStorage.removeItem("auto_submit_attempted");
|
| 357 |
+
setTimeout(() => {
|
| 358 |
+
window.location.reload();
|
| 359 |
+
}, 5000);
|
| 360 |
+
return null;
|
| 361 |
+
}
|
| 362 |
+
throw new Error('Serveur temporairement occupé. Réessayez dans quelques secondes.');
|
| 363 |
+
}
|
| 364 |
+
|
| 365 |
+
return response.json();
|
| 366 |
})
|
| 367 |
+
.then(data => {
|
| 368 |
+
if (!data) return;
|
| 369 |
+
|
| 370 |
+
console.log('Données reçues:', data);
|
| 371 |
+
if (data.status === 'role_selected') {
|
| 372 |
+
console.log('Rôle sélectionné avec succès, rechargement...');
|
| 373 |
+
sessionStorage.setItem('scroll_to_chat', '1');
|
| 374 |
setTimeout(() => {
|
| 375 |
+
window.location.href = window.location.origin + '/';
|
| 376 |
+
}, 500);
|
| 377 |
return;
|
| 378 |
}
|
| 379 |
+
|
| 380 |
+
throw new Error('Erreur lors de la sélection du rôle. Veuillez réessayer.');
|
| 381 |
})
|
| 382 |
+
.catch(error => {
|
| 383 |
+
console.error('Erreur lors de la sélection de rôle:', error);
|
| 384 |
+
if (!isAutoSubmit) {
|
| 385 |
+
alert(error.message || 'Erreur réseau. Veuillez réessayer.');
|
| 386 |
+
} else {
|
| 387 |
+
sessionStorage.removeItem("auto_submit_attempted");
|
| 388 |
}
|
| 389 |
})
|
| 390 |
+
.finally(() => {
|
| 391 |
+
isSubmittingRole = false;
|
| 392 |
+
roleButtons.forEach(btn => {
|
| 393 |
+
btn.style.pointerEvents = '';
|
| 394 |
+
});
|
| 395 |
});
|
| 396 |
+
}
|
| 397 |
+
|
| 398 |
+
// Gestion de la sélection de rôle: confirmation immédiate au clic
|
| 399 |
+
roleButtons.forEach(button => {
|
| 400 |
+
button.addEventListener('click', function () {
|
| 401 |
+
if (isSubmittingRole) return;
|
| 402 |
+
|
| 403 |
+
roleButtons.forEach(btn => btn.classList.remove('selected'));
|
| 404 |
+
this.classList.add('selected');
|
| 405 |
+
selectedRole = this.dataset.role;
|
| 406 |
+
submitRoleSelection(selectedRole);
|
| 407 |
+
});
|
| 408 |
+
});
|
| 409 |
+
|
| 410 |
+
// si on a déjà enregistré un rôle, envoyer automatiquement au back seulement si le rôle n'est pas encore confirmé
|
| 411 |
+
// et qu'on n'a pas déjà essayé cette session
|
| 412 |
+
const autoSubmitAttempted = sessionStorage.getItem("auto_submit_attempted");
|
| 413 |
+
if (selectedRole && document.querySelector('.role-selection-container') && !autoSubmitAttempted) {
|
| 414 |
+
console.log('Role déjà présent en localStorage:', selectedRole);
|
| 415 |
+
sessionStorage.setItem("auto_submit_attempted", "true");
|
| 416 |
+
submitRoleSelection(selectedRole, true);
|
| 417 |
}
|
| 418 |
|
| 419 |
if (resetRoleBtn) {
|