Conversation
Sinon leur ordre dans le volet de sélection suit celui, arbitraire, du Set de sélection, ce qui rend une sélection multiple difficile à parcourir.
…bile) Le bouton « Show in Graph » du tableau des edges passait par fitViewportToNodes (cadrage sur tout le canvas), alors que le bouton « Zoom on all selected edges » du volet passait par notre cadrage conscient de la bande visible (.filler). D'où, sur mobile, des edges cadrés derrière le volet de sélection, et un niveau de zoom différent entre les deux entrées. Les deux chemins passent désormais par focusCameraOnNodes (cadrage band-aware + surbrillance), réutilisé par focusCameraOnEdges. L'attente runWhenReadyToFrame combine bande stabilisée et graphe rendu (relit le sigma vivant à chaque frame), donc le cadrage est correct aussi bien depuis le volet (déjà monté) que depuis le tableau (navigation puis montage).
Deux corrections dans getCameraStateToFrameNodes : - La largeur du label (fixe, non scalée) n'est désormais réservée que pour les nœuds situés à droite du centre (le label s'affiche à droite du nœud). La réserver pour tous, y compris les nœuds à gauche dont le label s'étend vers l'intérieur, sur-contraignait le zoom et dézoomait énormément sur une bande étroite (mobile) — d'où « on ne voit presque plus le graphe » sur une sélection d'edges étalée (un edge seul, 2 nœuds proches, n'était pas affecté). La réserve est aussi plafonnée pour qu'un label très long ne puisse pas écraser le zoom. - Garde-fou : cadrer un sous-ensemble de nœuds ne doit jamais dézoomer au-delà de l'affichage du graphe entier. On calcule le zoom qui fait tenir tous les nœuds rendus dans la bande et on ne dézoome jamais en deçà.
… facilement, grisee tant qu'il n'y a pas de modification
- Header mobile : la disquette de sauvegarde est regroupée avec le bouton Workspace à gauche (espaceur puis thème/langue/logo à droite), au lieu d'être poussée à droite près du sélecteur de thème par le flex-grow de Workspace. Elle est ainsi proche de Workspace et n'attrape plus les clics du menu thème. - Header mobile : l'état ouvert/fermé de la barre d'icônes (burger) est persisté entre les vues Graphe et Data (chaque page monte son propre Header, un simple useState se réinitialisait à chaque changement de vue). - Bandeau de gauche : ajout d'icônes « + » pour créer un node et un edge, à droite des titres Nodes et Edges (composant partagé GraphSummary, donc présent dans les vues Graphe et Data). Le clic ouvre la modale de création correspondante.
…le localiser Dans le volet des edges sélectionnés, seuls les nœuds source/cible d'un edge étaient cliquables (pour localiser le nœud). Le milieu de l'edge est désormais cliquable lui aussi et déclenche la localisation de l'edge, via le même hook partagé useLocateInGraph.locateEdge que celui utilisé dans la vue Data Mode Edges (seule l'option navigateToGraph diffère, nécessaire depuis le tableau qui est sur une autre page). Le comportement exécuté est donc identique des deux côtés.
…, pas de fast-forward)
…œud cliquable dans le volet des nœuds sélectionnés Même bug que celui déjà corrigé sur les edges : dans le volet des nœuds sélectionnés, le nœud n'était pas cliquable pour se localiser (contrairement au tableau Data), car ce comportement n'était implémenté que dans NodeComponentById (en enveloppant NodeComponent dans un bouton depuis l'extérieur), et EdgeComponent dupliquait la même logique d'enrobage pour ses nœuds source/cible. Factorisation : NodeComponent (le composant partagé) porte désormais lui-même le comportement optionnel « rendre le nœud cliquable » via onClick/buttonTitle. NodeComponentById, EdgeComponent (source/cible) et le volet de sélection utilisent tous ce même mécanisme unique au lieu de le réimplémenter chacun de leur côté — plus de risque de comportements divergents pour une même fonctionnalité.
…ge depuis une fiche Sur mobile, en particulier avec plusieurs edges sélectionnés : cliquer sur un nœud (ou un edge) à l'intérieur d'une fiche en bas de la liste remplaçait la sélection par ce seul élément, mais le volet restait scrollé à son ancienne position (proche du bas de l'ancienne liste, plus longue), laissant le titre et la barre d'icônes du nouvel élément hors champ. Le volet remonte désormais en haut dès que la sélection est totalement remplacée par une autre sans recouvrement (type différent, ou aucun id en commun avec l'ancienne sélection) — le cas d'une localisation ou d'un saut vers un nouvel élément sur le graphe. Une modification partielle de la liste courante (désélectionner/cocher un seul élément) conserve la position de scroll.
…ion du clic mobile 1) Une étoile apparaît à droite de la disquette dès que le graphe (données, apparence ou filtres) a été modifié depuis le dernier enregistrement ; elle disparaît automatiquement une fois la sauvegarde effectuée (isDirty repasse à false aussi bien pour l'enregistrement GitHub que pour l'export local/Save As). 2) La disquette est désormais toujours visible (plus seulement quand un fichier GitHub est ouvert) : si aucun fichier cloud n'est connecté, le clic ouvre la modale « Save as... » (enregistrement local ou vers un nouveau fichier GitHub) au lieu de ne rien faire. 3) Sur mobile, la disquette et le bouton Workspace étaient collés (aucun espace entre les deux dans la barre du menu burger), ce qui faisait qu'un tap imprécis sur la disquette pouvait atteindre la zone tactile du bouton Workspace et ouvrir son menu. Ajout d'un espacement entre les boutons de la barre.
…ros nœuds de la zone visible, répartis), réglage du nombre de libellés affichés et taille minimale de rendu
Le libellé étant écrit à droite de son nœud, les côtés ne sont pas équivalents : à gauche, un nœud qui entre dans l'écran a d'emblée tout son libellé visible, d'où une marge nulle ; à droite, la marge passe de 50 à 25 px, ce qui rend éligibles des nœuds jusque-là écartés sans que leur libellé devienne illisible pour autant. Documente également le retour sur `develop` après chaque propagation en production.
…bellés (nulle à gauche, réduite à droite)
…texte La marge de 50 px, héritée du côté droit, écartait sans raison des nœuds proches des bords supérieur et inférieur : seule la hauteur du texte compte là, et non la longueur du libellé. Elle est donc calculée à partir de la géométrie de rendu de sigma (ligne de base à un tiers de la taille de police sous le centre du nœud, jambages descendants jusqu'à 0,3 de plus), pour la plus grande taille de libellé attendue, soit 16 px. Les ratios de cette géométrie, jusqu'ici codés en dur dans la détection du clic sur un libellé, sont partagés entre les deux usages.
…és ramenée à la hauteur du texte
Confirmation avant perte de graphe non sauvegardé à l'ouverture
…pris depuis la modale d'accueil
…auvegardé factorisée (y compris depuis la modale d'accueil)
Zoome automatiquement sur la sélection quand elle change
…d), désynchronisées du rendu CI depuis le 2026-08-16
Fiabilise les captures e2e de load-graph.spec.ts (dérive de rendu CI)
…'écran (load-graph.spec.ts)
…u'elle apparaisse dans le graphe de rendu (débounce de sigmaGraphAtom)
Zoom auto non déclenché après création d'un lien
…n veille Sur Firefox Android, un onglet laissé de côté une nuit est déchargé pour libérer de la mémoire, puis restauré au retour. Le navigateur ne rétablit la sessionStorage de l'onglet que si elle est assez petite pour son gestionnaire de session : un graphe sérialisé est très loin du compte (60 Ko pour Les Misérables, dont 39 % pour les colonnes de dates automatiques ajoutées récemment). L'onglet revenait donc vide, avec la popup d'accueil, et le graphe était perdu. L'instantané de l'espace de travail (graphe, filtres, apparence, session) passe donc en localStorage, que le navigateur restaure quelle que soit sa taille, sous un espace de noms propre à l'onglet. Seul cet identifiant reste en sessionStorage — quelques dizaines d'octets, toujours restaurés — et il est doublé dans history.state, lui aussi restauré, au cas où la sessionStorage serait perdue entièrement. Comme le localStorage survit à l'onglet qui l'a écrit, les espaces de noms sont nettoyés : ceux laissés par des onglets disparus depuis plus de sept jours sont supprimés au démarrage, et atteindre le quota évince les moins récemment utilisés. Un graphe trop gros pour être stocké efface désormais l'instantané précédent, qui aurait sinon été restauré à la place.
…onglet mis en veille
Deux oublis du correctif précédent, qui ne restaurait que le contenu de l'espace de travail : - L'étoile "modifications non enregistrées" disparaissait : la restauration effaçait le drapeau isDirty, parce qu'elle passe forcément par des écritures d'atomes qui le remettent à true, sans rapport avec l'état réel. Le drapeau est désormais enregistré avec l'instantané, et remis tel quel — il faut donc le lire avant de toucher aux atomes, sans quoi on ne relit que le "true" que la restauration vient d'écrire. - La position et le zoom repartaient d'un cadrage complet du graphe. La caméra est maintenant enregistrée (à l'arrêt du déplacement) et remise en place au chargement. Les coordonnées n'ayant de sens que par rapport à la boîte englobante du graphe, la restauration passe toujours par resetCamera d'abord, via restoreCamera, appelé aussi bien à la restauration de l'espace de travail qu'au montage de sigma, puisque l'un ou l'autre peut arriver en dernier. Le bouton "voir tout le graphe", l'ouverture d'un fichier et les layouts continuent d'appeler resetCamera : ils recadrent, et le nouveau cadrage devient à son tour celui que l'on retrouvera.
…rés avec l'espace de travail
Focus automatique sur la recherche fuzzy à l'ouverture du volet gauche (mobile)
… à l'ouverture du volet mobile
Author
|
Bonsoir @sim51, Si vous avez besoin d'infos supplémentaires, ou si vous souhaitez essayer ma version, n'hésitez pas à me contacter. Cordialement, |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull request type
Check the type of change your PR introduces:
Summary of changes (
d906a95→65d89a9)This range covers the full set of changes accumulated on this fork since the base commit, spanning many feature/fix branches merged into
developand periodically promoted tomain_jg.Save & session
getFile/getFileContent)Node & Edge editing
updateEdge, add a swap button in the edit form, and an "Invert arrow's direction" menu item [Add button to invert Source and Target of an Edge #321]Formula (scripted) columns & data columns
Selection panel & Graph view
Search
Data tables
Filters
Color palette
Mobile & navigation
mouseenterwith no matchingmouseleave), intercepting taps on the buttons underneathDefault labels
Label rendering
Pre-production banner & CI
develop; configure GitHub Pages for this fork; grantcontents:writepermission to the deploy workflowMisc / internal
fullGraphreference changesmerge --no-ff)