Skip to content

Many enhancements: node/edge editing, formula columns, selection panel, Github check before save, mobile UX & pre-production CI... - #332

Open
JeanGarf wants to merge 388 commits into
gephi:mainfrom
JeanGarf:main_jg
Open

JeanGarf wants to merge 388 commits into
gephi:mainfrom
JeanGarf:main_jg

Conversation

@JeanGarf

@JeanGarf JeanGarf commented Aug 4, 2026 •

Copy link
Copy Markdown

Pull request type

Check the type of change your PR introduces:

  • Bugfix
  • Feature
  • Code style update (formatting, renaming)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • Documentation content changes
  • Other (please describe):

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 develop and periodically promoted to main_jg.

Save & session

  • Fix GitHub file being overwritten after creating a new workspace (Critical Bug)
  • Add a save icon next to "Workspace", greyed out until there are unsaved changes
  • Persist session settings (layout & metrics parameters) together with the graph
  • Warn before editing a GitHub file that has become stale, checked as soon as the create/edit popup opens
  • Re-arm the freshness check every ~1 minute (down from 5) and re-check before every save
  • Fix a save deadlock and add an "Overwrite" button to the conflict popup
  • Save-conflict popup: all 3 buttons visible on mobile, "Keep" selected by default
  • Fix a reload loop (the internal reference date wasn't refreshed after Reload)
  • Disable the HTTP cache on gist reads (getFile / getFileContent)
  • Fix a freshness false positive: memorize the open date from the same detail endpoint used by the periodic checks, instead of the list endpoint; add a 1s tolerance to absorb transient GitHub timestamp inconsistencies
  • Stop flagging a remote change that isn't one (real content comparison, not date alone)
  • Fix the two remaining root causes of false "modified on GitHub" alerts: fingerprint mismatch between sent and remote-returned bytes, and an un-persisted "keep my changes" acknowledgment causing repeated re-warnings
  • Open from GitHub: the last opened file is now really preselected (not just visually), so "Open" works immediately
  • Warn before opening another file while the current graph has unsaved changes, from every place a file can be opened - including the welcome modal, previously the one path this guard forgot
  • Survive a page reload and a discarded/restored tab (Firefox Android frees background tabs overnight): the graph, its "unsaved changes" star, and the camera's position/zoom all come back exactly as they were left

Node & Edge editing

  • Avoid Gephi Lite to crash when deleting an Edge [Deleting Edge makes Gephi lite to crash #318] (critical bug)
  • Prevent creation of duplicate nodes/edges
  • Support changing edge extremities (source/target) via 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]
  • Pre-fill default attribute values on node/edge creation [Default value for attributes #326]
  • Auto-focus the first empty field in node/edge modals
  • Numeric attributes: cross-platform +/− stepper
  • Add a validation button in the modal header and duplicate the OK button in the modal footer (especially for Android)
  • Fix edge weight resetting to 1 on creation [weight field is reseted to 1 #322]
  • Move ID field to the end of node/edge create/edit forms and data columns; move x/y position fields to the end of the edit form
  • Fix Escape not closing the node/edge create/edit popups
  • Confirm before losing unsaved input when closing the editor (Back button, Escape, click-outside, and both close crosses all go through the same confirmation)
  • When editing an edge, offer to create the typed source/target node on the fly if it doesn't exist yet, with confirmation
  • Fix the node/edge/attribute create/edit popup being too wide on mobile

Formula (scripted) columns & data columns

  • Scripted columns: persisted script, live recompute, editable label, and a "Freeze values" action to materialize computed values into a static attribute
  • Add automatic "Update Date" / "Creation Date" columns, with backfill for graphs already loaded in session
  • GEXF export now materializes formula column values
  • Rename "Delete attribute" → "Delete column"; rename "Identifier" → "ID"
  • Fix the Label caption for scripted attributes: back to a plain fixed "Label" instead of computing it from the current display label (Appearance)

Selection panel & Graph view

  • Add a title and selected-item count to the selection panel
  • Make selected nodes/edges clickable to locate them
  • Click a node's label to locate it
  • Add quick-action icons (locate, select neighbors, edit, invert direction, delete)
  • Add icons to create an edge from a node and select a node's edges
  • Sort selected edges by source, target, then label; show only endpoint labels for a selected edge and refocus dimming on it
  • Improve camera framing when locating an edge; unify multi-edge zoom between table and panel (mobile-aware); fix excessive zoom-out on multi-node framing
  • Scroll the selection panel to top after locating an item
  • Visualize the shortest path between two selected nodes
  • Long-press to add a node or edge to the selection (touch equivalent of Ctrl-click)
  • Mobile: fold the selection panel without losing the selection
  • Selection panel: toggle between alphabetical and size sort, persisted per item type
  • Automatically zoom on the selection whenever it changes (debounced so a just-created edge has time to reach the rendered graph first)

Search

  • Made the main fuzzy search robust to involuntary focus loss on Android
  • Fixed the clear cross not closing the results list on Windows, and made it reappear automatically on Android
  • Touch-friendly fuzzy search, persistent results, browser autocomplete hidden
  • Clear cross: focus returned to the field, and the cross always visible
  • Persistent fuzzy search text and clearable fields in the editor
  • Pre-fill node/edge creation with the text typed in the fuzzy search
  • Close the results dropdown when another panel or popup takes its place (it used to keep floating on top)
  • Move the fuzzy search field between the graph title and the Nodes/Edges counter, so the Android virtual keyboard no longer hides its results list
  • Auto-focus the fuzzy search field whenever its panel is (re)opened on mobile

Data tables

  • Locate a node/edge by clicking from the data tables
  • Add Source/Target label columns [In data view, edge mode, Create column Source Label and Target Label #320] and move ID columns to the end (edge view, then node view)
  • Search edges by source/target labels, not just internal IDs
  • Keyboard navigation between cells, plus a cancel button
  • Align the number field's stepper with the check button, not the cross

Filters

  • Reorder the filters panel and support scripted attributes as filterable
  • Fix the displayed From/To range-filter placeholder values
  • Add a "Based on filtered values" checkbox for size min/max interpolation
  • Left panel: clarify when filters are active
  • Make filtered items readable and consistent everywhere (funnel icon, selection, dimmed rendering)
  • A filtered edge also dims both its endpoints

Color palette

  • Sort the color legend alphabetically and keep existing colors when a new category is added
  • Remove obsolete categories from the palette; sync the palette when data changes, not only when fields change

Mobile & navigation

  • Add mobile header with node/edge creation icons; expand the Workspace toolbar by default on mobile
  • Fix the Layout submenu appearing unexpectedly on mobile
  • Android Back button closes the popup instead of navigating; prevent Back from popping Graph/Data views or exiting the app with unsaved work; warn before leaving the app with unsaved changes
  • Add a "+" button to create a node directly from the bottom bar, between the panel-close button and "Graph"
  • Add an auto-report menu entry, wired to the feedback-widget-js widget
  • On mobile, the bug icon opens a Report / Auto-report menu like on desktop, replacing three separate burger-menu icons
  • Replace the language selector's text label with an icon on mobile, freeing room for the bug icon on small viewports
  • Hide the floating graph controls (zoom, selection mode...) when a side panel is deployed on mobile, so they stop overlapping its footer buttons
  • Fix tooltips/dropdowns staying stuck open on mobile (a tap fires a mouseenter with no matching mouseleave), intercepting taps on the buttons underneath
  • Add a play/stop icon, next to the theme toggle, to relaunch or stop the last used spatialization
  • Keep the English terms "Graph" and "Data" in the French UI instead of translating them

Default labels

  • Use ID as the default label for nodes/edges; don't show the ID when "No label" is selected

Label rendering

  • Replace the label-display size threshold (which defeated itself on zoom) with a per-screen label budget: at every frame, the largest visible nodes are picked and spread across the viewport, with a minimum render size so small neighbors (e.g. around a hovered node) stay legible
  • Adapt the budget to small screens and to the actually visible area (excluding what the header and panels cover)
  • Show exactly the configured number of labels on every device, without silently down-scaling it on phones
  • Make the label-eligibility margins asymmetric (nil on the left, reduced on the right, where the label text extends), then geometry-accurate vertically (based on sigma's own label-line metrics, shared with click detection)
  • Rename the size/zoom/label-density settings in the appearance panel, with all translations updated

Pre-production banner & CI

  • Add CI deployment of pre-production to GitHub Pages from develop; configure GitHub Pages for this fork; grant contents:write permission to the deploy workflow
  • Move the pre-production banner to the top of the graph; detect preprod via URL

Misc / internal

  • Factor the duplicated data-creation menu into a shared constant; add it to the Graph view above Spatialisation [Data Creation Menu also on Graph View #319]
  • Refresh the filtered graph cache on node/edge data changes, not only on fullGraph reference changes
  • Documentation: factoring rule (avoid divergent behavior across call sites) and feature-branch sync rule (merge --no-ff)
  • Show the build commit hash and date below the version number in the About popup, so the running version can be checked at a glance
  • Fix i18n-checker false positives on dynamically-referenced keys
  • Regenerate e2e reference screenshots (Java / Les Misérables / Power Grid), desynced from CI rendering since 2026-08-16

claude added 30 commits July 18, 2026 21:56
… naviguer

Sans historique dédié, le bouton Retour retombait sur la navigation du
routeur et faisait défiler les vues Graphe/Data au lieu de fermer la
popup d'édition ouverte. Une entrée d'historique factice est
maintenant empilée à l'ouverture d'une popup, consommée par Retour
(qui ferme alors la popup) ou par toute autre fermeture (Annuler,
soumission, clic extérieur...).
Toutes les navigations entre les vues Graphe et Data (onglets du
header, bascule nœuds/liens, "Afficher dans les données", "Ouvrir
dans le graphe", localisation) utilisent maintenant un remplacement
d'historique plutôt qu'un empilement. Basculer plusieurs fois entre
les deux vues n'accumule donc plus d'entrées d'historique : le bouton
Back ne peut plus les dépiler une à une jusqu'à sortir de
l'application sans avoir sauvegardé.
…auvegardées

Tant qu'il y a des modifications non sauvegardées, le navigateur
affiche sa confirmation native "quitter le site ?" lorsqu'on quitte
réellement le document (bouton Retour qui sort, fermeture d'onglet,
rechargement). Aucune gêne pour la navigation interne entre les vues
Graphe et Data, et aucune confirmation quand il n'y a rien à perdre.
…sauvegardé

Le beforeunload ne suffit pas : sur mobile (ex. Firefox Android), le
bouton Back ne le déclenche pas. On piège donc le Back via l'historique :
une entrée "garde" est maintenue en haut de la pile, sur laquelle le Back
retombe. Selon le contexte :
- une popup ouverte est fermée (et la garde est ré-empilée) ;
- s'il y a des modifications non sauvegardées, une confirmation est
  demandée avant de réellement quitter ;
- sinon, on quitte normalement.
Le beforeunload est conservé pour couvrir le rechargement et la fermeture
d'onglet. Fusionne l'ancien effet "Back ferme la popup" et l'effet
beforeunload en une seule logique de garde. Les nettoyages d'URL de
l'initialisation passent en replaceState pour ne pas enterrer la garde.
…ement

Recharger la page (ou créer un nouvel espace de travail) restaure l'état
du graphe/apparence/filtres via de nouveaux objets, ce qui déclenchait à
tort le marquage "modifié" (comparaison par référence), alors qu'aucune
édition n'avait eu lieu. isDirty est maintenant explicitement remis à
false après ces restaurations, comme c'était déjà le cas après l'ouverture
d'un fichier.
Sur mobile, l'en-tête (Workspace/Graphe/Data) est ancré en bas de
l'écran (flex-direction: column-reverse), donc un bandeau ancré en bas
finissait par chevaucher les icônes de zoom/sélection du graphe. Le
haut du graphe, lui, est toujours libre (mobile comme desktop).
1) À la création d'un nœud, une recherche floue (même index que la
barre de recherche) compare le champ utilisé comme libellé (ou l'ID à
défaut) aux nœuds existants, et affiche les correspondances : cliquer
en annule la création et localise le nœud existant.

2) À la création d'un lien, si un lien relie déjà les deux nœuds
sélectionnés (dans un sens ou l'autre), un avertissement apparaît ;
cliquer dessus annule la création et sélectionne/localise le(s)
lien(s) existant(s).
Ouvrir "Créer un nouveau nœud/lien" ou éditer un nœud/lien existant ne
positionnait le focus sur aucun champ (ou de façon incohérente pour les
liens), obligeant à cliquer avant de pouvoir taper. Le focus se porte
maintenant sur le premier champ vide, dans l'ordre d'affichage
(attributs, position, id pour les nœuds ; source, cible, attributs, id
pour les liens), via un helper partagé getFirstEmptyValueIndex. Si tous
les champs sont déjà remplis (édition d'un nœud/lien complet), aucun
focus n'est forcé. Le champ couleur et le multi-édition en bénéficient
aussi.
# Conflicts:
#	packages/gephi-lite/src/components/data/EditEdge.tsx
#	packages/gephi-lite/src/components/data/EditNode.tsx
…our lors de la saisie

Le calcul du nom recherché dépendait de la référence du tableau attributes
(watch("attributes")), qui peut être muté en place selon le contexte de
rendu (ex : modale ouverte depuis la page Graph) au lieu d'être remplacé.
React ne détectait alors aucun changement et l'avertissement ne se
mettait jamais à jour pendant la saisie. Le calcul dépend maintenant de
la valeur scalaire du champ label elle-même.
…é du graphe

- Déplacer le type de graphe (ex : "Réseau mixte") au-dessus des compteurs
  de nœuds et de liens.
- Sous chaque compteur, afficher l'item de ce type dont la date de mise à
  jour est la plus récente (nœud : pastille + label ; lien : source → cible
  via le composant Edge existant), cliquable pour le localiser dans le graphe.
- Sous chaque item, indiquer sa date de mise à jour.

Le calcul réutilise le champ système update_date déjà maintenu sur chaque
item. Pour que la fonctionnalité marche quel que soit le mode de chargement,
setGraphDataset garantit désormais les champs de dates système sur tout
remplacement complet du dataset (idempotent pour les données déjà datées),
alignant le chargement de fichier natif sur l'import graphology et la
restauration de session.
Les deux blocs Nodes/Edges se retrouvaient empilés au lieu d'être côte à
côte, car le panneau (largeur fixe 256px) était trop étroit pour deux
colonnes de largeur minimale 8rem avec retour à la ligne. En passant
chaque colonne en flex égal (au lieu d'une largeur minimale fixe), les
deux colonnes tiennent désormais côte à côte.

Le type de graphe (ex : "Réseau mixte") est déplacé de son emplacement
au-dessus des compteurs vers la colonne Nodes, juste sous la date du
nœud le plus récent : il se retrouve ainsi sur la même ligne que la
cible du lien le plus récent dans la colonne Edges.
…de nœud/lien

Sur mobile, le clavier virtuel peut recouvrir le bouton de validation
situé en bas de la modale pendant la saisie d'un champ. Le composant
Modal partagé accepte désormais un prop submitLabel : quand il est
fourni, un bouton de soumission est affiché dans l'en-tête, à gauche de
la croix de fermeture, toujours visible au-dessus du clavier.

Pour l'édition de nœud et de lien, ce bouton (libellé "OK") remplace
celui du pied de la modale, qui reprenait jusqu'ici le texte du titre
("Edit existing node"/"Create new node", etc). Le panneau latéral de
création (Data page), qui réutilise le même formulaire hors modale,
garde inchangé son bouton de soumission en pied de panneau.
claude added 30 commits October 3, 2026 06:58
Chevron vers le haut quand la barre est dépliée (il la replie), vers le bas
quand elle est repliée (il la rouvre), à la place du hamburger.

Claude-Session: https://claude.ai/code/session_01JnTcfrRgqYuc9P2F4gZdVx
…r (dès 2 caractères)

Le filtre ne réduit que la liste affichée : sélection, graphe et actions du volet restent inchangés.

Claude-Session: https://claude.ai/code/session_01JnTcfrRgqYuc9P2F4gZdVx
…filement, titre réduit ; textes du filtre ajoutés à la langue dev

Claude-Session: https://claude.ai/code/session_01JnTcfrRgqYuc9P2F4gZdVx
…s nœuds extrémités (triés), saisie libre conservée

Choisir un nœud ne garde que les liens qui le touchent ; le texte libre filtre comme avant.

Claude-Session: https://claude.ai/code/session_01JnTcfrRgqYuc9P2F4gZdVx

This branch has not been deployed

No deployments
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