Environnement :
- Version d'ArcGIS Enterprise : 12.1
- Version d'Experience Builder : 1.20.0
- Navigateur/Système d'exploitation : Chrome
Résumé :Un widget personnalisé enregistré en tant que ressource distante (isRemote : true) sur Portal fonctionne correctement lors de la configuration d'une Experience, mais après avoir enregistré l'Experience, le context.isRemote du widget passe à false et context.folderUrl devient un chemin mal formé contenant la chaîne littérale undefined, au lieu de conserver l'URL distante originale du widget.
Étapes pour reproduire :
- Enregistrer un widget personnalisé sur Portal en tant qu'application/widget Experience Builder hébergé sur un serveur externe
- Créer une nouvelle Experience et glisser le widget sur la zone de travail
- À ce stade, l'inspection de this.props.context à l'intérieur du widget montre :
{
"isRemote" : true,
"folderUrl" : "https://myserver/xwd/customwidget/"
}
- Enregistrer l'Experience
- Après l'enregistrement (ou le rechargement de l'application publiée), le même contexte montre :
{
"isRemote" : false,
"folderUrl" : "https://portalURL/apps/experiencebuilder/experience/../cdn/359/undefined"
}
Comportement attendu :context.folderUrl devrait continuer à pointer vers l'URL distante originale du widget (ou sinon résoudre vers un chemin valide et accessible), avant et après l'enregistrement de l'Experience.
Comportement réel :Le widget tente de charger ses propres ressources statiques (dans notre cas, un iframe pointant vers ${context.folderUrl}dist/runtime/assets/some.html) depuis une URL invalide :
https://portalURL/portal/apps/experiencebuilder/experience/../cdn/359/undefineddist/runtime/assets/some.html
ce qui entraîne une erreur 404 et le widget ne parvient pas à afficher son contenu dans l'application publiée.
Impact :Le widget personnalisé est non fonctionnel dans l'application de production publiée, alors qu'il fonctionne correctement lors de la configuration/aperçu dans Builder.
Ce bug impacte également le favicon donc le résultat est aucune icône pour le widget.
Code pertinent (extrait) :
<iframe
id="myWidget"
src={`${this.props.context.folderUrl}dist/runtime/assets/some.html`}
width="100%"
height="90%"
/>