Skip to content

Conversation

@PowerKiKi
Copy link
Member

@PowerKiKi PowerKiKi commented Nov 4, 2025

Proposition d'alternative pour la config du sélecteur hiérarchique. L'idée principale est de d'abord déclarer les noeuds, puis de déclarer les relations possibles entre chaque pair de noeuds. Ainsi on a plus besoin de l'ancien childrenRelationNames qui pouvait être invalide de façon complètement silencieuse (et était non-typé). J'ai l'impression que cette structure est plus facile à suivre par l'humain.

En plus de cela, on ajoute la nouvelle possibilité d'overrider le filtre utilisé pour obtenir les roots. Cette partie pourrait être faite sans le reste du refactor, pour résoudre #11914. En fait non, je crois pas que c'est nécessaire du tout.

@sambaptista, @stissot est-ce que cette nouvelle façon de faire, illustrée via https://github.com/Ecodev/natural/pull/255/files#r2488822913, vous semble aller dans la bonne direction ?

Comment on lines +31 to +35
public readonly itemNode = nodeConfig({
service: ItemService,
root: true,
selectableAtKey: 'any',
});
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

D'abord on définit les noeuds de l'arbre. La nouvelle propriété root permet de spécifier le(s) root(s) du tree.

Comment on lines +42 to +51
public hierarchicConfig = hierarchicConfig(
[this.itemNode],
[
{
parent: this.itemNode,
child: this.itemNode,
field: 'parent',
},
],
);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Puis on définit les relations entre les noeuds de l'arbre. Une relation est un parent et un child, lié par un field (comme avant, ce field est utilisé pour fabriqué le filtre pour obtenir les enfants à partir du parent).

Comment on lines 55 to 61
root: {
filter: {
conditions: [
// ...
],
},
},
Copy link
Member Author

@PowerKiKi PowerKiKi Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dans cet autre exemple, on override le filtre par défaut pour obtenir les roots ({empty: {}}) avec un filtre custom. Permettant donc d'avoir des racines différents en fonctions des besoins métiers.

Cela devrait permettre de résoudre #11914.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En fait je crois plus que cela soit une bonne idée. Parce qu'il est préférable de modifier le comportement {empty: {}} directement du côté du serveur, pour garantir une cohérence partout.

Comment on lines +70 to +84
public hierarchicConfig2 = hierarchicConfig(
[this.itemForRootNode, this.itemForChildNode],
[
{
parent: this.itemForRootNode,
child: this.itemForChildNode,
field: 'parent',
},
{
parent: this.itemForChildNode,
child: this.itemForChildNode,
field: 'parent',
},
],
);
Copy link
Member Author

@PowerKiKi PowerKiKi Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Les roots sont filtrées de façon spéciales, mais tous les enfants, récursivement, n'ont plus de filtre spécial. En fait non.

Comment on lines +83 to +92
export function nodeConfig<T extends UntypedModelService>(node: NodeConfig<T>): NodeConfig<T> {
return node;
}

export function hierarchicConfig<Nodes extends NodeConfig[]>(
nodes: Nodes,
relations: RelationConfig<Nodes>[],
): NaturalHierarchicConfiguration<Nodes> {
return {nodes: nodes, relations: relations};
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On utilise 2 fonctions pour construire la config pour permettre à TypeScript de nous garantir que les noeuds utilisés dans les relations, sont bien déclarés dans la liste de noeuds.

@sambaptista
Copy link
Member

Tout ce qui m'importe c'est qu'il n'y ai pas de régressions. La syntaxe m'importe peu, sens toi libre de changer à ton goût.

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