Dnd d'un arbre vers un container
Bonjour,
Je travail sur le drag and drop de feuille d'un arbre vers un container (un simple dojo.dnd.source).
Le drag and drop fonctionne tres bien mais j'obtiens dans mon container, un div ayant le même visuel que celui dans l'arbre (donc avec les icones genre la barre etc ...)
Je pensais supprimer le div issu du drag and drop et le remplacer par un item construit automatiquement mais je n'arrive pas à utiliser la fonction delItem de dojo.dnd.Source.
le code que j'essaye de stabiliser :
Code:
1 2 3 4 5 6 7
| dojo.connect(shopping_list_items_list, "onDndDrop", function(source, nodes, copy, target){
if (target==shopping_list_items_list) {
nodes.forEach(function(node){
shopping_list_items_list.delItem(node.id);
});
}
}); |
J'ai regardé dans la map du dojo.dnd.source mais je n'arrive pas à trouver un objet qui pourrais correspondre.
Est ce que quelqu'un aurais un début de piste, je suis perdu
D'avance merci
Guillaume
fonction creator à appliquer
Re,
J'adore ton
Code:
1 2 3 4
|
checkAcceptance: function(target, source) {
return true;
} |
Cela a le mérite de la brièveté et simplifie l'utilisation de l'attribut accept :mrgreen:
Ton souci provient de ce que je t'écrivais précédemment: quand tu fais le drop, dojo doit copier l'élément précédent. Or il va le faire selon le type de la source (un div donne une div, une ul donne un li, etc...). Pour s'affranchir de ça, il faut redéfinir la fonction "creator". C'est cette fonction qui est appelée pour créer le DOM lié au drop ou qui crée l'avatar au moment du drag... Dans ton cas cela pourrait donner quelque chose comme:
Code:
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
|
shopping_list_items_list = new dojo.dnd.Source("shopping_list_items_list",{
selfAccept: "false",
checkItemAcceptance: function(target, source) {
console.log("Check acceptance ",source);
return true;
},
checkAcceptance: function(target, source) {
return true;
},
creator: function(item, hint) {
var texte;
if (hint!= "avatar") {
//XXXXXXX l'attribut de l'item du store qu'on souhaite afficher
texte = shopping_list_store.getValue(item.item, "XXXXXXX") ;
}
else {
//en cas de déplacement d'un élément de cette source
//note: en cas de copie, il faudrait gérer plus précisément le type de donnée de item
texte= "Avatar dédié: " + item;
}
//créons un paragraphe plutôt que le div du treeNode
var p = dojo.create("p",{innerHTML: texte});
//un petit coup de rouge (hips) pour s'assurer qu'on ne triche pas !
dojo.style(p, {color:"red"});
//et on renvoie notre noeud et le type de données associée
return {node: p, data: texte, type: ["Text"]};
}
}); |
Je viens de faire un essai rapide et cela fonctionne bien, mais faudra peut-être que tu ajustes car le vendredi soir je ne suis plus trop étanche !
:chin:
Pour info, dans ce cas l'erreur à ne pas faire c'est de remplacer le onDndDrop (je sais ,tu as fait un connect ;) , mais c'est juste pour info), car alors on rend le dnd instable, faute de mise à jour des variables qu'il gère.
:chin:
ERE