Changeset 91527 in spip-zone for _plugins_/plan


Ignore:
Timestamp:
Aug 28, 2015, 10:26:13 PM (6 years ago)
Author:
marcimat@…
Message:

Permettre de déplacer des objets depuis la page plan (si on est administrateur).

On recharge la page après chaque déplacement (et cela recharge le script jstree).
C'est un peu lourd, mais on est sûr d'avoir toutes les données à jour comme cela.

Location:
_plugins_/plan/trunk
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/plan/trunk/paquet.xml

    r91521 r91527  
    22        prefix="plan"
    33        categorie="navigation"
    4         version="1.0.1"
     4        version="1.0.2"
    55        etat="test"
    66        compatibilite="[3.0.0;3.1.*]"
  • _plugins_/plan/trunk/plan_fonctions.php

    r91524 r91527  
    2020**/
    2121function plan_limiter_listes() {
    22         return defined('_PLAN_LIMITER_LISTES') ? _PLAN_LIMITER_LISTES : 50;
     22        return defined('_PLAN_LIMITER_LISTES') ? _PLAN_LIMITER_LISTES : 10;
    2323}
    2424
  • _plugins_/plan/trunk/prive/squelettes/contenu/plan.html

    r91521 r91527  
     1
     2<script type="text/javascript">
     3(function($){
     4$(document).ready(function(){
     5
     6        var $mytree = $('body.plan #contenu #racine');
     7        var $mytree_source = $mytree.clone();
     8        // $mytree.after($mytree_source);
     9
     10        $mytree.jstree({
     11                "plugins" : [ "types", "search", "state"[(#AUTORISER{configurer}|oui), "dnd"] ],
     12                "core" : {
     13                        "animation" : 0,
     14                        "check_callback" : true,
     15                        "data" : function (node, cb) {
     16                                // on est obligé de tout charger en ajax (même la racine)
     17                                // donc on charge 1 fois la racine avec le html d'origine
     18                                if (node.id === '#') {
     19                                        cb($mytree_source.html());
     20                                }
     21
     22                                // et pour ce qu'on ne connait pas (classe css 'jstree-closed' sur un LI, et pas de UL à l'intérieur)
     23                                // on fait un appel ajax pour obtenir la liste correspondant à l'objet souhaité, lorsque c'est demandé.
     24                                else {
     25                                        var id_rubrique = node.parent.split('-')[1];
     26                                        var params = {
     27                                                "id_rubrique": id_rubrique,
     28                                                "objet": node.data.jstree.objet
     29                                        };
     30                                        if ("#ENV{statut}") {
     31                                                params.statut = "#ENV{statut}";
     32                                        }
     33                                        $.ajax({
     34                                                url: "[(#VAL{plan}|generer_url_action{"", 1})]",
     35                                                data: params,
     36                                                dataType: 'html',
     37                                                cache: false,
     38                                        }).done(function(data) {
     39                                                cb(data);
     40                                        });
     41                                }
     42                        }
     43                },
     44                "search" : {
     45                        "show_only_matches" : true,
     46                },
     47                "types" : {
     48                        "#" : {
     49                                "icon" : "[(#VAL{rubrique}|objet_icone{16}|extraire_attribut{src})]",
     50                                "valid_children" : ["default"]
     51                        },
     52                        "default" : {
     53                                "icon" : "[(#VAL{rubrique}|objet_icone{16}|extraire_attribut{src})]",
     54                                "valid_children" : [
     55                                        "default"
     56                                        <BOUCLE_childs(DATA){source table,#REM|plan_lister_objets_rubrique}>, "[(#VALEUR|objet_type)]", "box_[(#VALEUR|objet_type)]"</BOUCLE_childs>
     57                                ]
     58                        }
     59                        [(#REM) On déclare les listes d'éléments qui ne peuvent pas avoir d'enfants ici (articles, sites...) ]
     60                        <BOUCLE_objets(DATA){source table,#REM|plan_lister_objets_rubrique}>
     61                        ,"[(#VALEUR|objet_type)]" : {
     62                                "icon" : "[(#VALEUR|objet_icone{16}|extraire_attribut{src})]",
     63                                "max_children" : 0,
     64                                "max_depth" : 0
     65                        }
     66                        </BOUCLE_objets>
     67                        [(#REM) Leur conteneur parent indique le nombre d'item, tel que "23 articles" et est de type 'box_xx' ]
     68                        <BOUCLE_box_objets(DATA){source table,#REM|plan_lister_objets_rubrique}>
     69                        ,"box_[(#VALEUR|objet_type)]" : {
     70                                "icon" : "[(#VALEUR|objet_icone{16}|extraire_attribut{src})]",
     71                                "max_depth" : 1,
     72                                "valid_children" : ["[(#VALEUR|objet_type)]"]
     73                        }
     74                        </BOUCLE_box_objets>
     75                }
     76        });
     77
     78        // un clic d'une feuille amène sur son lien
     79        // mais… éviter que le plugin 'state' clique automatiquement lorsqu'il restaure
     80        // la sélection précédente !
     81        $mytree.one("restore_state.jstree", function () {
     82                $(this).on("changed.jstree", function (e, data) {
     83                        data.instance.save_state();
     84                        var node = data.instance.get_node(data.node, true);
     85                        if (node) {
     86                                location.href = node.children('a').attr('href');
     87                        }
     88                });
     89        });
     90
     91        // lorsqu'on déplace un nœud
     92        $mytree.on("move_node.jstree", function(event, data) {
     93                // si les parents sont identiques : pas de changement,
     94                // on ne peut/veut pas gérer ici les positionnements
     95                console.log(data);
     96
     97                if (data.old_parent == data.parent) {
     98                        // data.instance.refresh();
     99                        return true;
     100                }
     101
     102                // il existe 2 cas de boites :
     103                // - un item (rubrique, article, site) a été déplacé
     104                // - un conteneur (box_xx) a été déplacé (ie: tous les articles qu'il contient par exemple)
     105                //   dans ce cas on retrouve tous les identifiants déplacés
     106                var box = (data.node.type.substring(0, 4) == 'box_');
     107                var infos = data.node.id.split('-'); // articles-rubrique-30 (box) ou article-30 (item)
     108
     109                if (box) {
     110                        var ids = [];
     111                        $.each(data.node.children, function(key, val) {
     112                                ids.push( val.split('-')[1] );
     113                        });
     114                        var params = {
     115                                objet: infos[0],
     116                                id_objet: ids,
     117                                id_rubrique_source: infos[2],
     118                                id_rubrique_destination: data.parent.split('-')[1]
     119                        }
     120                } else if (infos[0] == 'rubrique') {
     121                        // les rubriques n'ont pas de 'box_' et sont directement dans les sous rubriques
     122                        var params = {
     123                                objet: infos[0],
     124                                id_objet: [ infos[1] ],
     125                                id_rubrique_source: (data.old_parent == '#' ? 0 : data.old_parent.split('-')[1]),
     126                                id_rubrique_destination: (data.parent == '#' ? 0 : data.parent.split('-')[1])
     127                        }
     128                } else {
     129                        // un item, sa destination est soit une box (de même type) soit une rubrique
     130                        var dest = data.parent.split('-'); // articles-rubrique-30 (box) ou rubrique-30
     131                        console.log(dest, dest.length);
     132                        var params = {
     133                                objet: infos[0],
     134                                id_objet: [ infos[1] ],
     135                                id_rubrique_source: data.old_parent.split('-')[2],
     136                                id_rubrique_destination: (dest.length == 3 ? dest[2] : dest[1]),
     137                        }
     138                }
     139
     140                console.log(params, data);
     141
     142                $.ajax({
     143                        url: "[(#VAL{deplacer_objets}|generer_url_action{"", 1})]",
     144                        data: params,
     145                        dataType: 'json',
     146                        cache: false,
     147                }).done(function(response) {
     148                        // console.log('done', response);
     149                        ajaxReload('contenu');
     150                });
     151
     152                return true;
     153        });
    1154
    2155
     156        // recherche automatique
     157        $mytree_search = $("#mytree_search");
     158
     159        var to = false;
     160        $mytree_search.keyup(function () {
     161                if (to) { clearTimeout(to); }
     162                to = setTimeout(function () {
     163                        var v = $mytree_search.val();
     164                        $mytree.jstree(true).search(v);
     165                }, 250);
     166        });
     167
     168
     169});
     170})(jQuery);
     171</script>
    3172
    4173<div id="mytree_actions">
  • _plugins_/plan/trunk/prive/squelettes/head/plan.html

    r91526 r91527  
    55
    66
    7 <script type="text/javascript">
    8 (function($){
    9 $(document).ready(function(){
    10         $(function () {
    11 
    12                 var $mytree = $('body.plan #contenu #racine');
    13                 var $mytree_source = $mytree.clone();
    14                 // $mytree.after($mytree_source);
    15 
    16                 $mytree.jstree({
    17                         "plugins" : [ "types", "search", "state" ],
    18                         "core" : {
    19                                 "data" : function (node, cb) {
    20                                         // on est obligé de tout charger en ajax (même la racine)
    21                                         // donc on charge 1 fois la racine avec le html qu'on reçoit d'origine
    22                                         if (node.id === '#') {
    23                                                 cb($mytree_source.html());
    24                                         }
    25 
    26                                         // et pour ce qu'on ne connait pas (classe css 'jstree-closed' sur un LI, et pas de UL à l'intérieur)
    27                                         // on fait un appel ajax pour obtenir la liste correspondant à l'objet souhaité, lorsque c'est demandé.
    28                                         else {
    29                                                 var id_rubrique = node.parent.split('-')[1];
    30                                                 var params = {
    31                                                         "id_rubrique": id_rubrique,
    32                                                         "objet": node.type
    33                                                 };
    34                                                 if ("#ENV{statut}") {
    35                                                         params.statut = "#ENV{statut}";
    36                                                 }
    37                                                 $.ajax({
    38                                                         url: "[(#VAL{plan}|generer_url_action{"", 1})]",
    39                                                         data: params,
    40                                                         dataType: 'html',
    41                                                         cache: false,
    42                                                 }).done(function(data) {
    43                                                         cb(data);
    44                                                 });
    45                                         }
    46                                 }
    47                         },
    48                         "search" : {
    49                                 "show_only_matches" : true,
    50                         },
    51                         "types" : {
    52                                 "default" : {
    53                                         "icon" : "[(#VAL{rubrique}|objet_icone{16}|extraire_attribut{src})]",
    54                                 }
    55                                 <BOUCLE_objets(DATA){source table,#REM|plan_lister_objets_rubrique}>
    56                                 ,"[(#VALEUR|objet_type)]" : {
    57                                         "icon" : "[(#VALEUR|objet_icone{16}|extraire_attribut{src})]",
    58                                 }
    59                                 </BOUCLE_objets>
    60                         }
    61                 });
    62 
    63                 // un clic d'une feuille amène sur son lien
    64                 // mais… éviter que le plugin 'state' clique automatiquement lorsqu'il restaure
    65                 // la sélection précédente !
    66                 $mytree.one("restore_state.jstree", function () {
    67                         $(this).on("changed.jstree", function (e, data) {
    68                                 data.instance.save_state();
    69                                 location.href = data.instance.get_node(data.node, true).children('a').attr('href');
    70                         });
    71                 });
    72 
    73 
    74                 // recherche automatique
    75                 $mytree_search = $("#mytree_search");
    76 
    77                 var to = false;
    78                 $mytree_search.keyup(function () {
    79                         if (to) { clearTimeout(to); }
    80                         to = setTimeout(function () {
    81                                 var v = $mytree_search.val();
    82                                 $mytree.jstree(true).search(v);
    83                         }, 250);
    84                 });
    85 
    86         });
    87 });
    88 })(jQuery);
    89 </script>
    90 
    917<style type='text/css'>
    928#mytree_actions { margin-bottom:1em; margin-top:1em; }
  • _plugins_/plan/trunk/prive/squelettes/inclure/plan2-articles.html

    r91524 r91527  
    1111[(#ENV{liste}|non)
    1212        <ul class="menu-items articles">
    13                 <li class="item[ (#GET{total}|>{#VAL|plan_limiter_listes}|oui)jstree-closed]" data-jstree='{"type":"article"}'>
     13                <li id="articles-rubrique-#ID_RUBRIQUE" class="item[ (#GET{total}|>{#VAL|plan_limiter_listes}|oui)jstree-closed]" data-jstree='{"type":"box_article", "objet":"article"}'>
    1414                        <strong>[(#GET{total}|objet_afficher_nb{article})]</strong>
    1515]
  • _plugins_/plan/trunk/prive/squelettes/inclure/plan2-syndic.html

    r91524 r91527  
    99[(#ENV{liste}|non)
    1010        <ul class="menu-items sites syndic">
    11                 <li class="item[ (#GET{total}|>{#VAL|plan_limiter_listes}|oui)jstree-closed]" data-jstree='{"type":"site"}'>
     11                <li id="syndic-rubrique-#ID_RUBRIQUE" class="item[ (#GET{total}|>{#VAL|plan_limiter_listes}|oui)jstree-closed]" data-jstree='{"type":"box_site", "objet": "site"}'>
    1212                        <strong>[(#GET{total}|objet_afficher_nb{site})]</strong>
    1313]
Note: See TracChangeset for help on using the changeset viewer.