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 302 commits into
gephi:mainfrom
JeanGarf:main_jg
Open

Many enhancements: node/edge editing, formula columns, selection panel, Github check before save, mobile UX & pre-production CI...#332
JeanGarf wants to merge 302 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 (d906a95627860e)

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

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 (espacially 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)

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

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)

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"

Default labels

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

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

claude and others added 30 commits July 15, 2026 08:09
À la création, la valeur de weight saisie était écrasée par 1 : allAttributes
fusionnait les attributs du formulaire puis "...pick(data, 'label','color','weight')",
où data.weight valait toujours 1 (défaut du nouvel edge, jamais modifié car ce
n'est pas un champ enregistré du formulaire).

Suppression du défaut weight:1 et de l'override pick : la valeur saisie via le
tableau d'attributs devient l'unique source de vérité. Un weight non renseigné
reste traité comme 1 par les algorithmes (getEdgeWeight par défaut).
# Conflicts:
#	packages/gephi-lite/src/components/data/EditEdge.tsx
Depuis le volet Selected Nodes, un clic sur "+" préremplissait déjà la source.
Désormais, si exactement deux nœuds sont sélectionnés, la cible est préremplie
avec l'autre nœud et le focus se place sur le premier champ de saisie suivant
target (le premier attribut). Avec un seul nœud, comportement inchangé (target
vide, focus sur target).
Ajout d'un champ defaultValue au FieldModel (SDK), éditable via le formulaire
créer/modifier un attribut (EditFieldModel) avec l'éditeur typé EditItemAttribute.
Les formulaires de création de node et edge initialisent chaque champ avec la
valeur par défaut de l'attribut. Uniquement à la création, pas de rétro-remplissage
des items existants.
Chaque node et edge reçoit désormais deux attributs système en lecture
seule (type date, format yyyy-MM-dd HH:mm:ss), toujours affichés en
dernières colonnes du tableau de données, dans l'ordre Update Date puis
Creation Date :
- Creation Date est fixée à la création (ou à l'import) et ne change plus.
- Update Date est rafraîchie à chaque modification des attributs ou des
  extrémités d'un edge (pas lors d'un simple déplacement de node).

Ces champs sont exclus des formulaires de création/édition manuelle et
de l'édition inline du tableau, et les nouveaux attributs créés par
l'utilisateur s'insèrent toujours avant eux.
Les colonnes de dates n'étaient ajoutées qu'à la création/modification
d'un node/edge ou à l'import d'un fichier. Un graphe déjà présent dans
le stockage local du navigateur (rechargement de session) contournait
ce mécanisme et n'affichait jamais ces colonnes.

Au chargement d'un dataset depuis la session, les champs manquants sont
désormais complétés avec la date du jour.
Les attributs scriptés deviennent des colonnes "formule" dont le script est
stocké dans le FieldModel (donc persisté avec le dataset) et dont les valeurs
sont recalculées à la volée par le pipeline des attributs dynamiques.

- SDK : ajout de FieldModel.script (FieldScriptFunction), sérialisé
  automatiquement grâce au support des fonctions dans gephiLiteStringify.
- dynamicItemDataAtom évalue aussi les champs script du modèle : recalcul au
  chargement, à l'édition d'un nœud/arête, au changement de topologie ou de
  script. Une erreur de script laisse la cellule vide sans tout interrompre.
- Le menu "scripted attribute" stocke désormais le script au lieu de figer les
  valeurs, avec un mode édition pour re-modifier le script.
- Table de données : colonnes formule en lecture seule, le menu de colonne
  "modifier" rouvre l'éditeur de script.
- Les champs script sont exclus des formulaires de création/édition de
  nœud/arête et d'édition multiple (ils sont calculés).
# Conflicts:
#	packages/gephi-lite/src/components/data/EditEdge.tsx
#	packages/gephi-lite/src/components/data/EditMultipleItems.tsx
#	packages/gephi-lite/src/components/data/EditNode.tsx
#	packages/gephi-lite/src/core/graph/index.ts
#	packages/gephi-lite/src/views/dataPage/dataTable/useDataTableColumns.tsx
#	packages/sdk/src/graph/types.ts
À l'export GEXF, les valeurs calculées des champs "formule" (script) sont
désormais écrites comme attributs statiques sur le graphe exporté, afin
d'apparaître dans le fichier GEXF.

Cette matérialisation ne modifie que le graphe d'export construit à la volée
par dataGraphToFullGraph : le dataset, les définitions de formule et la
sauvegarde native .gephi-lite restent inchangés.
Sur mobile (< 576px), sélectionner un item déploie un panneau qui prend 50% de
la hauteur ; la zone graphe (.filler) rétrécit via une transition CSS. Comme le
bouton "Localiser" fait select() puis focus() de façon synchrone, le cadrage
était calculé sur la bande pleine hauteur (avant déploiement du panneau), puis
le panneau recouvrait la moitié basse.

focusCameraOnEdges attend désormais que la zone graphe se stabilise avant de
cadrer, pour tenir compte du panneau. Sur desktop rien ne change (la bande est
déjà stable, le cadrage est immédiat).

Correctif candidat à valider sur un vrai appareil Android.
Les navigateurs mobiles (Android, iOS) n'affichent pas les spin buttons natifs
de <input type="number">, laissant les champs numériques sans moyen visible
d'incrémenter/décrémenter.

Ajout d'un composant NumberInput ([−] champ [+]) utilisé par l'éditeur numérique
(table de données, formulaires de création/édition, valeur par défaut…). Les
spin buttons natifs sont masqués en CSS pour éviter les doublons sur desktop :
le stepper est ainsi identique sur toutes les plateformes.
Nouvelle chaîne d'intégration continue (deploy-app-preprod.yml) déclenchée à
chaque push sur develop : build de l'app puis déploiement dans la branche
gh-pages sous le sous-chemin /preprod/, à côté de la production (déployée depuis
main_jg à la racine). La prod n'est jamais touchée (clean: false, écriture sous
preprod/ uniquement) ; analytics Matomo désactivé sur la préprod.

URLs :
- prod    : https://jeangarf.github.io/gephi-lite/          (main_jg)
- préprod : https://jeangarf.github.io/gephi-lite/preprod/  (develop)

Ajout d'un bandeau "PRÉ-PRODUCTION" (PreproductionBanner) affiché uniquement
quand l'app est buildée avec VITE_PREPRODUCTION (défini par ce workflow), pour
distinguer visuellement l'instance de préprod de la prod.
claude and others added 30 commits August 9, 2026 14:43
Créer un node à la volée depuis le formulaire d'edge
…r mobile

Sur Android, le bouton affichait le code de la langue en texte (ex. "dev"), ce qui prenait trop de place et poussait l'icône de signalement de bug hors de l'écran sur les petits viewports.
datatable.save_and_update_column and graph.remote_changed.message are
only reached through variables (saveAndRunI18nKey, messageKey), so the
static AST checker can't see the t() call site and flags them as
unused. Ignore them the same way datatable.save_and_create_column
(same pattern, same file) already is.
Sur mobile, remplacer le libellé texte de la langue par une icône
…sur PC

Remplace les 3 icônes séparées du menu burger mobile (Home, Signaler,
Signaler auto) par le même bouton + menu déroulant que sur desktop,
ce qui supprime l'icône "Signaler auto" isolée.
Sur mobile, l'icône bug ouvre un menu Signaler / Signaler auto comme sur PC
…f5-b4bc-c49e4c4c6de0

Fix: popup de création/édition Node/Edge/attribut trop large sur mobile
…node à la volée), fix popups/tooltips mobile, sélecteur de langue mobile
…mpteur Nodes/Edges

Evite que le clavier virtuel Android ne cache la liste de resultats du champ fuzzy.
Remonter le champ de recherche fuzzy entre le titre et le compteur Nodes/Edges
Renommer le bouton de report en "Report an issue using feedback-service"
Traduit le libellé 'Report an issue using feedback-service'
Icône play/stop sous Réseau mixte pour la dernière spatialisation
Déplace l'icône play/stop de la dernière spatialisation à côté du bouton Data
On small viewports (Android), the deployed side panel covers most of
the screen height, but the floating sigma controls (zoom, selection
mode...) are pinned to the viewport bottom-right and end up rendered
above it, overlapping the panel footer buttons (e.g. layout Play/Stop).
…026-822a-f3252d375bbc

Fix: bouton + de zoom masqué par le bouton Play/Stop sur mobile
Déplace l'icône Play/Stop à gauche du bouton de thème
Conserve Graph/Data en anglais en mode français
…n volet est déployé sur mobile, icône Play/Stop à gauche du bouton de thème, termes Graph et Data conservés en anglais en mode français
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.

3 participants