liste déroulante postes téléphoniques

This commit is contained in:
Pierre Marx
2025-09-04 13:06:17 -04:00
parent ee038cedd8
commit a22344d664
5 changed files with 151 additions and 11 deletions

View File

@@ -2,22 +2,25 @@
"agents": [
{
"id": "agent1",
"accessCode": "AGENT001",
"name": "Marie DUPONT",
"email": "marie.dupont@callcenter.fr",
"email": "AGENT001@callcenter.fr",
"password": "demo123",
"centresAssignes": ["centre1", "centre2", "centre3"]
},
{
"id": "agent2",
"accessCode": "AGENT002",
"name": "Jean MARTIN",
"email": "jean.martin@callcenter.fr",
"email": "AGENT002@callcenter.fr",
"password": "demo456",
"centresAssignes": ["centre2", "centre4", "centre5"]
},
{
"id": "agent3",
"accessCode": "AGENT003",
"name": "Sophie BERNARD",
"email": "sophie.bernard@callcenter.fr",
"email": "AGENT003@callcenter.fr",
"password": "demo789",
"centresAssignes": ["centre1", "centre3", "centre4", "centre5"]
}
@@ -109,6 +112,7 @@
"signalR": {
"serverUrl": "http://10.90.20.201:8002/signalR",
"serviceProvider": "RDVPREM",
"enabled": true
"enabled": true,
"terminalsSimulation": ["3001", "3002", "3003", "3004", "3005"]
}
}

View File

@@ -17,8 +17,11 @@
</div>
<h2>Connexion Agent</h2>
<form id="loginForm">
<input type="email" id="email" placeholder="Email" required>
<input type="text" id="accessCode" placeholder="Code d'accès" required>
<input type="password" id="password" placeholder="Mot de passe" required>
<input type="text" id="terminal" list="terminalList" placeholder="Poste téléphonique" required autocomplete="off">
<datalist id="terminalList">
</datalist>
<button type="submit">Se connecter</button>
<div id="loginError" class="error-message"></div>
</form>

37
main.js
View File

@@ -81,6 +81,9 @@ function initializeSignalR() {
sendSignalRStatus();
});
// Configurer les méthodes SignalR
setupSignalRMethods();
// Démarrer la connexion
startSignalRConnection();
@@ -91,6 +94,16 @@ function initializeSignalR() {
}
}
function setupSignalRMethods() {
// Écouter les événements IPBX
signalRConnection.on('IpbxEvent', (name, args) => {
if (!args) return;
const event = args[0];
console.log('Événement IPBX reçu:', event);
// TODO: Gérer les événements d'appel
});
}
async function startSignalRConnection() {
try {
signalRStatus = 'connecting';
@@ -171,6 +184,30 @@ ipcMain.handle('get-signalr-status', () => {
return signalRStatus;
});
// Récupérer la liste des terminaux téléphoniques
ipcMain.handle('get-terminal-list', async () => {
// Mode simulation si SignalR non connecté
if (!signalRConnection || signalRStatus !== 'connected') {
console.log('SignalR non connecté, utilisation des terminaux de simulation');
return config.signalR.terminalsSimulation || ['3001', '3002', '3003'];
}
try {
console.log('Récupération des terminaux pour:', config.signalR.serviceProvider);
const terminals = await signalRConnection.invoke(
'GetTerminalListByServiceProvider',
config.signalR.serviceProvider
);
console.log('Terminaux disponibles:', terminals);
return terminals || [];
} catch (error) {
console.error('Erreur récupération terminaux:', error);
// Retourner les terminaux de simulation en cas d'erreur
return config.signalR.terminalsSimulation || ['3001', '3002', '3003'];
}
});
// Connexion agent
ipcMain.handle('login-agent', (event, credentials) => {
const agent = config.agents.find(a =>

View File

@@ -18,12 +18,17 @@ document.addEventListener('DOMContentLoaded', async () => {
// Écouter les changements de statut SignalR
ipcRenderer.on('signalr-status', (event, status) => {
updateSignalRIndicator(status);
// Recharger les terminaux à chaque changement de statut
loadTerminals();
});
// Obtenir le statut initial SignalR
const initialStatus = await ipcRenderer.invoke('get-signalr-status');
updateSignalRIndicator(initialStatus);
// Toujours charger les terminaux (simulation ou réels)
loadTerminals();
// Vérifier si un agent est déjà connecté
const agentData = await ipcRenderer.invoke('get-current-agent');
if (agentData) {
@@ -66,19 +71,44 @@ document.addEventListener('DOMContentLoaded', async () => {
async function handleLogin(e) {
e.preventDefault();
const email = document.getElementById('email').value;
const accessCode = document.getElementById('accessCode').value;
const password = document.getElementById('password').value;
const terminal = document.getElementById('terminal').value;
const errorDiv = document.getElementById('loginError');
const result = await ipcRenderer.invoke('login-agent', { email, password });
// Vérifier que le terminal est sélectionné et valide
if (!terminal) {
errorDiv.textContent = 'Veuillez sélectionner un poste téléphonique';
return;
}
if (result.success) {
currentAgent = result.agent;
currentCentres = result.centres;
// Valider que le terminal existe dans la liste
if (!validateTerminal(terminal)) {
errorDiv.textContent = 'Poste téléphonique invalide. Veuillez choisir un poste de la liste.';
return;
}
// Sauvegarder le terminal sélectionné pour la prochaine fois
localStorage.setItem('last-terminal', terminal);
// Pour l'instant, utiliser l'authentification locale (simulation)
// TODO: Intégrer l'authentification SignalR
const config = await ipcRenderer.invoke('get-config');
const agent = config.agents.find(a =>
a.email === `${accessCode}@callcenter.fr` &&
a.password === password
);
if (agent) {
currentAgent = agent;
currentAgent.terminal = terminal; // Ajouter le terminal sélectionné
currentCentres = config.centres.filter(c =>
agent.centresAssignes.includes(c.id)
);
errorDiv.textContent = '';
showMainPage();
} else {
errorDiv.textContent = result.message;
errorDiv.textContent = 'Code d\'accès ou mot de passe incorrect';
}
}
@@ -406,6 +436,57 @@ async function saveNotes() {
}
}
// === GESTION DES TERMINAUX ===
let availableTerminals = []; // Stocker les terminaux disponibles
async function loadTerminals() {
const terminalInput = document.getElementById('terminal');
const terminalDatalist = document.getElementById('terminalList');
if (!terminalInput || !terminalDatalist) return;
try {
// Récupérer les terminaux depuis le serveur SignalR
const terminals = await ipcRenderer.invoke('get-terminal-list');
availableTerminals = terminals || [];
if (terminals && terminals.length > 0) {
// Vider la datalist
terminalDatalist.innerHTML = '';
// Ajouter chaque terminal comme option
terminals.forEach(terminal => {
const option = document.createElement('option');
option.value = terminal;
terminalDatalist.appendChild(option);
});
// Restaurer la dernière sélection si disponible
const lastTerminal = localStorage.getItem('last-terminal');
if (lastTerminal && terminals.includes(lastTerminal)) {
terminalInput.value = lastTerminal;
}
// Activer l'input
terminalInput.disabled = false;
terminalInput.placeholder = 'Poste téléphonique (tapez pour filtrer)';
} else {
terminalDatalist.innerHTML = '';
terminalInput.placeholder = 'Aucun poste disponible';
terminalInput.disabled = true;
}
} catch (error) {
console.error('Erreur chargement des terminaux:', error);
terminalDatalist.innerHTML = '';
terminalInput.placeholder = 'Erreur de chargement';
terminalInput.disabled = true;
}
}
// Valider que le terminal saisi existe dans la liste
function validateTerminal(terminal) {
return availableTerminals.includes(terminal);
}
// === GESTION INDICATEUR SIGNALR ===
function updateSignalRStatus() {
// Fonction appelée au chargement pour initialiser l'interface

View File

@@ -120,6 +120,21 @@ body {
border: 1px solid #ddd;
border-radius: 5px;
font-size: 14px;
background-color: white;
}
#loginForm input:disabled {
background-color: #f5f5f5;
cursor: not-allowed;
}
/* Style pour l'input avec datalist */
#loginForm input[list] {
cursor: text;
}
#loginForm input[list]::-webkit-calendar-picker-indicator {
display: none;
}
#loginForm button {