Skip to content

IHM improvements: hosted mode, config modal, isolated devices, nodal order#110

Merged
marota merged 7 commits into
mainfrom
claude/maneuver-ui-improvements-nmzumn
Jun 29, 2026
Merged

IHM improvements: hosted mode, config modal, isolated devices, nodal order#110
marota merged 7 commits into
mainfrom
claude/maneuver-ui-improvements-nmzumn

Conversation

@marota

@marota marota commented Jun 29, 2026

Copy link
Copy Markdown
Collaborator

Summary

This PR adds four major improvements to the maneuver IHM (interactive web interface):

  1. Hosted mode security — disable local file import on remote instances (HuggingFace Space) to prevent confidentiality leaks
  2. Configuration modal — expose pluggable algorithms per phase and scenario/sequence save paths
  3. Isolated device handling — properly disconnect devices declared as isolated (0-bar nodes) instead of leaving them connected
  4. Nodal view ordering — share horizontal axis between top/bottom feeders so left-right position matches the detailed SLD exactly

Key Changes

Backend (scripts/manoeuvre_ihm.py)

  • Hosted mode detection & enforcement:

    • DATASET["hosted"] flag (auto-detected via SPACE_ID env var or --hosted CLI flag)
    • /api/pick_grid_file and /api/load_grid return 403 when hosted
    • Added _HOSTED_IMPORT_MSG constant with installation instructions
  • Isolated device disconnection (_isoler_dans_etat method):

    • New method that forces declared isolated devices to be truly disconnected (0-bar nodes)
    • Opens incident switches to detach devices from busbars
    • Called in nodale_to_detaillee before topology calculation
    • Recalculates verdict on real nodes only (excludes isolated devices from node count)
  • Scenario metadata enhancements:

    • save_scenario() now accepts cible_dt (target topology date) and author parameters
    • Stores created_at (ISO format, server time) and author in scenario metadata
    • list_scenarios() exposes these fields for the reload modal
  • Configuration API (/api/config):

    • GET /api/config returns available algorithms per phase + current save paths + hosted flag
    • POST /api/config updates scenario/sequence directories (read-only when hosted)
  • Enhanced nodale_to_detaillee response:

    • Added nb_isoles (count of isolated devices)
    • Added changes field (diff between initial and target states for highlighting)
    • Recalculates verdict when isolated devices are present (counts only real nodes)

Frontend (scripts/manoeuvre_ihm_assets/index.html)

  • Hosted mode UI:

    • Hide "📁 Local" tab and panel when hosted
    • Show dismissible banner explaining local import is disabled with installation instructions
    • dismissHostedNote() function to hide the banner
  • Configuration modal (#configModal):

    • Three algorithm selectors (identification, sequencing, planning) with available options
    • Scenario/sequence directory inputs (disabled when hosted)
    • openConfig(), saveConfig(), closeConfig() functions
    • Displays "hosted" notice when applicable
  • Author field:

    • New input field in header (left of ⚙ Config button) for author name
    • Separate modal (#authorModal) for first-time author entry
    • initAuthor(), confirmAuthor(), closeAuthor() functions
    • Author name persisted in localStorage and passed to save API
  • Map improvements:

    • Cursor changed from pointer to crosshair on substation disks for precise targeting
    • New #mapTip element displays substation name on hover, follows mouse
    • CSS styling for hover tooltip
  • Nodal view enhancements:

    • New "⌀ Isoler" button to declare selected feeders as isolated devices
    • nodIsolateSel() function to move selected feeders to isolated zone
    • Isolated zone now styled as drop target (dashed outline) during drag operations
    • .droptarget CSS class for visual feedback
  • Scenario list display:

    • Show cible_dt (target date) if different from departure date
    • Show author and created_at metadata as chips
    • Include author in search filter

Tests (`tests/manoe

https://claude.ai/code/session_0144YJtJLNn3gaBHh2mF9dQk

claude added 7 commits June 29, 2026 16:18
…g, dates, ouvrages isolés

- Sécurité Space : import de fichier local désactivé sur une IHM déportée
  (onglet Local masqué + invite à l'IHM locale) ; /api/pick_grid_file et
  /api/load_grid renvoient 403 quand hosted (fichiers potentiellement confidentiels).
- Carte France : nom du poste affiché au survol (#mapTip) et curseur en croix
  (pointeur précis) sur les disques au lieu d'une main.
- Modale ⚙ Config : algorithmes pluggables par phase (avec le défaut « libtopo »)
  et chemins de sauvegarde/rechargement des scénarios/séquences ; GET/POST /api/config.
- Scénarios : conservation de la date/heure de la topo de départ (meta.dt, local
  ou RTE7000) et de la topo cible (meta.cible_dt) pour un fichier RTE7000 dont la
  cible n'a pas été modifiée.
- Topo nodale cible : champ « ⌀ Isoler » + zone de dépose pour déclarer des
  ouvrages isolés ; le backend les laisse hors partition ET les déconnecte
  réellement (nœud 0-barre, Session._isoler_dans_etat) au lieu d'un faux nœud
  à un seul ouvrage.
- Tests : tests/manoeuvre/test_ihm_ui_improvements.py ; doc docs/manoeuvre/ihm.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144YJtJLNn3gaBHh2mF9dQk
…étaillé

Les départs « haut » et « bas » d'un nœud étaient répartis sur deux rangées
indépendantes (espacement par rang propre à chaque rangée), donc sans axe
horizontal commun : la position relative gauche→droite ne reflétait pas le
schéma détaillé. buildNodaleSVG attribue désormais une colonne par rang
d'abscisse SLD sur l'ensemble des départs du nœud (haut et bas confondus) ;
le côté (haut/bas) et l'ordre gauche→droite sont conservés exactement comme
dans la vue détaillée.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144YJtJLNn3gaBHh2mF9dQk
…l nodal→détaillé, tests

- /api/nodale_to_detaillee renvoie désormais `changes` (diff départ→cible) ;
  le front applique highlightChanges → organes verts/oranges affichés après
  « Calculer la topologie détaillée d'intérêt » (auparavant absents).
- Verdict recalculé sur l'état FINAL (post-isolation) : les ouvrages isolés
  sont comptés à part (`nb_isoles`) et jamais comme des nœuds. Le statut
  affiche « N nœud(s) + M ouvrage(s) isolé(s) » au lieu d'un total gonflé
  (« obtenu 4 » pour 2 nœuds + 2 isolés). is_verified compare la partition
  réelle (hors isolés) à la cible visée.
- Tests : test_ihm_ui_improvements.py (changes, nb_isoles, compte réel,
  ordre nodal) ; marqueurs de structure dans test_ihm_frontend_asset.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144YJtJLNn3gaBHh2mF9dQk
- Métadonnées de scénario enrichies : `created_at` (horloge serveur, à
  l'écriture) et `author` (facultatif) ajoutés au bloc meta et exposés par
  /api/scenarios.
- Champ « ✍ votre nom » dans l'en-tête, à gauche de ⚙ Config : auteur des
  scénarios, mémorisé localement (localStorage) et modifiable à tout moment.
- À la première sauvegarde sans nom déclaré, une modale demande l'auteur une
  fois, avec une coche « ne plus me redemander » (resolveAuthor/askAuthor).
- Modale Recharger : chips ✍ auteur et 🕒 date de création ; l'auteur entre
  aussi dans la recherche texte.
- Tests : created_at/author dans meta + list_scenarios + /api/save ; marqueurs
  de structure (authorName, authorModal, resolveAuthor, authorNoask). Doc à jour.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144YJtJLNn3gaBHh2mF9dQk
…ndex docs

- README : nouvelle section « Getting Started » avec les recettes de lancement
  des deux points d'entrée — système expert (CLI main.py : scénario par défaut,
  contingence custom, backend pypowsybl) et IHM manœuvre (extra [ihm], modes
  --grid local et --dataset RTE7000). Entrée ajoutée à la table des matières.
- README : section « Interactive Maneuver Interface » enrichie (commandes de
  lancement, points forts : édition nodale, ⌀ Isoler, carte d'exploration,
  modale ⚙ Config, champ ✍ login + date de création).
- docs/README.md : description de ihm.md mise à jour (carte, config, isolés,
  métadonnées auteur/date) + lien vers Getting Started.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144YJtJLNn3gaBHh2mF9dQk
@marota marota merged commit 401f25a into main Jun 29, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants