Skip to main content
Liphou
Inspiring
March 15, 2022
Question

[JS] Dialog

  • March 15, 2022
  • 1 reply
  • 621 views

Hello everyone,

Here is my problem, I use a window that asks to choose an action (“Cancel”, “Update”, “New Set” and “To follow”).

If I click on one of these buttons a closing code is transmitted except the “New Set” button which opens another window and if I click on “apply”, it retains the new Name and 4 until then OK BUT if I do “cancel” in this window it is always 4 which is returned even if I click on “update”.

How to clear code?

I don't really understand the reaction.

Thanks for your help or if you have another idea. thank you

/---------------------

Bonjour à tous, Voici mon problème, j'utilise une fenetre qui demande de choisir une action («Annul», «Mise à jour», «Nouveau Set» et «Pour suivre»).
Si je clic sur un de ces bouttons un code de fermeture est transmi sauf le boutton «Nouveau Set» qui ouvre une aure fenêtre et si je clic sur «applique», il reteun le nouveau Nom et 4 jusque là, OK MAIS si je fais «annul» dans cette fenêtre c'est toujour 4 qui est retourné même si je clic sur «mise à jour».

Comment effacé se code?
Je ne comprend pas trop la reaction.

Merci pour votre aide ou si vous avez une autre idée. merci

 

var o = {};

o.leContenuDuFichier = [["Name01","test1.01", "test1.02", "test1.03"],["Name02","test2.01", "test2.02", "test2.03"],["Name03","test3.01", "test3.02", "test3.03"]];
$.writeln( modif_set ("Name02"));


function modif_set (le_set_name) {
    // $.writeln ("modif_set : " + le_set_name);
    
                 var dialog = new Window("dialog"); 
                 dialog.text = "Sauvegardre set du JOB \""+ le_set_name + "\"."; 
                 dialog.preferredSize.width = 500; 
                 dialog.orientation = "column"; 
                 dialog.alignChildren = ["left","top"]; 
                 dialog.spacing = 10; 
                 dialog.margins = 20; 
 
             var updreg_set = dialog.add("statictext", undefined, undefined, {name: "updreg_set"}); 
                 updreg_set.text = "Attention le set du JOB \""+ le_set_name  +"\" est modifie."; 
 
             // GROUP1
             // ======
             var group1 = dialog.add("group", undefined, {name: "group1"}); 
                 group1.preferredSize.width = 480; 
                 group1.orientation = "row"; 
                 group1.alignChildren = ["right","center"]; 
                 group1.spacing = 10; 
                 group1.margins = [0,13,0,0]; 
 
             var cancel = group1.add("button", undefined, undefined, {name: "button_Annul"}); 
                 cancel.text = "Annul"; 
 
             var button1 = group1.add("button", undefined, undefined, {name: "button1"}); 
                 button1.text = "Mise à jour"; 
 
             var button2 = group1.add("button", undefined, undefined, {name: "button2"}); 
                 button2.text = "Nouveau Set"; 
 
             var ok = group1.add("button", undefined, undefined, {name: "ok"}); 
                 ok.text = "Pour suivre"; 
 
             // Add button functions
             
             cancel.onClick = function() { // Annul
                
                 dialog.close(2);
                 
             }
             button1.onClick = function() { // mise à jour
                dialog.close(3);
 
                 
             }
             button2.onClick = function() { // Nouveau Set
                 dialog.close(4);
                 
 
                 o.new_Name_Set = new_set(le_set_name);
                // tmp_local_modif_set = 4;
 
                 
             }
             ok.onClick = function() { // Pour suivre
                 //alert("Les modification du Set " + le_set_name + " seront perdu.")
                 dialog.close(1);
               }
             
 
 
             return(dialog.show());
 
 
             
 }



function new_set(ancien_name){
    
    // DIALOG
    // ======
    var dialog_New = new Window("dialog"); 
    dialog_New.text = "New Set."; 
    dialog_New.orientation = "column"; 
    dialog_New.alignChildren = ["left","top"]; 
    dialog_New.spacing = 10; 
    dialog_New.margins = 16; 

    // INFO_NEW_SET
    // ============
    var info_new_set = dialog_New.add("group", undefined, {name: "info_new_set"}); 
    info_new_set.orientation = "column"; 
    info_new_set.alignChildren = ["left","center"]; 
    info_new_set.spacing = 10; 
    info_new_set.margins = 0; 

    var statictext1 = info_new_set.add("statictext", undefined, undefined, {name: "statictext1"}); 
    statictext1.text = "Entre le nouveau nom du set :"; 

    var name_New_Set = info_new_set.add('edittext {properties: {name: "name_New_Set"}}'); 
    name_New_Set.text = ancien_name + "_new"; 
    name_New_Set.preferredSize.width = 200; 

    // LES_BOUTTON
    // ===========
    var les_boutton = dialog_New.add("group", undefined, {name: "les_boutton"}); 
    les_boutton.preferredSize.width = 200; 
    les_boutton.orientation = "row"; 
    les_boutton.alignChildren = ["right","center"]; 
    les_boutton.spacing = 10; 
    les_boutton.margins = 9; 

    var boute02 = les_boutton.add("button", undefined, undefined, {name: "cancel"}); 
        boute02.text = "Annul"; 

    var boute01 = les_boutton.add("button", undefined, undefined, {name: "OK"}); 
        boute01.text = "applique";

        name_New_Set.onChanging = function () {
            for (var i = 0; i < o.leContenuDuFichier.length; i++) {

                    if ( name_New_Set.text == o.leContenuDuFichier[i][0]) { // problème ici
                        alert("Le nom utilisé existe déjà !");
                        name_New_Set.text = ancien_name + "_new";
                    }
            
            }
            
    }
    

    
    if (dialog_New.show() == 4) {
    
            return(name_New_Set.text);
         //$.writeln("name_New_Set.text : " + name_New_Set.text);
     } else {
            modif_set (ancien_name);
     };


} 

 

 

 

 
 
This topic has been closed for replies.

1 reply

Charu Rajput
Community Expert
Community Expert
March 15, 2022

Hi,

Your question is little unclear to me. Are you trying to update value Name02 on first window by the new value that you enter inside the new window?

Best regards
Liphou
LiphouAuthor
Inspiring
March 15, 2022

c'est compliqué d'expliqué ...

voici le fenêtre de base :

 

si je clic sur "mise à jour" :

 

 

 

$.writeln( modif_set ("Name02"));

retoure "3" la OK mais si je fais un aller retoure sur cette fenêtre :

 

 

 

 et si je retape sur :

 Et là ,

$.writeln( modif_set ("Name02"));

 

 retoure "4", c'est pas juste ....

 

 
Marc Autret
Legend
March 17, 2022

Bonjour @Liphou 

 

Une clé pour progresser consisterait à mieux documenter les fonctions (contexte, arguments attendus, valeurs de retour) parce qu'ici la logique est vraiment difficile à suivre. De ce que j'ai compris, on a affaire à une fonction principale qui ouvre l'interface et devrait retourner un choix parmi 4 options. Mais le cas échéant, cette fonction appelle une routine connexe (elle-même interfacée) permettant à l'utilisateur de spécifier un nouveau nom.

 

Plusieurs problèmes immédiats :

  • d'abord les fonctions sont imbriquées : modif_set invoque new_set, qui invoque modif_set, etc. ;
  • ensuite dialog_New.show() ne renvoie jamais 4, si bien que la première condition à la fin de new_set n'est jamais satisfaite ;
  • la valeur de retour de new_set est en fait undefined (vu que `return name_New_Set.text` n'est jamais traversé) ;
  • les gestionnaires d'événements (du genre onClick, onChange…) sont des fonctions spéciales qui réclament un soin particulier, notamment quant à la portée des identifiants ; pour des raisons techniques, on recommande d'y minimiser les dépendances à des variables externes, et même de les détacher du code principal (v. mon exemple plus bas) ;
  • enfin, dernier point litigieux, le gestionnaire button2.onClick (dans modif_set) ferme le dialogue auquel il appartient — dialog.close(4) — puis appelle new_set(le_set_name). C'est dangereux parce que cet appel se produit depuis un composant (button2) qui vient juste d'être « invalidé » par la fermeture du dialogue. Risque sérieux de fuite mémoire, sans parler d'autres bugs induits plus difficiles à tracer.

 

Bref, pour y voir plus clair, il faudrait faire un peu le ménage dans ces interactions fonctionnelles. Un dialogue est modal. Il s'ouvre, gère les événements utilisateurs, et se ferme. Il peut éventuellement déclencher l'ouverture d'un sous-dialogue (lui-même modal) qui aura sa propre boucle d'événements. Du moins c'est le scénario ordinaire. Métaphoriquement, tu peux ouvrir une parenthèse dans une parenthèse, du moment que tu fermes la parenthèse intérieure avant de fermer la parenthèse extérieure.


Il semble (?) que tu cherches à procéder autrement. Pourquoi pas, mais à condition de bien préciser les conditions de sortie. Par exemple, si tu souhaites que la fermeture du sous-dialogue (Nouveau nom) ferme également le dialogue principal tout en te permettant de récupérer la bonne valeur de retour (4), alors il faut aussi décider de ce qui se passe quand l'utilisateur annule le sous-dialogue. Si je suis la logique de ton programme, je suppose qu'il faudrait alors renvoyer la valeur 2 (qui correspond à la valeur d'annulation du dialogue principal).

 

Il y a plusieurs façons de traiter la question, tout dépend de l'objectif recherché dans ton flux de travail. Voici un schéma possible. Je ne sais pas s'il correspond à ton idée, mais il résout les problèmes que j'ai signalés plus haut :

 

var data = {};
data.fileContent =
[
  [ "Name01", "test1.01", "test1.02", "test1.03" ],
  [ "Name02", "test2.01", "test2.02", "test2.03" ],
  [ "Name03", "test3.01", "test3.02", "test3.03" ]
];

function mainDial(/*str*/setName,  dlg,u)
//----------------------------------
// Main dialog.
// => 1 [Continue] | 2 [Cancel] | 3 [Update] | 4 [NewSet]
{
  dlg = new Window('dialog');

  with( dlg )
  {
    text = "Sauver \"" + setName + "\".";
    orientation = "column"; // etc
    add('statictext', u, "Attention : set \"" + setName  + "\" modifié.");
    addEventListener('mousedown', callee.BTN_CLICK);
  }

  with( dlg.add('group') )
  {
    orientation = "row"; // etc
    add('button', u, "Annulation",  { retDlg:2 });
    add('button', u, "Mise à jour", { retDlg:3 });
    add('button', u, "Nouveau Set", { retDlg:4, arg:setName }); // OK->4 ; Cancel->2
    add('button', u, "Poursuivre",  { retDlg:1 });
  }

  return dlg.show();
}

mainDial.BTN_CLICK = function onClick(/*MouseEvent*/ev,  pp,r,t)
//----------------------------------
// Button click event manager [mainDial.]
// this :: Window
// => undef
{
  pp = ev.target.properties||0;
  r = pp.retDlg;
  if( !r ) return; // Extra click.
  
  if( 4 == r )
  {
    // Special case => sub-dialog.
    t = newSetDial(pp.arg);
    t ? (data.new_Name_Set=t) : (r=2);
  }
  
  this.close(r);
};

function newSetDial(/*str*/baseName,  dlg,defName,edi,u)
//----------------------------------
// Extra dialog (called from mainDial.BTN_CLICK.)
// => str [New-Name-OK] | '' [KO]
{
  dlg = new Window('dialog');
  defName = baseName + "_new";

  with( dlg )
  {
    text = "New Set.";
    orientation = "column";
  }

  // Text field.
  with( dlg.add('group') )
  {
    orientation = "column"; // etc
    add('statictext', u, "Nouveau nom :");
    with( edi=add('edittext', u, defName, { def:defName }) )
    {
      preferredSize = [200,-1];
      addEventListener('change', callee.EDI_CHANGE);
    }
  }
  
  // Buttons.
  with( dlg.add('group') )
  {
    orientation = "row"; // etc
    add('button', u, "Annuler",   {name: 'cancel'}); // => 2 (auto)
    add('button', u, "Appliquer", {name: 'ok'});   // => 1 (auto)
  }
  
  return 1==dlg.show() ? edi.text : '';
}

newSetDial.EDI_CHANGE = function onChange(/*Event*/ev,  t,a,i)
//----------------------------------
// EditText event manager [newSetDial.]
// this :: EditText
// => undef
{
  t = this.text.toLowerCase();
  a = data.fileContent; // str[][]
  for( i=a.length ; i-- && a[i][0].toLowerCase() != t ; );
  if( 0 <= i )
  {
    alert("Nom déjà utilisé.");
    this.text = this.properties.def; // reset to default.
  }
};


var r = mainDial("Name02");
$.writeln( "Code de retour: " + r );
4==r && $.writeln( "New name set: " + data.new_Name_Set );

 

Marc