IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques & Frameworks Discussion :

[Struts2] Drag and Drop sur des listes


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut [Struts2] Drag and Drop sur des listes
    Bonjour tout le monde

    Voilà, j'ai un problème avec Struts2 et Dojo Toolkit...
    Je poste le message en espérant ne pas faire un bide cette fois (j'ai d'autres messages sur Struts2 et Dojo non résolus )

    "Mon appli" est donc basée sur Struts2, et j'essaie actuellement de réaliser des listes avec Drag and Drop.
    Le Dojo Toolkit étant intégré à l'application par la lib "struts2-dojo-plugin-2.1.6.jar", je me suis directement mis en quête d'exemples d'utilisation.

    Je suis tombé sur ce site/blog et plus particulièrement cet exemple là je me suis juste dit WAOU !!! Je veux le même à la maison !

    J'ai donc gentillement copié/collé le code fournis pour faire des tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <div class="catalogContainer">
        <h2>Catalog</h2>
        <ul dojoType="dojo.dnd.Source" accept="inStock,outOfStock"
            id="catalogNode" class="container">
            <li class="dojoDndItem inStock" dndType="inStock">Wrist watch</li>
            <li class="dojoDndItem inStock" dndType="inStock">Life jacket</li>
            <li class="dojoDndItem inStock" dndType="inStock">Toy bulldozer</li>
            <li class="dojoDndItem outOfStock" dndType="outOfStock">
              Vintage microphone</li>
            <li class="dojoDndItem outOfStock" dndType="outOfStock">TIE fighter</li>
            <li class="dojoDndItem inStock" dndType="inStock">Apples</li>
            <li class="dojoDndItem inStock" dndType="inStock">Bananas</li>
            <li class="dojoDndItem outOfStock" dndType="outOfStock">Tomatoes</li>
             <li class="dojoDndItem inStock" dndType="inStock">Bread</li>
        </ul>
    </div>
     
    <div class="cartContainer">
        <h2>Cart</h2>
        <ol dojoType="dojo.dnd.Source" accept="inStock"
            id="cartNode" class="container">
        </ol>
    </div>
     
    <div class="wishlistContainer">
        <h2>Wishlist</h2>
        <ol dojoType="dojo.dnd.Source" accept="inStock,outOfStock"
            id="wishlistNode" class="container">
        </ol>
    </div>
    Sans oublier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <script type="text/javascript">
    	dojo.require("dojo.dnd.source"); // dojo.dnd.Source ne marche pas non plus :triste:
    </script>
    Et là c'est le drame... Quand je lance ma page j'ai seulement 3 listes complètement normales. Je veux dire par là que je n'ai pas de Drag'n'Drop, le style je m'en fiche pour l'instant.
    Et pour toute explication ce message dans la Console d'erreurs de Firefox :
    Could not load 'dojo.dnd.Source'; last tried '__package__js'
    http://localhost:9000/mon_appli/stru...struts_dojo.js
    J'ai grand besoin d'aide, j'ai bien regardé la ligne de l'erreur, mais c'est clair comme du jus de boudin.
    Ce tuto m'a tapé dans l'oeil, si quelqu'un m'aide je me à ses pieds...


  2. #2
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut MAJ
    Petite màj, j'ai essayé en remplaçant le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script type="text/javascript">
    	dojo.require("dojo.dnd.source");
    </script>
    par le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script type="text/javascript">
    	dojo.require("dojo.dnd.*");
    </script>
    Du coup je n'ai plus l'erreur mentionnée plus haut dans la console de Firefox, en revanche mes listes sont toujours désespérément non Drag'n'Drop - ables...

  3. #3
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut Avancée
    Bonjour bonjour,

    Si ça peut intéresser quelqu'un, voici comment j'avance, tout en gardant en tête que mon but est de coller à l'exemple suivant.

    Alors j'ai pu constater que la classe dojo.dnd.Source n'existait pas dans le plugin dojo pour struts2 , du moins dans celui que j'utilise, et l'import du Dojo Toolkit depuis les fichiers du site par une balise script n'apporte que des conflits avec les classes embarquées par le plugin.

    Ne m'en demandez pas plus, je ne sais pas comment tout ceci fonctionne

    J'ai en revanche trouvé les classes HtmlDropTarget et HtmlDragSource, qui implémentent le DnD sur les composants UL / OL, LI et DIV (peut-être TR, TD, je ne sais pas), on a donc la possibilité, tout comme avec dojo.dnd.Source, de spécifier un type pour les éléments qui peuvent être déplacés, et un ou plusieurs types d'éléments acceptés par les zones cibles (ou * si on accepte tout).
    Par contre, et à mon grand damne, la propriété copyOnly qui permet de faire du copier/coller de l'élément draggé ne semble pas reconnue, je n'ai donc réussi à faire que du couper/coller.
    La seule parade que j'ai trouvée est de faire une sauvegarde de la liste de départ, pour la re-générer comme à l'origine à la fin du Dnd...

    Voilà un peu de code pour illustrer le tout...

    Page jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <!-- div contenant la liste depuis laquelle on copie les éléments -->
    <div id="catalogContainer" class="catalogContainer">					
    	<fieldset class="encadrer">
    	<legend class="encadrerLegend">Source</legend>
        <div id="cataloglist" class="container" style="height:100px;">
        <ul id="catalogNode" style="height:100px;">
            <li id="1" class="dojoDndItem">Elem 1</li>
            <li id="2" class="dojoDndItem">Elem 2</li>
            <li id="3" class="dojoDndItem">Elem 3</li>
            <li id="4" class="dojoDndItem">Elem 4</li>
            <li id="5" class="dojoDndItem">Elem 5</li>
            <li id="6" class="dojoDndItem">Elem 6</li>
            <li id="7" class="dojoDndItem">Elem 7</li>
            <li id="8" class="dojoDndItem">Elem 8</li>
            <li id="9" class="dojoDndItem">Elem 9</li>
            <li id="10" class="dojoDndItem">Elem 10</li>
        </ul>
        </div>
        </fieldset>
    </div>
     
    <!-- div vide, remplie par copie des éléments de la première liste -->
    <div id="cartContainer" class="cartContainer">				
    	<fieldset class="encadrer">
    	<legend class="encadrerLegend">Cible</legend>
        <div id="cartlist" class="container" style="height: 100px;">
        <ol id="cartNode" style="height:100px;">
        </ol>
        </div>
        </fieldset>
    </div>
     
    <-- script qui va mettre en place le DnD -->
    <script type="text/javascript">
    	initDnd();
    </script>
    Fichier de script js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
     
    // Fonction byId pour raccourcir la récupération d'un élément
    function byId(id){
    	return document.getElementById(id);
    }
     
    var node = null;
    // Liste des éléments sélectionnés, la méthode onSelected a été appellée
    var selectedTab = new Array();
     
    //Détection de l'enfoncement ou relachement de la touche Ctrl (pour la multisélection)
    var isCtrl = false;
    document.onkeyup=function(e) {
        if(e.which == 17) {isCtrl=false;}
    }
    document.onkeydown=function(e){
        if(e.which == 17) {isCtrl=true;}
    }
     
    /* Méthode permettant de redéfinir le style du marqueur par défaut qui s'affiche lorsque l'on peut déposer un élément au dessus ou au dessous d'un autre dans la liste*/
    createCustomDropIndicator = function(element) {
    	var alertLeft , alertWidth ;
    	element.dropIndicator = document.createElement("div");
    	with (element.dropIndicator.style) {
    		position = "absolute";
    		zIndex = 999;
    		if(element.vertical){
    			borderLeftWidth = "2px";
    			borderLeftColor = "#369";
    			borderLeftStyle = "solid";
    			height = dojo.html.getBorderBox(element.domNode).height + "px";
    			top = dojo.html.getAbsolutePosition(element.domNode, true).y + "px";
    		}else{
    			borderTopWidth = "2px";
    			borderTopColor = "#369";
    			borderTopStyle = "solid";
    			width = (dojo.html.getBorderBox(element.domNode).width-50) + "px";
    			left = dojo.html.getAbsolutePosition(element.domNode, true).x + "px";
    		}
    	}
    }
     
    //Fonction initialisant les composants de DnD
    function initDnd(){
    	var x ;	
     
    	// Récupération de la liste source
    	var catalogNode = byId("catalogNode");
    	node = catalogNode.innerHTML;
    	// Création de la zone de DnD acceptant tout élément
    	var catalogTarget = new dojo.dnd.HtmlDropTarget(catalogNode, ["*"]);
    	// Surcharge de la méthode onDropEnd appelée à la fin d'un DnD d'un élément de cette liste
    	catalogTarget.onDropEnd = function(e) {
    		// Restauration de la liste telle qu'elle était à l'origine
    		catalogNode.innerHTML = node ;
    		// Re-création des éléments DnDropables de cette liste et de la liste destinataire (puisqu'elles ont changées)
    		setDradAndDrop(catalogNode, cartNode);
    		// Arrangement de la taille pour la scrollbar
    		setDradAndDropSize();
    		// Appel à la méthode "mère"
    		return dojo.dnd.HtmlDropTarget.prototype.onDropEnd.apply(this, arguments);
        }
    	// Surcharge de la méthode de création du marqueur de DnD
    	catalogTarget.createDropIndicator=function() {
    		// Appel à la fonction créer plus haut
    		createCustomDropIndicator(this);
    	}
     
    	// Idem avec la liste cible
    	var cartNode = byId("cartNode");
    	var cartTarget = new dojo.dnd.HtmlDropTarget(cartNode, ["*"]);
    	cartTarget.onDrop = function(e) {
    		catalogNode.innerHTML = node ;
    		setDradAndDrop(catalogNode, cartNode);
    		setDradAndDropSize();
    	    return dojo.dnd.HtmlDropTarget.prototype.onDrop.apply(this, arguments);
        }
    	cartTarget.createDropIndicator=function() {
    		createCustomDropIndicator(this);
    	}
     
    	// Création des éléments de DnD dans les listes pour la première fois
    	setDradAndDrop(catalogNode, cartNode);
    	// Ajustement de la taille pour la scrollbar pour la première fois
    	setDradAndDropSize();
    }
     
    // Méthode qui récupère tous les éléments des deux listes et les rend DnDropables
    function setDradAndDrop (ul, ul2) {
    	// Récupération des li de la liste source
    	var lis = ul.getElementsByTagName("li");
    	for(x=0; x<lis.length; x++){
    		// Création de l'objet HtmlDragSource
    		var toast = new dojo.dnd.HtmlDragSource(lis[x], "inStock");
    		// Surcharge de la méthode onSelected
    		toast.onSelected = function(e) {
    			// Appel à la méthode définie plus bas
    			dragAndDropSelected(this.dragObject);
    		}
    		// Surcharge de la méthode onDragStart
    		toast.onDragStart = function(e) {
    			// Changement de l'apparence de l'élément
    			this.dragObject.className = "dojoDndCopy" ;
    			// Rétablissement du fonctionnement de base
    		    return dojo.dnd.HtmlDragSource.prototype.onDragStart.apply(this, arguments);
    		}
    		// Surcharge de la méthode onDragEnd
    		toast.onDragEnd = function(e) {
    			// Re-générer les élements de DnD des liste qui viennent d'être modifiées par un DnD
    			setDradAndDrop (ul, ul2);
    			// Désélectionner tous les éléments
    			for(i=0 ; i<selectedTab.length ; i++) {
    				if (selectedTab[i]!=null) {
    					selectedTab[i].className = "dojoDndItem" ;
    				}
    			}
    			selectedTab = new Array();
    		    return dojo.dnd.HtmlDragSource.prototype.onDragEnd.apply(this, arguments);
    		}
    	}
    	// Idem pour la liste cible
    	if (ul2 != null) {
    		var lis2 = ul2.getElementsByTagName("li");
    		for(x=0; x<lis2.length; x++){
    			var toast2 = new dojo.dnd.HtmlDragSource(lis2[x], "inStock");
    			toast2.onSelected = function(e) {
    				dragAndDropSelected(this.dragObject);
    			}
    			toast2.onDragStart = function(e) {
    				this.dragObject.className = "dojoDndMove" ;
    			    return dojo.dnd.HtmlDragSource.prototype.onDragStart.apply(this, arguments);
    			}
    			toast2.onDragEnd = function(e) {
    				this.dragObject.className = "dojoDndItem" ;
    			    return dojo.dnd.HtmlDragSource.prototype.onDragEnd.apply(this, arguments);
    			}
    		}
    	}
    }
     
    // Gestion des éléments sélectionnés
    // Si la touche Ctrl est enfoncée, il s'agit d'une multi-sélection, sinon
    // c'est un élément unique qui est sélectionné
    function dragAndDropSelected (dragObject) {
    	var i;
    	// Si la touche Ctrl n'est pas enfoncée ... sinon ...
    	if (!isCtrl) {
    		if (selectedTab.length!=0) {
    			// Si la liste des éléments sélectionné n'est pas vide
    			// On rétabli le style afin que ces éléments ne soient plus marqués
    			for(i=0 ; i<selectedTab.length ; i++) {
    				if (selectedTab[i]!=null) {
    					selectedTab[i].className = "dojoDndItem" ;
    				}
    			}
    			// On vide cette liste
    			selectedTab = new Array();
    		}
    		// Marqueur de sélection pour un seul élément dans le tableau
    		selectedTab[0] = "UNIQ" ;
    		// Marquer le style de l'élément sélectionné
    		dragObject.className = "dojoDndItemSelected" ;
    		// Ajouter cet élément à la liste
    		selectedTab[1] = dragObject ;
    	} else {
    		// Si le liste contenait une sélection unique (pas une multi-sélection)
    		// On désélectionne cet élément
    		if (selectedTab[0]=="UNIQ") {
    			for(i=0 ; i<selectedTab.length ; i++) {
    				selectedTab[1].className = "dojoDndItem" ;
    			}
    			selectedTab = new Array();
    		}
    		// On marque l'élément présent comme sélectionné
    		dragObject.className = "dojoDndItemSelected" ;
    		// On ajoute l'élément sélectionné présentement à la fin de la liste
    		selectedTab[selectedTab.length] = dragObject ;
    	}
    }
     
    // Ajustement de la taille de la liste dans les composants parents pour faire apparaitre une scrollbar
    function setDradAndDropSize () {
    	// Récupération de la taille disponible dans l'écran pour l'affichage de la liste
    	var tailleTot = getTailleTotal() ;
    	var divCatalogContainer = byId("catalogContainer");
    	var divCartContainer = byId("cartContainer");
    	var divCatalogList = byId("cataloglist");
    	var divCartList = byId("cartlist");
    	var catalogNode = byId("catalogNode");
    	var cartNode = byId("cartNode");
    	// Récupération de la hauteur de la liste en comptant son nombre d'éléments multiplié par leur hauteur
    	var hauteur = (catalogNode.getElementsByTagName("li").length*24);
    	// Si cette taille est inférieure à la taille disponible, alors prend tout l'espace disponible afin de pouvoir DnD "dans le vide"
    	if (hauteur<tailleTot-15){
    		hauteur = tailleTot-45;
    	}
    	catalogNode.style.height = hauteur+"px";
    	// Idem
    	hauteur = (cartNode.getElementsByTagName("li").length*24);
    	if (hauteur<tailleTot-15){
    		hauteur = tailleTot-55;
    	}
    	cartNode.style.height = hauteur+"px";
    	// Ajustement de la taille des contenants, là c'est à chacun de tester
    	divCatalogContainer.style.height=(tailleTot+15) + "px";
    	divCartContainer.style.height=(tailleTot+15) + "px";
    	divCatalogList.style.height=(tailleTot-15) + "px";
    	divCartList.style.height=(tailleTot-15) + "px";
    }
    Le fichier css:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /*Style losqu'un élément est en train d'être copié*/
    .dojoDndMove 			{height: 18px;background-image: url("../ressources/images/dndMove.png"); background-repeat: no-repeat; font-size:100%; padding:3px; padding-left: 20px;}
    /*Style losqu'un élément est en train d'être déplacé*/
    .dojoDndCopy 			{height: 18px;background-image: url("../ressources/images/dndCopy.png"); background-repeat: no-repeat; font-size:100%; padding:3px; padding-left: 20px;}
    /*Style losqu'un élément n'est pas sélectionné*/
    .dojoDndItem 			{padding:3px;height: 18px;}
    /*Style losqu'un élément est survolé*/
    .dojoDndItem:hover 		{background-color: #ededed; cursor:pointer;height: 18px;}
    /*Style losqu'un élément est sélectionné*/
    .dojoDndItemSelected 	{background-color: #5bbdea; color: #444; padding:3px;height: 18px;}
     
    /*Contenants*/
    .container 				{overflow-y:auto;}
    .catalogContainer, .cartContainer {position: relative;float: left;margin-right: 20px;width: 233px;}
    #catalogNode 			{cursor: default;list-style: none;}
    #cartNode 				{cursor: default;/*padding: 1em 2em;*/}
    Bon j'avoue que ça fait pas mal de code à déchiffrer, d'autant que je ne suis pas expert en js, loin de là.
    Plus d'infos ici et ici (fin de la page).

    Le fonctionnement général de ceci :
    * Un liste d'éléments est pré remplie.
    * De cette liste, on peut copier des éléments par DnD vers une seconde liste.
    * La première liste sera régénérée comme à l'origine, c'est pour cela qu'on a une copie.
    * La copie d'un élément de la liste source vers la liste source est donc accepté, mais sans effet.
    * Le déplacement d'un élément de la liste cible vers la liste source aura pour effet de supprimer l'élément.
    * Le déplacement d'un élément de la liste cible vers la liste cible est autorisé, l'ordre des éléments sera changé.
    * On peut sélectionner plusieurs éléments en maintenant la touche Ctrl enfoncée.

    Petits bémols :
    * La multi-sélection agit parfois de façon un peu étrange, quelques fois l'ordre de sélection est important, quelques fois il n'est pas pris en compte, je n'ai pas réussi à déterminer d'où ça venait.
    * L'avatar affiché lorsqu'un élément est en déplacement est beaucoup plus simpliste que dans l'exemple dont je me suis inspiré, dans la mesure où je n'arrive à afficher qu'une petite image en fond...

    Si vous avez des remarques, des conseils, je suis toujours preneur
    M'est avis que tout ce truc n'est bien optimisé, mais bon en attendant ça répond à un besoin urgent alors


  4. #4
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Je crois que ton problème vient simplement du fait que le plugin Dojo que tu utilises est celui relatif à la v0.4 de Dojo alors que ta démo est faite avec une 1.2...

    ERE

  5. #5
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    Je me doutais effectivement qu'il s'agissait d'un problème de version, seulement sur ce projet je suis stagiaire, et l'archi du projet a été mise en place par un autre développeur avant que je n'arrive.

    La lib que nous utilisons est struts2-dojo-plugin-2.1.6.jar, j'essaie de trouver des infos dessus mais sur le site d'apache struts2 ou de dojo toolkit je n'ai pas trouvé grand chose.

    Je vais aller voir du côté du forum Struts2, si quelqu'un à un tuyau sur une version de ce plugin embarquant une version plus récente de Dojo mais j'ai peu d'espoir.
    Si j'en crois Jérôme Lafosse dans Struts 2 - Le framework de développement d'applications Java EE (eni Editions) :
    ..., la version de Dojo présente dans le plug-in est une ancienne version et il n'est pas possible de mettre à jour cette librairie. De même, cette librairie basée sur la version 0.4 de Dojo et particulièrement lente. Les concepteurs de Struts précisent d'ailleurs que l'utilisation du plug-in Dojo pour Struts supérieur à 2.1 est dépréciée et que la maintenance n'est plus supportée pour cette librairie. Les développeurs Struts travaillent actuellement sur un plug-in basé sur la librairie JavaScript JQuery, mais précisent que les développeurs peuvent utiliser n'importe quel framework JavaScript avec Struts.
    Ça m'arrange pas tout ça.

  6. #6
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Citation Envoyé par arnaud.tlse Voir le message
    Bonjour,

    Merci pour ta réponse.
    Je me doutais effectivement qu'il s'agissait d'un problème de version, seulement sur ce projet je suis stagiaire, et l'archi du projet a été mise en place par un autre développeur avant que je n'arrive.

    La lib que nous utilisons est struts2-dojo-plugin-2.1.6.jar, j'essaie de trouver des infos dessus mais sur le site d'apache struts2 ou de dojo toolkit je n'ai pas trouvé grand chose.

    Je vais aller voir du côté du forum Struts2, si quelqu'un à un tuyau sur une version de ce plugin embarquant une version plus récente de Dojo mais j'ai peu d'espoir.
    Si j'en crois Jérôme Lafosse dans Struts 2 - Le framework de développement d'applications Java EE (eni Editions) :


    Ça m'arrange pas tout ça.
    A ce rythme là on va vite tous faire du JQuery...
    Déjà qu'on fait un max de Spring... lequel utilise plutôt Dojo ! Va comprendre quelque chose !

    ERE

  7. #7
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    En parlant de jQuery, j'ai posté sur le forum dédié, et j'ai eu confirmation que le DnD comme celui que j'essaie de "refaire" est uniquement sur un élément à la fois, donc pas de multi-sélection...

    Bon de mon côté j'ai repris mon propre code, j'ai viré ce qui ne servait à rien et j'ai corrigé l'histoire de la multi-sélection qui n'en faisait qu'à sa tête.
    Pour rappel :
    Admettons que j'ai une liste chronologique 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 d'éléments (1, 2, ..., 10 étant les id).

    En sélectionnant dans l'ordre 5, 6, 7, 4, 1 j'avais deux cas de figure :
    * Si je drop au sommet de la liste, j'obtiens 5, 6, 7, 4, 1 (ordre de sélection conservé)
    * Si je drop dans ou en bas de la liste, j'obtiens 1, 4, 7, 6, 5 (ordre de sélection inversé).

    Maintenant, quel que soit l'endroit où j'effectue mon drop, j'obtiens 1, 4, 5, 6, 7.
    L'ordre de sélection n'est pas conservé, et les éléments sont toujours ordonnés de façon chronologique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    // Les fonctions qui ont changées
    function initDnd(){
    	var x ;
     
    	var catalogNode = byId("catalogNode");
    	node = catalogNode.innerHTML;
    	var catalogTarget = new dojo.dnd.HtmlDropTarget(catalogNode, ["*"]);
    	catalogTarget.onDropEnd = function(e) {
    		catalogNode.innerHTML = node ;
    		setDradAndDropSize();
    		return dojo.dnd.HtmlDropTarget.prototype.onDropEnd.apply(this, arguments);
        }
    	catalogTarget.createDropIndicator=function() {
    		createCustomDropIndicator(this);
    	}
     
    	var cartNode = byId("cartNode");
    	target = cartNode ;
    	var cartTarget = new dojo.dnd.HtmlDropTarget(cartNode, ["*"]);
    	cartTarget.onDrop = function(e) {
    		catalogNode.innerHTML = node ;
    		setDradAndDropSize();
    	    return dojo.dnd.HtmlDropTarget.prototype.onDrop.apply(this, arguments);
        }
    	cartTarget.createDropIndicator=function() {
    		createCustomDropIndicator(this);
    	}
    	setDradAndDrop(catalogNode, cartNode);
    	setDradAndDropSize();
    }
     
    function setDradAndDrop (ul, ul2) {
    	var lis = ul.getElementsByTagName("li");
    	for(x=0; x<lis.length; x++){
    		var toast = new dojo.dnd.HtmlDragSource(lis[x], "inStock");
    		toast.onSelected = function(e) {
    			dragAndDropSelected(this.dragObject);
    		}
    		toast.onDragStart = function(e) {
    			this.dragObject.className = "dojoDndCopy" ;
    		    return dojo.dnd.HtmlDragSource.prototype.onDragStart.apply(this, arguments);
    		}
    		toast.onDragEnd = function(e) {
    			if(this.dragObject==selectedTab[selectedTab.length-1]) {
    				setDradAndDrop (ul, ul2);
    				selectedTab = new Array();
    			}
    		}
    	}
    	if (ul2 != null) {
    		var lis2 = ul2.getElementsByTagName("li");
    		var sort = new Array();
    		for(x=0; x<lis2.length; x++){
    			if(lis2[x].className=="dojoDndCopy"){
    				sort[sort.length] = lis2[x];
    			}
    		}
    		sort = fctTriABulle(sort);
    		for(x=0 , y=0 ; x<lis2.length && y<sort.length ; x++){
    			if (lis2[x].className=="dojoDndCopy"){
    				sort[y].className="dojoDndItem";
    				ul2.insertBefore(sort[y],lis2[x]);
    				y++;
    			}
    		}
    	}
    }
     
    // Un nouvelle
    function fctTriABulle(tab)
    {
    	var temp;
    	var triABulle = new Array();
    	for(y=0;y<tab.length;y++) {
    		triABulle[y] = tab[y];
    	}
    	for(j=0;j<triABulle.length-1;j++)
    	{
    		for(k=(j+1);k<triABulle.length;k++)
    		{
    			if(parseInt(triABulle[j].id)>parseInt(triABulle[k].id))
    			{
    				temp = triABulle[j];
    				triABulle[j]=triABulle[k];
    				triABulle[k]=temp;
    			}
    		}
    	}
    	return triABulle;
    }
    Voilà bon je poste au cas où ça puisse aider quelqu'un.

    J'ai toujours le soucis de l'avatar durant le drag qui n'est pas fameux, mais bon, je m'en contenterai pour l'instant .


  8. #8
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Re,

    Pas de chance de devoir trainer une vieille version alors que tant de progrès ont été réalisés par la suite.
    Par contre pourquoi utilises tu ta propre fonction de tri alors qu'il existe une fonction native sur la class Array de JS, et qui sera bien plus efficace ?

    ERE

  9. #9
    Membre confirmé Avatar de arnaud.tlse
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 115
    Par défaut
    'Soir !

    Citation Envoyé par emmanuel.remy Voir le message
    Pas de chance de devoir trainer une vieille version alors que tant de progrès ont été réalisés par la suite.
    Effectivement, je retourne sans arrêt sur la page d'exemple donnée plus haut pour voir ce que je n'arrive pas à reproduire

    Citation Envoyé par emmanuel.remy Voir le message
    Par contre pourquoi utilises tu ta propre fonction de tri alors qu'il existe une fonction native sur la class Array de JS, et qui sera bien plus efficace ?
    Tout simplement parce que je ne savais pas qu'il existait une telle fonction .
    Je ne fais du JS que depuis quelques semaines, je tâtonne, la seule fonction de trie que je connaisse est sort() mais je ne sais pas si on peut l'utiliser avec des objets ?
    J'ai d'abord essayé en mettant dans mon tableau les id des objets, mais même avec un parseInt(id) avant l'insertion, il me renvoyait toujours quelque chose du style 1 | 10 | 100 | 11 | 12 | 2 | 3 | 30 | etc...

    Si t'as un tuyau je suis preneur

  10. #10
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    La fonction sort de l'objet Array accepte un paramètre qui est simplement une fonction de callback qui compare deux éléments entre eux et renvoie 0 si ils sont égaux, <0 si le premier est plus petit que le second et >0 sinon.

    Si tu as besoin de plus d'info, regarde ici par exemple.

    ERE

Discussions similaires

  1. Drag and drop sur une PictureBox
    Par abdiouldbody dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/06/2009, 15h55
  2. drag and drop sur une listBox?
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 30/09/2006, 10h27
  3. Drag and drop sur du text ?
    Par isa150183 dans le forum JSF
    Réponses: 2
    Dernier message: 05/07/2006, 06h28
  4. [FLASH MX2004] Drag and drop entre deux List
    Par aldo-tlse dans le forum Flash
    Réponses: 15
    Dernier message: 24/09/2005, 01h10
  5. Drag and drop sur un JTree
    Par tomca dans le forum Composants
    Réponses: 4
    Dernier message: 02/08/2005, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo