bouton mini test enlevé
This commit is contained in:
@@ -34,6 +34,9 @@ Ce projet est un POC de professeur virtuel pour enfants, avec:
|
||||
- Cote eleve, le bouton principal bascule entre `Demarrer la seance` et `Fin de la seance`.
|
||||
- Cote eleve, la colonne gauche affiche les themes du jour: une card lecon avec pourcentage local, une card exercice avec statut.
|
||||
- Le bilan complet de progression reste reserve aux vues prof/admin.
|
||||
- Les options TTS visibles doivent etre libellees `Voix Douce`, `Voix Rigolote`, etc.; la mention "Voix IA non humaine..." est portee par un tooltip.
|
||||
- Le declenchement manuel de mini-test/exercice doit disparaitre de l'interface eleve; le programme doit etre determine par Professeur TOP.
|
||||
- A prevoir cote admin: tableau par eleve et prompts/instructions personnalises pour guider Professeur TOP par eleve.
|
||||
- Le vrai `docker-compose.yml` de production n'est pas dans ce repo. Il est situe un niveau au-dessus sur le serveur.
|
||||
- La conf nginx reelle route:
|
||||
- `/api/` vers `tutor-backend:8000`
|
||||
|
||||
@@ -105,6 +105,13 @@ function getSupportedRecordingMimeType() {
|
||||
return candidates.find((type) => MediaRecorder.isTypeSupported(type)) || ''
|
||||
}
|
||||
|
||||
function formatVoiceLabel(profile) {
|
||||
if (!profile?.label) return ''
|
||||
return profile.label.toLowerCase().startsWith('voix ')
|
||||
? profile.label
|
||||
: `Voix ${profile.label}`
|
||||
}
|
||||
|
||||
function LoginPage({ onLogin }) {
|
||||
const [credentials, setCredentials] = useState({ username: '', password: '' })
|
||||
const [status, setStatus] = useState('')
|
||||
@@ -935,9 +942,6 @@ function TutorApp({ currentUser, onLogout }) {
|
||||
<span>{exerciseLabel}</span>
|
||||
</div>
|
||||
<p>{assessment?.skill_label || lessonFocus?.label || 'Aucun exercice lance.'}</p>
|
||||
<button type="button" onClick={fetchAssessment} disabled={!selectedStudentId || !sessionActive}>
|
||||
{exerciseStatus === 'not-started' ? 'Lancer exercice' : 'Nouvel exercice'}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -1020,10 +1024,19 @@ function TutorApp({ currentUser, onLogout }) {
|
||||
<option value="">Voix de Professeur TOP</option>
|
||||
{voiceProfiles.map((profile) => (
|
||||
<option key={profile.id} value={profile.id}>
|
||||
{profile.label}
|
||||
{formatVoiceLabel(profile)}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
{selectedVoiceProfile && (
|
||||
<span
|
||||
className="voice-tooltip"
|
||||
title={`Voix IA non humaine: ${formatVoiceLabel(selectedVoiceProfile)} - ${selectedVoiceProfile.description}`}
|
||||
aria-label={`Voix IA non humaine: ${formatVoiceLabel(selectedVoiceProfile)} - ${selectedVoiceProfile.description}`}
|
||||
>
|
||||
i
|
||||
</span>
|
||||
)}
|
||||
<button type="button" onClick={startVoiceInput} disabled={isTranscribing}>
|
||||
{isAutoListening ? 'Couper le micro' : isTranscribing ? 'Transcription...' : 'Micro auto'}
|
||||
</button>
|
||||
|
||||
@@ -69,6 +69,9 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.student-layout .sidebar > .stack.small-gap {
|
||||
display: none;
|
||||
}
|
||||
.admin-layout .sidebar > button:nth-of-type(2) {
|
||||
display: none;
|
||||
}
|
||||
.today-panel {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -155,10 +158,22 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
}
|
||||
.composer {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 220px 130px 130px;
|
||||
grid-template-columns: 1fr 190px 36px 130px 130px;
|
||||
gap: 0.75rem;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
.voice-tooltip {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 36px;
|
||||
height: 100%;
|
||||
min-height: 46px;
|
||||
border-radius: 12px;
|
||||
background: #e2e8f0;
|
||||
color: #14213d;
|
||||
font-weight: 700;
|
||||
cursor: help;
|
||||
}
|
||||
.assessment {
|
||||
display: none;
|
||||
flex: 0 0 auto;
|
||||
|
||||
Reference in New Issue
Block a user