docs signalR

This commit is contained in:
Pierre Marx
2025-09-04 11:55:08 -04:00
parent 7e34c471de
commit e6eaba3018
2 changed files with 585 additions and 5 deletions

View File

@@ -186,26 +186,154 @@ function handleCallHungUp(event, mainWindow) {
}
```
### 4. Récupération de la liste des terminaux
### 4. Récupération et sélection des terminaux téléphoniques
#### Processus complet de récupération des terminaux
La récupération des terminaux se fait en deux phases : récupération depuis le serveur et affichage dans l'interface de connexion.
##### Côté processus principal (main.js)
```javascript
// Obtenir les terminaux disponibles
async function getTerminalList(connection, serviceProvider) {
// Handler IPC pour récupérer les terminaux
ipcMain.handle('get-terminal-list', async () => {
try {
const terminals = await connection.invoke(
const terminals = await signalRConnection.invoke(
'GetTerminalListByServiceProvider',
serviceProvider
config.ServiceProvider // Ex: 'RDVPREM' depuis la config
);
console.log('Terminaux disponibles:', terminals);
// Retourne un tableau de numéros: ["3001", "3002", "3003", ...]
return terminals;
} catch (error) {
console.error('Erreur récupération terminaux:', error);
return [];
}
});
```
##### Côté renderer - Interface de sélection
```javascript
// Au chargement de la page de connexion
document.addEventListener('DOMContentLoaded', async () => {
try {
// Afficher un loader
const terminalSelect = document.getElementById('terminal-select');
terminalSelect.innerHTML = '<option value="">Chargement des terminaux...</option>';
// Récupérer les terminaux disponibles depuis le serveur
const terminals = await ipcRenderer.invoke('get-terminal-list');
if (terminals && terminals.length > 0) {
populateTerminalSelect(terminals);
// Restaurer la dernière sélection si disponible
const lastTerminal = localStorage.getItem('last-terminal');
if (lastTerminal && terminals.includes(lastTerminal)) {
terminalSelect.value = lastTerminal;
}
} else {
showError('Aucun terminal téléphonique disponible');
terminalSelect.innerHTML = '<option value="">Aucun terminal disponible</option>';
}
} catch (error) {
console.error('Erreur chargement terminaux:', error);
showError('Impossible de récupérer la liste des terminaux');
}
});
// Remplir le select avec les terminaux
function populateTerminalSelect(terminals) {
const select = document.getElementById('terminal-select');
select.innerHTML = '<option value="">Sélectionner un terminal...</option>';
terminals.forEach(terminal => {
const option = document.createElement('option');
option.value = terminal;
option.textContent = `Poste ${terminal}`;
select.appendChild(option);
});
}
// Intégration dans le formulaire de connexion
async function handleLogin(e) {
e.preventDefault();
const terminal = document.getElementById('terminal-select').value;
// Validation : terminal obligatoire
if (!terminal) {
showError('Veuillez sélectionner un terminal téléphonique');
return;
}
const credentials = {
email: document.getElementById('email').value,
password: document.getElementById('password').value,
terminal: terminal
};
// Sauvegarder le terminal pour la prochaine connexion
localStorage.setItem('last-terminal', terminal);
// Connexion avec le terminal sélectionné
const result = await ipcRenderer.invoke('agent-login', credentials);
if (result.success) {
// Le terminal est maintenant associé à la session
// Il sera affiché dans le titre de la fenêtre
console.log(`Connecté sur le poste ${terminal}`);
}
}
```
##### Interface HTML correspondante
```html
<!-- Formulaire de connexion avec sélection du terminal -->
<form id="loginForm">
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" required>
</div>
<div class="form-group">
<label for="password">Mot de passe</label>
<input type="password" id="password" required>
</div>
<div class="form-group">
<label for="terminal-select">Terminal téléphonique</label>
<select id="terminal-select" required>
<option value="">Chargement...</option>
</select>
</div>
<button type="submit">Se connecter</button>
</form>
```
#### Points importants sur les terminaux
1. **ServiceProvider** : Le paramètre configuré dans `config.json` détermine quels terminaux sont disponibles pour l'organisation
2. **Filtrage serveur** : Le serveur filtre automatiquement les terminaux selon :
- Le fournisseur de service (ServiceProvider)
- Les droits de l'organisation
- La disponibilité des postes
- Les terminaux déjà utilisés par d'autres agents
3. **Validation obligatoire** : Un agent DOIT sélectionner un terminal pour se connecter - c'est ce qui permet le routage des appels
4. **Affichage contextuel** : Après connexion, le terminal est affiché dans le titre :
```javascript
mainWindow.setTitle(`SimpleConnect - Agent: ${user} (${firstName} ${lastName}) - Tel: ${terminal}`);
```
5. **Association terminal-agent** : Cette association permet au serveur SignalR de router les événements IPBX vers le bon agent
### 5. Déconnexion propre
```javascript