From abf13151ecde3c88ae1c667783be6fffade7e079 Mon Sep 17 00:00:00 2001 From: "marcimat@rezo.net" <> Date: Thu, 19 Jan 2017 16:17:14 +0000 Subject: [PATCH] =?UTF-8?q?Permettre=20d'annuler=20l'ordre=20enregistr?= =?UTF-8?q?=C3=A9=20pour=20les=20liens=20sur=20les=20documents.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - une action "desordonner_liens_documents" est ajoutée (un peu sur le même fonctionnement que dissocier_document) - une action "Réinitialiser l’ordre" est ajouté en fin de liste (visible si un rang_lien au moins est défini) - les actions affectant l'ensemble des documents en fin de liste sont placées dans une div ".actions-liste" - les documents déplaçables sont encadrés aussi d'une div (.sortable) essentiellement pour éviter de pouvoir les déplacer au dessus ou au dessous de la pagination ou des actions globales. --- .gitattributes | 1 + action/desordonner_liens_documents.php | 108 ++++++++++++++++++ action/dissocier_document.php | 2 +- lang/medias_fr.php | 2 + modeles/document_desc.html | 2 +- paquet.xml | 2 +- .../inclure/portfolio-documents.html | 36 +++++- prive/style_prive_plugin_medias.html | 5 +- 8 files changed, 149 insertions(+), 9 deletions(-) create mode 100644 action/desordonner_liens_documents.php diff --git a/.gitattributes b/.gitattributes index 20d27105..5d80e75f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,6 +3,7 @@ action/acceder_document.php -text action/ajouter_documents.php -text action/changer_mode_document.php -text action/copier_local.php -text +action/desordonner_liens_documents.php -text action/dissocier_document.php -text action/editer_document.php -text action/ordonner_liens_documents.php -text diff --git a/action/desordonner_liens_documents.php b/action/desordonner_liens_documents.php new file mode 100644 index 00000000..38b0b0f2 --- /dev/null +++ b/action/desordonner_liens_documents.php @@ -0,0 +1,108 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2016 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +/** + * Gestion de l'action desordonner_document + * + * @package SPIP\Medias\Action + **/ + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} + + +/** + * Désordonner des documents + * + * @param string $arg + * fournit les arguments de la fonction dissocier_document + * sous la forme `$id_objet-$objet-$document-suppr-safe` + * + * - 4eme arg : suppr = true, false sinon + * - 5eme arg : safe = true, false sinon + * + * @return void + */ +function action_desordonner_liens_documents_dist($arg = null) { + if (is_null($arg)) { + $securiser_action = charger_fonction('securiser_action', 'inc'); + $arg = $securiser_action(); + } + + $arg = explode('-', $arg); + list($id_objet, $objet, $document) = $arg; + + if ( + $id_objet = intval($id_objet) + and autoriser('desordonnerdocuments', $objet, $id_objet) + ) { + desordonner_liens_documents($document, $objet, $id_objet); + } else { + spip_log("Interdit de désordonner les documents sur : $objet $id_objet", 'spip'); + } +} + +/** + * Désordonner des documents + * + * @param int|string $document + * id_document a désordonner + * I/image pour dissocier les images en mode Image + * I/document pour dissocier les images en mode document + * D/document pour dissocier les documents non image en mode document + * @param string $objet + * objet duquel dissocier + * @param $id_objet + * id_objet duquel dissocier + * @return void + */ +function desordonner_liens_documents($document, $objet, $id_objet) { + include_spip('action/editer_liens'); + if ($id_document = intval($document)) { + desordonner_liens_document($id_document, $objet, $id_objet); + } else { + list($image, $mode) = explode('/', $document); + $image = ($image == 'I'); + $typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $image ? '' : 'NOT'); + + $obj = 'id_objet=' . intval($id_objet) . ' AND objet=' . sql_quote($objet); + + $s = sql_select( + 'docs.id_document', + 'spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document', + "$obj AND vu='non' AND docs.mode=" . sql_quote($mode) . " AND $typdoc" + ); + while ($t = sql_fetch($s)) { + desordonner_liens_document($t['id_document'], $objet, $id_objet); + } + } +} + +/** + * Désordonner un document + * + * @param int $id_document + * id_document a désordonner + * @param string $objet + * objet duquel dissocier + * @param $id_objet + * id_objet duquel dissocier + * @return void + */ +function desordonner_liens_document($id_document, $objet, $id_objet) { + objet_qualifier_liens( + array('document' => $id_document), + array($objet => $id_objet), + array('rang_lien' => 0) + ); +} \ No newline at end of file diff --git a/action/dissocier_document.php b/action/dissocier_document.php index 4bf0d842..a2d75425 100644 --- a/action/dissocier_document.php +++ b/action/dissocier_document.php @@ -149,7 +149,7 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa * I/image pour dissocier les images en mode Image * I/document pour dissocier les images en mode document * D/document pour dissocier les documents non image en mode document - * @param $objet + * @param string $objet * objet duquel dissocier * @param $id_objet * id_objet duquel dissocier diff --git a/lang/medias_fr.php b/lang/medias_fr.php index b07ad001..d7668a16 100644 --- a/lang/medias_fr.php +++ b/lang/medias_fr.php @@ -141,6 +141,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'label_paginer_par' => 'Paginer par :', 'label_parents' => 'Ce document est lié à ', 'label_refdoc_joindre' => 'Document numéro', + 'lien_tout_desordonner' => 'Réinitialiser l’ordre', + 'lien_tout_desordonner_verif' => 'L’ordre définit pour cette liste de documents sera réinitialisé. Êtes-vous sûr ?', 'lien_tout_enlever' => 'Tout enlever', 'logo' => 'Logo', diff --git a/modeles/document_desc.html b/modeles/document_desc.html index 2908ed6e..147b068f 100644 --- a/modeles/document_desc.html +++ b/modeles/document_desc.html @@ -77,7 +77,7 @@ Distribue sous licence GPL [(#TOTAL_BOUCLE|=={1}|et{#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET}}|et{#VU|=={non}})[(#BOUTON_ACTION{<:medias:bouton_enlever_supprimer_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT-suppr-safe,#SELF},ajax,<:medias:bouton_enlever_supprimer_document_confirmation:>,'',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]] [(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:bouton_enlever_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT--safe,#SELF},ajax,'','',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]] [(#AUTORISER{modifier,document,#ID_DOCUMENT}|oui) - <span class="deplacer-document"><img src='#CHEMIN_IMAGE{deplacer-16.png}' width='16' height='16' alt='<:medias:ordonner_ce_document|attribut_html:>' /></span> + <span class="deplacer-document" data-rang="#RANG_LIEN"><img src='#CHEMIN_IMAGE{deplacer-16.png}' width='16' height='16' alt='<:medias:ordonner_ce_document|attribut_html:>' title='<:medias:ordonner_ce_document|attribut_html:>' /></span> <a href="#URL_ECRIRE{document_edit,id_document=#ID_DOCUMENT}" target="_blank" class="editbox" tabindex="0" role="button"><:medias:bouton_modifier_document:></a> ]<//B_compte> [(#PIPELINE{document_desc_actions,#ARRAY{args,#ARRAY{id_document,#ID_DOCUMENT,position,document_desc,objet,#OBJET,id_objet,#ID_OBJET},data,''}})] diff --git a/paquet.xml b/paquet.xml index e0b25372..f0409279 100644 --- a/paquet.xml +++ b/paquet.xml @@ -1,7 +1,7 @@ <paquet prefix="medias" categorie="multimedia" - version="2.17.1" + version="2.17.2" etat="stable" compatibilite="[3.2.0-dev;]" logo="prive/themes/spip/images/portfolio-32.png" diff --git a/prive/squelettes/inclure/portfolio-documents.html b/prive/squelettes/inclure/portfolio-documents.html index f565e0c0..1dcfc363 100644 --- a/prive/squelettes/inclure/portfolio-documents.html +++ b/prive/squelettes/inclure/portfolio-documents.html @@ -14,11 +14,18 @@ <h3><span class="image_loading"></span><:medias:info_illustrations:></h3> <div class="liste_items documents" id="illustrations#ENV{id_unique}"> [<p class="pagination">(#PAGINATION{prive})</p>] +<div class="sortable"> <BOUCLE_illustrations(DOCUMENTS documents_liens types_documents){inclus=image}{mode=image}{id_objet}{objet}{par rang_lien, num titre, date,id_document}{pagination 50}{statut?}> #MODELE{document_desc,id_document,id_objet,objet} </BOUCLE_illustrations> +</div> [<p class="pagination">(#PAGINATION{prive})</p>] -[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/image,#SELF|ancre_url{illustrations}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]] +[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET}) + <div class="actions-liste"> + [(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/image,#SELF|ancre_url{illustrations}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})] + [(#BOUTON_ACTION{<:medias:lien_tout_desordonner:>,#URL_ACTION_AUTEUR{desordonner_liens_documents,#ID_OBJET-#OBJET-I/image,#SELF|ancre_url{illustrations}},'ajax tout_desordonner',<:medias:lien_tout_desordonner_verif:>})] + </div> +] </div> #SET{nbdocs,#GET{nbdocs}|plus{#GRAND_TOTAL}} </B_illustrations> @@ -28,11 +35,18 @@ <h3><:medias:info_portfolio:></h3> <div class="liste_items documents" id="portfolio#ENV{id_unique}"> [<p class="pagination">(#PAGINATION{prive})</p>] +<div class="sortable"> <BOUCLE_portfolio(DOCUMENTS documents_liens types_documents){inclus=image}{mode=document}{id_objet}{objet}{par rang_lien, num titre, date,id_document}{pagination 50}{statut?}> #MODELE{document_desc,id_document,id_objet,objet} </BOUCLE_portfolio> +</div> [<p class="pagination">(#PAGINATION{prive})</p>] -[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/document,#SELF|ancre_url{portfolio}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]] +[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET}) + <div class="actions-liste"> + [(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-I/document,#SELF|ancre_url{portfolio}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})] + [(#BOUTON_ACTION{<:medias:lien_tout_desordonner:>,#URL_ACTION_AUTEUR{desordonner_liens_documents,#ID_OBJET-#OBJET-I/document,#SELF|ancre_url{illustrations}},'ajax tout_desordonner',<:medias:lien_tout_desordonner_verif:>})] + </div> +] </div> #SET{nbdocs,#GET{nbdocs}|plus{#GRAND_TOTAL}} </B_portfolio> @@ -42,11 +56,18 @@ <h3><:medias:info_documents:></h3> <div class="liste_items documents" id="documents#ENV{id_unique}"> [<p class="pagination">(#PAGINATION{prive})</p>] +<div class="sortable"> <BOUCLE_documents(DOCUMENTS documents_liens types_documents){inclus!=image}{mode!=vignette}{id_objet}{objet}{par rang_lien, num titre, date,id_document}{pagination 50}{statut?}> #MODELE{document_desc,id_document,id_objet,objet} </BOUCLE_documents> +</div> [<p class="pagination">(#PAGINATION{prive})</p>] -[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-D/document,#SELF|ancre_url{documents}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})]] +[(#AUTORISER{dissocierdocuments,#OBJET,#ID_OBJET}) + <div class="actions-liste"> + [(#BOUTON_ACTION{<:medias:lien_tout_enlever:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-D/document,#SELF|ancre_url{documents}},'ajax tout_supprimer',<:ecrire:lien_tout_supprimer:> ?})] + [(#BOUTON_ACTION{<:medias:lien_tout_desordonner:>,#URL_ACTION_AUTEUR{desordonner_liens_documents,#ID_OBJET-#OBJET-D/document,#SELF|ancre_url{documents}},'ajax tout_desordonner',<:medias:lien_tout_desordonner_verif:>})] + </div> +] </div> #SET{nbdocs,#GET{nbdocs}|plus{#GRAND_TOTAL}} </B_documents> @@ -137,7 +158,7 @@ function choix_affichages_documents() { /* Gestion du tri des listes de documents et de leur enregistrement */ function ordonner_listes_documents() { if ($.fn.sortable) { - $("#illustrations#ENV{id_unique}, #portfolio#ENV{id_unique}, #documents#ENV{id_unique}").each(function () { + $("#illustrations#ENV{id_unique}, #portfolio#ENV{id_unique}, #documents#ENV{id_unique}").find('> .sortable').each(function () { // détruire / recréer le sortable à chaque appel ajax if ($(this).has('.ui-sortable').length) { $(this).sortable('destroy'); @@ -203,10 +224,17 @@ function ordonner_listes_documents() { item.css({backgroundColor: couleur_succes}).animate({backgroundColor: couleur_origine}, 'normal', function(){ item.css({backgroundColor: ''}); }); + items.parent().find('.tout_desordonner').show(); } }); } }); + // bouton "désordonner" + if ($(this).parent().find('.deplacer-document[data-rang!=0]').length) { + $(this).parent().find('.tout_desordonner').show(); + } else { + $(this).parent().find('.tout_desordonner').hide(); + } }); } } diff --git a/prive/style_prive_plugin_medias.html b/prive/style_prive_plugin_medias.html index d98e492e..838837c0 100644 --- a/prive/style_prive_plugin_medias.html +++ b/prive/style_prive_plugin_medias.html @@ -194,7 +194,8 @@ p.actions {clear:both;} .portfolios .item .titre > .sanstitre, .portfolios .item .titre > .sanstitre + .fichier {opacity:0.4;} -.portfolios .tout_supprimer { clear:both; margin-top:.6925em; display:block; } +.portfolios .actions-liste { clear:both; margin-top:.6925em; display:block; } +.portfolios .actions-liste > * {display:inline; } .portfolios .tout_supprimer span {display:block; text-align:#GET{right};} .item.vu_oui {background:#f9f9f9;} @@ -298,7 +299,7 @@ h3 .affichages { /* Grille en cases des documents. */ -.portfolios .documents_cases { +.portfolios .documents_cases .sortable { display:flex; flex-wrap: wrap; } -- GitLab