Liste fille héritée avec contrainte

Request description

Bonjour,

Nous rencontrons un problème en plusieurs couches sur la V6 que nous ne reproduisons pas en V5.
Dans le cas très particulier d’une liste fille

  • héritée
  • avec contrainte
    les données du panel ne s’affichent pas au premier chargement.

Après un reload du formulaire, elles s’affichent correctement.
Si je recharge toute la page (F5) le problème apparaît de nouveau.
Il semble que la durée de chargement de la contrainte crée une confusion au moment de l’affichage de la liste.

Je mets ci-dessous les steps et mon analyse.

Steps to reproduce

1.Créer un objet B hérité d’un objet A
2.Créer un lien d’un objet C en liste fille sur l’objet A
3.Créer une contrainte sur l’objet C
4. Dans le template de l’objet B, ajouter cette liste fille dans les onglets bas
5. Afficher l’objet B : l’onglet C reste sur le vue “skeleton”
6. Faire un reload de B : l’onglet C s’affiche correctement

Analyse :
Il semble qu’en raison du chargement un peu long de la contrainte, on entre dans

function display() obj.hook(p.display, [ctn, obj, p, _ => {

avant l’appel à s.display = s.display || o.displaySearch; dans bindHooks.

p.display qui est sensé afficher la liste est donc undefined.

Je vois qu’on passe une 2ème fois dans le display après le bindHooks, mais le display semble se faire cette fois sur l’onglet du père qui est dans une area inherited cachée.

HTML de ma liste fille sur C, hidden avec les data
image

HTML de ma liste fille sur B, toujours en skeleton
image

J’espère avoir donné toutes les informations utiles,
Merci de votre aide,
Emmanuelle

Technical information

Instance /health

[Platform]
Status=OK
Version=6.2.3
BuiltOn=2025-03-07 12:29
Git=6.2/de139c86150da2a84599aa6c14b51d1e06a2e118

Bonjour,

Merci pour ton retour détaillé, on va essayer de reproduire ton cas, il y a peut être un pb d’ordre de chargement entre la panel et les contraintes.

En V6, Simplicité traite les chargements des éléments du formulaire au travers de promesses, ce qui permet entre autre d’avoir un vrai hook “onload” final une fois tous les composants asynchrones chargés (allSettled des panel fils, des images, objets externes…).

Sinon que fait la contrainte exactement ? peut être qu’elle ne termine pas bien au premier usage et sort en erreur en arrêtant du coup l’affichage de la liste ?

Au moment du premier display() la contrainte ne semble pas encore être chargée pour cet objet.

Ensuite j’ai le retour de chargement de la contrainte, ce qui me fait passer dans bindHooks, elle apparaît dans les sources.

Je passe une 2ème fois dans display() (en raison de l’héritage ?) avec la méthode bien définie cette fois

mais l’affichage de la liste s’effectue sur la version mère (onglet caché hérité) du formulaire.

La contrainte est basique, nous avons quand même essayé de la remplacer par true mais le problème persiste.

(function($) {
    Simplicite.UI.constraints["RciServiceVersion"] = function(ctn, obj, field, index, context, cbk) {
        if (field && field.name && ["rciSerVersionSerId", "rciServersionServersionId__rciSerVersionSerId"].indexOf(field.name) < 0) {
            cbk && cbk();
            return;
        }
        ctn = ctn || $('body');
        var ui = obj.ui
          , app = ui.getApp();
        function _getField(f) {
            return ui.getUIField(ctn, obj, f, index, true);
        }
        function _apply() {
            var grant = app.grant, parent = obj.parent, parentRefField = obj.parentRefField, _expr, _field, _action, _link, _view, _area, _vis;
            try {
                (function _cst_RciServiceVersion() {
                    function _expr1() {
                        return (obj.getFieldValue("rciSerVersionSerId") != "");
                    }
                    _expr = _expr1();
                    _field = _getField("rciSerVersionSerId.rciSerMethod");
                    if (_field && _expr !== undefined) {
                        _field.ui.visible(_expr, true, context);
                    }
                }
                )();
                cbk && cbk();
            } catch (e) {
                console.error("Apply constraint error", e);
            }
        }
        app.grant.responsibilities && obj.metadata.fields ? _apply() : app.getGrant( () => {
            obj.metadata.fields ? _apply() : obj.getMetaData(_apply);
        }
        , {
            web: true
        });
    }
    ;
    console.log("Loaded constraints RciServiceVersion");
}
)(jQuery);

Non reproduit sur la démo en créant un objet DemoSupplier2 héritier de DemoSupplier et avec une contrainte de visibilité d’un champ de l’objet lié DemoProduct.

Depuis le formulaire de DemoSupplier2 :

La contrainte de DemoProduct est bien chargée avant d’afficher la liste.
Le displayReferenceList qui affiche la liste fille, charge l’instance panel DemoProduct et ses contraintes :

Ensuite sur onload de la definition de la contrainte, il appelle le displayList de cette instance dans le bon container.

Que la liste soit dans un tab ou en dessous du formulaire ne change rien.

Votre template doit avoir un soucis : 2 fois le même panel ?

Je ne comprends pas, mais ça doit venir de là.

J’ai ajouté dans le template de l’objet fils (RciApi) un link de l’objet père (RciService), ce n’est pas correct ?

EDIT : en effet je viens de voir que dans l’area 1 de l’objet père, on a déjà les onglets définis, ce qui explique l’onglet en double dans le form de mon objet fils … j’ai supprimé l’area 1 du templace et je n’ai plus le souci.
Désolée du dérangement !

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.