Comment ouvrir un formulaire d'objet depuis une publication html?

Bonjour,

J’ai une publication html dans laquelle j’affiche des div qui sont des objets métiers que je récupère en JSON.
Comment je fais pour naviguer dans l’application Simplicité en cliquant sur ces objets ?
J’ai essayé via un script js :
$(".myclass").click(function(){ $ui.displayForm(".myclass", "myobject", 2, { showNav: true, nav: "new"});});
Mais j’ai une erreur “$ui is not defined”
Oui je peux trouver le code Simplicité permettant d’utiliser $ui ?

si c’est une iframe ou un fenetre, il faut nécessairement aller chercher $ui au bon endroit. Là vous tentez d’afficher le formulaire dans votre composant qui n’a pas chargé la UI Simplicité.

Avec
var $ui = window.$ui || window.parent.$ui || window.opener.$ui;
vous aurez plus de chance d’afficher le formulaire dans la UI Simplicité qui a lancé votre div.

Merci, effectivement je n’ai plus l’erreur mais cela n’a aucun impact sur la page qui a lancé ma publication.
Dans le displayform, je dois bien rentrer displayForm(class de ma div, l’objet métier que je veux ouvrir, le row_id de cet objet ) ?

Et si je mets :
parent.$ui.displayForm(null, "rciSubsidiary", "2", { showNav: true, nav: "new" });
cela me dit que le parent est undefined

oui il faut surement mettre window.parent.

var ui = window.$ui || window.parent.$ui || window.opener.$ui;
ui.displayForm(ctn, "<nomobject>", "<rowid>", { showNav: true, nav: "new" });`
  • ctn = null : le container principal de la UI (c’est à dire "#work"),
  • sinon mettre un selector d’un div particulier comme "#mydiv"
  • ou directement un objet jQuery

C’est parfait merci beaucoup

Enfin un truc qui marche aujourd’hui ;)

Bonjour,

Je reprends ce ticket pour savoir s’il y a un moyen d’utiliser le displayForm dans un nouvel onglet ?
Avec ce code, le form s’ouvre “derrière” (dans le window.opener, sur lequel je ne peux pas mettre le focus)

> var ui = window.$ui || window.parent.$ui || window.opener.$ui;
> ui.displayForm(ctn, "<nomobject>", "<rowid>", { showNav: true, nav: "new" });`

J’essaie donc d’utiliser le displayForm dans un window.open, mais j’ai l’impression que le UI engine n’est chargé qu’à la sortie de mon javascript.
Et si j’utilise les méthodes “on” (type onloadeddata) de mon nouvel onglet, je n’ai plus le nom et le row_id de mon objet à disposition …

Merci d’avance

Quel est le besoin ? ça me semble un mauvaise idée.
Le formulaire, la navigation, les callback, les appels ajax… ont besoin de la UI, donc ce n’est pas juste un window.open d’un formulaire ou d’une liste.

Vous pouvez lancer un window.open sur l’URL du site avec un deep link.
Ca fera 2 fenêtres partageant la même session comme un CTRL+n, donc attention aux effets indésirables de session si la personne se met à travailler en parallèle dans sa session sur un même objet dans 2 onglets faussement étanches.

// Tiny URL object form
window.open(Simplicite.ROOT + "?f=MyObject;1234");
// Tiny URL object list
window.open(Simplicite.ROOT + "?l=MyObject");
// URL from a getObjectURL, getListURL... on backside
window.open(Simplicite.ROOT + "?deeplink=" + encodeURIComponent(url));

Il y a la méthode $ui.detachURL qui est encore expérimentale, donc à ne pas utiliser tant qu’elle n’est pas stable, elle devra servir à terme à détacher des URL avec ou sens décoration (sans menu, header… mais avec la UI chargée pour permettre d’avoir plusieurs navigations, avoir plusieurs zones de travail #work, etc). C’est dans les besoins de la V5.

A date, suivant le besoin de travailler dans plusieurs fenêtres étanches, il est préférable d’utiliser un autre navigateur ou une session privée, car il est impossible de savoir d’où viennent les flux ajax s’ils sont lancées depuis plusieurs onglets d’un même session web : en back le “synchronize” est fait du les droits de session à chaque appel, donc N fenêtres = N sessions, sinon Simplicité ne garantit pas que tout soit thread safe en back.

A partir de l’UI classique nous ouvrons une publication HTML dans un nouvel onglet.

image

Cette publication liste des Applications. Le onclick de chaque application présentée permet d’afficher son form dans l’UI classique (displayForm).
Mais cela s’affiche dans l’onglet précédent qui a permis d’ouvrir la page HTML, et qui est caché derrière. Ce n’est pas ergonomique du tout car l’utilisateur ne voit même pas que son clic a marché.
A partir de ma page HTML je ne peux pas remettre le focus sur l’onglet précédent (le window.opener) donc j’essaie d’ouvrir un nouvel onglet par dessus, faute de mieux. Sinon il me reste la solution de fermer la page HTML mais ce n’est pas terrible.

Merci pour ces précisions.
Empiler des fenêtres posera tout autant de problèmes, car par exemple la personne va se mettre à cliquer sur “Fermer”: la fenêtre ne va pas se fermer mais revenir à la page d’accueil, etc.

Le besoin est d’avoir une liste particulière et d’ouvrir chaque ligne pour avoir le détail puis revenir à la liste… J’ai déjà vu ça un peu partout ;-)

Pour réponde au besoin à mon avis :

  • Il faut que le bouton soit un Action et affiche la liste des Applications avec les filtres ou en utilisant une instance particulière s’il faut changer les colonnes en profondeur au postLoad. Au pire si cette liste est trop spécifique, il faut en faire un objet Externe (table html spécifique) qui va s’empiler dans la barre de navigation (nav=add)

  • et utiliser la navigation standard pour ouvrir le formulaire de la ligne (ou utiliser getTargetObject si besoin de router ailleurs que cet objet). Le bouton Fermer va revenir tout seul à la liste empilée dans la nav.

Autre solution avec un peu de code :

on peut imaginer que le bouton d’action affiche la liste standard (ou l’objet externe) dans un écran splitté à droite ou à gauche (cf $ui.view.split comme on le fait pour un arbre ou le modeleur). Le click sur une ligne affichera le formulaire à côté de la liste.
Il faut que la liste soit pas trop large pour que ça tienne sur l’écran.

.

1 Like