[edit] Tu n'étais pas loin Nessper Tu as failli me griller le temps que j'écrive mon post :O En fait il ne te manquait pas grand-chose, le truc c'est que ce sont les deux Sortable qu'il faut détruire et recréer, car sinon les objets Droppable et Draggable ne sont pas correctement réinitialisés. [/edit]
Ce n'est pas aussi simple Loetheri, le composant Sortable n'est que peu manipulable au runtime, et «n'autoriser le changement que si…» n'est pas aussi facile à faire qu'à dire La question est loin d'être triviale comme tu sembles le sous-entendre…
Enfin, ceci mis à part j'ai une solution à te proposer Nessper :
Ce n'est pas aussi simple Loetheri, le composant Sortable n'est que peu manipulable au runtime, et «n'autoriser le changement que si…» n'est pas aussi facile à faire qu'à dire La question est loin d'être triviale comme tu sembles le sous-entendre…
Enfin, ceci mis à part j'ai une solution à te proposer Nessper :
Code PHP :
<?php
var sortablesState = 0;
function initSortables() {
// state = 0 => interdit
// state = 1 => autorisé
var nbActive = $('firstlist').immediateDescendants().size();
// si interdit et moins de 10 éléments, alors autoriser
if (sortablesState == 0 && nbActive < 10) {
// supprimer les Sortables s'il y en a
if (Sortable.options("firstlist")) {
Sortable.destroy("firstlist");
}
if (Sortable.options("secondlist")) {
Sortable.destroy("secondlist");
}
// Créer les sortables en autorisant les mouvements des deux côtés
Sortable.create("firstlist",
{dropOnEmpty:true,containment:["firstlist","secondlist"], constraint:false, onUpdate:initSortables});
Sortable.create("secondlist",
{dropOnEmpty:true,handle:'handle',containment:["firstlist","secondlist"],constraint:false});
// Passer l'état à "autorisé"
sortablesState = 1;
}
// si autorisé et au moins 10 éléments, alors interdire
else if (sortablesState == 1 && nbActive >= 10) {
// Supprimer les Sortable
Sortable.destroy("firstlist");
Sortable.destroy("secondlist");
// Créer les Sortable en limitant les mouvements
Sortable.create("firstlist",
{dropOnEmpty:true, containment:["firstlist"], constraint:false, onUpdate:initSortables});
Sortable.create("secondlist",
{dropOnEmpty:true, containment:["firstlist","secondlist"], constraint:false});
// Passer à l'état "interdit"
sortablesState = 0;
}
}
// Initialisation des sortables : on appelle la fonction générique
initSortables();
Si tu as besoin d'explications, l'idée c'est :
- Une fonction d'initialisation générique.
- Une variable pour connaître l'état des «Sortable» (qui signifie en gros «a-t'on le droit d'en ajouter vers la première liste ?»).
Si autorisé, et que liste1 a 10 éléments ou plus : interdire.
Si interdit, et que liste1 a moins de 10 éléments : autoriser.
«interdire» =
- Supprimer les «Sortable» actuels.
- Créer les «Sortable» en n'autorisant que le mouvement de liste1 vers liste1 ou liste2 (pas de liste2 vers liste1).
- Passer l'état à «autorisé»
«autoriser» =
- Supprimer les «Sortable» actuels s'il y en a déjà.
- Créer les «Sortable» en autorisant tous les mouvements.
- Passer l'état à «interdit».