From ab44a4fa71f47150b1bb24d36f036fa485d15bc7 Mon Sep 17 00:00:00 2001 From: Yann Gonidec Date: Mon, 17 Jun 2019 09:22:10 +0200 Subject: [PATCH] =?UTF-8?q?front=20:=20suite=20popup=20=C3=A9dition=20de?= =?UTF-8?q?=20m=C3=A9dia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Copyright.php | 15 ++ app/Etiquette.php | 15 ++ app/Http/Controllers/DossierController.php | 8 +- app/Http/Controllers/MediaController.php | 57 ++++- app/Http/Controllers/UploadController.php | 29 ++- app/Http/Traits/MediaTools.php | 4 +- app/Langue.php | 15 ++ app/Media.php | 34 +++ app/Typemedia.php | 2 + app/Typevue.php | 15 ++ public/.htaccess | 156 +++++++++++++ public/css/app.css | 33 ++- public/js/app.js | 218 ++++++++++++++++--- resources/js/admin.js | 2 +- resources/js/app.js | 2 +- resources/js/media.js | 194 +++++++++++++++-- resources/sass/partials/media.scss | 33 ++- resources/views/layouts/media_edit.blade.php | 89 ++++---- resources/views/media_manager.blade.php | 6 + routes/web.php | 14 +- 20 files changed, 831 insertions(+), 110 deletions(-) create mode 100644 app/Copyright.php create mode 100644 app/Etiquette.php create mode 100644 app/Langue.php create mode 100644 app/Typevue.php diff --git a/app/Copyright.php b/app/Copyright.php new file mode 100644 index 0000000..3769e89 --- /dev/null +++ b/app/Copyright.php @@ -0,0 +1,15 @@ +get(); $sujets = Sujet::all(); - return view('dossiers.index')->with(['dossiers'=> $dossiers, 'sujets'=> $sujets]); + + return view('dossiers.index')->with([ + 'dossiers'=> $dossiers, + 'sujets'=> $sujets, + ]); } /** @@ -189,6 +194,7 @@ class DossierController extends Controller $query->whereIn("marque_id", $marques); })->get(); $response['count'] = Media::where('sujet_id', $sujetId)->whereNull('dossier_id')->count(); + $response['typevues'] = Typevue::where('sujet_id', $sujetId)->get(); if(Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')] )){ $response['draggable'] = true; diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index 842b930..445995e 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -6,6 +6,10 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use App\Sujet; use App\Media; +use App\Typemedia; +use App\Langue; +use App\Copyright; +use App\Etiquette; class MediaController extends Controller { @@ -18,8 +22,18 @@ class MediaController extends Controller */ public function index() { - $sujets = Sujet::all(); - return view('media_manager')->with(['sujets'=> $sujets]); + $sujets = Auth::user()->sujets; + $typemedias = Typemedia::all(); + $langues = Langue::all(); + $copyrights = Copyright::all(); + $etiquettes = Etiquette::all(); + return view('media_manager')->with([ + 'sujets'=> $sujets, + 'typemedias'=> $typemedias, + 'langues'=> $langues, + 'copyrights'=> $copyrights, + 'etiquettes'=> $etiquettes, + ]); } /** @@ -35,9 +49,14 @@ class MediaController extends Controller $limit = $request->input('limit'); if($dossier_id == "0"){ - $response['data'] = Media::where('sujet_id', $sujet_id)->whereNull('dossier_id')->offset($offset)->limit($limit)->orderBy('created_at', 'desc')->get(); + $response['data'] = Media::where('sujet_id', $sujet_id)->whereNull('dossier_id')->with('Etiquette')->offset($offset)->limit($limit)->orderBy('created_at', 'desc')->get(); }else{ - $response['data'] = Media::where('sujet_id', $sujet_id)->where('dossier_id', $dossier_id)->offset($offset)->limit($limit)->orderBy('created_at', 'desc')->get(); + $response['data'] = Media::where('sujet_id', $sujet_id)->where('dossier_id', $dossier_id)->with('Etiquette')->offset($offset)->limit($limit)->orderBy('created_at', 'desc')->get(); + } + if(Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')] )){ + $response['draggable'] = true; + }else{ + $response['draggable'] = false; } return json_encode($response); @@ -49,6 +68,7 @@ class MediaController extends Controller */ public function moveMedia(Request $request) { + Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]); $response = array(); $dossier_id = $request->input('dossier_id'); $data = $request->input('data'); @@ -68,4 +88,33 @@ class MediaController extends Controller return json_encode(true); } + /** + * supprimer des médias + * + */ + public function removeMedia(Request $request) + { + Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]); + + $medias = $request->input('medias'); + Media::destroy($medias); + + return json_encode(true); + } + + /** + * Obtenir toutes les informations d'un média + * + */ + public function getOneMedia(Request $request) + { + $response = array(); + $media_id = $request->input('media_id'); + $media = Media::where('id', $media_id)->with('Sujet')->first(); + if($media){ + $response['data'] = $media; + } + return json_encode($response); + } + } diff --git a/app/Http/Controllers/UploadController.php b/app/Http/Controllers/UploadController.php index be2a778..fc99ada 100644 --- a/app/Http/Controllers/UploadController.php +++ b/app/Http/Controllers/UploadController.php @@ -111,6 +111,11 @@ class UploadController extends Controller { $media->largeur = $width; $media->hauteur = $height; $media->resolution = $this->get_dpi($destinationPath.$filename); + if($media->resolution != 0){ + $media->largeur_mm = ceil(($width * 2.54 / $media->resolution)*10); + $media->hauteur_mm = ceil(($height * 2.54 / $media->resolution)*10); + } + $this->createThumbnail($destinationPath.$filename, $destinationPath.$uid.'_thumb.'.$extension, 200); if($width >= 1500){ $this->createThumbnail($destinationPath.$filename, $destinationPath.$uid.'_preview.'.$extension, 1500); @@ -150,28 +155,34 @@ class UploadController extends Controller { default: $media->typemedia_id = 5; - if($extension == 'pdf'){ + if(in_array($extension, array("pdf", "ai", "psd")) ){ $im = new \imagick(); - $im->readImage($destinationPath.$filename.'[0]'); - $im->setImageFormat('jpg'); + $im->readImage($destinationPath.$filename); + if($extension == "pdf" || $extension == "psd"){ + $im->setIteratorIndex(0); + } + //$im->setImageFormat('jpg'); + //list($width,$height) = $im->getImageGeometry(); $imageprops = $im->getImageGeometry(); $width = $imageprops['width']; $height = $imageprops['height']; // create preview - $fp = $destinationPath.$uid.'_preview.jpg'; + $fp = $destinationPath.$uid.'_preview.png'; if($width >= 1500){ - $newHeight = (1500 * $height) / $width; - $im->resizeImage(1500,$newHeight, \imagick::FILTER_LANCZOS, 0.9, true); + //$newHeight = (1500 * $height) / $width; + //$im->resizeImage(1500,$newHeight, \imagick::FILTER_LANCZOS, 0.9, true); + $im->thumbnailImage(1500, 1500 , true); } $im->writeImage($fp); // create thumb - $newHeight = (200 * $height) / $width; - $im->resizeImage(200, $newHeight, \imagick::FILTER_LANCZOS, 0.9, true); - $fp = $destinationPath.$uid.'_thumb.jpg'; + //$newHeight = (200 * $height) / $width; + //$im->resizeImage(200, $newHeight, \imagick::FILTER_LANCZOS, 0.9, true); + $im->thumbnailImage(200, 200 , true); + $fp = $destinationPath.$uid.'_thumb.png'; $im->writeImage($fp); } diff --git a/app/Http/Traits/MediaTools.php b/app/Http/Traits/MediaTools.php index 48a776e..232832e 100644 --- a/app/Http/Traits/MediaTools.php +++ b/app/Http/Traits/MediaTools.php @@ -110,12 +110,12 @@ trait MediaTools { 2 => [ 'load' => 'imagecreatefromjpeg', 'save' => 'imagejpeg', - 'quality' => 100 + 'quality' => 50 ], 3 => [ 'load' => 'imagecreatefrompng', 'save' => 'imagepng', - 'quality' => 0 + 'quality' => 5 ], 1 => [ 'load' => 'imagecreatefromgif', diff --git a/app/Langue.php b/app/Langue.php new file mode 100644 index 0000000..7d6b342 --- /dev/null +++ b/app/Langue.php @@ -0,0 +1,15 @@ +belongsTo('App\Typemedia', 'typemedia_id'); } + + /** + * Get the typevue that owns the media. + */ + public function typevue() + { + return $this->belongsTo('App\Typevue', 'typevue_id'); + } + + /** + * Get the langue that owns the media. + */ + public function langue() + { + return $this->belongsTo('App\Langue', 'typevue_id'); + } + + /** + * Get the copyright that owns the media. + */ + public function copyright() + { + return $this->belongsTo('App\Copyright', 'copyright_id'); + } + + /** + * Get the etiquette that owns the media. + */ + public function etiquette() + { + return $this->belongsTo('App\Etiquette', 'etiquette_id'); + } } diff --git a/app/Typemedia.php b/app/Typemedia.php index 2a23f2e..7b8a584 100644 --- a/app/Typemedia.php +++ b/app/Typemedia.php @@ -6,6 +6,8 @@ use Illuminate\Database\Eloquent\Model; class Typemedia extends Model { + protected $table = "typemedias"; + /** * The primary key associated with the table. * diff --git a/app/Typevue.php b/app/Typevue.php new file mode 100644 index 0000000..3d646dd --- /dev/null +++ b/app/Typevue.php @@ -0,0 +1,15 @@ + + order allow,deny + deny from all + + +# Protect sql files + + Order allow,deny + Deny from all + + + + + AddType application/vnd.ms-fontobject .eot + AddType application/x-font-opentype .otf + AddType image/svg+xml .svg + AddType application/x-font-ttf .ttf + AddType application/font-woff .woff + AddType application/font-woff2 .woff2 + + + +### FILTRE CONTRE XSS, REDIRECTIONS HTTP, base64_encode, VARIABLE PHP GLOBALS VIA URL, MODIFIER VARIABLE _REQUEST VIA URL, TEST DE FAILLE PHP, INJECTION SQL SIMPLE + RewriteCond %{REQUEST_METHOD} (GET|POST) [NC] + RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR] + RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR] + RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [OR] + RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR] + RewriteCond %{QUERY_STRING} ^.*(127\.0).* [NC,OR] + RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)(https?|ftp|mosConfig)(%3A|:)//(.*)$ [NC,OR] ## ATTENTION A CETTE REGLE. ELLE PEUT CASSER CERTAINES REDIRECTIONS RESSEMBLANT A: http://www.truc.fr/index.php?r=http://www.google.fr ## + RewriteCond %{QUERY_STRING} ^.*(_encode|localhost|loopback).* [NC,OR] + RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR] + RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR] + RewriteCond %{QUERY_STRING} ^(.*)(SELECT(%20|\+)|UNION(%20|\+)ALL|INSERT(%20|\+)|DELETE(%20|\+)|CHAR\(|UPDATE(%20|\+)|REPLACE(%20|\+)|LIMIT(%20|\+)|CONCAT(%20|\+)|DECLARE(%20|\+))(.*)$ [NC] + RewriteRule (.*) - [F] + + + + + # A TESTER la page n'accepte que les scripts provenant du même nom de domaine et de google.com (par exemple) + #Header set Content-Security-Policy "script-src 'self' https://www.google.com" + + # Protection contre le clickjacking. Interdit que le site soit intégré en iframe + #Header always set X-FRAME-OPTIONS "DENY" + + # Bloque la totalité du contenu lorsqu'une attaque XSS est suspectée + Header always set X-XSS-Protection "1; mode=block" + + #Désactive la détection automatique du type des ressources + Header always set X-Content-Type-Options "nosniff" + + + # protege les cookies d'être modifiés par le client + #Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure + + +# BEGIN DEFLATE COMPRESSION + + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/vnd.ms-fontobject + AddOutputFilterByType DEFLATE application/x-font + AddOutputFilterByType DEFLATE application/x-font-opentype + AddOutputFilterByType DEFLATE application/x-font-otf + AddOutputFilterByType DEFLATE application/x-font-truetype + AddOutputFilterByType DEFLATE application/x-font-ttf + AddOutputFilterByType DEFLATE application/font-woff2 + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE font/opentype + AddOutputFilterByType DEFLATE font/otf + AddOutputFilterByType DEFLATE font/ttf + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE image/x-icon + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/xml + +# END DEFLATE COMPRESSION + + + ExpiresActive On + ExpiresDefault "access plus 1 month" + ExpiresByType text/html "access plus 0 seconds" + ExpiresByType text/xml "access plus 0 seconds" + ExpiresByType application/xml "access plus 0 seconds" + ExpiresByType application/json "access plus 0 seconds" + ExpiresByType application/pdf "access plus 0 seconds" + ExpiresByType application/rss+xml "access plus 1 hour" + ExpiresByType application/atom+xml "access plus 1 hour" + ExpiresByType application/x-font-ttf "access plus 1 month" + ExpiresByType font/opentype "access plus 1 month" + ExpiresByType application/x-font-woff "access plus 1 month" + ExpiresByType application/x-font-woff2 "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" + ExpiresByType application/vnd.ms-fontobject "access plus 1 month" + ExpiresByType image/jpg "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType video/ogg "access plus 1 month" + ExpiresByType audio/ogg "access plus 1 month" + ExpiresByType video/mp4 "access plus 1 month" + ExpiresByType video/webm "access plus 1 month" + ExpiresByType text/css "access plus 6 month" + ExpiresByType application/javascript "access plus 6 month" + ExpiresByType application/x-shockwave-flash "access plus 1 week" + ExpiresByType image/x-icon "access plus 1 week" + + + + + Header set Cache-Control "max-age=2592000, public" + + + Header set Cache-Control "max-age=604800, public" + + + Header set Cache-Control "max-age=604800, private" + + + Header set Cache-Control "max-age=5, public" + + + Header set Cache-Control "max-age=604800, public" + + + + + + mod_gzip_on Yes + mod_gzip_dechunk Yes + mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ + mod_gzip_item_include handler ^cgi-script$ + mod_gzip_item_include mime ^text/.* + mod_gzip_item_include mime ^application/x-javascript.* + mod_gzip_item_exclude mime ^image/.* + mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* + + +Header unset Pragma +FileETag None +Header unset ETag + + Options -MultiViews -Indexes diff --git a/public/css/app.css b/public/css/app.css index d0a6214..3592b8e 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -13674,6 +13674,28 @@ table tfoot tr:hover { cursor: pointer; } +.media_manager .main_content .media_container .wrapper .imageItem .etiquette { + position: absolute; + display: inline; + top: 38px; + left: 0; + z-index: 2; + color: #ffffff; + padding: 2px; +} + +.media_manager .main_content .media_container .wrapper .imageItem .etiquette[data-id="0"] { + display: none; +} + +.media_manager .main_content .media_container .wrapper .imageItem .etiquette i { + position: absolute; + right: -10px; + top: 0; + font-size: 30px; + line-height: 17px; +} + .media_manager .main_content .media_container .wrapper .imageItem .contextMenu { position: absolute; width: 100%; @@ -13810,7 +13832,7 @@ table tfoot tr:hover { .media_manager .side_menu { background-color: #3b3b3b; position: relative; - width: 340px; + width: 450px; height: 100%; transition: 0.3s ease-in-out; z-index: 1; @@ -13847,6 +13869,10 @@ table tfoot tr:hover { border-radius: 50%; } +.media_manager .side_menu header select { + width: 100%; +} + .media_manager .side_menu header .close_side_menu { background-color: #3b3b3b; position: absolute; @@ -14046,6 +14072,11 @@ table tfoot tr:hover { height: 100%; } +#form_media .main_content .tab.tab_preview embed { + width: 66%; + height: 99%; +} + #form_media .main_content .tab.tab_edit .tab_content { overflow: auto; height: calc(100% - 50px); diff --git a/public/js/app.js b/public/js/app.js index cec7399..fd360fd 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -10878,7 +10878,7 @@ function tableSearch(field, attr, search) { function tableGlobalSearch(field, search, cols) { var search = search.toUpperCase(); $(field).each(function (index, value) { - $row = $(this); + var $row = $(this); var find = false; $.each(cols, function (index, value) { var dataCol = $row.find("td:nth-of-type(" + value + ")").text().toUpperCase(); @@ -11014,7 +11014,7 @@ $(".contact_btn").on('click', function (event) { $(".close_popup").on('click', function (event) { event.preventDefault(); - $.fancybox.getInstance().close(); + $.fancybox.close(); }); // ---- Header : envoi formulaire de contact $(".form_contact_send").on('click', function (event) { @@ -11356,10 +11356,10 @@ $(document).ready(function () { }, success: function success(result) { $(".folder_container .dd3-item[data-id='" + dossier_id + "'] > .dd3-content span").html(libelle); - $.fancybox.getInstance().close(); + $.fancybox.close(); }, error: function error(jqXHR, textStatus, errorThrown) { - $.fancybox.getInstance().close(); + $.fancybox.close(); $.fancyMessage({ title: "Attention", message: "Erreur lors de l'édition du dossier, merci d'actualiser la page.", @@ -11490,7 +11490,9 @@ $(document).ready(function () { $(this).dblclick(); } else if ($target.hasClass('downloadItem')) {// Télécharger le média } else if ($target.hasClass('addBasket')) {// ajouter le média au panier - } else if ($target.hasClass('deleteItem')) {// supprimer le média + } else if ($target.hasClass('deleteItem')) { + // supprimer le média + removeMedias([$(this).attr('data-id')]); } else if ($target.hasClass('tagItem')) {// Appliquer une étiquette } @@ -11562,13 +11564,14 @@ $(document).ready(function () { event.preventDefault(); // initialise le nuage de Tags $('#tag-editor').tagEditor({ - initialTags: ['Paysage', 'Nature', 'Soleil'], placeholder: 'Saissisez des tags', removeDuplicates: false, clickDelete: true }); var minWidth = $(document).width(); - var minHeight = $(document).height() - 43 - 40; // Mémorise le média courant + var minHeight = $(document).height() - 43 - 40; // récupère l'image de preview + + var imgPreview = $(this).attr('data-preview'); // Mémorise le média courant $(window).data('current_edit_media', $(this).attr('data-id')); // sélectionne la tab preview à l'ouverture @@ -11576,10 +11579,11 @@ $(document).ready(function () { if ($(this).attr('data-typemedia') == 1) { // média image - $("#form_media .form_media_retouch").show(); // on active l'onglet ressource + $("#form_media .form_media_retouch").show(); // on active l'onglet retouche + + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge l'image de preview - $(".preview_img").val($(this).attr('data-preview')); $(".tab_preview").html('
'); $("#openseadragon").css('width', '100%'); $("#openseadragon").css('height', minHeight); @@ -11587,7 +11591,7 @@ $(document).ready(function () { id: "openseadragon", tileSources: { type: "image", - url: $(".preview_img").val() + url: imgPreview } }); // charge l'image pour la retouche @@ -11602,14 +11606,13 @@ $(document).ready(function () { save: { callback: function callback() { var newImage = this.darkroom.sourceCanvas.toDataURL(); - $(".preview_img").val(newImage); viewer.destroy(); viewer = null; viewer = OpenSeadragon({ id: "openseadragon", tileSources: { type: "image", - url: $(".preview_img").val() + url: newImage } }); } @@ -11619,6 +11622,8 @@ $(document).ready(function () { } else if ($(this).attr('data-typemedia') == 2) { // média svg $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche + + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge le svg $(".tab_preview").html(''); @@ -11626,6 +11631,8 @@ $(document).ready(function () { } else if ($(this).attr('data-typemedia') == 4) { // média audio $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche + + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge l'audio $(".tab_preview").html(''); @@ -11633,6 +11640,8 @@ $(document).ready(function () { } else if ($(this).attr('data-typemedia') == 3) { // média video $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche + + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge la vidéo $(".tab_preview").html(''); @@ -11640,14 +11649,96 @@ $(document).ready(function () { } else if ($(this).attr('data-typemedia') == 5) { // média document $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche - // charge l'aperçu + // pdf : on affiche le lecteur pdf - $(".tab_preview").html(''); - $(".tab_preview img").attr("src", $(this).attr('data-preview')); - } // affiche la popin + if ($(this).attr('data-ext') == 'pdf') { + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu + // charge l'aperçu + + $(".tab_preview").html(''); + $(".tab_preview embed").attr("src", $(this).attr('data-src')); // psd et ai : on affiche la preview classique + } else if ($(this).attr('data-ext') == 'psd' || $(this).attr('data-ext') == 'ai') { + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu + // charge l'aperçu + + $(".tab_preview").html('
'); + $("#openseadragon").css('width', '100%'); + $("#openseadragon").css('height', minHeight); + viewer = OpenSeadragon({ + id: "openseadragon", + tileSources: { + type: "image", + url: imgPreview + } + }); // autre document : pas d'aperçu + } else { + $("#form_media .form_media_preview").hide(); // masque l'onglet aperçu + + $("#form_media .form_media_edit").trigger("click"); // sélectionne la tab d'édition à l'ouverture + } + } // chargement des données du média - $("#form_media").fadeIn('fast'); + $.ajax({ + url: '/ajax/get-media', + method: 'POST', + dataType: 'json', + data: { + media_id: $(window).data('current_edit_media') + }, + success: function success(result) { + // chargement des données + $(".tab_edit #arcadia_id").val(result.data.arcadia_id); + $(".tab_edit #libelle").val(result.data.libelle); + $(".tab_edit #sujetLibelle").val(result.data.sujet.LIBELLE); + $(".tab_edit #typevues").val(result.data.typevue_id); + $(".tab_edit #typemedias").val(result.data.typemedia_id); //$(".tab_edit #variantes").val(result.data.etiquette_id); + + $(".tab_edit #langues").val(result.data.langue_id); + $(".tab_edit #commentaire").val(result.data.commentaire); //$(".tab_edit #version").val(result.data.version); + + $(".tab_edit #created_at").val(result.data.created_at); + $(".tab_edit #updated_at").val(result.data.updated_at); + $(".tab_edit #published_at").val(result.data.published_at); // liste des produits liés + // marque lié + // site lié + // tags $('#demo3').tagEditor('addTag', 'example'); + + $(".tab_edit #etiquettes").val(result.data.etiquette_id); + $(".tab_edit #extension").val(result.data.extension); + $(".tab_edit #copyrights").val(result.data.copyright_id); + $(".tab_edit #largeur").val(result.data.largeur); + $(".tab_edit #hauteur").val(result.data.hauteur); + $(".tab_edit #resolution").val(result.data.resolution); + $(".tab_edit #largeur_mm").val(result.data.largeur_mm); + $(".tab_edit #hauteur_mm").val(result.data.hauteur_mm); // affiche la popin + + $("#form_media").fadeIn('fast'); + }, + error: function error(jqXHR, textStatus, errorThrown) { + // si le plugin de retouche a déjà été chargé + if (drPlugin !== null) { + drPlugin.selfDestroy(); + drPlugin = null; // on détruit le plugin de retouche + } // si le plugin de preview a déjà été chargé + + + if (viewer !== null) { + viewer.destroy(); + viewer = null; // on détruit le plugin de preview + } + + $('#tag-editor').tagEditor('destroy'); + $('.ed_on').hide(); + $('.ed_off').show(); // on détruit le plugin de tag + + $.fancyMessage({ + title: "Edition d'un média", + message: "Ouverture du média impossible. Merci d'actualiser la page.", + type: "error" + }); + } + }); }); // ---- fermeture de la popup d'édition $(".form_media_close, .btn_tab_edit_cancel").on("click", function (event) { @@ -11658,7 +11749,10 @@ $(document).ready(function () { if (drPlugin !== null) { drPlugin.selfDestroy(); drPlugin = null; // on détruit le plugin de retouche + } // si le plugin de preview a déjà été chargé + + if (viewer !== null) { viewer.destroy(); viewer = null; // on détruit le plugin de preview } @@ -11675,6 +11769,17 @@ $(document).ready(function () { if ($(".tab_preview audio").length) { $(".tab_preview audio").get(0).pause(); } + }); // ---- Suppression de média en masse + + $('.action_delete_media').on('click', function (event) { + event.preventDefault(); + var medias = []; + $('.media_container .imageItem').each(function (index) { + if ($(this).attr("aria-grabbed") == "true") { + medias.push($(this).attr("data-id")); + } + }); + removeMedias(medias); }); // ---- gestion des onglets de la popup d'édition $("#form_media .tabbtn").on("click", function (event) { @@ -11745,7 +11850,7 @@ $(document).ready(function () { url: "/ajax/upload-media", dataType: 'json', limitMultiFileUploads: 10, - maxChunkSize: 10000000, + maxChunkSize: 8000000, dragover: function dragover(e, data) { $(".uploader-window").fadeIn("fast"); }, @@ -11867,10 +11972,18 @@ function initFolderManager(sujetId) { }, success: function success(result) { var output = ''; - var draggable = result.draggable; - var data = result.data; + var draggable = result.draggable; // initialisation de la liste type vues + + var typevues = result.typevues; + $("#typevues").find('option').remove(); + $.each(typevues, function (index, typevue) { + $("#typevues").append(''); + }); // ajout du total à la racine + var total = result.count; - $(".root_folder .count").html(total); + $(".root_folder .count").html(total); // construction des dossiers + + var data = result.data; $.each(data, function (index, item) { output += buildItem(item); }); @@ -11982,6 +12095,7 @@ function loadMedia(dossier_id, sujet_id) { $(window).data('noMedia', true); } + var draggable = result.draggable; $.each(data, function (index, item) { var ico = ""; var detail = ""; @@ -12018,9 +12132,9 @@ function loadMedia(dossier_id, sujet_id) { case 5: ico = ''; - if (item.extension = "pdf") { - thumb = item.source.split('.')[0] + "_thumb.jpg"; - preview = item.source.split('.')[0] + "_preview.jpg"; + if (item.extension == "pdf" || item.extension == "ai" || item.extension == "psd") { + thumb = item.source.split('.')[0] + "_thumb.png"; + preview = item.source.split('.')[0] + "_preview.png"; } else { itemClass = "doc"; } @@ -12030,7 +12144,8 @@ function loadMedia(dossier_id, sujet_id) { default: } - output += '
'; + output += '
'; + output += '
' + item.etiquette.libelle + '
'; output += '
    '; output += ''; output += ''; @@ -12055,6 +12170,59 @@ function loadMedia(dossier_id, sujet_id) { $(window).data('ajaxready', true); } }); +} // ---- Supression de médias + + +function removeMedias(medias) { + if (medias.length == 0) { + $.fancyMessage({ + title: "Attention", + message: "Veuillez sélectionner les médias à supprimer.", + type: "error" + }); + } else { + $.fancyConfirm({ + title: "Suppression de média", + message: "Êtes-vous sûr de vouloir supprimer " + medias.length + " média(s) ?", + okButton: 'Supprimer', + noButton: 'Annuler', + callback: function callback(value) { + if (value) { + $.ajax({ + url: '/ajax/remove-media', + method: 'POST', + dataType: 'json', + data: { + medias: medias + }, + success: function success(result) { + $.each(medias, function (index, value) { + $(".media_container .imageItem[data-id='" + value + "']").remove(); + }); // ---- MAJ du nb de média dans le dossier + + var currentFolder = $(".currentFolder").val(); + + if (currentFolder == 0 || currentFolder == "") { + var count = $(".folder_container .root_folder .count"); + } else { + var count = $(".folder_container .dd3-item[data-id='" + currentFolder + "'] > .dd3-content .count"); + } + + count.html(parseInt(count.html()) - medias.length); + }, + error: function error(jqXHR, textStatus, errorThrown) { + $.fancybox.close(); + $.fancyMessage({ + title: "Attention", + message: "Erreur lors de la suppression du média, merci d'actualiser la page.", + type: "error" + }); + } + }); + } + } + }); + } } // ---- contruction de l'arborescence des dossiers diff --git a/resources/js/admin.js b/resources/js/admin.js index bf1d7e4..8585341 100644 --- a/resources/js/admin.js +++ b/resources/js/admin.js @@ -187,7 +187,7 @@ function tableGlobalSearch(field, search, cols){ var search = search.toUpperCase(); $(field).each(function (index, value) { - $row = $(this); + var $row = $(this); var find = false; $.each(cols, function (index, value) { var dataCol = $row.find("td:nth-of-type("+value+")").text().toUpperCase(); diff --git a/resources/js/app.js b/resources/js/app.js index 13ac772..e35e5c9 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -142,7 +142,7 @@ $(".contact_btn").on('click',function(event) { // ---- Header : fermeture de la popup $(".close_popup").on('click',function(event) { event.preventDefault(); - $.fancybox.getInstance().close(); + $.fancybox.close(); }); // ---- Header : envoi formulaire de contact diff --git a/resources/js/media.js b/resources/js/media.js index 4f3645f..61ee71d 100644 --- a/resources/js/media.js +++ b/resources/js/media.js @@ -272,10 +272,10 @@ $(document).ready(function() { }, success: function(result){ $(".folder_container .dd3-item[data-id='"+dossier_id+"'] > .dd3-content span").html(libelle); - $.fancybox.getInstance().close(); + $.fancybox.close(); }, error: function(jqXHR, textStatus, errorThrown) { - $.fancybox.getInstance().close(); + $.fancybox.close(); $.fancyMessage({title : "Attention", message : "Erreur lors de l'édition du dossier, merci d'actualiser la page.", type : "error"}); } }); @@ -399,6 +399,7 @@ $(document).ready(function() { }else if ($target.hasClass('downloadItem')) { // Télécharger le média }else if ($target.hasClass('addBasket')) { // ajouter le média au panier }else if ($target.hasClass('deleteItem')) { // supprimer le média + removeMedias([$(this).attr('data-id')]); }else if ($target.hasClass('tagItem')) { // Appliquer une étiquette } return false; @@ -466,7 +467,6 @@ $(document).ready(function() { // initialise le nuage de Tags $('#tag-editor').tagEditor({ - initialTags: ['Paysage', 'Nature', 'Soleil'], placeholder: 'Saissisez des tags', removeDuplicates : false, clickDelete : true @@ -475,25 +475,27 @@ $(document).ready(function() { var minWidth = $(document).width(); var minHeight = $(document).height()-43-40; + // récupère l'image de preview + var imgPreview = $(this).attr('data-preview'); + // Mémorise le média courant $(window).data('current_edit_media', $(this).attr('data-id')); // sélectionne la tab preview à l'ouverture $("#form_media .form_media_preview").trigger("click"); if($(this).attr('data-typemedia') == 1){ // média image - $("#form_media .form_media_retouch").show(); // on active l'onglet ressource + $("#form_media .form_media_retouch").show(); // on active l'onglet retouche + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge l'image de preview - $(".preview_img").val($(this).attr('data-preview')); $(".tab_preview").html('
    '); - $("#openseadragon").css('width', '100%'); $("#openseadragon").css('height', minHeight); viewer = OpenSeadragon({ id: "openseadragon", tileSources: { type: "image", - url: $(".preview_img").val(), + url: imgPreview, } }); @@ -510,13 +512,12 @@ $(document).ready(function() { save: { callback: function() { var newImage = this.darkroom.sourceCanvas.toDataURL(); - $(".preview_img").val(newImage); viewer.destroy(); viewer = null; viewer = OpenSeadragon({ id: "openseadragon", tileSources: { type: "image", - url: $(".preview_img").val(), + url: newImage, } }); } @@ -525,27 +526,108 @@ $(document).ready(function() { }); }else if ($(this).attr('data-typemedia') == 2) { // média svg $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge le svg $(".tab_preview").html(''); $(".tab_preview img").attr("src", $(this).attr('data-src')); }else if ($(this).attr('data-typemedia') == 4) { // média audio $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge l'audio $(".tab_preview").html(''); $(".tab_preview audio").attr("src", $(this).attr('data-src')); }else if ($(this).attr('data-typemedia') == 3) { // média video $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu // charge la vidéo $(".tab_preview").html(''); $(".tab_preview video").attr("src", $(this).attr('data-src')); }else if ($(this).attr('data-typemedia') == 5) { // média document + $("#form_media .form_media_retouch").hide(); // masque l'onglet retouche - // charge l'aperçu - $(".tab_preview").html(''); - $(".tab_preview img").attr("src", $(this).attr('data-preview')); + + // pdf : on affiche le lecteur pdf + if($(this).attr('data-ext') == 'pdf'){ + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu + // charge l'aperçu + $(".tab_preview").html(''); + $(".tab_preview embed").attr("src", $(this).attr('data-src')); + + // psd et ai : on affiche la preview classique + }else if ($(this).attr('data-ext') == 'psd' || $(this).attr('data-ext') == 'ai') { + $("#form_media .form_media_preview").show(); // on active l'onglet aperçu + // charge l'aperçu + $(".tab_preview").html('
    '); + $("#openseadragon").css('width', '100%'); + $("#openseadragon").css('height', minHeight); + viewer = OpenSeadragon({ + id: "openseadragon", + tileSources: { + type: "image", + url: imgPreview, + } + }); + + // autre document : pas d'aperçu + }else{ + $("#form_media .form_media_preview").hide(); // masque l'onglet aperçu + $("#form_media .form_media_edit").trigger("click"); // sélectionne la tab d'édition à l'ouverture + } + + } - // affiche la popin - $("#form_media").fadeIn('fast'); + // chargement des données du média + $.ajax({ + url: '/ajax/get-media', + method: 'POST', + dataType : 'json', + data: { + media_id : $(window).data('current_edit_media'), + }, + success: function(result){ + // chargement des données + $(".tab_edit #arcadia_id").val(result.data.arcadia_id); + $(".tab_edit #libelle").val(result.data.libelle); + $(".tab_edit #sujetLibelle").val(result.data.sujet.LIBELLE); + $(".tab_edit #typevues").val(result.data.typevue_id); + $(".tab_edit #typemedias").val(result.data.typemedia_id); + //$(".tab_edit #variantes").val(result.data.etiquette_id); + $(".tab_edit #langues").val(result.data.langue_id); + $(".tab_edit #commentaire").val(result.data.commentaire); + //$(".tab_edit #version").val(result.data.version); + $(".tab_edit #created_at").val(result.data.created_at); + $(".tab_edit #updated_at").val(result.data.updated_at); + $(".tab_edit #published_at").val(result.data.published_at); + // liste des produits liés + // marque lié + // site lié + // tags $('#demo3').tagEditor('addTag', 'example'); + $(".tab_edit #etiquettes").val(result.data.etiquette_id); + $(".tab_edit #extension").val(result.data.extension); + $(".tab_edit #copyrights").val(result.data.copyright_id); + $(".tab_edit #largeur").val(result.data.largeur); + $(".tab_edit #hauteur").val(result.data.hauteur); + $(".tab_edit #resolution").val(result.data.resolution); + $(".tab_edit #largeur_mm").val(result.data.largeur_mm); + $(".tab_edit #hauteur_mm").val(result.data.hauteur_mm); + + // affiche la popin + $("#form_media").fadeIn('fast'); + }, + error: function(jqXHR, textStatus, errorThrown) { + // si le plugin de retouche a déjà été chargé + if(drPlugin !== null){ + drPlugin.selfDestroy(); drPlugin = null; // on détruit le plugin de retouche + } + // si le plugin de preview a déjà été chargé + if(viewer !== null){ + viewer.destroy(); viewer = null; // on détruit le plugin de preview + } + $('#tag-editor').tagEditor('destroy'); $('.ed_on').hide();$('.ed_off').show(); // on détruit le plugin de tag + $.fancyMessage({title : "Edition d'un média", message : "Ouverture du média impossible. Merci d'actualiser la page.", type : "error"}); + } + }); + }); @@ -557,6 +639,9 @@ $(document).ready(function() { // si le plugin de retouche a déjà été chargé if(drPlugin !== null){ drPlugin.selfDestroy(); drPlugin = null; // on détruit le plugin de retouche + } + // si le plugin de preview a déjà été chargé + if(viewer !== null){ viewer.destroy(); viewer = null; // on détruit le plugin de preview } $('#tag-editor').tagEditor('destroy'); $('.ed_on').hide();$('.ed_off').show(); // on détruit le plugin de tag @@ -569,6 +654,18 @@ $(document).ready(function() { } }); + // ---- Suppression de média en masse + $('.action_delete_media').on('click',function(event){ + event.preventDefault(); + var medias = []; + $('.media_container .imageItem').each(function (index) { + if( $(this ).attr("aria-grabbed") == "true" ){ + medias.push($(this ).attr("data-id")); + } + }); + removeMedias(medias); + }); + // ---- gestion des onglets de la popup d'édition $("#form_media .tabbtn").on("click" , function(event) { event.preventDefault(); @@ -649,7 +746,7 @@ $(document).ready(function() { url: "/ajax/upload-media", dataType: 'json', limitMultiFileUploads: 10, - maxChunkSize: 10000000, + maxChunkSize: 8000000, dragover: function (e, data) { $(".uploader-window").fadeIn( "fast"); }, @@ -772,10 +869,20 @@ function initFolderManager(sujetId){ success: function(result){ var output = ''; var draggable = result.draggable; - var data = result.data; + + // initialisation de la liste type vues + var typevues = result.typevues; + $("#typevues").find('option').remove(); + $.each(typevues, function (index, typevue) { + $("#typevues").append('') + }); + + // ajout du total à la racine var total = result.count; $(".root_folder .count").html(total); + // construction des dossiers + var data = result.data; $.each(data, function (index, item) { output += buildItem(item); }); @@ -866,6 +973,7 @@ function loadMedia(dossier_id, sujet_id){ if(data.length == 0){ $(window).data('noMedia', true); } + var draggable = result.draggable; $.each(data, function (index, item) { var ico = ""; @@ -897,9 +1005,9 @@ function loadMedia(dossier_id, sujet_id){ break; case 5: ico = ''; - if(item.extension = "pdf"){ - thumb = item.source.split('.')[0]+"_thumb.jpg"; - preview = item.source.split('.')[0]+"_preview.jpg"; + if(item.extension == "pdf" || item.extension == "ai" || item.extension == "psd"){ + thumb = item.source.split('.')[0]+"_thumb.png"; + preview = item.source.split('.')[0]+"_preview.png"; }else{ itemClass = "doc"; } @@ -908,7 +1016,8 @@ function loadMedia(dossier_id, sujet_id){ } - output += '
    '; + output += '
    '; + output += '
    '+item.etiquette.libelle+'
    '; output += '
      '; output += ''; output += ''; @@ -934,6 +1043,51 @@ function loadMedia(dossier_id, sujet_id){ }); } +// ---- Supression de médias +function removeMedias(medias){ + + if(medias.length == 0){ + $.fancyMessage({title : "Attention", message : "Veuillez sélectionner les médias à supprimer.", type : "error"}); + }else{ + $.fancyConfirm({ + title : "Suppression de média", + message : "Êtes-vous sûr de vouloir supprimer "+medias.length+" média(s) ?", + okButton : 'Supprimer', + noButton : 'Annuler', + callback : function (value) { + if (value) { + $.ajax({ + url: '/ajax/remove-media', + method: 'POST', + dataType : 'json', + data: { + medias: medias + }, + success: function(result){ + $.each(medias, function (index, value) { + $(".media_container .imageItem[data-id='"+value+"']").remove(); + }); + + // ---- MAJ du nb de média dans le dossier + var currentFolder = $(".currentFolder").val(); + if(currentFolder == 0 || currentFolder == ""){ + var count = $(".folder_container .root_folder .count"); + }else{ + var count = $(".folder_container .dd3-item[data-id='"+currentFolder+"'] > .dd3-content .count"); + } + count.html(parseInt(count.html())-medias.length); + }, + error: function(jqXHR, textStatus, errorThrown) { + $.fancybox.close(); + $.fancyMessage({title : "Attention", message : "Erreur lors de la suppression du média, merci d'actualiser la page.", type : "error"}); + } + }); + } + } + }); + } +} + // ---- contruction de l'arborescence des dossiers function buildItem(item) { var parentClass = ""; diff --git a/resources/sass/partials/media.scss b/resources/sass/partials/media.scss index db29553..190a4af 100644 --- a/resources/sass/partials/media.scss +++ b/resources/sass/partials/media.scss @@ -127,6 +127,28 @@ padding-bottom: 25px; cursor: pointer; + .etiquette{ + position: absolute; + display: inline; + top: 38px; + left:0; + z-index: 2; + color: $white; + padding: 2px; + + &[data-id='0']{ + display: none; + } + + i{ + position: absolute; + right: -10px; + top: 0; + font-size: 30px; + line-height: 17px; + } + } + .contextMenu{ position: absolute; width: 100%; @@ -265,7 +287,7 @@ .side_menu{ background-color: $grey; position: relative; - width: 340px; + width: 450px; height: 100%; transition: 0.3s ease-in-out; z-index: 1; @@ -298,6 +320,9 @@ border-radius: 50%; } } + select{ + width: 100%; + } .close_side_menu{ background-color: $grey; position: absolute; @@ -484,6 +509,12 @@ width: auto; height: 100%; } + + embed { + width: 66%; + height: 99%; + } + } &.tab_edit{ diff --git a/resources/views/layouts/media_edit.blade.php b/resources/views/layouts/media_edit.blade.php index 0c91dd9..cb2f943 100644 --- a/resources/views/layouts/media_edit.blade.php +++ b/resources/views/layouts/media_edit.blade.php @@ -9,67 +9,66 @@
      -

      Informations générales

      - - + + hasRole(config('roles.const.ADMIN'))) disabled @endif >
      - +
      - +
      - - +
      +
      + +
      - - + +
      - - -
      -
      - - + @foreach ($langues as $langue) + + @endforeach
      - +
      - +
      - - + +
      - - + +
      - - + +
      @@ -124,9 +123,11 @@
      - - + @foreach ($etiquettes as $etiquette) + + @endforeach
      @@ -134,33 +135,35 @@

      Informations techniques

      - +
      - - + @foreach ($copyrights as $copyright) + + @endforeach
      - +
      - +
      - +
      - - + +
      - - + +
    diff --git a/resources/views/media_manager.blade.php b/resources/views/media_manager.blade.php index 621d424..a8dfe07 100644 --- a/resources/views/media_manager.blade.php +++ b/resources/views/media_manager.blade.php @@ -53,11 +53,17 @@
    + @if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')])) Ajouter un média + @endif Télécharger Ajouter au panier + @if (Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')])) Supprimer + @endif + @if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')])) Etiquette + @endif
    diff --git a/routes/web.php b/routes/web.php index 67118ec..a4f5678 100644 --- a/routes/web.php +++ b/routes/web.php @@ -12,10 +12,15 @@ */ Route::group(['middleware' => ['auth']], function(){ + // Les pages Front Route::get('/', 'CommunController@index')->name('home'); + Route::get('/gestion-des-medias', 'MediaController@index')->name('media_manager'); + Route::get('/upload', 'UploadController@index'); + + // Message de contact Route::post('/send-message', 'CommunController@sendMessage'); - Route::get('/gestion-des-medias', 'MediaController@index')->name('media_manager'); + // Ajax pour la gestion des dossiers Route::post('/ajax/load-folder', 'DossierController@loadFolder'); Route::post('/ajax/add-folder', 'DossierController@addFolder'); Route::post('/ajax/remove-folder', 'DossierController@removeFolder'); @@ -24,12 +29,17 @@ Route::group(['middleware' => ['auth']], function(){ Route::post('/ajax/favoris-folder', 'UserController@favorisFolder'); Route::post('/ajax/get-folder-property', 'DossierController@getFolderProperty'); Route::post('/ajax/save-folder-property', 'DossierController@saveFolderProperty'); + + // Ajax pour la gestion des médias Route::post('/ajax/load-media', 'MediaController@loadMedia'); Route::post('/ajax/move-media', 'MediaController@moveMedia'); + Route::post('/ajax/remove-media', 'MediaController@removeMedia'); + Route::post('/ajax/get-media', 'MediaController@getOneMedia'); - Route::get('/upload', 'UploadController@index'); + // Ajax pour la gestion de l'upload de média Route::post('/ajax/upload-media', 'UploadController@storeMedia'); + // Back office Route::resource('user', 'UserController'); Route::post('/check-matricule', 'UserController@checkMatricule'); Route::resource('dossier', 'DossierController');