From 0ef8d61e0190bfd928fa3f61124143a5c6d24e7b Mon Sep 17 00:00:00 2001 From: "marcimat@rezo.net" <> Date: Sat, 14 Jan 2017 22:31:30 +0000 Subject: [PATCH] =?UTF-8?q?Int=C3=A9gration=20du=20plugin=20"Ordoc"=20dans?= =?UTF-8?q?=20M=C3=A9dias.=20Cela=20permet=20d'ordonner=20les=20documents?= =?UTF-8?q?=20attach=C3=A9s=20=C3=A0=20des=20objets=20=C3=A9ditoriaux.=20L?= =?UTF-8?q?'ordre=20est=20stock=C3=A9=20dans=20la=20colonne=20"rang=5Flien?= =?UTF-8?q?"=20de=20la=20table=20"spip=5Fdocuments=5Fliens".?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 3 + action/ordonner_liens_documents.php | 103 ++++++++++++++++++ base/medias.php | 3 +- lang/medias_fr.php | 4 + medias_administrations.php | 4 + modeles/document_desc.html | 9 +- paquet.xml | 4 +- .../inclure/portfolio-documents.html | 85 ++++++++++++++- prive/style_prive_plugin_medias.html | 19 +++- prive/themes/spip/images/deplacer-16.png | Bin 0 -> 3222 bytes prive/themes/spip/images/deplacer-24.png | Bin 0 -> 3453 bytes 11 files changed, 220 insertions(+), 14 deletions(-) create mode 100644 action/ordonner_liens_documents.php create mode 100644 prive/themes/spip/images/deplacer-16.png create mode 100644 prive/themes/spip/images/deplacer-24.png diff --git a/.gitattributes b/.gitattributes index b97ca5dc..20d27105 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,6 +5,7 @@ action/changer_mode_document.php -text action/copier_local.php -text action/dissocier_document.php -text action/editer_document.php -text +action/ordonner_liens_documents.php -text action/supprimer_document.php -text action/supprimer_tous_orphelins.php -text action/tourner.php -text @@ -282,6 +283,8 @@ prive/themes/spip/images/base/video-16.png -text prive/themes/spip/images/base/video-22.png -text prive/themes/spip/images/base/video-32.png -text prive/themes/spip/images/base/vu-16.png -text +prive/themes/spip/images/deplacer-16.png -text +prive/themes/spip/images/deplacer-24.png -text prive/themes/spip/images/distant-16.png -text prive/themes/spip/images/doc-16.png -text prive/themes/spip/images/doc-24.png -text diff --git a/action/ordonner_liens_documents.php b/action/ordonner_liens_documents.php new file mode 100644 index 00000000..a1be0467 --- /dev/null +++ b/action/ordonner_liens_documents.php @@ -0,0 +1,103 @@ +<?php + +/** + * Action ordonnant un lien sur une table de liens + * + * @plugin Medias + * @copyright 2017 + * @author Matthieu Marcillaud + * @licence GNU/GPL + * @package SPIP\Ordoc\Action + */ + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} + +function action_ordonner_liens_documents_dist() { + action_ordonner_liens_dist(); +} + + +function action_ordonner_liens_dist() { + include_spip('inc/autoriser'); + include_spip('base/objets'); + include_spip('action/editer_liens'); + + // source (table spip_xx_liens) + $objet = objet_type(_request('objet_source')); + + // objet lié + $objet_lie = _request('objet_lie'); + $id_objet_lie = intval(_request('id_objet_lie')); + + // ordre des éléments + $ordre = _request('ordre'); + + if (!$objet or !$objet_lie or !$id_objet_lie OR !$ordre or !objet_associable($objet)) { + return envoyer_json_erreur(_T('medias:erreur_objet_absent') . ' ' . _T('medias:erreur_deplacement_impossible')); + } + + if (!autoriser('modifier', $objet_lie, $id_objet_lie)) { + return envoyer_json_erreur(_T('medias:erreur_autorisation') . ' ' . _T('medias:erreur_deplacement_impossible')); + } + + list($_id_objet, $table_liens) = objet_associable($objet); + + $success = $errors = array(); + + $actuels = sql_allfetsel( + array($_id_objet . ' AS id', 'rang_lien'), + $table_liens, + array( + sql_in($_id_objet, $ordre), + 'objet = ' . sql_quote($objet_lie), + 'id_objet = ' . sql_quote($id_objet_lie) + ) + ); + + $futurs = array_flip($ordre); + // ordre de 1 à n (pas de 0 à n). + array_walk($futurs, function(&$v) { $v++; }); + + $updates = array(); + + foreach ($actuels as $l) { + if ($futurs[$l['id']] !== $l['rang_lien']) { + $updates[$l['id']] = $futurs[$l['id']]; + } + } + + if ($updates) { + foreach ($updates as $id => $ordre) { + sql_updateq( + $table_liens, + array('rang_lien' => $ordre), + array( + $_id_objet . ' = ' . $id, + 'objet = ' . sql_quote($objet_lie), + 'id_objet = ' . sql_quote($id_objet_lie) + ) + ); + } + } + + return envoyer_json_envoi(array( + 'done' => true, + 'success' => $success, + 'errors' => $errors, + )); +} + +function envoyer_json_envoi($data) { + header('Content-Type: application/json; charset=' . $GLOBALS['meta']['charset']); + echo json_encode($data); +} + +function envoyer_json_erreur($msg) { + return envoyer_json_envoi(array( + 'done' => false, + 'success' => array(), + 'errors' => array($msg) + )); +} diff --git a/base/medias.php b/base/medias.php index 778c457b..73d508ca 100644 --- a/base/medias.php +++ b/base/medias.php @@ -87,7 +87,8 @@ function medias_declarer_tables_auxiliaires($tables_auxiliaires) { 'id_document' => "bigint(21) DEFAULT '0' NOT NULL", 'id_objet' => "bigint(21) DEFAULT '0' NOT NULL", 'objet' => "VARCHAR (25) DEFAULT '' NOT NULL", - 'vu' => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL" + 'vu' => "ENUM('non', 'oui') DEFAULT 'non' NOT NULL", + 'rang_lien' => "int(4) DEFAULT '0' NOT NULL" ); $spip_documents_liens_key = array( diff --git a/lang/medias_fr.php b/lang/medias_fr.php index e55b0288..b07ad001 100644 --- a/lang/medias_fr.php +++ b/lang/medias_fr.php @@ -74,14 +74,17 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'entree_titre_image' => 'Titre de l’image :', 'erreur_aucun_document' => 'Ce document n’existe pas dans la médiathèque', 'erreur_aucun_fichier' => 'Aucun fichier n’a été trouvé', + 'erreur_autorisation' => 'Échec de l’autorisation.', 'erreur_chemin_distant' => 'Le fichier distant @nom@ n’a pas pu être trouvé', 'erreur_chemin_ftp' => 'Le fichier indiqué n’a pas été trouvé sur le serveur', 'erreur_copie_fichier' => 'Impossible de copier le fichier @nom@', + 'erreur_deplacement_impossible' => 'Déplacement impossible.', 'erreur_dossier_tmp_manquant' => 'Un dossier temporaire est manquant pour télécharger les fichiers', 'erreur_ecriture_fichier' => 'Erreur lors de l’écriture du fichier sur le disque', 'erreur_format_fichier_image' => 'Le format de @nom@ ne convient pas pour une image', 'erreur_indiquez_un_fichier' => 'Indiquez un fichier !', 'erreur_insertion_document_base' => 'Impossible d’enregistrer le document @fichier@ en base de données', + 'erreur_objet_absent' => 'Informations reçues incomplètes.', 'erreur_suppression_vignette' => 'Erreur lors de la suppression de la vignette', 'erreur_upload_type_interdit' => 'Le téléchargement des fichiers du type de @nom@ n’est pas autorisé', 'erreur_upload_vignette' => 'Erreur lors du chargement de la vignette @nom@', @@ -155,6 +158,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( // O 'objet_document' => 'Document', 'objet_documents' => 'Documents', + 'ordonner_ce_document' => 'Ordonner ce document', // P 'par_date' => 'Date', diff --git a/medias_administrations.php b/medias_administrations.php index 99922362..1979fc9f 100644 --- a/medias_administrations.php +++ b/medias_administrations.php @@ -169,6 +169,10 @@ function medias_upgrade($nom_meta_base_version, $version_cible) { // ajout de ics + vcf array('creer_base_types_doc') ); + $maj['1.3.0'] = array( + // ajout de rang_lien + array('maj_tables', 'spip_documents_liens'), + ); include_spip('base/upgrade'); include_spip('base/medias'); maj_plugin($nom_meta_base_version, $version_cible, $maj); diff --git a/modeles/document_desc.html b/modeles/document_desc.html index 62e814bc..2908ed6e 100644 --- a/modeles/document_desc.html +++ b/modeles/document_desc.html @@ -12,7 +12,7 @@ Distribue sous licence GPL <div class="descriptions"> <h4 class="titrem"> - [(#VU|=={oui}|oui)<img src='#CHEMIN_IMAGE{vu-16-10.png}' width='16' height='10' alt='<:medias:document_vu:>' title='<:medias:document_vu:>'/> ] + [(#VU|=={oui}|oui)<img src='#CHEMIN_IMAGE{vu-16-10.png}' width='16' height='10' alt='<:medias:document_vu|attribut_html:>' title='<:medias:document_vu:>'/> ] <span class="#EDIT{titre} titre" title="[(#FICHIER*|basename|attribut_html)]"> [(#TITRE|oui)#TITRE] [(#TITRE|non) @@ -27,7 +27,7 @@ Distribue sous licence GPL <div class="infos"> <div class="permanentes"> - [(#DISTANT|=={oui}|oui)<img src='#CHEMIN_IMAGE{distant-16.png}' width='16' height='16' alt='<:medias:fichier_distant:>' title='<:medias:fichier_distant:>'/> ]<:info_numero_abbreviation:>#ID_DOCUMENT - #EXTENSION + [(#DISTANT|=={oui}|oui)<img src='#CHEMIN_IMAGE{distant-16.png}' width='16' height='16' alt='<:medias:fichier_distant|attribut_html:>' title='<:medias:fichier_distant|attribut_html:>'/> ]<:info_numero_abbreviation:>#ID_DOCUMENT - #EXTENSION <a class="lien_details" onClick="$(this).parent().next('.detaillees').toggle(); return true;" @@ -76,9 +76,10 @@ Distribue sous licence GPL <BOUCLE_compte(documents_liens){id_document}{0,2} /> [(#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) + [(#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> <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> + ]<//B_compte> [(#PIPELINE{document_desc_actions,#ARRAY{args,#ARRAY{id_document,#ID_DOCUMENT,position,document_desc,objet,#OBJET,id_objet,#ID_OBJET},data,''}})] </div> diff --git a/paquet.xml b/paquet.xml index d9a894f1..b8077a6a 100644 --- a/paquet.xml +++ b/paquet.xml @@ -1,11 +1,11 @@ <paquet prefix="medias" categorie="multimedia" - version="2.16.0" + version="2.17.0" etat="stable" compatibilite="[3.2.0-dev;]" logo="prive/themes/spip/images/portfolio-32.png" - schema="1.2.7" + schema="1.3.0" > <nom>Medias</nom> diff --git a/prive/squelettes/inclure/portfolio-documents.html b/prive/squelettes/inclure/portfolio-documents.html index c9e9afb6..663c71dd 100644 --- a/prive/squelettes/inclure/portfolio-documents.html +++ b/prive/squelettes/inclure/portfolio-documents.html @@ -14,7 +14,7 @@ <h3><span class="image_loading"></span><:medias:info_illustrations:></h3> <div class="liste_items documents" id="illustrations#ENV{id_unique}"> [<p class="pagination">(#PAGINATION)</p>] -<BOUCLE_illustrations(DOCUMENTS documents_liens types_documents){inclus=image}{mode=image}{id_objet}{objet}{par num titre,date,id_document}{pagination 50}{statut?}> +<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> [(#TOTAL_BOUCLE|>{20}|oui)<p class="pagination">#PAGINATION</p>] @@ -28,7 +28,7 @@ <h3><:medias:info_portfolio:></h3> <div class="liste_items documents" id="portfolio#ENV{id_unique}"> [<p class="pagination">(#PAGINATION)</p>] -<BOUCLE_portfolio(DOCUMENTS documents_liens types_documents){inclus=image}{mode=document}{id_objet}{objet}{par num titre,date,id_document}{pagination 50}{statut?}> +<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> [(#TOTAL_BOUCLE|>{20}|oui)<p class="pagination">#PAGINATION</p>] @@ -42,7 +42,7 @@ <h3><:medias:info_documents:></h3> <div class="liste_items documents" id="documents#ENV{id_unique}"> [<p class="pagination">(#PAGINATION)</p>] -<BOUCLE_documents(DOCUMENTS documents_liens types_documents){inclus!=image}{mode!=vignette}{id_objet}{objet}{par num titre,date,id_document}{pagination 50}{statut?}> +<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> [(#TOTAL_BOUCLE|>{20}|oui)<p class="pagination">#PAGINATION</p>] @@ -134,11 +134,90 @@ 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 () { + // détruire / recréer le sortable à chaque appel ajax + if ($(this).has('.ui-sortable').length) { + $(this).sortable('destroy'); + } + // pas de tri possible s'il n'y a qu'un seul élément. + if ($(this).find('> .item').length < 2) { + $(this).find('.deplacer-document').hide(); + return true; // continue + } else { + $(this).find('.deplacer-document').show(); + } + $(this).sortable({ + /*axis: "y",*/ /* minidoc a un affichage en case */ + handle: "", + placeholder: "ui-state-highlight deplacer-document-placeholder", + cancel: 'img.croix_centre_image', + start: function(event, ui) { + ui.item.addClass('document-en-mouvement'); + }, + stop: function(event, ui) { + ui.item.removeClass('document-en-mouvement'); + }, + update: function (event, ui) { + var items = $(this); + var item = ui.item; + var liste = items.sortable('toArray'); + var ordre = []; + + $.each(liste, function(i, id) { + if (id) { + ordre.push( id.substring(3) ); // doc123 => 123 + } + }); + + var action = '[(#VAL{ordonner_liens_documents}|generer_url_action{"", 1})]'; + var params = { + objet_source: 'document', + objet_lie: '#OBJET', + id_objet_lie: '#ID_OBJET', + ordre: ordre, + }; + + item.animateLoading(); + + $.ajax({ + url: action, + data: params, + dataType: 'json', + cache: false, + }).done(function(data) { + + var couleur_origine = item.css('background-color'); + var couleur_erreur = $("<div class='remove'></div>").css('background-color'); + var couleur_succes = $("<div class='append'></div>").css('background-color'); + item.endLoading(true); + + if (data.errors.length) { + items.sortable('cancel'); + item.css({backgroundColor: couleur_erreur}).animate({backgroundColor: couleur_origine}, 'normal', function(){ + item.css({backgroundColor: ''}); + }); + } else { + item.css({backgroundColor: couleur_succes}).animate({backgroundColor: couleur_origine}, 'normal', function(){ + item.css({backgroundColor: ''}); + }); + } + }); + } + }); + }); + } +} + if (window.jQuery) { jQuery(function($){ onAjaxLoad(check_reload_page); choix_affichages_documents(); onAjaxLoad(choix_affichages_documents); + ordonner_listes_documents(); + onAjaxLoad(ordonner_listes_documents); }); } /*]]>*/</script> diff --git a/prive/style_prive_plugin_medias.html b/prive/style_prive_plugin_medias.html index ca0d7f05..51255b81 100644 --- a/prive/style_prive_plugin_medias.html +++ b/prive/style_prive_plugin_medias.html @@ -197,6 +197,12 @@ p.actions {clear:both;} .item.vu_oui {background:#f9f9f9;} +.deplacer-document-placeholder { height:130px; } +.deplacer-document { margin-#GET{right}:0.5em; float: #GET{left}; margin-top:2px; cursor:move; } +.document-en-mouvement { cursor:move; } + +.portfolios .item .actions a.editbox { margin-top: 0 !important; } + /* Types d'affichages des listes de douments */ h3 .affichages { @@ -275,13 +281,16 @@ h3 .affichages { } .portfolios .documents_liste .item .actions { align-items:center; + text-align:#GET{right}; margin-#GET{left}:1em; padding-#GET{right}:0; + min-width:80px; } .portfolios .documents_liste .item .actions .editbox, -.portfolios .documents_liste .item .actions .ordoc-deplacer { +.portfolios .documents_liste .item .actions .deplacer-document { display:inline-block; } +.documents_liste .deplacer-document-placeholder { height:40px; } /* Grille en cases des documents. */ @@ -310,10 +319,12 @@ h3 .affichages { display:inline-block; float:#GET{right}; } -.portfolios .documents_cases .item .actions .ordoc-deplacer { +.portfolios .documents_cases .item .actions .deplacer-document { display:inline-block; - float:#GET{left}; + margin-top:0px; } +.documents_cases .deplacer-document-placeholder { height:130px; width:113px; padding: 2px; margin: 2px;} + .portfolios .documents_cases .item .vignette { width:auto; height:auto; @@ -331,7 +342,7 @@ h3 .affichages { width:100%; margin-bottom:0; box-sizing:border-box; - padding: 4px 6px; + padding: 2px 5px 1px 5px; } .portfolios .documents_cases .tout_supprimer { flex-basis: 100%; diff --git a/prive/themes/spip/images/deplacer-16.png b/prive/themes/spip/images/deplacer-16.png new file mode 100644 index 0000000000000000000000000000000000000000..7823dce1acf400597e3d52634476d0485b5ed3a4 GIT binary patch literal 3222 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 Jvd$@?2>>j>6C(fs literal 0 HcmV?d00001 diff --git a/prive/themes/spip/images/deplacer-24.png b/prive/themes/spip/images/deplacer-24.png new file mode 100644 index 0000000000000000000000000000000000000000..1b92b6afa36ca06f733e809246f149a18ae4531a GIT binary patch literal 3453 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 literal 0 HcmV?d00001 -- GitLab