-
- -
+
diff --git a/app/Console/Commands/ImportArcadiaFiles.php b/app/Console/Commands/ImportArcadiaFiles.php index 302db55..0313b51 100644 --- a/app/Console/Commands/ImportArcadiaFiles.php +++ b/app/Console/Commands/ImportArcadiaFiles.php @@ -4,6 +4,7 @@ namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Facades\File; use App\Article; use App\Marque; use App\Sujet; @@ -11,9 +12,13 @@ use App\Typemedia; use App\Typevue; use App\Site; use App\Variante; +use App\Media; +use App\Http\Traits\MediaTools; class ImportArcadiaFiles extends Command { + use MediaTools; + /** * The name and signature of the console command. * @@ -171,10 +176,111 @@ class ImportArcadiaFiles extends Command $record->save(); } } + }elseif (substr($filename, 0, 16) == "DAM_MEDIA_VISUEL") { + foreach ($fileContent->MEDIA_VISUEL as $row) { + $record = Media::where('arcadia_id', $row->code)->first(); + if(!$record){ // Insert new record + $record = new Media(); + $record->arcadia_id = $row->code; + if($row->extension != ""){ + $record->extension = $row->extension->typeFichier->libExtension; + } + + $record->libelle = $row->libelle; + $record->largeur = $row->nbPxLargeur; + $record->largeur_mm = $row->largeurMm; + $record->hauteur = $row->nbPxHauteur; + $record->hauteur_mm = $row->hauteurMm; + $record->resolution = $row->pppLargeur; + if($row->version != ""){ + $record->version = $row->version; + }else{ + $record->version = 1; + } + + if($row->typemedia_id != ""){ + $record->typemedia_id = $row->codeTypeMedia; + }else{ + $record->typemedia_id = 1; + } + if($row->typevue_id != ""){ + $record->typevue_id = $row->codeTypeVue; + } + $record->commentaire = $row->commentaire; + $record->sujet_id = $row->codeSujet; + if($row->langue != ""){ + $record->langue_id = $row->langue; + } + if($row->copyright != ""){ + $record->copyright_id = $row->copyright; + } + if($row->codeVariante != ""){ + $record->variante_id = $row->codeVariante; + } + if($row->dateCreation != ""){ + $row->dateCreation = substr($row->dateCreation, 0, 10); + $date = explode("/", $row->dateCreation); + $record->created_at = $date[2].'-'.$date[1].'-'.$date[0]; + } + if($row->dateModification != ""){ + $row->dateModification = substr($row->dateModification, 0, 10); + $date = explode("/", $row->dateModification); + $record->updated_at = $date[2].'-'.$date[1].'-'.$date[0]; + } + if($row->datePublication != ""){ + $row->datePublication = substr($row->datePublication, 0, 10); + $date = explode("/", $row->datePublication); + $record->published_at = $date[2].'-'.$date[1].'-'.$date[0]; + } + $record->statut = config('services.statut.public_etendue'); + + // TODO lien avec les sites, marques et articles + + + $mediaFile = "/images/".$record->arcadia_id.".".$record->extension; + $fileExists = Storage::disk('arcadia')->exists($mediaFile); + if($fileExists){ + $file = Storage::disk('arcadia')->get($mediaFile); + + // Affectation d'un dossier et d'un uid + $destinationPath = $this->get_mediaFolder()."/"; + $record->folder = $destinationPath; + $record->uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', + // 32 bits for "time_low" + mt_rand(0, 0xffff), mt_rand(0, 0xffff), + // 16 bits for "time_mid" + mt_rand(0, 0xffff), + // 16 bits for "time_hi_and_version", + // four most significant bits holds version number 4 + mt_rand(0, 0x0fff) | 0x4000, + // 16 bits, 8 bits for "clk_seq_hi_res", + // 8 bits for "clk_seq_low", + // two most significant bits holds zero and one for variant DCE1.1 + mt_rand(0, 0x3fff) | 0x8000, + // 48 bits for "node" + mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) + ); + + // déplacement du média et renommage du fichier + $full_path_source = Storage::disk('arcadia')->getDriver()->getAdapter()->applyPathPrefix($mediaFile); + $full_path_dest = Storage::disk('local')->getDriver()->getAdapter()->applyPathPrefix($destinationPath.$record->uid. '.' .$record->extension); + File::move($full_path_source, $full_path_dest); + + // calcul de la taille du média et durée + $record->taille = $this->formatBytes($this->get_file_size($full_path_dest)); + $record->save(); + + // ---- Creation des vignettes de base + $this->create_sys_thumb($record); + // ---- Creation des vignettes en lien avec le sujet du média + $this->create_thumb($record); + } + } + } } // ---- Suppression du fichier - Storage::disk('arcadia')->delete($filename); + //Storage::disk('arcadia')->delete($filename); $bar->advance(); } diff --git a/app/Http/Controllers/DossierController.php b/app/Http/Controllers/DossierController.php index d56121b..828f79e 100644 --- a/app/Http/Controllers/DossierController.php +++ b/app/Http/Controllers/DossierController.php @@ -22,7 +22,7 @@ class DossierController extends Controller public function index() { Auth::user()->authorizeRoles(config('roles.const.ADMIN')); - $dossiers = Dossier::whereNull('parent_id') + $dossiers = Dossier::whereNull('parent_id')->where('system', 0) ->get(); $sujets = Sujet::where('sujet_dam', 1)->get(); @@ -191,11 +191,22 @@ class DossierController extends Controller $userId = Auth::user()->id; $sujetId = $request->input('sujetId'); $marques = Auth::user()->marques()->pluck("marque_id"); - $response['data'] = Dossier::where('sujet_id', $sujetId) + $dossierQuery = Dossier::where('sujet_id', $sujetId) ->whereNull('parent_id') ->whereHas("marques", function($query) use ($marques){ $query->whereIn("marque_id", $marques); })->get(); + + // Ajout du dépôt de fichier pour les admin + if(Auth::user()->hasRole(config('roles.const.ADMIN')) ){ + $depotQuery = Dossier::whereNull('parent_id') + ->where('system', 1) + ->get(); + $response['data'] = $dossierQuery->merge($depotQuery); + }else{ + $response['data'] = $dossierQuery; + } + $response['count'] = Media::where('sujet_id', $sujetId) ->whereNull('dossier_id') ->where(function ($query) use ( $userId ) { @@ -232,11 +243,39 @@ class DossierController extends Controller Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]); $parent_id = $request->input('parent_id'); $libelle = $request->input('libelle'); + $description = $request->input('description'); // ---- Le dossier $dossier = new Dossier(); $dossier->libelle = $libelle; + $dossier->description = $description; $dossier->parent_id = $parent_id; + if($parent_id == 1){ // dossier de dépôt + $dossier->system = 1; + } + $dossier->save(); + + $response['folder_id'] = $dossier->id; + return json_encode($response); + } + + /** + * Ajouter un dossier de dépôt + * + */ + public function addDepotFolder(Request $request) + { + $response = array(); + $parent_id = $request->input('parent_id'); + $libelle = $request->input('libelle'); + $description = $request->input('description'); + + // ---- Le dossier + $dossier = new Dossier(); + $dossier->libelle = $libelle; + $dossier->description = $description; + $dossier->parent_id = 1; + $dossier->system = 1; $dossier->save(); $response['folder_id'] = $dossier->id; @@ -272,12 +311,17 @@ class DossierController extends Controller Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]); $dossier_id = $request->input('dossier_id'); $parent_id = $request->input('parent_id'); + $sujet_id = $request->input('sujet_id'); // ---- Le dossier $dossier = Dossier::where('id', $dossier_id)->first(); if($dossier && !is_null($dossier->parent_id)){ $dossier->parent_id = $parent_id; if ($dossier->save()) { + + Media::where('dossier_id', $dossier_id)->update(['sujet_id' => $sujet_id]); + + return json_encode(true); } } diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index b1402ca..a270693 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -14,6 +14,7 @@ use App\Copyright; use App\Etiquette; use App\Site; use App\Marque; +use App\Dossier; use App\Tag; use App\Article; use App\Http\Traits\MediaTools; @@ -35,7 +36,7 @@ class MediaController extends Controller $langues = Langue::all(); $copyrights = Copyright::all(); $etiquettes = Etiquette::all(); - $sites = Site::all(); + $sites = Site::orderBy('libelle')->get(); $marques = Marque::all(); return view('media_manager')->with([ 'sujets'=> $sujets, @@ -58,41 +59,88 @@ class MediaController extends Controller $userId = Auth::user()->id; $dossier_id = $request->input('dossier_id'); $sujet_id = $request->input('sujet_id'); + $filters = json_decode($request->input('filters')); $offset = $request->input('offset'); $limit = $request->input('limit'); $orderField = $request->input('orderField'); $order = $request->input('order'); + $isDepot = 0; - if($dossier_id == "0"){ - $response['data'] = Media::where('sujet_id', $sujet_id) - ->whereNull('dossier_id') + if($dossier_id == "0"){ // dossier racine + $query= Media::where('sujet_id', $sujet_id) + ->whereNull('dossier_id'); + }elseif($dossier_id == "-1"){ + $query = Media::where('sujet_id', $sujet_id) ->where(function ($query) use ( $userId ) { $query->where('statut', '<>', 0) ->orWhere('created_by', $userId); - }) - ->with('Etiquette') - ->offset($offset) - ->limit($limit) - ->orderBy($orderField, $order) - ->get(); + }); }else{ - $response['data'] = Media::where('sujet_id', $sujet_id) - ->where('dossier_id', $dossier_id) - ->where(function ($query) use ( $userId ) { - $query->where('statut', '<>', 0) - ->orWhere('created_by', $userId); - }) - ->with('Etiquette') - ->offset($offset) - ->limit($limit) - ->orderBy($orderField, $order) - ->get(); + $dossier= Dossier::where('id', $dossier_id)->first(); + if($dossier->parent_id != 1 && $dossier->id != 1){ // dossier classic + $query = Media::where('sujet_id', $sujet_id) + ->where('dossier_id', $dossier_id) + ->where(function ($query) use ( $userId ) { + $query->where('statut', '<>', 0) + ->orWhere('created_by', $userId); + }); + }else{ // dossier dépôt + $isDepot = 1; + $query= Media::where('dossier_id', $dossier_id); + } } + + // Filtre recherche texte + if(property_exists($filters, 'search')){ + $search = strtolower(trim($filters->search->value)); + $query->where(function ($query) use ( $search ) { + $query->whereRaw("LCASE(libelle) LIKE '%".$search."%'") + ->orWhere('arcadia_id', $search) + ->orWhereHas("articles", function($query) use ($search){ + $query->where("noArt", $search) + ->orWhereRaw("LCASE(libCcial) LIKE '%".$search."%'") + ->orWhereRaw("LCASE(libMarq) LIKE '%".$search."%'") + ->orWhereRaw("LCASE(libFamVte) LIKE '%".$search."%'") + ->orWhere('codGencodAdm', $search) + ->orWhere('codGencodSymb', $search) + ->orWhere('codGencodPds', $search); + }) + ->orWhereHas("tags", function($query) use ($search){ + $query->WhereRaw("LCASE(libelle) LIKE '%".$search."%'"); + }); + }); + } + // Filtre type de média + if(property_exists($filters, 'typemedia_id')){ + $query->whereIn('typemedia_id', $filters->typemedia_id->value); + } + // Filtre type de vue + if(property_exists($filters, 'typevue_id')){ + $query->whereIn('typevue_id', $filters->typevue_id->value); + } + // Filtre liason avec Arcadia + if(property_exists($filters, 'arcadia_id')){ + $query->whereNotNull('arcadia_id' ); + } + // Filtre etiquette + if(property_exists($filters, 'etiquette_id')){ + $query->whereIn('etiquette_id', $filters->etiquette_id->value); + } + + + $query->with('Etiquette') + ->offset($offset) + ->limit($limit) + ->orderBy($orderField, $order); + $response['data'] = $query->get(); + if(Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')] )){ $response['draggable'] = true; }else{ $response['draggable'] = false; } + $response['role'] = Auth::user()->role; + $response['isDepot'] = $isDepot; return json_encode($response); } @@ -107,10 +155,12 @@ class MediaController extends Controller $response = array(); $dossier_id = $request->input('dossier_id'); $data = $request->input('data'); + $sujet_id = $request->input('sujet_id'); $data = explode(",", $data); foreach ($data as $key => $media_id) { $media = Media::where('id', $media_id)->first(); if($media){ + $media->sujet_id = $sujet_id; if($dossier_id > 0){ $media->dossier_id = $dossier_id; }else{ @@ -165,15 +215,21 @@ class MediaController extends Controller $filepath = preg_quote($media->folder.$media->uid, '/'); $matchingFiles = preg_grep('/^'.$filepath.'/', $files); foreach ($matchingFiles as $matchingFile) { - $im = new \imagick($matchingFile); - $imageprops = $im->getImageGeometry(); $path_parts = pathinfo($matchingFile); - $fileInfo = array(); $fileInfo['url'] = $host."/".$matchingFile; - $fileInfo['resolution'] = $imageprops['width']."x".$imageprops['height']."px"; - $fileInfo['extension'] = $path_parts['extension']; $fileInfo['libelle'] = $path_parts['filename']; + $fileInfo['extension'] = $path_parts['extension']; + $fileInfo['resolution'] = ""; + + if(in_array($path_parts['extension'], array("gif", "jpeg", "jpg", "png", "pdf", "ai", "psd")) ){ + $im = new \imagick($matchingFile); + $im->setIteratorIndex(0); + $imageprops = $im->getImageGeometry(); + $fileInfo['resolution'] = $imageprops['width']."x".$imageprops['height']."px"; + } + + if(strpos($fileInfo['libelle'], '_')){ $fileInfo['libelle'] = "Format ".substr($fileInfo['libelle'], strpos($fileInfo['libelle'], '_')+1); }else{ @@ -343,6 +399,12 @@ class MediaController extends Controller $response = false; $media_id = $request->input('media_id'); $arcadia_id = $request->input('arcadia_id'); + if($arcadia_id == "" || $arcadia_id == 0){ + $arcadia_id = NULL; + }else{ + $media = Media::where('arcadia_id', $arcadia_id)->first(); + if($media) return json_encode($response); + } $media = Media::where('id', $media_id)->first(); if($media){ @@ -379,7 +441,7 @@ class MediaController extends Controller public function downloadMedia(Request $request) { if(!$user = Auth::user()) abort(404, 'Erreur lors du téléchargement'); - + $deleteFileAfterSend = false; // obtention du format $formatId = $request->input('format'); if($formatId != 0){ @@ -410,10 +472,11 @@ class MediaController extends Controller $zip->addFile($fp, basename($fp)); } } + $deleteFileAfterSend = true; $zip->close(); $fp = $zip_file; } - return response()->download($fp)->deleteFileAfterSend(true); + return response()->download($fp)->deleteFileAfterSend($deleteFileAfterSend); } } diff --git a/app/Http/Controllers/UploadController.php b/app/Http/Controllers/UploadController.php index 5389345..bc30e00 100644 --- a/app/Http/Controllers/UploadController.php +++ b/app/Http/Controllers/UploadController.php @@ -5,6 +5,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use Illuminate\Http\Request; use App\Media; +use App\Site; use App\Http\Traits\MediaTools; @@ -12,9 +13,16 @@ class UploadController extends Controller { use MediaTools; - public function index() + public function index(Request $request) { - return view('upload.show'); + // ---- Vérification du token de sécurité + $token = $request->get('token'); + if($token != env('TOKEN_DEPOT', "c8c4613a-236c-4b06-95f6-a9c9c6c18861")) return abort(404); + + $sites = Site::orderBy('libelle')->get(); + return view('upload.show')->with([ + 'sites'=> $sites, + ]); } public function storeMedia(Request $request) @@ -22,10 +30,10 @@ class UploadController extends Controller { $uid = $request->input('uid'); $sujet_id = $request->input('sujet_id'); $dossier_id = $request->input('dossier_id'); - if($dossier_id == 0) $dossier_id = null; + if($dossier_id == 0) $dossier_id = NULL; $headers = $request->headers->all(); - $acceptFileTypes = array('gif','jpeg', 'jpg','png','mp4','mp3','psd','ai','eps','svg','indd','pdf'); + $acceptFileTypes = array('gif','jpeg', 'jpg','png','mp4','mp3','psd','ai','svg','pdf'); if ($request->hasFile('files')) { $file = $request->file('files'); @@ -113,10 +121,13 @@ class UploadController extends Controller { case 'jpeg': case 'jpg': case 'png': + case 'ai': + case 'pdf': + case 'psd': $media->typemedia_id = 1; $im = new \imagick($destinationPath.$filename); - if($extension == "gif" ){ + if(in_array($extension, array("pdf", "ai", "psd", "gif")) ){ $im->setIteratorIndex(0); } @@ -134,11 +145,14 @@ class UploadController extends Controller { $media->hauteur_mm = ""; } $media->save(); + $im->destroy(); // ---- Creation des vignettes de base $this->create_sys_thumb($media); // ---- Creation des vignettes en lien avec le sujet du média - $this->create_thumb($media); + if(isset($sujet_id) ){ + $this->create_thumb($media); + } break; // Illustration/Vectorielle (2) case 'svg': @@ -165,45 +179,6 @@ class UploadController extends Controller { } $media->save(); break; - // Document (5) - case 'ai': - case 'eps': - case 'indd': - case 'pdf': - case 'psd': - default: - $media->typemedia_id = 5; - - - if(in_array($extension, array("pdf", "ai", "psd")) ){ - $im = new \imagick(); - - $im->readImage($destinationPath.$filename); - if($extension == "pdf" || $extension == "psd" || $extension == "ai"){ - $im->setIteratorIndex(0); - } - $imageprops = $im->getImageGeometry(); - $media->largeur = $imageprops['width']; - $media->hauteur = $imageprops['height']; - $resolutions = $im->getImageResolution(); - $media->resolution = $resolutions['x']; - - if($media->resolution != 0){ - $media->largeur_mm = ceil(($media->largeur * 2.54 / $media->resolution)*10); - $media->hauteur_mm = ceil(($media->hauteur * 2.54 / $media->resolution)*10); - }else{ - $media->largeur_mm = ""; - $media->hauteur_mm = ""; - } - $media->save(); - $im->destroy(); - - // ---- Creation des vignettes de base - $this->create_sys_thumb($media); - // ---- Creation des vignettes en lien avec le sujet du média - $this->create_thumb($media); - } - break; } } diff --git a/app/Http/Traits/MediaTools.php b/app/Http/Traits/MediaTools.php index 5c4f08b..7c7f0a0 100644 --- a/app/Http/Traits/MediaTools.php +++ b/app/Http/Traits/MediaTools.php @@ -169,7 +169,7 @@ trait MediaTools { // format système (thumb et preview) if($format->system == 1){ if(in_array($media->extension, array("gif", "jpeg", "jpg", "png")) ){ - return public_path()."/".$media->folder.$media->uid.'_'.$format->libelle.'.'.$format->extension; + return public_path()."/".$media->folder.$media->uid.'_'.$format->libelle.'.'.$media->extension; }elseif(in_array($media->extension, array("pdf", "ai", "psd"))){ return public_path()."/".$media->folder.$media->uid.'.png'; }else{ diff --git a/app/Sujet.php b/app/Sujet.php index 6760dd2..a7a6011 100644 --- a/app/Sujet.php +++ b/app/Sujet.php @@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model; class Sujet extends Model { - + /** * The primary key associated with the table. * diff --git a/config/ldap.php b/config/ldap.php index a778249..c62c91b 100644 --- a/config/ldap.php +++ b/config/ldap.php @@ -155,6 +155,7 @@ return [ */ 'port' => env('LDAP_PORT', 389), + // 'port' => env('LDAP_PORT', 636), /* |-------------------------------------------------------------------------- diff --git a/package.json b/package.json index c2bf31c..ac502b3 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "watch-poll": "npm run watch -- --watch-poll", "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", "prod": "npm run production", - "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" + "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "wp": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" }, "devDependencies": { "axios": "^0.18", diff --git a/public/css/app.css b/public/css/app.css index 597d958..0e7607f 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -3834,6 +3834,16 @@ table { user-select: none; } +.dd3-content span { + text-overflow: ellipsis; + word-wrap: break-word; + white-space: nowrap; + display: inline-block; + width: 209px; + overflow: hidden; + height: 20px; +} + .dd3-content .count { float: right; display: inline; @@ -12217,7 +12227,8 @@ readers do not read off random characters that represent icons */ * https://opensource.org/licenses/MIT */ -.upload_container { +.upload_container, +.depot_container { display: none; position: absolute; top: 50%; @@ -12226,13 +12237,14 @@ readers do not read off random characters that represent icons */ transform: translate(-50%, -50%); width: 300px; height: 400px; - background-color: #ffffff; + background-color: #24272e; z-index: 100; border-radius: 10px; /* Fixes for IE < 8 */ } -.upload_container .fileinput-button { +.upload_container .fileinput-button, +.depot_container .fileinput-button { position: relative; overflow: hidden; display: inline-block; @@ -12254,19 +12266,21 @@ readers do not read off random characters that represent icons */ border-radius: 4px; width: 100%; font-size: 15px; - color: #3b3b3b; + color: #ffffff; padding: 16px; cursor: pointer; - border-bottom: 1px solid #aaaaaa; + border-bottom: 1px solid #17191F; } -.upload_container .fileinput-button i { +.upload_container .fileinput-button i, +.depot_container .fileinput-button i { color: #2489D1; font-size: 18px; margin-right: 10px; } -.upload_container .fileinput-button input { +.upload_container .fileinput-button input, +.depot_container .fileinput-button input { position: absolute; top: 0; right: 0; @@ -12278,18 +12292,20 @@ readers do not read off random characters that represent icons */ } @media screen\9 { - .upload_container .fileinput-button input { + .upload_container .fileinput-button input, + .depot_container .fileinput-button input { filter: alpha(opacity=0); font-size: 100%; height: 100%; } } -.upload_container .progress { +.upload_container .progress, +.depot_container .progress { display: none; height: 6px; overflow: hidden; - background-color: #f5f5f5; + background-color: #24272e; position: absolute; top: 0px; left: 0; @@ -12297,7 +12313,8 @@ readers do not read off random characters that represent icons */ width: 100%; } -.upload_container .progress .progress-bar { +.upload_container .progress .progress-bar, +.depot_container .progress .progress-bar { float: left; width: 0; height: 100%; @@ -12310,29 +12327,34 @@ readers do not read off random characters that represent icons */ transition: width 0.6s ease; } -.upload_container .progress .progress-bar.progress-bar-success { +.upload_container .progress .progress-bar.progress-bar-success, +.depot_container .progress .progress-bar.progress-bar-success { background-color: #5cb85c; } -.upload_container .content_wrapper { +.upload_container .content_wrapper, +.depot_container .content_wrapper { height: 286px; overflow-y: auto; } -.upload_container #files > div { +.upload_container #files > div, +.depot_container #files > div { width: 100%; padding: 10px; - border-bottom: 1px solid #e8ebed; + border-bottom: 1px solid #17191F; } -.upload_container #files > div div:first-child { - color: #000000; +.upload_container #files > div div:first-child, +.depot_container #files > div div:first-child { + color: #ffffff; margin-bottom: 5px; font-size: 14px; position: relative; } -.upload_container #files > div div:first-child span { +.upload_container #files > div div:first-child span, +.depot_container #files > div div:first-child span { white-space: nowrap; display: block; text-overflow: ellipsis; @@ -12340,11 +12362,13 @@ readers do not read off random characters that represent icons */ max-width: 91%; } -.upload_container #files > div div:last-child { - color: #3b3b3b; +.upload_container #files > div div:last-child, +.depot_container #files > div div:last-child { + color: #aaaaaa; } -.upload_container #files > div button { +.upload_container #files > div button, +.depot_container #files > div button { display: none; border: none; background-color: transparent; @@ -12354,17 +12378,20 @@ readers do not read off random characters that represent icons */ cursor: pointer; } -.upload_container #files > div button i { - color: #337ab7; +.upload_container #files > div button i, +.depot_container #files > div button i { + color: #ffffff; font-size: 19px; } -.upload_container #files > div:hover button { +.upload_container #files > div:hover button, +.depot_container #files > div:hover button { display: block; } -.upload_container .upload_bar { - border-top: 1px solid #aaaaaa; +.upload_container .upload_bar, +.depot_container .upload_bar { + border-top: 1px solid #17191F; width: 100%; height: 60px; position: absolute; @@ -12372,17 +12399,61 @@ readers do not read off random characters that represent icons */ padding: 13px 10px; } -.upload_container .upload_bar #submit { +.upload_container .upload_bar #submit, +.depot_container .upload_bar #submit { display: inline-block; } .upload_container .upload_bar #cancel, -.upload_container .upload_bar #close_upload_form { - color: #3b3b3b; +.upload_container .upload_bar #close_upload_form, +.depot_container .upload_bar #cancel, +.depot_container .upload_bar #close_upload_form { + color: #ffffff; cursor: pointer; margin-left: 15px; } +.depot_container { + display: block; + width: 700px; +} + +.depot_container header { + padding: 20px; + border-bottom: 1px solid #17191F; +} + +.depot_container header i { + font-size: 30px; + margin-right: 10px; + color: white; +} + +.depot_container .mainContent { + display: flex; + flex-direction: row; +} + +.depot_container .mainContent .col { + width: 50%; +} + +.depot_container .mainContent .col .fileinput-button { + border: none; +} + +.depot_container .mainContent .col .content_wrapper { + height: 217px; +} + +.depot_container .mainContent .col input, +.depot_container .mainContent .col textarea, +.depot_container .mainContent .col select { + display: block; + width: 315px; + margin: 15px; +} + .darkroom-container { position: relative; } @@ -13624,19 +13695,107 @@ table tfoot tr:hover { .media_manager .main_content header .search_wrapper .search_filters { display: inline-flex; align-items: center; - padding: 0px 10px; } .media_manager .main_content header .search_wrapper .search_filters > div { display: flex; align-items: center; - margin-right: 10px; + padding: 1px 8px; + border-right: 1px solid #aaaaaa; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } .media_manager .main_content header .search_wrapper .search_filters > div i { margin-left: 10px; } +.media_manager .main_content header .search_wrapper .search_filters > div:last-child { + border: none; +} + +.media_manager .main_content header .search_wrapper .search_filters > div .list { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + top: 17px; + left: 50%; + background-color: #24272e; + padding: 9px; + min-width: 163px; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + z-index: 1; +} + +.media_manager .main_content header .search_wrapper .search_filters > div .list.list_etiquette li label { + color: #ffffff; + padding: 4px; + display: inline-block; + position: relative; +} + +.media_manager .main_content header .search_wrapper .search_filters > div .list.list_etiquette li label::before { + border-color: inherit; + content: ""; + top: 0; + border-style: solid; + border-width: 11px; + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + position: absolute; + right: -22px; +} + +.media_manager .main_content header .search_wrapper .filter_wrapper { + display: flex; + flex-direction: row; + margin-top: 18px; + align-items: center; +} + +.media_manager .main_content header .search_wrapper .filter_wrapper > span { + color: #FFAB57; + font-weight: bold; + margin-right: 3px; +} + +.media_manager .main_content header .search_wrapper .filter_wrapper .search_filters_list .filter_item { + border: 1px solid #aaaaaa; + border-radius: 3px; + padding: 3px 3px; + font-size: 11px; + margin: 0 1px; + display: inline-block; +} + +.media_manager .main_content header .search_wrapper .filter_wrapper .search_filters_list .filter_item:hover { + color: #ffffff; + border: 1px solid #ffffff; +} + +.media_manager .main_content header .search_wrapper .filter_wrapper .search_filters_list .filter_item i { + margin-left: 6px; +} + +.media_manager .main_content header .search_wrapper .filter_wrapper .reinit_search_btn { + display: none; + color: #2ea8e5; + margin-left: 4px; + font-size: 11px; +} + +.media_manager .main_content header .search_wrapper .filter_wrapper .reinit_search_btn:hover { + color: #2489D1; + text-decoration: underline; +} + .media_manager .main_content header .action_wrapper { background-color: #3b3b3b; width: 100%; diff --git a/public/js/app.js b/public/js/app.js index db2afe6..c28d941 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -10928,9 +10928,14 @@ jQuery.fn.scrollParent = function () { return overflowRegex.test(overflowState.overflow + overflowState.overflowX + overflowState.overflowY); }).eq(0); return position === "fixed" || !scrollParent.length ? $(this[0].ownerDocument || document) : scrollParent; -}; //confirm popup +}; // ---- Configuration de base des filtres médias +$(window).data('offset', 0); +$(window).data('limit', 50); +$(window).data('currentFolder', 0); +$(window).data('filter', {}); //confirm popup + $.fancyConfirm = function (opts) { opts = $.extend(true, { title: 'Are you sure?', @@ -10981,15 +10986,22 @@ $(".userbar").on('click', function (event) { }); $(document).mouseup(function (e) { var container = $(".userbar"); - var menuContextuel = $(".folder_container .folder_menu"); if (!container.is(e.target) && container.has(e.target).length === 0) { $(".submenu").hide(); } + var menuContextuel = $(".folder_container .folder_menu"); + if (!menuContextuel.is(e.target) && menuContextuel.has(e.target).length === 0) { menuContextuel.hide(); } + + var filter_list = $(".filter_selector"); + + if (!filter_list.is(e.target) && filter_list.has(e.target).length === 0) { + $(".filter_selector .list").hide(); + } }); // ---- Header : Ouverture formulaire de contact $(".contact_btn").on('click', function (event) { @@ -11058,6 +11070,195 @@ $(".form_contact_send").on('click', function (event) { /***/ }), +/***/ "./resources/js/depot.js": +/*!*******************************!*\ + !*** ./resources/js/depot.js ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +$(document).ready(function () { + /****************************** + Dépôt de média + **********************************/ + // ---- Initialisation du module de dépôt + if ($('#uploadDepot').length) { + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + } + }); + var dossier_id = 0; + var cancel_btn = $('').addClass('cancel').html(''); + var upload_btn = $('').addClass('upload').css('display', 'none'); + $('#submit').on('click', function (event) { + event.preventDefault(); + + if (!$(".form_depot_media")[0].checkValidity()) { + $(".form_depot_media")[0].reportValidity(); + $.fancyMessage({ + title: "Dépôt de médias", + message: "Veuillez compléter tous les champs avant de lancer le transfert.", + type: "error" + }); + return false; + } + + if (currentfiles.length == 0) { + $.fancyMessage({ + title: "Dépôt de médias", + message: "Veuillez ajouter des médias avant de lancer le transfert.", + type: "error" + }); + return false; + } + + var currentdate = new Date(); + folderName = $("#depot_societe").val().replace(' ', '_') + "_" + currentdate.getFullYear().toString() + ("0" + (currentdate.getMonth() + 1)).slice(-2) + currentdate.getDate().toString() + "_" + currentdate.getHours().toString() + currentdate.getMinutes().toString() + currentdate.getSeconds().toString(); + var description = "Nom : " + $("#depot_nom").val() + '\n' + "Société : " + $("#depot_societe").val() + '\n' + $("#depot_description").val(); // création d'un dossier de dépôt + + $("#upload_errors").html(""); + $.ajax({ + url: '/ajax/add-depot-folder', + method: 'POST', + dataType: 'json', + data: { + libelle: folderName, + description: description + }, + success: function success(result) { + dossier_id = result.folder_id; + $('.upload').click(); //click upload buttons and upload all files in the queue + }, + error: function error(jqXHR, textStatus, errorThrown) {} + }); + }); + $('#cancel').on('click', function (event) { + event.preventDefault(); + $('.cancel').click(); //click cancel buttons and remove all files in the queue + + $("#upload_errors").html(""); + }); + $(".uploader-window").on("dragleave", function () { + $(this).stop().fadeOut("fast"); + }); + var currentfiles = []; + var maxFiles = 20; + var counter = 0; + $('#uploadDepot').fileupload({ + url: "/ajax/upload-media", + dataType: 'json', + limitMultiFileUploads: 10, + maxChunkSize: 8000000, + maxNumberOfFiles: 2, + dragover: function dragover(e, data) { + $(".uploader-window").fadeIn("fast"); + }, + add: function add(e, data) { + if (counter < maxFiles) { + counter++; + } else { + $.fancyMessage({ + title: "Attention", + message: "Vous ne pouvez pas ajouter plus de " + maxFiles + " fichiers", + type: "info" + }); + return false; + } + + data.files = $.map(data.files, function (file, i) { + if ($.inArray(file.name, currentfiles) >= 0) { + $.fancyMessage({ + title: "Attention", + message: "Nous ne pouvons pas envoyer plusieurs fichiers du même nom. Veuillez renommer vos fichiers puis essayez à nouveau.", + type: "error" + }); + return null; + } + + return file; + }); + $.each(data.files, function (index, file) { + var uploadErrors = []; + var acceptFileTypes = /^(gif|jpe?g|png|mp4|mp3|psd|ai|svg|pdf)$/i; + + if (file.name.split('.').pop().length && !acceptFileTypes.test(file.name.split('.').pop())) { + uploadErrors.push('Ce type de fichier n\'est pas accepté'); + } + + if (data.originalFiles[0]['size'].length && data.originalFiles[0]['size'] > 5000000) { + uploadErrors.push('La taille du fichier est trop grande.'); + } + + if (uploadErrors.length > 0) { + alert(uploadErrors.join("\n")); + return false; + } + + currentfiles.push($.trim(file.name)); + var row = document.createElement('div'); + var col1 = document.createElement('div'); + var col2 = document.createElement('div'); + $(col1).append("" + file.name + "").append(cancel_btn.clone(true).data(data)); + $(col2).append("" + file.type + " - " + FileConvertSize(file.size) + ""); + $(col2).append(upload_btn.clone(true).data(data)); + $(row).append(col1, col2); + $(".files").append(row); + $('.upload').eq(-1).on('click', function () { + data.formData = { + uid: create_UUID(), + dossier_id: dossier_id + }; + data.submit(); + }); + $('.cancel').eq(-1).on('click', function () { + $(this).parent().parent().remove(); + currentfiles = arrayRemove(currentfiles, $.trim(file.name)); + }); + }); + }, + start: function start(e, data) { + $('#progress').show(); + }, + drop: function drop(e, data) { + $(".uploader-window").stop().fadeOut("fast"); + }, + done: function done(e, data) { + $.each(data.files, function (index, file) { + currentfiles = arrayRemove(currentfiles, $.trim(file.name)); + }); + }, + stop: function stop(e) { + $(".files").html(""); + counter = 0; + currentfiles = []; + $('#progress .progress-bar').css('width', '0%'); + $('#progress').hide(); + $("#depot_nom").val(''); + $("#depot_societe").val(''); + $("#depot_description").val(''); + $.fancyMessage({ + title: "Dépôt de médias", + message: "Le transfert des fichiers est terminé !", + type: "info" + }); + }, + fail: function fail(e, data) { + $.each(data.files, function (index, file) { + $('
Erreur durant le transfert du fichier ' + file.name + '.
').appendTo('#upload_errors'); + currentfiles = arrayRemove(currentfiles, $.trim(file.name)); + }); + }, + progressall: function progressall(e, data) { + var progress = parseInt(data.loaded / data.total * 100, 10); + $('#progress .progress-bar').css('width', progress + '%'); + } + }).prop('disabled', !$.support.fileInput).parent().addClass($.support.fileInput ? undefined : 'disabled'); + } +}); + +/***/ }), + /***/ "./resources/js/media.js": /*!*******************************!*\ !*** ./resources/js/media.js ***! @@ -11071,6 +11272,28 @@ $(document).ready(function () { **********************************/ // ---- init des dossiers if ($(".media_manager").length) { + // En cas d'une recherche depuis la home, initialise la page avec une recherche texte + if ($("#searchParameter").val() != "") { + // on créé un object filtre + var filter = { + type: "search", + legend: "Recherche : ", + value: $("#searchParameter").val(), + libelle: [$("#searchParameter").val()] + }; // MAJ du filtre principal et de l'affichage + + updateFilter(filter); + $(".search_filters .search_value").val($("#searchParameter").val()); + } // En cas d'une recherche depuis la home, initialise la page avec le bon sujet + + + if ($("#sujetParameter").val() != "") { + // aucun dossier sélectionner + $(window).data('currentFolder', -1); + $("#sujet_selector").val($("#sujetParameter").val()); + loadMedia($("#sujet_selector").val()); + } + var sujetId = $("#sujet_selector").val(); if (sujetId != "") initFolderManager(sujetId); } // ---- collapse/expand side menu @@ -11093,7 +11316,7 @@ $(document).ready(function () { $("#sujet_selector").on('change', function (event) { var sujetId = $("#sujet_selector").val(); if (sujetId != "") $('.dd').nestable('destroy'); - $(".currentFolder").val(0); + $(window).data('currentFolder', 0); initFolderManager(sujetId); }); // ---- sélectionner un dossier et favoris @@ -11129,9 +11352,17 @@ $(document).ready(function () { $(".folder_container .root_folder").removeClass('selected'); $(this).addClass('selected'); var sujet_id = $("#sujet_selector").val(); - $(".currentFolder").val(dossier_id); + $(window).data('currentFolder', dossier_id); $(window).data('offset', 0); - loadMedia(dossier_id, sujet_id); + loadMedia(sujet_id); // ajout du dossier courant dans la barre de filtre + + $(".search_filters_list #currentFolder").remove(); + var output = ''; + output += 'Dossier : '; + output += '' + $(".folder_container .dd3-item[data-id='" + dossier_id + "'] > .dd3-content span").html() + ''; + output += ''; + output += ''; + $(".search_filters_list").prepend(output); } }); // ---- sélectionner la racine @@ -11139,10 +11370,18 @@ $(document).ready(function () { event.preventDefault(); $(".folder_container .dd3-content").removeClass('selected'); $(this).addClass('selected'); - $(".currentFolder").val(0); + $(window).data('currentFolder', 0); var sujetId = $("#sujet_selector").val(); $(window).data('offset', 0); - loadMedia(0, sujetId); + loadMedia(sujetId); // ajout du dossier courant dans la barre de filtre + + $(".search_filters_list #currentFolder").remove(); + var output = ''; + output += 'Dossier : '; + output += 'racine'; + output += ''; + output += ''; + $(".search_filters_list").prepend(output); }); // ---- menu contextuel des dossiers $(".folder_container").on('contextmenu', '.dd3-content', function (event) { @@ -11210,8 +11449,9 @@ $(document).ready(function () { var dossier_id = $(this).parents(".folder_menu").attr("data-id"); $(".folder_container .folder_menu").hide(); $(".folder_container .loader").show(); + var $countCurrentFolder = $(".folder_container .dd3-item[data-id='" + dossier_id + "'] > .dd3-content .count").html(); - if (!$('.dd .dd-item[data-id="' + dossier_id + '"] > ol').length) { + if (!$('.dd .dd-item[data-id="' + dossier_id + '"] > ol').length && $(window).data('currentFolder') == 0) { $.ajax({ url: '/ajax/remove-folder', method: 'POST', @@ -11399,17 +11639,18 @@ $(document).ready(function () { var data = event.originalEvent.dataTransfer.getData("Text"); - if ($(".currentFolder").val() != dossier_id) { + if ($(window).data('currentFolder') != dossier_id) { $.ajax({ url: '/ajax/move-media', method: 'POST', dataType: 'json', data: { dossier_id: dossier_id, - data: data + data: data, + sujet_id: $("#sujet_selector").val() }, success: function success(result) { - var currentFolderId = $(".currentFolder").val(); + var currentFolderId = $(window).data('currentFolder'); var arrayMediaId = data.split(','); if (currentFolderId == 0) { @@ -11587,8 +11828,7 @@ $(document).ready(function () { if ($(".media_container").scrollTop() + $(".media_container").height() == $(".media_container .wrapper").height()) { $(window).data('ajaxready', false); var sujet_id = $("#sujet_selector").val(); - var dossier_id = $(".currentFolder").val(); - loadMedia(dossier_id, sujet_id); + loadMedia(sujet_id); } }); // ---- Mode d'affichage @@ -11612,9 +11852,8 @@ $(document).ready(function () { $(".action_wrapper #order_select").on("change", function (event) { var sujet_id = $("#sujet_selector").val(); - var dossier_id = $(".currentFolder").val(); $(window).data('offset', 0); - loadMedia(dossier_id, sujet_id); + loadMedia(sujet_id); }); /****************************** Edition d'un média @@ -11624,7 +11863,25 @@ $(document).ready(function () { var drPlugin = null; var viewer = null; $(".main_content .wrapper").on("dblclick", '.imageItem', function (event) { - event.preventDefault(); // initialise le nuage de Tags + event.preventDefault(); // récupère l'image de preview + + var imgPreview = $(this).attr('data-preview'); + + if ($(this).attr('data-depot') == 1) { + if ($(this).attr('data-typemedia') == 1 || $(this).attr('data-typemedia') == 2) { + // image + $.fancybox.open('' + item.libelle + '
'; @@ -12634,7 +12923,7 @@ function loadMedia(dossier_id, sujet_id) { $(window).data('ajaxready', true); } }); -} // ---- Supression de médias +}; // ---- Supression de médias function removeMedias(medias) { @@ -12664,7 +12953,7 @@ function removeMedias(medias) { $(".media_container .imageItem[data-id='" + value + "']").remove(); }); // ---- MAJ du nb de média dans le dossier - var currentFolder = $(".currentFolder").val(); + var currentFolder = $(window).data('currentFolder'); if (currentFolder == 0 || currentFolder == "") { var count = $(".folder_container .root_folder .count"); @@ -12790,22 +13079,22 @@ function addItem(parent_id, item_id, content) { $('.dd .dd-item[data-id="' + parent_id + '"] > ol').append(html); } -function arrayRemove(arr, value) { +window.arrayRemove = function (arr, value) { return arr.filter(function (ele) { return ele != value; }); -} +}; -function FileConvertSize(aSize) { +window.FileConvertSize = function (aSize) { aSize = Math.abs(parseInt(aSize, 10)); var def = [[1, 'octets'], [1024, 'ko'], [1024 * 1024, 'Mo'], [1024 * 1024 * 1024, 'Go'], [1024 * 1024 * 1024 * 1024, 'To']]; for (var i = 0; i < def.length; i++) { if (aSize < def[i][0]) return (aSize / def[i - 1][0]).toFixed(2) + ' ' + def[i - 1][1]; } -} +}; -function create_UUID() { +window.create_UUID = function () { var dt = new Date().getTime(); var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = (dt + Math.random() * 16) % 16 | 0; @@ -12813,7 +13102,167 @@ function create_UUID() { return (c == 'x' ? r : r & 0x3 | 0x8).toString(16); }); return uuid; -} +}; + +/***/ }), + +/***/ "./resources/js/searchengine.js": +/*!**************************************!*\ + !*** ./resources/js/searchengine.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +$(document).ready(function () { + /****************************** + Moteur de recherche de médias + **********************************/ + // ---- Initialisation du module de recherche + if ($('.search_wrapper').length) { + // ---- Par défaut déselectionne toutes les checkbox + $(".filter").find('input[type="checkbox"]').prop("checked", false); // ---- Initialisation des listes + + $(".filter_selector .filter_btn").on('click', function (event) { + $(".filter_selector .list").not($(this).parent().find(".list")).hide(); + $(this).parent().find(".list").toggle(); + }); // ---- Initialisation du champ de recherche + + $(".search_filters .search_value").on('keypress', function (event) { + if (event.keyCode == 13) { + $(".search_filters .search_btn").trigger('click'); + } + }); // ---- Clique sur le bouton de recherche + + $(".search_filters .search_btn").on('click', function (event) { + // on créé un object filtre + var filter = { + type: "search", + legend: "Recherche : ", + value: $(".search_filters .search_value").val(), + libelle: [$(".search_filters .search_value").val()] + }; // MAJ du filtre principal et de l'affichage + + updateFilter(filter); // On lance la recherche + + var sujet_id = $("#sujet_selector").val(); + $(window).data('offset', 0); + loadMedia(sujet_id); + }); // ---- Clique sur un filtre + + $(".filter").on('click', 'input[type="checkbox"]', function (event) { + var values = []; + var libelles = []; // on créé un object filtre + + var filter = { + type: $(this).parents(".filter").attr('data-type'), + legend: $(this).parents(".filter").attr('data-lib-type'), + value: [], + libelle: [] + }; // on y insère toutes les valeurs de ce même type de filtre + + $(this).parents(".filter").find('input[type="checkbox"]').each(function (index, cb) { + if ($(this).is(':checked')) { + filter.value.push($(this).val()); + filter.libelle.push($(this).next("label").html()); + } + }); // MAJ du filtre principal et de l'affichage + + updateFilter(filter); // On lance la recherche + + var sujet_id = $("#sujet_selector").val(); + $(window).data('offset', 0); + loadMedia(sujet_id); + }); // ---- Réinitialisation de la recherche + + $(".reinit_search_btn").on('click', function (event) { + event.preventDefault(); // Vide la bar recherche + + $.each(Object.keys($(window).data('filter')), function (index, value) { + if (value != "currentFolder") $(".search_filters_list #" + value).remove(); + }); // supprime tous les éléments de recherche + + $(window).data('filter', {}); // masque le bouton de reinitialisation + + $(".filter_wrapper .reinit_search_btn").hide(); // ---- Initialisation des listes + + $(".filter").find('input[type="checkbox"]').prop("checked", false); // On lance la recherche + + var sujet_id = $("#sujet_selector").val(); + $(window).data('offset', 0); + loadMedia(sujet_id); + }); // ---- Suppression d'un filtre + + $(".search_filters_list").on('click', '.filter_item', function (event) { + event.preventDefault(); + var filters = $(window).data('filter'); + var type = $(this).attr('id'); // Supprime l'élément dans la bar recherche + + $(".search_filters_list #" + type).remove(); + + if (type == "currentFolder") { + $(".folder_container .dd3-content").removeClass('selected'); + $(".folder_container .root_folder").removeClass('selected'); + $(window).data('currentFolder', -1); + } else { + // supprime la propriété dans l'objet + if ("undefined" !== typeof filters[type]) { + // si l'object à cette propriété + delete filters[type]; // on l'a supprime + } + + $(window).data('filter', filters); // ---- Initialisation des listes + + $(".search_filters .filter[data-type='" + type + "']").find('input[type="checkbox"]').prop("checked", false); + } // masque le bouton de reinitialisation + + + if (Object.keys($(window).data('filter')).length == 0) { + $(".filter_wrapper .reinit_search_btn").hide(); + } // On lance la recherche + + + var sujet_id = $("#sujet_selector").val(); + $(window).data('offset', 0); + loadMedia(sujet_id); + }); + } +}); + +window.updateFilter = function (filter) { + var filters = $(window).data('filter'); // si ce filtre n'a pas de valeur + + if (filter.value.length == 0) { + $(".search_filters_list #" + filter.type).remove(); // on supprime le filtre de la liste + + if ("undefined" !== typeof filters[filter.type]) { + // si l'object à cette propriété + delete filters[filter.type]; // on l'a supprime + } // si on a des valeurs pour ce filtre + + } else { + // on met à jour l'objet filtre + filters[filter.type] = filter; + $(window).data('filter', filters); // si le filtre n'existe pas dans la liste on l'ajoute + + if (!$(".search_filters_list #" + filter.type).length) { + var output = ''; + output += '' + filter.legend + ''; + output += ''; + output += ''; + output += ''; + $(".search_filters_list").append(output); + } + + $(".search_filters_list #" + filter.type + " .value").html(filter.libelle.join()); + } // affiche/masque le bouton de reinitialisation + + + if (Object.keys($(window).data('filter')).length > 0) { + $(".filter_wrapper .reinit_search_btn").show(); + } else { + $(".filter_wrapper .reinit_search_btn").hide(); + } +}; /***/ }), @@ -12829,15 +13278,17 @@ function create_UUID() { /***/ }), /***/ 0: -/*!*************************************************************************************************************!*\ - !*** multi ./resources/js/app.js ./resources/js/admin.js ./resources/js/media.js ./resources/sass/app.scss ***! - \*************************************************************************************************************/ +/*!********************************************************************************************************************************************************************!*\ + !*** multi ./resources/js/app.js ./resources/js/admin.js ./resources/js/media.js ./resources/js/depot.js ./resources/js/searchengine.js ./resources/sass/app.scss ***! + \********************************************************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { __webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\app.js */"./resources/js/app.js"); __webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\admin.js */"./resources/js/admin.js"); __webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\media.js */"./resources/js/media.js"); +__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\depot.js */"./resources/js/depot.js"); +__webpack_require__(/*! D:\sources\www\ldc-dam\resources\js\searchengine.js */"./resources/js/searchengine.js"); module.exports = __webpack_require__(/*! D:\sources\www\ldc-dam\resources\sass\app.scss */"./resources/sass/app.scss"); diff --git a/resources/js/app.js b/resources/js/app.js index e35e5c9..471762e 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -21,6 +21,12 @@ jQuery.fn.scrollParent = function() { return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; }; +// ---- Configuration de base des filtres médias +$(window).data('offset', 0); +$(window).data('limit', 50); +$(window).data('currentFolder', 0); +$(window).data('filter', {}); + //confirm popup $.fancyConfirm = function( opts ) { opts = $.extend( true, { @@ -107,14 +113,19 @@ $(".userbar").on('click',function(event) { $(document).mouseup(function(e) { var container = $(".userbar"); - var menuContextuel = $(".folder_container .folder_menu"); if (!container.is(e.target) && container.has(e.target).length === 0) { $(".submenu").hide(); } + var menuContextuel = $(".folder_container .folder_menu"); if (!menuContextuel.is(e.target) && menuContextuel.has(e.target).length === 0) { menuContextuel.hide(); } + + var filter_list = $(".filter_selector"); + if (!filter_list.is(e.target) && filter_list.has(e.target).length === 0) { + $(".filter_selector .list").hide(); + } }); // ---- Header : Ouverture formulaire de contact diff --git a/resources/js/depot.js b/resources/js/depot.js new file mode 100644 index 0000000..e673ad7 --- /dev/null +++ b/resources/js/depot.js @@ -0,0 +1,176 @@ + +$(document).ready(function() { + + /****************************** + Dépôt de média + **********************************/ + + // ---- Initialisation du module de dépôt + if($('#uploadDepot').length){ + $.ajaxSetup({ + headers: { + 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') + } + }); + var dossier_id = 0; + var cancel_btn = $('') + .addClass('cancel') + .html(''); + var upload_btn = $('') + .addClass('upload') + .css('display', 'none'); + + $('#submit').on('click',function(event){ + event.preventDefault(); + + if(!$(".form_depot_media")[0].checkValidity()){ + $(".form_depot_media")[0].reportValidity() + $.fancyMessage({title : "Dépôt de médias", message : "Veuillez compléter tous les champs avant de lancer le transfert.", type : "error"}); + return false; + } + if(currentfiles.length == 0){ + $.fancyMessage({title : "Dépôt de médias", message : "Veuillez ajouter des médias avant de lancer le transfert.", type : "error"}); + return false; + } + + var currentdate = new Date(); + folderName = $("#depot_societe").val().replace(' ', '_')+"_"+currentdate.getFullYear().toString()+("0" +(currentdate.getMonth()+1)).slice(-2)+currentdate.getDate().toString()+"_"+currentdate.getHours().toString()+currentdate.getMinutes().toString()+ currentdate.getSeconds().toString(); + var description = "Nom : "+$("#depot_nom").val()+'\n'+"Société : "+$("#depot_societe").val()+'\n'+$("#depot_description").val(); + + // création d'un dossier de dépôt + $("#upload_errors").html(""); + $.ajax({ + url: '/ajax/add-depot-folder', + method: 'POST', + dataType : 'json', + data: { + libelle: folderName, + description : description, + }, + success: function(result){ + dossier_id = result.folder_id; + $('.upload').click() //click upload buttons and upload all files in the queue + }, + error: function(jqXHR, textStatus, errorThrown) { + + } + }); + }); + $('#cancel').on('click',function(event){ + event.preventDefault(); + $('.cancel').click() //click cancel buttons and remove all files in the queue + $("#upload_errors").html(""); + }); + + $(".uploader-window").on("dragleave", function(){ + $(this).stop().fadeOut( "fast"); + }); + + var currentfiles = []; + var maxFiles = 20; + var counter = 0; + $('#uploadDepot').fileupload({ + url: "/ajax/upload-media", + dataType: 'json', + limitMultiFileUploads: 10, + maxChunkSize: 8000000, + maxNumberOfFiles: 2, + dragover: function (e, data) { + $(".uploader-window").fadeIn( "fast"); + }, + add: function (e, data) { + + if(counter < maxFiles){ + counter++; + }else{ + $.fancyMessage({title : "Attention", message : "Vous ne pouvez pas ajouter plus de "+maxFiles+" fichiers", type : "info"}); + return false; + } + + data.files = $.map(data.files, function(file,i){ + if ($.inArray(file.name,currentfiles) >= 0) { + $.fancyMessage({title : "Attention", message : "Nous ne pouvons pas envoyer plusieurs fichiers du même nom. Veuillez renommer vos fichiers puis essayez à nouveau.", type : "error"}); + return null; + } + return file; + }); + + $.each(data.files, function (index, file) { + + var uploadErrors = []; + var acceptFileTypes = /^(gif|jpe?g|png|mp4|mp3|psd|ai|svg|pdf)$/i; + if(file.name.split('.').pop().length && !acceptFileTypes.test(file.name.split('.').pop())) { + uploadErrors.push('Ce type de fichier n\'est pas accepté'); + } + if(data.originalFiles[0]['size'].length && data.originalFiles[0]['size'] > 5000000) { + uploadErrors.push('La taille du fichier est trop grande.'); + } + if(uploadErrors.length > 0) { + alert(uploadErrors.join("\n")); + return false; + } + + currentfiles.push($.trim(file.name)); + var row = document.createElement('div'); + var col1 = document.createElement('div'); + var col2 = document.createElement('div'); + $(col1).append(""+file.name+"").append(cancel_btn.clone(true).data(data)); + $(col2).append(""+file.type+" - "+FileConvertSize(file.size)+""); + $(col2).append(upload_btn.clone(true).data(data)); + $(row).append(col1, col2); + $(".files").append(row); + + $('.upload').eq(-1).on('click',function(){ + data.formData = { + uid: create_UUID(), + dossier_id: dossier_id, + }; + data.submit(); + }) + $('.cancel').eq(-1).on('click',function(){ + $(this).parent().parent().remove(); + currentfiles = arrayRemove(currentfiles, $.trim(file.name)); + }) + }); + + }, + start: function (e, data) { + $('#progress').show(); + }, + drop: function (e, data) { + $(".uploader-window").stop().fadeOut( "fast"); + }, + done: function (e, data) { + $.each(data.files, function (index, file) { + currentfiles = arrayRemove(currentfiles, $.trim(file.name)); + }); + }, + stop: function (e,) { + $(".files").html(""); + counter = 0; + currentfiles = []; + $('#progress .progress-bar').css('width', '0%'); + $('#progress').hide(); + $("#depot_nom").val(''); + $("#depot_societe").val(''); + $("#depot_description").val(''); + $.fancyMessage({title : "Dépôt de médias", message : "Le transfert des fichiers est terminé !", type : "info"}); + }, + fail: function (e, data) { + $.each(data.files, function (index, file) { + $('Erreur durant le transfert du fichier ' + file.name + '.
') + .appendTo('#upload_errors'); + currentfiles = arrayRemove(currentfiles, $.trim(file.name)); + }); + }, + progressall: function (e, data) { + var progress = parseInt(data.loaded / data.total * 100, 10); + $('#progress .progress-bar').css( + 'width', + progress + '%' + ); + } + }).prop('disabled', !$.support.fileInput) + .parent().addClass($.support.fileInput ? undefined : 'disabled'); + } +}); diff --git a/resources/js/media.js b/resources/js/media.js index e21fa40..ba814a3 100644 --- a/resources/js/media.js +++ b/resources/js/media.js @@ -1,4 +1,3 @@ - $(document).ready(function() { /****************************** @@ -7,6 +6,29 @@ $(document).ready(function() { // ---- init des dossiers if ( $( ".media_manager" ).length ) { + + // En cas d'une recherche depuis la home, initialise la page avec une recherche texte + if($("#searchParameter").val() != ""){ + // on créé un object filtre + var filter = { + type: "search", + legend : "Recherche : ", + value: $("#searchParameter").val(), + libelle: [$("#searchParameter").val()], + }; + // MAJ du filtre principal et de l'affichage + updateFilter(filter); + $(".search_filters .search_value").val($("#searchParameter").val()); + } + + // En cas d'une recherche depuis la home, initialise la page avec le bon sujet + if($("#sujetParameter").val() != ""){ + // aucun dossier sélectionner + $(window).data('currentFolder', -1); + + $("#sujet_selector").val($("#sujetParameter").val()); + loadMedia($("#sujet_selector").val()); + } var sujetId = $("#sujet_selector").val(); if(sujetId != "") initFolderManager(sujetId); @@ -31,7 +53,7 @@ $(document).ready(function() { var sujetId = $("#sujet_selector").val(); if(sujetId != "") $('.dd').nestable('destroy'); - $(".currentFolder").val(0); + $(window).data('currentFolder', 0); initFolderManager(sujetId); }); @@ -65,9 +87,18 @@ $(document).ready(function() { $(".folder_container .root_folder").removeClass('selected'); $(this).addClass('selected'); var sujet_id = $("#sujet_selector").val(); - $(".currentFolder").val(dossier_id); + $(window).data('currentFolder', dossier_id); $(window).data('offset', 0); - loadMedia(dossier_id, sujet_id); + loadMedia(sujet_id); + + // ajout du dossier courant dans la barre de filtre + $(".search_filters_list #currentFolder").remove(); + var output = ''; + output += 'Dossier : '; + output += ''+$(".folder_container .dd3-item[data-id='"+dossier_id+"'] > .dd3-content span").html()+''; + output += ''; + output += ''; + $(".search_filters_list").prepend(output); } }); @@ -78,10 +109,19 @@ $(document).ready(function() { event.preventDefault(); $(".folder_container .dd3-content").removeClass('selected'); $(this).addClass('selected'); - $(".currentFolder").val(0); + $(window).data('currentFolder', 0); var sujetId = $("#sujet_selector").val(); $(window).data('offset', 0); - loadMedia(0, sujetId); + loadMedia(sujetId); + + // ajout du dossier courant dans la barre de filtre + $(".search_filters_list #currentFolder").remove(); + var output = ''; + output += 'Dossier : '; + output += 'racine'; + output += ''; + output += ''; + $(".search_filters_list").prepend(output); }); // ---- menu contextuel des dossiers @@ -145,7 +185,8 @@ $(document).ready(function() { $(".folder_container .folder_menu").hide(); $(".folder_container .loader").show(); - if(!$('.dd .dd-item[data-id="'+dossier_id+'"] > ol').length){ + var $countCurrentFolder = $(".folder_container .dd3-item[data-id='"+dossier_id+"'] > .dd3-content .count").html(); + if(!$('.dd .dd-item[data-id="'+dossier_id+'"] > ol').length && $(window).data('currentFolder') == 0){ $.ajax({ url: '/ajax/remove-folder', method: 'POST', @@ -313,7 +354,7 @@ $(document).ready(function() { // ---- source var data = event.originalEvent.dataTransfer.getData("Text"); - if($(".currentFolder").val() != dossier_id){ + if($(window).data('currentFolder') != dossier_id){ $.ajax({ url: '/ajax/move-media', method: 'POST', @@ -321,9 +362,10 @@ $(document).ready(function() { data: { dossier_id: dossier_id, data: data, + sujet_id: $("#sujet_selector").val(), }, success: function(result){ - var currentFolderId = $(".currentFolder").val(); + var currentFolderId = $(window).data('currentFolder'); var arrayMediaId = data.split(','); if(currentFolderId == 0){ var $countCurrentFolder = $(".folder_container .root_folder .count"); @@ -489,8 +531,7 @@ $(document).ready(function() { if( ($(".media_container").scrollTop() + $(".media_container").height() ) == $(".media_container .wrapper").height() ) { $(window).data('ajaxready', false); var sujet_id = $("#sujet_selector").val(); - var dossier_id = $(".currentFolder").val(); - loadMedia(dossier_id, sujet_id); + loadMedia(sujet_id); } }); @@ -514,9 +555,8 @@ $(document).ready(function() { // ---- Gestion de l'ordre d'affichage $(".action_wrapper #order_select").on("change", function(event) { var sujet_id = $("#sujet_selector").val(); - var dossier_id = $(".currentFolder").val(); $(window).data('offset', 0); - loadMedia(dossier_id, sujet_id); + loadMedia(sujet_id); }); /****************************** @@ -529,6 +569,20 @@ $(document).ready(function() { $(".main_content .wrapper").on("dblclick", '.imageItem' , function(event) { event.preventDefault(); + // récupère l'image de preview + var imgPreview = $(this).attr('data-preview'); + + if($(this).attr('data-depot') == 1){ + if($(this).attr('data-typemedia') == 1|| $(this).attr('data-typemedia') == 2){ // image + $.fancybox.open(''+item.libelle+'
'; @@ -1503,7 +1576,7 @@ function removeMedias(medias){ }); // ---- MAJ du nb de média dans le dossier - var currentFolder = $(".currentFolder").val(); + var currentFolder = $(window).data('currentFolder'); if(currentFolder == 0 || currentFolder == ""){ var count = $(".folder_container .root_folder .count"); }else{ @@ -1604,13 +1677,13 @@ function addItem(parent_id, item_id, content){ $('.dd .dd-item[data-id="'+parent_id+'"] > ol').append(html); } -function arrayRemove(arr, value) { +window.arrayRemove = function(arr, value){ return arr.filter(function(ele){ return ele != value; }); } -function FileConvertSize(aSize){ +window.FileConvertSize = function(aSize){ aSize = Math.abs(parseInt(aSize, 10)); var def = [[1, 'octets'], [1024, 'ko'], [1024*1024, 'Mo'], [1024*1024*1024, 'Go'], [1024*1024*1024*1024, 'To']]; for(var i=0; i