front : fin edition média

front : téléchargement de média
command : suppression des média archivés - regénération des miniatures - import des fichiers Arcadia
This commit is contained in:
Yann Gonidec 2019-07-11 11:45:47 +02:00
parent 97c7f54281
commit 7b857744f7
44 changed files with 2083 additions and 519 deletions

3
.gitignore vendored
View file

@ -8,6 +8,9 @@ public/uploads/*
/public/medias/*
!public/medias/.gitkeep
/storage/export_arcadia/*
!storage/export_arcadia/.gitkeep
/storage/*.key
/vendor
.env

16
app/Article.php Normal file
View file

@ -0,0 +1,16 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
/**
* The medias that belong to the article.
*/
public function medias()
{
return $this->belongsToMany('App\Media', 'medias_articles', 'article_id', 'media_id');
}
}

View file

@ -0,0 +1,99 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use App\Sujet;
use App\Media;
class DeleteMediaArchive extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'medias:deletearchive';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Suppression définitive de tous les médias (et leurs fichiers) qui ont été supprimés (en soft delete)';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Vous allez supprimer définitivement tous les médias (et leurs fichiers) qui ont été supprimés (en soft delete).');
$choice = $this->choice('Etes-vous sûr de vouloir lancer ce traitement ?' , ['y', 'n'], 'y');
if($choice != "y"){
$this->error('Choix incorrect');
die();
}
$sujets = Sujet::where('sujet_dam', 1)->get();
$this->line("");
$this->line("Liste des sujets disponibles");
$this->line("----------------------------");
foreach ($sujets as $key => $sujet) {
$this->line("[".$sujet->codeSujet."] ". $sujet->libelle);
}
$this->line("[0] Tous les sujets");
$sujetId = $this->ask('Pour quel sujet de média souhaitez vous executer le traitement ?' );
if($sujetId == ""){
$this->error('Id de sujet incorrect');
die();
}
if($sujetId == 0){
$medias = Media::onlyTrashed()->with('Sujet.formats')->get();
}else{
$medias = Media::onlyTrashed()->where('sujet_id', $sujetId)->with('Sujet.formats')->get();
}
if($medias->count() == 0){
$this->error('Aucun média a supprimer');
die();
}
$this->info($medias->count().' média(s) trouvé(s) - Début du traitement');
$bar = $this->output->createProgressBar(count($medias));
$bar->start();
foreach ($medias as $media) {
// supprime les fichiers médias stockés sur disque
$files = Storage::files($media->folder."/");
$filepath = preg_quote($media->folder.$media->uid, '/');
$matchingFiles = preg_grep('/^'.$filepath.'/', $files);
Storage::delete($matchingFiles);
// supprime le media en bdd
$media->forceDelete();
$bar->advance();
}
$bar->finish();
$this->line("");
$this->info('Fin du traitement');
}
}

View file

@ -0,0 +1,185 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use App\Article;
use App\Marque;
use App\Sujet;
use App\Typemedia;
use App\Typevue;
use App\Site;
use App\Variante;
class ImportArcadiaFiles extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'arcadia:import';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import des fichiers xml Arcadia';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Démarrage du traitement');
$files = Storage::disk('arcadia')->files();
$bar = $this->output->createProgressBar(count($files)-1);
$bar->start();
// ---- Pour chaque fichier
foreach ($files as $filename) {
if($filename == ".gitignore") continue;
// ---- Récupération du contenu
$files = Storage::disk('arcadia')->get($filename);
$fileContent = simplexml_load_string($files);
// ---- traitement du fichier
if(substr($filename, 0, 11) == "DAM_ARTICLE"){
foreach ($fileContent->dam as $row) {
$record = Article::where('noArt', $row->noArt)->first();
if($record){ // Update record
$record->libCcial = $row->libCcial;
$record->codMarq = $row->codMarq;
$record->libMarq = $row->libMarq;
$record->codFamVte = $row->codFamVte;
$record->libFamVte = $row->libFamVte;
$record->codGencodAdm = $row->codGencodAdm;
$record->codGencodSymb = $row->codGencodSymb;
$record->codGencodPds = $row->codGencodPds;
$record->save();
}else{ // Insert new record
$record = new Article();
$record->noArt = $row->noArt;
$record->libCcial = $row->libCcial;
$record->codMarq = $row->codMarq;
$record->libMarq = $row->libMarq;
$record->codFamVte = $row->codFamVte;
$record->libFamVte = $row->libFamVte;
$record->codGencodAdm = $row->codGencodAdm;
$record->codGencodSymb = $row->codGencodSymb;
$record->codGencodPds = $row->codGencodPds;
$record->save();
}
}
}elseif (substr($filename, 0, 10) == "DAM_MARQUE") {
foreach ($fileContent->dam as $row) {
$record = Marque::where('codMarq', $row->codMarq)->first();
if($record){ // Update record
$record->libMarq = $row->libMarq;
$record->save();
}else{ // Insert new record
$record = new Marque();
$record->codMarq = $row->codMarq;
$record->libMarq = $row->libMarq;
$record->save();
}
}
}elseif (substr($filename, 0, 15) == "DAM_MEDIA_SUJET") {
foreach ($fileContent->mediaSujet as $row) {
$record = Sujet::where('codeSujet', $row->code)->first();
if($record){ // Update record
$record->libelle = $row->libelle;
$record->save();
}else{ // Insert new record
$record = new Sujet();
$record->codeSujet = $row->code;
$record->libelle = $row->libelle;
$record->save();
}
}
}elseif (substr($filename, 0, 20) == "DAM_MEDIA_TYPE_MEDIA") {
foreach ($fileContent->mediatypemedia as $row) {
$record = Typemedia::where('codeTypemedia', $row->code)->first();
if($record){ // Update record
$record->libelle = $row->libelle;
$record->save();
}else{ // Insert new record
$record = new Typemedia();
$record->codeTypemedia = $row->code;
$record->libelle = $row->libelle;
$record->save();
}
}
}elseif (substr($filename, 0, 17) == "DAM_MEDIA_TYPEVUE") {
foreach ($fileContent->mediatypesvue as $row) {
$record = Typevue::where('codeTypevue', $row->code)->first();
if($record){ // Update record
$record->libelle = $row->libelle;
$record->sujet_id = $row->sujet_id->mediasujet->code;
$record->save();
}else{ // Insert new record
$record = new Typevue();
$record->codeTypevue = $row->code;
$record->libelle = $row->libelle;
$record->sujet_id = $row->sujet_id->mediasujet->code;
$record->save();
}
}
}elseif (substr($filename, 0, 18) == "DAM_MEDIA_VARIANTE") {
foreach ($fileContent->mediavariante as $row) {
$record = Variante::where('codeVariante', $row->code)->first();
if($record){ // Update record
$record->libelle = $row->libelle;
$record->sujet_id = $row->sujet_id->children()[0]->code;
$record->typevue_id = $row->CodeTypeVue->mediatypesvue->code;
$record->save();
}else{ // Insert new record
$record = new Variante();
$record->codeVariante = $row->code;
$record->libelle = $row->libelle;
$record->sujet_id = $row->sujet_id->children()[0]->code;
$record->typevue_id = $row->CodeTypeVue->mediatypesvue->code;
$record->save();
}
}
}elseif (substr($filename, 0, 20) == "DAM_SITE_PROD_GROUPE") {
foreach ($fileContent->SITE_PROD_GRP as $row) {
$record = Site::where('id', $row->code)->first();
if($record){ // Update record
$record->libelle = $row->libelle;
$record->save();
}else{ // Insert new record
$record = new Site();
$record->id = $row->code;
$record->libelle = $row->libelle;
$record->save();
}
}
}
// ---- Suppression du fichier
Storage::disk('arcadia')->delete($filename);
$bar->advance();
}
$bar->finish();
$this->line("");
$this->info('Fin du traitement');
}
}

View file

@ -0,0 +1,94 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use App\Sujet;
use App\Format;
use App\Media;
use App\Http\Traits\MediaTools;
class RegenerateThumbnails extends Command
{
use MediaTools;
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'medias:regenerate';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Regénération de toutes les vignettes des médias';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Vous allez regénérer toutes les miniatures des médias.');
$sujets = Sujet::where('sujet_dam', 1)->get();
$this->line("");
$this->line("Liste des sujets disponibles");
$this->line("----------------------------");
foreach ($sujets as $key => $sujet) {
$this->line("[".$sujet->codeSujet."] ". $sujet->libelle);
}
$this->line("[0] Tous les sujets");
$sujetId = $this->ask('Pour quel sujet de média souhaitez vous executer le traitement ?' );
if($sujetId == ""){
$this->error('Id de sujet incorrect');
die();
}
if($sujetId == 0){
$medias = Media::where('typemedia_id', 1)->with('Sujet.formats')->get();
}else{
$medias = Media::where('sujet_id', $sujetId)->where('typemedia_id', 1)->with('Sujet.formats')->get();
}
if($medias->count() == 0){
$this->error('Aucun média n\'a été trouvé');
die();
}
$this->info($medias->count().' média(s) trouvé(s) - Début du traitement');
$bar = $this->output->createProgressBar(count($medias));
$bar->start();
foreach ($medias as $media) {
// ---- 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);
$bar->advance();
}
$bar->finish();
$this->line("");
$this->info('Fin du traitement');
}
}

View file

@ -12,4 +12,12 @@ class Etiquette extends Model
* @var string
*/
protected $primaryKey = 'etiquette_id';
/**
* Get the medias for the etiquette.
*/
public function medias()
{
return $this->hasMany('App\Media');
}
}

31
app/Format.php Normal file
View file

@ -0,0 +1,31 @@
<?php
namespace App;
use App\Scopes\SystemScope;
use Illuminate\Database\Eloquent\Model;
class Format extends Model
{
/**
* The "booting" method of the model.
*
* @return void
*/
protected static function boot()
{
parent::boot();
static::addGlobalScope(new SystemScope);
}
/**
* The sujet that belong to the format.
*/
public function sujets()
{
return $this->belongsToMany('App\Sujet', 'sujets_formats', 'format_id', 'sujet_id');
}
}

View file

@ -7,6 +7,8 @@ use App\Sujet;
use App\Marque;
use App\Media;
use App\Typevue;
use App\Variante;
use App\Format;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@ -22,7 +24,7 @@ class DossierController extends Controller
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$dossiers = Dossier::whereNull('parent_id')
->get();
$sujets = Sujet::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.index')->with([
'dossiers'=> $dossiers,
@ -39,7 +41,7 @@ class DossierController extends Controller
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$marques = Marque::all();
$sujets = Sujet::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.create')->with(['marques'=> $marques, 'sujets'=> $sujets]);
}
@ -111,7 +113,7 @@ class DossierController extends Controller
$dossierMarques = $dossier->marques;
$marques = Marque::all();
$dossierSujets = $dossier->sujets;
$sujets = Sujet::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.edit')->with(['dossier'=> $dossier, 'dossierMarques' => $dossierMarques, 'marques' => $marques, 'sujets'=> $sujets]);
}
@ -186,15 +188,30 @@ class DossierController extends Controller
public function loadFolder(Request $request)
{
$response = array();
$userId = Auth::user()->id;
$sujetId = $request->input('sujetId');
$marques = Auth::user()->marques()->pluck("marque_id");
$response['data'] = Dossier::where('sujet_id', $sujetId)
->whereNull('parent_id')
->whereHas("marques", function($query) use ($marques){
$query->whereIn("marque_id", $marques);
})->get();
$response['count'] = Media::where('sujet_id', $sujetId)->whereNull('dossier_id')->count();
->whereNull('parent_id')
->whereHas("marques", function($query) use ($marques){
$query->whereIn("marque_id", $marques);
})->get();
$response['count'] = Media::where('sujet_id', $sujetId)
->whereNull('dossier_id')
->where(function ($query) use ( $userId ) {
$query->where('statut', '<>', 0)
->orWhere('created_by', $userId);
})
->count();
$response['typevues'] = Typevue::where('sujet_id', $sujetId)->get();
$response['variantes'] = Variante::where('sujet_id', $sujetId)->get();
$FormatsSujet = Format::whereHas('sujets', function ($query) use ($sujetId) {
$query->where('sujet_id',$sujetId);
})->get();
$FormatsSystem = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('system', 1)->get();
$response['formats'] = $FormatsSujet->merge($FormatsSystem);
if(Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')] )){
$response['draggable'] = true;

View file

@ -6,6 +6,7 @@ use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use App\Sujet;
use App\Format;
use App\Media;
use App\Typemedia;
use App\Langue;
@ -13,10 +14,14 @@ use App\Copyright;
use App\Etiquette;
use App\Site;
use App\Marque;
use App\Tag;
use App\Article;
use App\Http\Traits\MediaTools;
class MediaController extends Controller
{
use MediaTools;
/**
* Display a listing of the resource.
@ -39,7 +44,7 @@ class MediaController extends Controller
'copyrights'=> $copyrights,
'etiquettes'=> $etiquettes,
'sites'=> $sites,
'marques'=> $marques,
'marques'=> $marques
]);
}
@ -50,6 +55,7 @@ class MediaController extends Controller
public function loadMedia(Request $request)
{
$response = array();
$userId = Auth::user()->id;
$dossier_id = $request->input('dossier_id');
$sujet_id = $request->input('sujet_id');
$offset = $request->input('offset');
@ -58,9 +64,29 @@ class MediaController extends Controller
$order = $request->input('order');
if($dossier_id == "0"){
$response['data'] = Media::where('sujet_id', $sujet_id)->whereNull('dossier_id')->with('Etiquette')->offset($offset)->limit($limit)->orderBy($orderField, $order)->get();
$response['data'] = Media::where('sujet_id', $sujet_id)
->whereNull('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();
}else{
$response['data'] = Media::where('sujet_id', $sujet_id)->where('dossier_id', $dossier_id)->with('Etiquette')->offset($offset)->limit($limit)->orderBy($orderField, $order)->get();
$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();
}
if(Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')] )){
$response['draggable'] = true;
@ -103,12 +129,18 @@ class MediaController extends Controller
*/
public function removeMedia(Request $request)
{
$deletedMediasList = array();
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$medias = $request->input('medias');
Media::destroy($medias);
$deleteMedias = $request->input('medias');
return json_encode(true);
$medias = Media::whereIn('id', $deleteMedias)->whereNull('arcadia_id')->get();
foreach ($medias as $media) {
$deletedMediasList[] = $media->id;
$media->delete();
}
return json_encode($deletedMediasList);
}
/**
@ -117,14 +149,38 @@ class MediaController extends Controller
*/
public function getOneMedia(Request $request)
{
$host = $request->getSchemeAndHttpHost();
$response = array();
$media_id = $request->input('media_id');
$media = Media::where('id', $media_id)->with('sujet')->with('sites')->with('marques')->with('tags:libelle')->first();
$media = Media::where('id', $media_id)->with('sujet')->with('sites')->with('marques')->with('articles')->with('tags:libelle')->first();
if($media){
// stock le média
$response['data'] = $media;
// stock les tags
foreach ($media->tags as $tag) {
$response['tags'][] = $tag->libelle;
}
// stock les vignettes existantes
$files = Storage::files($media->folder."/");
$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'];
if(strpos($fileInfo['libelle'], '_')){
$fileInfo['libelle'] = "Format ".substr($fileInfo['libelle'], strpos($fileInfo['libelle'], '_')+1);
}else{
$fileInfo['libelle'] = "Format original";
}
$response['vignettes'][] = $fileInfo;
}
}
return json_encode($response);
@ -138,8 +194,71 @@ class MediaController extends Controller
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR'), config('roles.const.CONTRIBUTEUR')]);
$response = array();
$mediaUpdate = (object) $request->input('media');
$media = Media::where('id', $mediaUpdate->id)->first();
if($media){
$media->libelle = $mediaUpdate->libelle;
$media->typevue_id = $mediaUpdate->typevue_id;
$media->variante_id = $mediaUpdate->variante_id;
$media->langue_id = $mediaUpdate->langue_id;
$media->commentaire = $mediaUpdate->commentaire;
$media->version = $mediaUpdate->version;
if( ($mediaUpdate->statut == config('services.statut.public') || $mediaUpdate->statut == config('services.statut.public_etendue')) && $media->statut == config('services.statut.brouillon')){
$media->published_at = date("Y-m-d H:i:s");
}
$media->statut = $mediaUpdate->statut;
$media->copyright_id = $mediaUpdate->copyright_id;
$media->etiquette_id = $mediaUpdate->etiquette_id;
$media->save();
// MAJ des tags
$media->tags()->detach();
if(isset($mediaUpdate->tags)){
foreach($mediaUpdate->tags as $tag){
$oTag = Tag::where('libelle', $tag)->first();
if(!$oTag){
$oTag = new Tag();
$oTag->libelle = $tag;
$oTag->save();
}
$media->tags()->attach($oTag->id);
}
}
// ---- Les sites
$media->sites()->detach();
$sSites = $mediaUpdate->sites;
if($sSites != ""){
$sites = explode(",", $sSites);
foreach($sites as $siteId){
$media->sites()->attach($siteId);
}
}
// ---- Les marques
$media->marques()->detach();
$sMarques = $mediaUpdate->marques;
if($sMarques != ""){
$marques = explode(",", $sMarques);
foreach($marques as $marqueId){
$media->marques()->attach($marqueId);
}
}
// ---- Les articles
$media->articles()->detach();
$sArticles = $mediaUpdate->articles;
if($sArticles){
$articles = explode(",", $sArticles);
foreach($articles as $articleId){
$media->articles()->attach($articleId);
}
}
}
$response = true;
return json_encode($response);
}
@ -184,10 +303,117 @@ class MediaController extends Controller
$media = Media::where('id', $media_id)->first();
if($media){
Storage::put($media->source, base64_decode($image));
$mediaPath = $media->folder.$media->uid.".".$media->extension;
Storage::put($mediaPath, base64_decode($image));
$im = new \imagick($mediaPath);
$imageprops = $im->getImageGeometry();
$media->largeur = $imageprops['width'];
$media->hauteur = $imageprops['height'];
$resolutions = $im->getImageResolution();
$im->destroy();
$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->taille = $this->formatBytes($this->get_file_size($mediaPath));
$media->save();
// Regénération des miniatures de base
$this->create_sys_thumb($media);
// ---- Creation des vignettes en lien avec le sujet du média
$this->create_thumb($media);
$response = $media;
}
return json_encode($response);
}
/**
* Applique un Id Arcadia à un média
*
*/
public function setIdArcdadia(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN')]);
$response = false;
$media_id = $request->input('media_id');
$arcadia_id = $request->input('arcadia_id');
$media = Media::where('id', $media_id)->first();
if($media){
$media->arcadia_id = $arcadia_id;
$media->save();
$response = true;
}
return json_encode($response);
}
/**
* Renvoie un article par ID Arcadia
*
*/
public function getArticle(Request $request)
{
$response = array();
$arcadia_id = $request->input('arcadia_id');
$article = Article::where('noArt', $arcadia_id)->first();
if($article){
$response['article'] = $article;
}else{
$response = false;
}
return json_encode($response);
}
/**
* Renvoie un article par ID Arcadia
*
*/
public function downloadMedia(Request $request)
{
if(!$user = Auth::user()) abort(404, 'Erreur lors du téléchargement');
// obtention du format
$formatId = $request->input('format');
if($formatId != 0){
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('id', $formatId)->first();
if(!$format) abort(404, 'Erreur lors du téléchargement');
}else{
$format = "";
}
$mediasId = $request->input('medias');
$medias = explode(",", $mediasId);
if(sizeof($medias) == 1){
$media = Media::where('id', $mediasId)->first();
if($media){
$fp = $this->get_mediaPath($media, $format);
}
}else{
// create zip archive
$zip_file = public_path() . '/uploads/DAM_'.uniqid().'_'.date("Ymd").'.zip';
$zip = new \ZipArchive();
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
// add file to archive
foreach ($medias as $mediaId) {
$media = Media::where('id', $mediaId)->first();
if($media){
$fp = $this->get_mediaPath($media, $format);
$zip->addFile($fp, basename($fp));
}
}
$zip->close();
$fp = $zip_file;
}
return response()->download($fp)->deleteFileAfterSend(true);
}
}

View file

@ -42,6 +42,7 @@ class UploadController extends Controller {
}
$extension = strtolower($files->getClientOriginalExtension());
$originalName = str_replace( ".".$extension, "", $files->getClientOriginalName());
if (!in_array($extension, $acceptFileTypes)) return array("false");
if($is_chunked_upload){
@ -95,9 +96,15 @@ class UploadController extends Controller {
// on créé un média en bdd
$media = new Media();
$media->libelle = $filename;
$media->dossier_id = $dossier_id;
$media->sujet_id = $sujet_id;
$media->libelle = $originalName;
$media->extension = $extension;
$media->source = $destinationPath.$filename;
$media->folder = $destinationPath;
if($user = Auth::user()){
$media->created_by= $user->id;
}
$media->uid = $uid;
$media->taille = $this->formatBytes($this->get_file_size($destinationPath.$filename));
switch ($extension) {
@ -107,26 +114,36 @@ class UploadController extends Controller {
case 'jpg':
case 'png':
$media->typemedia_id = 1;
list($width, $height) = getimagesize($destinationPath.$filename);
$media->largeur = $width;
$media->hauteur = $height;
$media->resolution = $this->get_dpi($destinationPath.$filename);
$im = new \imagick($destinationPath.$filename);
if($extension == "gif" ){
$im->setIteratorIndex(0);
}
$resolutions = $im->getImageResolution();
$media->resolution = $resolutions['x'];
$imageprops = $im->getImageGeometry();
$media->largeur = $imageprops['width'];
$media->hauteur = $imageprops['height'];
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);
$media->largeur_mm = ceil(($media->largeur * 2.54 / $media->resolution)*10);
$media->hauteur_mm = ceil(($media->hauteur * 2.54 / $media->resolution)*10);
}else{
$this->createThumbnail($destinationPath.$filename, $destinationPath.$uid.'_preview.'.$extension, $width);
$media->largeur_mm = "";
$media->hauteur_mm = "";
}
$media->save();
// ---- 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;
// Illustration/Vectorielle (2)
case 'svg':
$media->typemedia_id = 2;
$media->save();
break;
// Vidéo (3)
case 'mp4':
@ -137,6 +154,7 @@ class UploadController extends Controller {
$media->hauteur = $fileInfo['video']['resolution_y'];
$media->duree = $fileInfo['playtime_string'];
}
$media->save();
break;
// Audio (4)
case 'mp3':
@ -145,6 +163,7 @@ class UploadController extends Controller {
if($fileInfo = $getID3->analyze($destinationPath.$filename)){
$media->duree= $fileInfo['playtime_string'];
}
$media->save();
break;
// Document (5)
case 'ai':
@ -155,44 +174,37 @@ class UploadController extends Controller {
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"){
if($extension == "pdf" || $extension == "psd" || $extension == "ai"){
$im->setIteratorIndex(0);
}
//$im->setImageFormat('jpg');
//list($width,$height) = $im->getImageGeometry();
$imageprops = $im->getImageGeometry();
$media->largeur = $imageprops['width'];
$media->hauteur = $imageprops['height'];
$resolutions = $im->getImageResolution();
$media->resolution = $resolutions['x'];
$width = $imageprops['width'];
$height = $imageprops['height'];
// create preview
$fp = $destinationPath.$uid.'_preview.png';
if($width >= 1500){
//$newHeight = (1500 * $height) / $width;
//$im->resizeImage(1500,$newHeight, \imagick::FILTER_LANCZOS, 0.9, true);
$im->thumbnailImage(1500, 1500 , true);
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 = "";
}
$im->writeImage($fp);
// create thumb
//$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);
$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;
}
$media->dossier_id = $dossier_id;
$media->sujet_id = $sujet_id;
$media->save();
}
$filest = array();

View file

@ -21,7 +21,7 @@ class UserController extends Controller
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$users = User::all();
$sujets = Sujet::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('users.index')->with(['users'=> $users, 'sujets'=> $sujets]);
}
@ -35,7 +35,7 @@ class UserController extends Controller
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$roles = config('roles.label');
$marques = Marque::all();
$sujets = Sujet::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('users.create')->with(['roles'=> $roles, 'marques'=> $marques, 'sujets'=> $sujets]);
}
@ -87,6 +87,9 @@ class UserController extends Controller
foreach($sujets as $sujetId){
$user->sujets()->attach($sujetId);
}
}else{
session()->flash('error', "Vous devez ajouter au moins un sujet.");
return redirect()->route('user.create');
}
session()->flash('message', "L'utilisateur à été enregistré");
@ -160,7 +163,7 @@ class UserController extends Controller
$userMarques = $user->marques;
$marques = Marque::all();
$userSujets = $user->sujets;
$sujets = Sujet::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('users.edit')->with(['user'=> $user, 'roles'=> $roles, 'userMarques' => $userMarques, 'marques' => $marques, 'userSujets' => $userSujets, 'sujets'=> $sujets]);
}
@ -206,6 +209,9 @@ class UserController extends Controller
foreach($sujets as $sujetId){
$user->sujets()->attach($sujetId);
}
}else{
session()->flash('error', "Vous devez ajouter au moins un sujet.");
return redirect()->route('user.edit', ['user' => $user]);
}
session()->flash('message', "L'utilisateur à été mis à jour");

View file

@ -5,10 +5,85 @@ use Illuminate\Support\Facades\Storage;
trait MediaTools {
public function get_file_size($file_path) {
return $this->fix_integer_overflow(filesize($file_path));
}
public function create_thumb($media) {
$formats = $media->sujet->formats;
$mediaPath = public_path()."/".$media->folder.$media->uid.".".$media->extension;
$im = new \imagick($mediaPath);
$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN);
$im->stripImage();
if(in_array($media->extension, array("pdf", "ai", "psd")) ){
$im->setIteratorIndex(0);
}
foreach ($formats as $format) {
$fp = public_path()."/".$media->folder.$media->uid.'_'.$format->libelle.'.'.$format->extension;
$targetWidth = $format->largeur;
if($format->hauteur == 0){
$targetHeight = floor(($media->hauteur*$format->largeur)/$media->largeur);
}else{
$targetHeight = $format->hauteur;
}
$im->setImageFormat($format->extension);
if($media->largeur >= $targetWidth || $media->hauteur >= $targetHeight){
$im->thumbnailImage($targetWidth, $targetHeight , true);
}
$im->writeImage($fp);
}
$im->destroy();
}
public function create_sys_thumb($media) {
$mediaPath = public_path()."/".$media->folder.$media->uid.".".$media->extension;
$im = new \imagick();
$im->readImage($mediaPath);
if(in_array($media->extension, array("pdf", "ai", "psd")) ){
$extension = "png";
$im->setIteratorIndex(0);
}else{
$extension = $media->extension;
}
// create preview
$fp = public_path()."/".$media->folder.$media->uid.'_preview.'.$extension;
if($media->extension == "gif" ){
if($media->largeur >= 1500 || $media->hauteur >= 1500 || $media->largeur == ""){
$im = $im->coalesceImages();
foreach ($im as $frame) {
$frame->thumbnailImage(1500, 1500);
$frame->setImagePage(1500, 1500, 0, 0);
}
$im = $im->deconstructImages();
}
$im->writeImages($fp, true);
}else{
if($media->largeur >= 1500 || $media->hauteur >= 1500 || $media->largeur == ""){
$im->thumbnailImage(1500, 1500 , true);
}
$im->writeImage($fp);
}
// create thumb
$im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN);
$im->stripImage();
$fp = public_path()."/".$media->folder.$media->uid.'_thumb.'.$extension;
$im->thumbnailImage(200, 200 , true);
$im->writeImage($fp);
$im->destroy();
}
public function get_mediaFolder() {
$mediaPath = "medias/";
$directories = Storage::allDirectories($mediaPath );
@ -74,149 +149,32 @@ trait MediaTools {
}
}
public function get_dpi($filename){
// ---- Renvoi le chemin attendu d'un média selon le format demandé
public function get_mediaPath($media, $format = "") {
// open the file and read first 20 bytes.
$a = fopen($filename,'r');
$string = fread($a,20);
fclose($a);
// format original
if($format == ""){
return public_path()."/".$media->folder.$media->uid.'.'.$media->extension;
}
// get the value of byte 14th up to 18th
$data = bin2hex(substr($string,14,4));
$x = substr($data,0,4);
$y = substr($data,4,4);
//return array(hexdec($x),hexdec($y));
return hexdec($x);
// format spécifique
if($format->system == 0){
if(in_array($media->extension, array("gif", "jpeg", "jpg", "png", "pdf", "ai", "psd")) ){
return public_path()."/".$media->folder.$media->uid.'_'.$format->libelle.'.'.$format->extension;
}else{
return public_path()."/".$media->folder.$media->uid.'.'.$media->extension;
}
}
// 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;
}elseif(in_array($media->extension, array("pdf", "ai", "psd"))){
return public_path()."/".$media->folder.$media->uid.'.png';
}else{
return public_path()."/".$media->folder.$media->uid.'.'.$media->extension;
}
}
}
/**
* @param $src - a valid file location
* @param $dest - a valid file target
* @param $targetWidth - desired output width
* @param $targetHeight - desired output height or null
*/
function createThumbnail($src, $dest, $targetWidth, $targetHeight = null) {
// Link image type to correct image loader and saver
// - makes it easier to add additional types later on
// - makes the function easier to read
$IMAGETYPE_JPEG = 2;
$IMAGETYPE_PNG = 3;
$IMAGETYPE_GIF = 1;
$IMAGE_HANDLERS = [
2 => [
'load' => 'imagecreatefromjpeg',
'save' => 'imagejpeg',
'quality' => 50
],
3 => [
'load' => 'imagecreatefrompng',
'save' => 'imagepng',
'quality' => 5
],
1 => [
'load' => 'imagecreatefromgif',
'save' => 'imagegif',
'quality' => 0
]
];
// 1. Load the image from the given $src
// - see if the file actually exists
// - check if it's of a valid image type
// - load the image resource
// get the type of the image
// we need the type to determine the correct loader
$type = exif_imagetype($src);
// if no valid type or no handler found -> exit
if (!$type || !$IMAGE_HANDLERS[$type]) {
return null;
}
// load the image with the correct loader
$image = call_user_func($IMAGE_HANDLERS[$type]['load'], $src);
// no image found at supplied location -> exit
if (!$image) {
return null;
}
// 2. Create a thumbnail and resize the loaded $image
// - get the image dimensions
// - define the output size appropriately
// - create a thumbnail based on that size
// - set alpha transparency for GIFs and PNGs
// - draw the final thumbnail
// get original image width and height
$width = imagesx($image);
$height = imagesy($image);
// maintain aspect ratio when no height set
if ($targetHeight == null) {
// get width to height ratio
$ratio = $width / $height;
// if is portrait
// use ratio to scale height to fit in square
if ($width > $height) {
$targetHeight = floor($targetWidth / $ratio);
}
// if is landscape
// use ratio to scale width to fit in square
else {
$targetHeight = $targetWidth;
$targetWidth = floor($targetWidth * $ratio);
}
}
// create duplicate image based on calculated target size
$thumbnail = imagecreatetruecolor($targetWidth, $targetHeight);
// set transparency options for GIFs and PNGs
if ($type == $IMAGETYPE_GIF || $type == $IMAGETYPE_PNG) {
// make image transparent
imagecolortransparent(
$thumbnail,
imagecolorallocate($thumbnail, 0, 0, 0)
);
// additional settings for PNGs
if ($type == $IMAGETYPE_PNG) {
imagealphablending($thumbnail, false);
imagesavealpha($thumbnail, true);
}
}
// copy entire source image to duplicate image and resize
imagecopyresampled(
$thumbnail,
$image,
0, 0, 0, 0,
$targetWidth, $targetHeight,
$width, $height
);
// 3. Save the $thumbnail to disk
// - call the correct save method
// - set the correct quality level
// save the duplicate version of the image to disk
return call_user_func(
$IMAGE_HANDLERS[$type]['save'],
$thumbnail,
$dest,
$IMAGE_HANDLERS[$type]['quality']
);
}
}

View file

@ -12,7 +12,7 @@ class Marque extends Model
*
* @var string
*/
protected $primaryKey = 'COD_MARQUE';
protected $primaryKey = 'codMarq';
/**
* The users that belong to the marque.

View file

@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
class Media extends Model
{
use SoftDeletes;
protected $with = "owner";
protected $table = "medias";
/**
@ -74,6 +75,14 @@ class Media extends Model
return $this->belongsToMany('App\Tag', 'medias_tags', 'media_id', 'tag_id');
}
/**
* The articles that belong to the media.
*/
public function articles()
{
return $this->belongsToMany('App\Article', 'medias_articles', 'media_id', 'article_id');
}
/**
* The sites that belong to the media.
*/
@ -89,4 +98,12 @@ class Media extends Model
{
return $this->belongsToMany('App\Marque', 'medias_marques', 'media_id', 'marque_id');
}
/**
* Get the user that owns the media.
*/
public function owner()
{
return $this->belongsTo('App\User', 'created_by');
}
}

View file

@ -0,0 +1,21 @@
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class SystemScope implements Scope
{
/**
* Apply the scope to a given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
$builder->where('system', 0);
}
}

View file

@ -6,14 +6,13 @@ use Illuminate\Database\Eloquent\Model;
class Sujet extends Model
{
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'CODE_SUJET';
protected $primaryKey = 'codeSujet';
/**
* The users that belong to the sujet.
@ -31,6 +30,22 @@ class Sujet extends Model
return $this->hasMany('App\Dossier');
}
/**
* Get the variantes for the sujet.
*/
public function variantes()
{
return $this->hasMany('App\Variante');
}
/**
* Get the typeVue for the sujet.
*/
public function typeVues()
{
return $this->hasMany('App\Typevue');
}
/**
* Get the medias for the sujet.
*/
@ -38,4 +53,12 @@ class Sujet extends Model
{
return $this->hasMany('App\Media');
}
/**
* The formats that belong to the sujet.
*/
public function formats()
{
return $this->belongsToMany('App\Format', 'sujets_formats', 'sujet_id', 'format_id');
}
}

View file

@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model;
class Tag extends Model
{
public $timestamps = false;
/**
* The media that belong to the tags.
*/
@ -14,4 +15,5 @@ class Tag extends Model
{
return $this->belongsToMany('App\Media', 'medias_tags', 'tag_id', 'media_id');
}
}

View file

@ -13,5 +13,13 @@ class Typemedia extends Model
*
* @var string
*/
protected $primaryKey = 'CODE_TYPEMEDIA';
protected $primaryKey = 'codeTypemedia';
/**
* Get the media for the Typemedia.
*/
public function medias()
{
return $this->hasMany('App\Media');
}
}

View file

@ -11,5 +11,29 @@ class Typevue extends Model
*
* @var string
*/
protected $primaryKey = 'CODE_TYPEVUE';
protected $primaryKey = 'codeTypevue';
/**
* Get the variantes for the Typevue.
*/
public function variantes()
{
return $this->hasMany('App\Variante');
}
/**
* Get the sujet that owns the Typevue.
*/
public function sujet()
{
return $this->belongsTo('App\Sujet', 'sujet_id');
}
/**
* Get the medias for the Typevue.
*/
public function medias()
{
return $this->hasMany('App\Media');
}
}

View file

@ -91,4 +91,12 @@ class User extends Authenticatable
{
return $this->belongsToMany('App\Sujet', 'sujets_users', 'user_id', 'sujet_id');
}
/**
* Get the medias for the user.
*/
public function medias()
{
return $this->hasMany('App\Media');
}
}

32
app/Variante.php Normal file
View file

@ -0,0 +1,32 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Variante extends Model
{
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'codeVariante';
/**
* Get the sujet that owns the variante.
*/
public function sujet()
{
return $this->belongsTo('App\Sujet', 'sujet_id');
}
/**
* Get the typeVue that owns the variante.
*/
public function typeVue()
{
return $this->belongsTo('App\Typevue', 'typevue_id');
}
}

View file

@ -55,6 +55,11 @@ return [
'visibility' => 'public',
],
'arcadia' => [
'driver' => 'local',
'root' => storage_path('export_arcadia'),
],
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),

View file

@ -44,4 +44,9 @@ return [
],
],
'statut' => [
'brouillon' => 0,
'public' => 1,
'public_etendue' => 2,
],
];

50
public/css/app.css vendored
View file

@ -123,7 +123,6 @@ body {
color: #aaaaaa;
background-size: 6.1px 5.3px;
height: 100%;
overflow: hidden;
}
ol,
@ -13006,6 +13005,28 @@ readers do not read off random characters that represent icons */
right: -22px;
}
#form_download {
padding: 30px;
min-width: 300px;
}
#form_download h3 {
font-size: 14px;
margin-bottom: 12px;
font-weight: bold;
color: #ffffff;
}
#form_download hr {
color: #24272e;
border-bottom: 1px solid #2c2f36;
margin-bottom: 20px;
}
#form_download p {
margin-bottom: 40px;
}
/******************************************
TEMPLATE
******************************************/
@ -13256,6 +13277,7 @@ p {
}
input[type=text],
input[type=number],
input[type=password],
input[type=email],
input[type=url],
@ -13266,6 +13288,7 @@ select {
}
input[type=text].is-invalid,
input[type=number].is-invalid,
input[type=password].is-invalid,
input[type=email].is-invalid,
input[type=url].is-invalid,
@ -13693,6 +13716,7 @@ table tfoot tr:hover {
.media_manager .main_content header .action_wrapper .order select {
padding: 5px 0px;
color: #3b3b3b;
}
.media_manager .main_content .scrollLoader {
@ -14105,7 +14129,7 @@ table tfoot tr:hover {
height: 100%;
background-color: #333333;
position: absolute;
z-index: 999999999999;
z-index: 99990;
left: 0;
top: 0;
}
@ -14134,6 +14158,7 @@ table tfoot tr:hover {
font-size: 18px;
position: relative;
padding: 12px;
border: none;
}
#form_media header .form_media_close:after {
@ -14163,6 +14188,19 @@ table tfoot tr:hover {
z-index: 1;
}
#form_media header .form_media_download {
float: right;
font-size: 18px;
position: relative;
padding: 12px;
border: none;
}
#form_media header .form_media_download:hover {
background-color: transparent;
color: #ffffff;
}
#form_media .main_content {
height: calc(100% - 43px);
}
@ -14216,6 +14254,10 @@ table tfoot tr:hover {
background-color: #272626;
}
#form_media .main_content .tab.tab_edit .button_bar a {
display: inline-block;
}
#form_media .main_content .tab.tab_edit .cloud_tag_plugin {
position: relative;
}
@ -14294,6 +14336,10 @@ table tfoot tr:hover {
width: 100%;
}
#form_media .main_content .tab .wrapper .article_selector .remove_article {
color: #aaaaaa;
}
/******************************************
PAGE LOGIN
******************************************/

506
public/js/app.js vendored
View file

@ -10825,7 +10825,7 @@ window.initSelector = function ($selector) {
});
$($selector + " .selector_dataValues").val(datavalue.join()); // Recherche d'un élément
$($selector + " .selector_filter").on('keyup', function (event) {
$($selector + " .selector_filter").off().on('keyup', function (event) {
var options = $(this).parent($selector).find(".selector_choices li");
var search = $(this).val();
$(options).each(function () {
@ -10837,7 +10837,7 @@ window.initSelector = function ($selector) {
});
}); // Ajout d'un élément
$($selector + " .selector_choices").on("click", "li", function () {
$($selector + " .selector_choices").off().on("click", "li", function () {
if (!$(this).hasClass('selected')) {
var id = $(this).attr("data-value");
var text = $(this).html();
@ -10848,7 +10848,7 @@ window.initSelector = function ($selector) {
}
}); // Suppression d'un élément
$($selector + " .selector_values").on("click", "li", function () {
$($selector + " .selector_values").off().on("click", "li", function () {
var id = $(this).attr("data-value");
var text = $(this).html();
$(this).parent().parent().find('.selector_choices li[data-value="' + id + '"]').removeClass('selected');
@ -11462,6 +11462,12 @@ $(document).ready(function () {
$(this).attr("aria-grabbed", "true");
event.originalEvent.dataTransfer.setData('Text', $(this).attr("data-id"));
}
}); // ---- Restreint le Drag aux images
$("html").on("dragstart", function (event) {
if (!$(event.target).hasClass('imageItem')) {
return false;
}
}); // ---- déselectionne les éléments si on clique en dehors
$(".main_content .media_container").on("click", function (event) {
@ -11488,7 +11494,20 @@ $(document).ready(function () {
if ($target.hasClass('editItem')) {
// Editer un média
$(this).dblclick();
} else if ($target.hasClass('downloadItem')) {// Télécharger le média
} else if ($target.hasClass('downloadItem')) {
// Télécharger le média
var medias = [];
medias.push($(this).attr("data-id"));
$("#form_download").fancybox({
type: 'inline',
opts: {
animationDuration: 350,
animationEffect: 'material'
},
beforeShow: function beforeShow() {
$("#form_download .medias").val(medias.join());
}
}).trigger("click");
} else if ($target.hasClass('addBasket')) {// ajouter le média au panier
} else if ($target.hasClass('deleteItem')) {
// supprimer le média
@ -11628,69 +11647,92 @@ $(document).ready(function () {
$("#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
$(".tab_preview").html('<div id="openseadragon" ></div>');
$("#openseadragon").css('width', '100%');
$("#openseadragon").css('height', minHeight);
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: imgPreview
}
}); // charge l'image pour la retouche
if ($(this).attr('data-ext') == 'gif') {
// charge le gif
$(".tab_preview").html('<img class="svgElt" src=""/>');
$(".tab_preview img").attr("src", $(this).attr('data-src'));
} else {
// charge l'image de preview
$(".tab_preview").html('<div id="openseadragon" ></div>');
$("#openseadragon").css('width', '100%');
$("#openseadragon").css('height', minHeight);
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: imgPreview
}
});
}
$("#form_media .tab_retouch").html('<img id="drTarget" src="" >');
$("#drTarget").attr("src", $(this).attr('data-src'));
drPlugin = new Darkroom('#drTarget', {
minWidth: 200,
minHeight: 200,
maxWidth: minWidth,
maxHeight: minHeight,
plugins: {
save: {
callback: function callback() {
// récupère la nouvelle image
var newImage = this.darkroom.sourceCanvas.toDataURL(); // sauvegarde de l'image en base
if ($(this).attr('data-ext') == 'gif') {
// masque l'onglet retouche
$("#form_media .form_media_retouch").hide();
} else {
// charge l'image pour la retouche
$("#form_media .tab_retouch").html('<img id="drTarget" src="" >');
$("#drTarget").attr("src", $(this).attr('data-src'));
drPlugin = new Darkroom('#drTarget', {
minWidth: 200,
minHeight: 200,
maxWidth: minWidth,
maxHeight: minHeight,
plugins: {
save: {
callback: function callback() {
var dr = this.darkroom;
$.fancyConfirm({
title: "Retouche de l\'image",
message: "Êtes-vous sûr de vouloir modifier cette image ? (cette opération sera irréversible)",
okButton: 'Modifier l\'image',
noButton: 'Annuler',
callback: function callback(value) {
if (value) {
// récupère la nouvelle image
var newImage = dr.sourceCanvas.toDataURL(); // sauvegarde de l'image en base
$.ajax({
url: '/ajax/edit-photo',
method: 'POST',
dataType: 'json',
data: {
media_id: $(window).data('current_edit_media'),
image: newImage
},
success: function success(result) {
// MAJ de l'aperçu
viewer.destroy();
viewer = null;
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: newImage
$.ajax({
url: '/ajax/edit-photo',
method: 'POST',
dataType: 'json',
data: {
media_id: $(window).data('current_edit_media'),
image: newImage
},
success: function success(result) {
// MAJ de l'aperçu
viewer.destroy();
viewer = null;
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: newImage
}
}); // MAJ du visuel dans la Liste
var mediaId = $(window).data('current_edit_media');
var $media = $(".media_container .imageItem[data-id='" + mediaId + "'] .media");
var mediaBg = $media.css('background-image', 'url(' + result.folder + result.uid + "." + result.extension + '?t=' + new Date().getTime() + ')');
},
error: function error(jqXHR, textStatus, errorThrown) {
$.fancybox.close();
$.fancyMessage({
title: "Attention",
message: "Erreur lors de la sauvegarde de l'image, merci d'actualiser la page.",
type: "error"
});
}
});
}
}); // MAJ du visuel dans la Liste
var mediaId = $(window).data('current_edit_media');
var $media = $(".media_container .imageItem[data-id='" + mediaId + "'] .media");
var mediaBg = $media.css('background-image', 'url(' + result.source + new Date().getTime() + ')');
},
error: function error(jqXHR, textStatus, errorThrown) {
$.fancybox.close();
$.fancyMessage({
title: "Attention",
message: "Erreur lors de la sauvegarde de l'image, merci d'actualiser la page.",
type: "error"
});
}
});
}
});
}
}
}
}
});
});
}
} else if ($(this).attr('data-typemedia') == 2) {
// média svg
$("#form_media .form_media_retouch").hide(); // masque l'onglet retouche
@ -11762,21 +11804,46 @@ $(document).ready(function () {
// 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 #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 #variantes option").each(function () {
if ($(this).attr('data-typevue') == result.data.typevue_id) {
$(this).show();
} else {
$(this).hide();
}
});
$(".tab_edit #typemedias").val(result.data.typemedia_id);
$(".tab_edit #variantes").val(result.data.variante_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 #created_by").val(result.data.owner.firstname + " " + result.data.owner.lastname);
$(".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é
$(".tab_edit #published_at").val(result.data.published_at);
$(".tab_edit #statut").val(result.data.statut); // articles lié
$(".tab_edit .article_selector table tbody").html('');
$(".tab_edit #articles").val('');
var elems = [];
$.each(result.data.articles, function (index, article) {
$articleItem = $(".tab_edit .hidden_row tr").clone();
$articleItem.find('.col_lib').html(article.noArt + " : " + article.libCcial);
$articleItem.find('.col_famVente').html(article.codFamVte + " : " + article.libFamVte);
$articleItem.find('.col_marque').html(article.codMarq + " : " + article.libMarq);
$articleItem.find('.col_gencodAdm').html(article.codGencodAdm);
$articleItem.find('.col_gencodSymb').html(article.codGencodSymb);
$articleItem.find('.col_gencodPds').html(article.codGencodPds);
$articleItem.find('.remove_article').attr('data-id', article.id);
$(".tab_edit .article_selector table tbody").append($articleItem);
elems.push(article.id);
});
$(".tab_edit #articles").val(elems.join()); // marque lié
$(".tab_edit .selector_marques .selector_values").html('');
$.each(result.data.marques, function (index, marque) {
$(".tab_edit .selector_marques .selector_values").append('<li data-value="' + marque.COD_MARQUE + '" >' + marque.LIBELLE + '</li>');
$(".tab_edit .selector_marques .selector_values").append('<li data-value="' + marque.codMarq + '" >' + marque.libMarq + '</li>');
});
initSelector(".selector_marques"); // site lié
@ -11799,29 +11866,42 @@ $(document).ready(function () {
$(".tab_edit #largeur_mm").val(result.data.largeur_mm);
$(".tab_edit #hauteur_mm").val(result.data.hauteur_mm); // Config de la fiche d'édition
var sujetId = $("#sujet_selector").val();
if (result.data.sujet.sujet_arcadia == 0) {
$(".tab_edit .arcadia_fields").hide();
} else {
$(".tab_edit .arcadia_fields").show();
}
$(".tab_edit .article_form, .tab_edit .marque_form, .tab_edit .site_form").hide();
switch (sujetId) {
case '1':
switch (result.data.sujet_id) {
case 1:
// Visuel Article
$(".tab_edit .article_form").show();
break;
case '2':
case 2:
// Marque
$(".tab_edit .marque_form").show();
break;
case '3':
case 4:
// Sociétés
$(".tab_edit .site_form").show();
break;
default:
} // affiche la popin
} // Config de la liste des vignettes
$(".tab_links .table_links tbody").html('');
$.each(result.vignettes, function (index, vignette) {
$linkItem = $(".tab_links .row_copy_hidden table tr").clone();
$linkItem.find('.link_libelle').html(vignette.libelle + " " + vignette.extension + " " + vignette.resolution);
$linkItem.find('.link_input input').val(vignette.url);
$(".tab_links .table_links tbody").append($linkItem);
}); // affiche la popin
$("#form_media").fadeIn('fast');
},
error: function error(jqXHR, textStatus, errorThrown) {
@ -11876,6 +11956,118 @@ $(document).ready(function () {
if ($(".tab_preview audio").length) {
$(".tab_preview audio").get(0).pause();
}
}); // ---- Copie d'un lien dans le clipboard
$('.tab_links').on('click', '.fa-copy', function (event) {
$(this).prev().select();
document.execCommand("copy");
}); // ---- Bouton Arcadia
$('.tab_edit .btn-arcadia-link').on('click', function (event) {
event.preventDefault();
var arcadia_id = $("#arcadia_id").val();
arcadia_id = prompt("Indiquez le code Arcadia de ce média", arcadia_id);
$.ajax({
url: '/ajax/set-id-arcadia',
method: 'POST',
dataType: 'json',
data: {
arcadia_id: arcadia_id,
media_id: $(window).data('current_edit_media')
},
success: function success(result) {
if (result == true) {
$.fancybox.close();
$.fancyMessage({
title: "Lier un média à Arcadia",
message: "Le code Arcadia a bien été ajouté au média",
type: "info"
});
$("#arcadia_id").val(arcadia_id);
} else {
$.fancybox.close();
$.fancyMessage({
title: "Attention",
message: "Erreur lors de l'opération, merci d'actualiser la page.",
type: "error"
});
}
},
error: function error(jqXHR, textStatus, errorThrown) {
$.fancybox.close();
$.fancyMessage({
title: "Attention",
message: "Erreur lors de l'opération, merci d'actualiser la page.",
type: "error"
});
}
});
}); // ---- Bouton de suppression d'un article
$('.tab_edit .article_selector').on('click', ".remove_article", function (event) {
event.preventDefault();
var elems = $(".tab_edit #articles").val().split(',');
var id = $(this).attr('data-id');
var index = elems.indexOf(id);
elems = jQuery.grep(elems, function (value) {
return value != id;
});
$(".tab_edit #articles").val(elems.join());
$(this).parents("tr").remove();
}); // ---- Bouton d'ajout d'un article à un média
$('.tab_edit .add_article').on('click', function (event) {
event.preventDefault();
var arcadia_id = prompt("Indiquez le code Arcadia de l'article.", arcadia_id);
$.ajax({
url: '/ajax/get-article',
method: 'POST',
dataType: 'json',
data: {
arcadia_id: arcadia_id
},
success: function success(result) {
if (result) {
var article = result.article;
var elems = $(".tab_edit #articles").val().split(',');
if (jQuery.inArray(article.id, elems) == -1) {
// maj de la valeur du champ hidden
elems.push(article.id);
$(".tab_edit #articles").val(elems.join()); // maj du tableau html
$articleItem = $(".tab_edit .hidden_row tr").clone();
$articleItem.find('.col_lib').html(article.noArt + " : " + article.libCcial);
$articleItem.find('.col_famVente').html(article.codFamVte + " : " + article.libFamVte);
$articleItem.find('.col_marque').html(article.codMarq + " : " + article.libMarq);
$articleItem.find('.col_gencodAdm').html(article.codGencodAdm);
$articleItem.find('.col_gencodSymb').html(article.codGencodSymb);
$articleItem.find('.col_gencodPds').html(article.codGencodPds);
$articleItem.find('.remove_article').attr('data-id', article.id);
$(".tab_edit .article_selector table tbody").append($articleItem);
} else {
$.fancyMessage({
title: "Impossible d'ajouter l'article",
message: "Cet article est déjà présent dans la liste.",
type: "error"
});
}
} else {
$.fancyMessage({
title: "Impossible d'ajouter l'article",
message: "La référence de cet article n'a pas été trouvé.",
type: "error"
});
}
},
error: function error(jqXHR, textStatus, errorThrown) {
$.fancyMessage({
title: "Attention",
message: "Erreur lors de l'opération, merci d'actualiser la page.",
type: "error"
});
}
});
}); // ---- Suppression de média en masse
$('.action_delete_media').on('click', function (event) {
@ -11927,6 +12119,47 @@ $(document).ready(function () {
$('#form_etiquette .etiquette').on('click', function (event) {
event.preventDefault();
$(this).addClass('selected');
$.fancybox.close();
}); // ---- Popup pour télécharger des médias en masse
$('.action_download_media, .form_media_download').on('click', function (event) {
event.preventDefault();
var medias = [];
if ($(this).hasClass('form_media_download')) {
medias.push($(window).data('current_edit_media'));
} else {
$('.media_container .imageItem').each(function (index) {
if ($(this).attr("aria-grabbed") == "true") {
medias.push($(this).attr("data-id"));
}
});
}
if (medias.length == 0) {
$.fancyMessage({
title: "Télécharger des médias",
message: "Veuillez sélectionner au moins un média.",
type: "info"
});
} else {
$("#form_download").fancybox({
type: 'inline',
opts: {
animationDuration: 350,
animationEffect: 'material'
},
beforeShow: function beforeShow() {
$("#form_download .medias").val(medias.join());
}
}).trigger("click");
}
}); // ---- Bouton pour lancer le téléchargement d'un ou plusieurs médias
$('#form_download .btn_form_download').on('click', function (event) {
event.preventDefault();
$("#form_download #the_form_download").submit(); // ferme la popup
$.fancybox.close();
}); // ---- gestion des onglets de la popup d'édition
@ -11951,9 +12184,63 @@ $(document).ready(function () {
}); // ---- sauvegarde de la popup d'édition
$(".btn_tab_edit_save").on("click", function (event) {
// recupère les tags
$('#tag-editor').tagEditor('getTags')[0].tags; // ferme la popin
//$(".form_media_close, .btn_tab_edit_cancel").trigger('click');
if (!$(".form_edit_media")[0].checkValidity()) {
$.fancyMessage({
title: "Sauvegarde d'un média",
message: "Le formulaire a mal été renseigné. merci de corriger.",
type: "error"
});
}
var media = {
id: $(window).data('current_edit_media'),
libelle: $(".tab_edit #libelle").val(),
typevue_id: $(".tab_edit #typevues").val(),
variante_id: $(".tab_edit #variantes").val(),
langue_id: $(".tab_edit #langues").val(),
commentaire: $(".tab_edit #commentaire").val(),
version: $(".tab_edit #version").val(),
statut: $(".tab_edit #statut").val(),
copyright_id: $(".tab_edit #copyrights").val(),
etiquette_id: $(".tab_edit #etiquettes").val(),
tags: $('#tag-editor').tagEditor('getTags')[0].tags,
sites: $(".tab_edit .selector_sites .selector_dataValues").val(),
marques: $(".tab_edit .selector_marques .selector_dataValues").val(),
articles: $(".tab_edit #articles").val()
};
$.ajax({
url: '/ajax/save-media',
method: 'POST',
dataType: 'json',
data: {
media: media
},
success: function success(result) {
$.fancyMessage({
title: "Sauvegarde d'un média",
message: "Les données ont bien été enregistrées",
type: "info"
});
},
error: function error(jqXHR, textStatus, errorThrown) {
$.fancyMessage({
title: "Sauvegarde d'un média",
message: "Erreur lors de l'enregistrement. Merci d'actualiser la page.",
type: "error"
});
}
});
}); // ---- Chargement de la liste des vairantes lors du changement de type de vue
$(".tab_edit #typevues").on("change", function (event) {
var typevue_id = $(this).val();
$(".tab_edit #variantes option").each(function () {
if ($(this).attr('data-typevue') == typevue_id) {
$(this).show();
} else {
$(this).hide();
}
});
});
/******************************
Upload de média
@ -11993,15 +12280,29 @@ $(document).ready(function () {
$(this).stop().fadeOut("fast");
});
var currentfiles = [];
var maxFiles = 20;
var counter = 0;
$('#fileupload').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({
@ -12077,6 +12378,7 @@ $(document).ready(function () {
},
stop: function stop(e) {
$(".files").html("");
counter = 0;
currentfiles = [];
$('#progress .progress-bar').css('width', '0%');
$('#progress').hide();
@ -12124,7 +12426,20 @@ function initFolderManager(sujetId) {
var typevues = result.typevues;
$("#typevues").find('option').remove();
$.each(typevues, function (index, typevue) {
$("#typevues").append('<option value="' + typevue.CODE_TYPEVUE + '">' + typevue.LIBELLE + '</option>');
$("#typevues").append('<option value="' + typevue.codeTypevue + '">' + typevue.libelle + '</option>');
}); // initialisation de la liste variantes
var variantes = result.variantes;
$("#variantes").find('option').remove();
$.each(variantes, function (index, variante) {
$("#variantes").append('<option value="' + variante.codeVariante + '" data-typevue="' + variante.typevue_id + '" >' + variante.libelle + '</option>');
}); // initialisation des formats de vignette disponibles autéléchargement
$(window).data('formats', result.formats);
$('#form_download .download_format').html('');
$('#form_download .download_format').append('<option value="0">Format original</option>');
$.each(result.formats, function (index, format) {
$('#form_download .download_format').append('<option value="' + format.id + '">Vignette ' + format.extension + ' ' + format.libelle.toUpperCase() + ' (' + format.largeur + 'px)</option>');
}); // ajout du total à la racine
var total = result.count;
@ -12256,14 +12571,14 @@ function loadMedia(dossier_id, sujet_id) {
case 1:
ico = '<i class="fas fa-file-image"></i>';
detail = " - " + item.largeur + "x" + item.hauteur + "px";
thumb = item.source.split('.')[0] + "_thumb." + item.extension;
preview = item.source.split('.')[0] + "_preview." + item.extension;
thumb = item.folder + item.uid + "_thumb." + item.extension;
preview = item.folder + item.uid + "_preview." + item.extension;
break;
case 2:
ico = '<i class="fas fa-file-image"></i>';
thumb = item.source;
preview = item.source;
thumb = item.folder + item.uid + "." + item.extension;
preview = item.folder + item.uid + "." + item.extension;
break;
case 3:
@ -12282,8 +12597,8 @@ function loadMedia(dossier_id, sujet_id) {
ico = '<i class="fas fa-file"></i>';
if (item.extension == "pdf" || item.extension == "ai" || item.extension == "psd") {
thumb = item.source.split('.')[0] + "_thumb.png";
preview = item.source.split('.')[0] + "_preview.png";
thumb = item.folder + item.uid + "_thumb.png";
preview = item.folder + item.uid + "_preview.png";
} else {
itemClass = "doc";
}
@ -12293,7 +12608,7 @@ function loadMedia(dossier_id, sujet_id) {
default:
}
output += '<div class="imageItem" data-id="' + item.id + '" data-ext="' + item.extension + '" data-typemedia="' + item.typemedia_id + '" data-preview="' + preview + '" data-src="' + item.source + '" draggable="' + draggable + '" aria-grabbed="false">';
output += '<div class="imageItem" data-id="' + item.id + '" data-ext="' + item.extension + '" data-typemedia="' + item.typemedia_id + '" data-preview="' + preview + '" data-src="' + item.folder + item.uid + "." + item.extension + '" draggable="' + draggable + '" aria-grabbed="false">';
output += '<div class="etiquette" style="background-color:' + item.etiquette.color + '; border-color:' + item.etiquette.color + ';" data-id="' + item.etiquette.etiquette_id + '" >' + item.etiquette.libelle + '</div>';
output += '<div class="contextMenu"><ul>';
output += '<li class="menu-option editItem"><i class="fas fa-edit"></i> Editer</li>';
@ -12345,7 +12660,7 @@ function removeMedias(medias) {
medias: medias
},
success: function success(result) {
$.each(medias, function (index, value) {
$.each(result, function (index, value) {
$(".media_container .imageItem[data-id='" + value + "']").remove();
}); // ---- MAJ du nb de média dans le dossier
@ -12357,7 +12672,26 @@ function removeMedias(medias) {
var count = $(".folder_container .dd3-item[data-id='" + currentFolder + "'] > .dd3-content .count");
}
count.html(parseInt(count.html()) - medias.length);
count.html(parseInt(count.html()) - result.length);
if (result.length != medias.length) {
$.fancybox.close();
console.log(medias.length);
if (medias.length == 1) {
$.fancyMessage({
title: "Attention",
message: "Ce média est lié à Arcadia. Suppression refusée. ",
type: "error"
});
} else {
$.fancyMessage({
title: "Attention",
message: "Votre sélection contient des médias liés à Arcadia. Ces médias ne seront pas supprimés.",
type: "info"
});
}
}
},
error: function error(jqXHR, textStatus, errorThrown) {
$.fancybox.close();

View file

@ -1,3 +0,0 @@
<?php
phpinfo();
?>

View file

@ -132,7 +132,7 @@ window.initSelector = function($selector){
$($selector+" .selector_dataValues").val(datavalue.join());
// Recherche d'un élément
$($selector+" .selector_filter").on('keyup', function(event) {
$($selector+" .selector_filter").off().on('keyup', function(event) {
var options = $(this).parent($selector).find(".selector_choices li");
var search = $(this).val();
$(options).each(function() {
@ -146,7 +146,7 @@ window.initSelector = function($selector){
});
// Ajout d'un élément
$($selector+" .selector_choices" ).on( "click", "li", function() {
$($selector+" .selector_choices" ).off().on( "click", "li", function() {
if(!$(this).hasClass('selected')){
var id = $(this).attr("data-value");
var text = $(this).html();
@ -157,7 +157,7 @@ window.initSelector = function($selector){
}
});
// Suppression d'un élément
$($selector+" .selector_values" ).on( "click", "li", function() {
$($selector+" .selector_values" ).off().on( "click", "li", function() {
var id = $(this).attr("data-value");
var text = $(this).html();
$(this).parent().parent().find('.selector_choices li[data-value="'+id+'"]').removeClass('selected');

458
resources/js/media.js vendored
View file

@ -371,6 +371,13 @@ $(document).ready(function() {
}
});
// ---- Restreint le Drag aux images
$("html").on("dragstart", function(event) {
if(!$(event.target).hasClass('imageItem')){
return false;
}
});
// ---- déselectionne les éléments si on clique en dehors
$(".main_content .media_container").on("click", function(event) {
if (event.target !== this) return;
@ -397,6 +404,19 @@ $(document).ready(function() {
if($target.hasClass('editItem')){ // Editer un média
$(this).dblclick();
}else if ($target.hasClass('downloadItem')) { // Télécharger le média
var medias = [];
medias.push($(this).attr("data-id"));
$("#form_download").fancybox({
type : 'inline',
opts : {
animationDuration : 350,
animationEffect : 'material',
},
beforeShow : function() {
$("#form_download .medias").val(medias.join());
}
}).trigger("click");
}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')]);
@ -534,68 +554,90 @@ $(document).ready(function() {
$("#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
$(".tab_preview").html('<div id="openseadragon" ></div>');
$("#openseadragon").css('width', '100%');
$("#openseadragon").css('height', minHeight);
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: imgPreview,
}
});
if($(this).attr('data-ext') == 'gif'){
// charge le gif
$(".tab_preview").html('<img class="svgElt" src=""/>');
$(".tab_preview img").attr("src", $(this).attr('data-src'));
}else{
// charge l'image de preview
$(".tab_preview").html('<div id="openseadragon" ></div>');
$("#openseadragon").css('width', '100%');
$("#openseadragon").css('height', minHeight);
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: imgPreview,
}
});
}
// charge l'image pour la retouche
$("#form_media .tab_retouch").html('<img id="drTarget" src="" >');
$("#drTarget").attr("src", $(this).attr('data-src'));
drPlugin = new Darkroom('#drTarget', {
minWidth: 200,
minHeight: 200,
maxWidth: minWidth,
maxHeight: minHeight,
plugins: {
save: {
callback: function() {
// récupère la nouvelle image
var newImage = this.darkroom.sourceCanvas.toDataURL();
// sauvegarde de l'image en base
$.ajax({
url: '/ajax/edit-photo',
method: 'POST',
dataType : 'json',
data: {
media_id: $(window).data('current_edit_media'),
image : newImage
},
success: function(result){
// MAJ de l'aperçu
viewer.destroy(); viewer = null;
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: newImage,
if($(this).attr('data-ext') == 'gif'){
// masque l'onglet retouche
$("#form_media .form_media_retouch").hide();
}else{
// charge l'image pour la retouche
$("#form_media .tab_retouch").html('<img id="drTarget" src="" >');
$("#drTarget").attr("src", $(this).attr('data-src'));
drPlugin = new Darkroom('#drTarget', {
minWidth: 200,
minHeight: 200,
maxWidth: minWidth,
maxHeight: minHeight,
plugins: {
save: {
callback: function() {
var dr = this.darkroom;
$.fancyConfirm({
title : "Retouche de l\'image",
message : "Êtes-vous sûr de vouloir modifier cette image ? (cette opération sera irréversible)",
okButton : 'Modifier l\'image',
noButton : 'Annuler',
callback : function (value) {
if (value) {
// récupère la nouvelle image
var newImage = dr.sourceCanvas.toDataURL();
// sauvegarde de l'image en base
$.ajax({
url: '/ajax/edit-photo',
method: 'POST',
dataType : 'json',
data: {
media_id: $(window).data('current_edit_media'),
image : newImage
},
success: function(result){
// MAJ de l'aperçu
viewer.destroy(); viewer = null;
viewer = OpenSeadragon({
id: "openseadragon",
tileSources: {
type: "image",
url: newImage,
}
});
// MAJ du visuel dans la Liste
var mediaId = $(window).data('current_edit_media')
var $media = $(".media_container .imageItem[data-id='"+mediaId+"'] .media");
var mediaBg = $media.css('background-image', 'url('+result.folder+result.uid+"."+result.extension+'?t='+ new Date().getTime()+')');
},
error: function(jqXHR, textStatus, errorThrown) {
$.fancybox.close();
$.fancyMessage({title : "Attention", message : "Erreur lors de la sauvegarde de l'image, merci d'actualiser la page.", type : "error"});
}
});
}
});
// MAJ du visuel dans la Liste
var mediaId = $(window).data('current_edit_media')
var $media = $(".media_container .imageItem[data-id='"+mediaId+"'] .media");
var mediaBg = $media.css('background-image', 'url('+result.source+ new Date().getTime()+')');
}
});
}
},
}
});
}
},
error: function(jqXHR, textStatus, errorThrown) {
$.fancybox.close();
$.fancyMessage({title : "Attention", message : "Erreur lors de la sauvegarde de l'image, merci d'actualiser la page.", type : "error"});
}
});
}
},
}
});
}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
@ -660,22 +702,48 @@ $(document).ready(function() {
// 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 #sujetLibelle").val(result.data.sujet.libelle);
$(".tab_edit #typevues").val(result.data.typevue_id);
$(".tab_edit #variantes option").each(function(){
if($(this).attr('data-typevue')== result.data.typevue_id){
$(this).show();
}else{
$(this).hide();
}
});
$(".tab_edit #typemedias").val(result.data.typemedia_id);
//$(".tab_edit #variantes").val(result.data.etiquette_id);
$(".tab_edit #variantes").val(result.data.variante_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 #created_by").val(result.data.owner.firstname+" "+result.data.owner.lastname);
$(".tab_edit #updated_at").val(result.data.updated_at);
$(".tab_edit #published_at").val(result.data.published_at);
// liste des produits liés
$(".tab_edit #statut").val(result.data.statut);
// articles lié
$(".tab_edit .article_selector table tbody").html('');
$(".tab_edit #articles").val('');
var elems = [];
$.each(result.data.articles, function (index, article) {
$articleItem = $(".tab_edit .hidden_row tr").clone();
$articleItem.find('.col_lib').html(article.noArt+" : "+article.libCcial);
$articleItem.find('.col_famVente').html(article.codFamVte+" : "+article.libFamVte);
$articleItem.find('.col_marque').html(article.codMarq+" : "+article.libMarq);
$articleItem.find('.col_gencodAdm').html(article.codGencodAdm);
$articleItem.find('.col_gencodSymb').html(article.codGencodSymb);
$articleItem.find('.col_gencodPds').html(article.codGencodPds);
$articleItem.find('.remove_article').attr('data-id', article.id);
$(".tab_edit .article_selector table tbody").append($articleItem);
elems.push(article.id);
});
$(".tab_edit #articles").val(elems.join());
// marque lié
$(".tab_edit .selector_marques .selector_values").html('');
$.each(result.data.marques, function (index, marque) {
$(".tab_edit .selector_marques .selector_values").append('<li data-value="'+marque.COD_MARQUE+'" >'+marque.LIBELLE+'</li>');
$(".tab_edit .selector_marques .selector_values").append('<li data-value="'+marque.codMarq+'" >'+marque.libMarq+'</li>');
});
initSelector(".selector_marques");
@ -700,20 +768,32 @@ $(document).ready(function() {
$(".tab_edit #hauteur_mm").val(result.data.hauteur_mm);
// Config de la fiche d'édition
var sujetId = $("#sujet_selector").val();
if(result.data.sujet.sujet_arcadia == 0){
$(".tab_edit .arcadia_fields").hide();
}else{
$(".tab_edit .arcadia_fields").show();
}
$(".tab_edit .article_form, .tab_edit .marque_form, .tab_edit .site_form").hide();
switch (sujetId) {
case '1': // Visuel Article
switch (result.data.sujet_id) {
case 1: // Visuel Article
$(".tab_edit .article_form").show();
break;
case '2': // Marque
case 2: // Marque
$(".tab_edit .marque_form").show();
break;
case '3': // Sociétés
case 4: // Sociétés
$(".tab_edit .site_form").show();
break;
default:
}
// Config de la liste des vignettes
$(".tab_links .table_links tbody").html('');
$.each(result.vignettes, function (index, vignette) {
$linkItem = $(".tab_links .row_copy_hidden table tr").clone();
$linkItem.find('.link_libelle').html(vignette.libelle+" "+vignette.extension+" "+vignette.resolution);
$linkItem.find('.link_input input').val(vignette.url);
$(".tab_links .table_links tbody").append($linkItem);
});
// affiche la popin
$("#form_media").fadeIn('fast');
@ -758,6 +838,101 @@ $(document).ready(function() {
}
});
// ---- Copie d'un lien dans le clipboard
$('.tab_links').on('click', '.fa-copy', function(event){
$(this).prev().select();
document.execCommand("copy");
});
// ---- Bouton Arcadia
$('.tab_edit .btn-arcadia-link').on('click', function(event){
event.preventDefault();
var arcadia_id = $("#arcadia_id").val();
arcadia_id = prompt("Indiquez le code Arcadia de ce média", arcadia_id);
$.ajax({
url: '/ajax/set-id-arcadia',
method: 'POST',
dataType : 'json',
data: {
arcadia_id: arcadia_id,
media_id : $(window).data('current_edit_media'),
},
success: function(result){
if(result == true){
$.fancybox.close();
$.fancyMessage({title : "Lier un média à Arcadia", message : "Le code Arcadia a bien été ajouté au média", type : "info"});
$("#arcadia_id").val(arcadia_id);
}else{
$.fancybox.close();
$.fancyMessage({title : "Attention", message : "Erreur lors de l'opération, merci d'actualiser la page.", type : "error"});
}
},
error: function(jqXHR, textStatus, errorThrown) {
$.fancybox.close();
$.fancyMessage({title : "Attention", message : "Erreur lors de l'opération, merci d'actualiser la page.", type : "error"});
}
});
});
// ---- Bouton de suppression d'un article
$('.tab_edit .article_selector').on('click', ".remove_article", function(event){
event.preventDefault();
var elems = $(".tab_edit #articles").val().split(',');
var id = $(this).attr('data-id');
var index = elems.indexOf(id);
elems = jQuery.grep(elems, function(value) {
return value != id;
});
$(".tab_edit #articles").val(elems.join());
$(this).parents("tr").remove();
});
// ---- Bouton d'ajout d'un article à un média
$('.tab_edit .add_article').on('click', function(event){
event.preventDefault();
var arcadia_id = prompt("Indiquez le code Arcadia de l'article.", arcadia_id);
$.ajax({
url: '/ajax/get-article',
method: 'POST',
dataType : 'json',
data: {
arcadia_id: arcadia_id,
},
success: function(result){
if(result){
var article = result.article;
var elems = $(".tab_edit #articles").val().split(',');
if(jQuery.inArray(article.id, elems) == -1){
// maj de la valeur du champ hidden
elems.push(article.id);
$(".tab_edit #articles").val(elems.join());
// maj du tableau html
$articleItem = $(".tab_edit .hidden_row tr").clone();
$articleItem.find('.col_lib').html(article.noArt+" : "+article.libCcial);
$articleItem.find('.col_famVente').html(article.codFamVte+" : "+article.libFamVte);
$articleItem.find('.col_marque').html(article.codMarq+" : "+article.libMarq);
$articleItem.find('.col_gencodAdm').html(article.codGencodAdm);
$articleItem.find('.col_gencodSymb').html(article.codGencodSymb);
$articleItem.find('.col_gencodPds').html(article.codGencodPds);
$articleItem.find('.remove_article').attr('data-id', article.id);
$(".tab_edit .article_selector table tbody").append($articleItem);
}else{
$.fancyMessage({title : "Impossible d'ajouter l'article", message : "Cet article est déjà présent dans la liste.", type : "error"});
}
}else{
$.fancyMessage({title : "Impossible d'ajouter l'article", message : "La référence de cet article n'a pas été trouvé.", type : "error"});
}
},
error: function(jqXHR, textStatus, errorThrown) {
$.fancyMessage({title : "Attention", message : "Erreur lors de l'opération, merci d'actualiser la page.", type : "error"});
}
});
});
// ---- Suppression de média en masse
$('.action_delete_media').on('click',function(event){
event.preventDefault();
@ -811,6 +986,49 @@ $(document).ready(function() {
});
// ---- Popup pour télécharger des médias en masse
$('.action_download_media, .form_media_download').on('click',function(event){
event.preventDefault();
var medias = [];
if($(this).hasClass('form_media_download')){
medias.push($(window).data('current_edit_media'));
}else{
$('.media_container .imageItem').each(function (index) {
if( $(this ).attr("aria-grabbed") == "true" ){
medias.push($(this ).attr("data-id"));
}
});
}
if(medias.length == 0){
$.fancyMessage({title : "Télécharger des médias", message : "Veuillez sélectionner au moins un média.", type : "info"});
}else{
$("#form_download").fancybox({
type : 'inline',
opts : {
animationDuration : 350,
animationEffect : 'material',
},
beforeShow : function() {
$("#form_download .medias").val(medias.join());
}
}).trigger("click");
}
});
// ---- Bouton pour lancer le téléchargement d'un ou plusieurs médias
$('#form_download .btn_form_download').on('click',function(event){
event.preventDefault();
$("#form_download #the_form_download").submit();
// ferme la popup
$.fancybox.close();
});
// ---- gestion des onglets de la popup d'édition
$("#form_media .tabbtn").on("click" , function(event) {
event.preventDefault();
@ -834,11 +1052,53 @@ $(document).ready(function() {
// ---- sauvegarde de la popup d'édition
$(".btn_tab_edit_save").on("click" , function(event) {
// recupère les tags
$('#tag-editor').tagEditor('getTags')[0].tags
// ferme la popin
//$(".form_media_close, .btn_tab_edit_cancel").trigger('click');
if(!$(".form_edit_media")[0].checkValidity()){
$.fancyMessage({title : "Sauvegarde d'un média", message : "Le formulaire a mal été renseigné. merci de corriger.", type : "error"});
}
var media = {
id : $(window).data('current_edit_media'),
libelle : $(".tab_edit #libelle").val(),
typevue_id : $(".tab_edit #typevues").val(),
variante_id : $(".tab_edit #variantes").val(),
langue_id : $(".tab_edit #langues").val(),
commentaire : $(".tab_edit #commentaire").val(),
version : $(".tab_edit #version").val(),
statut : $(".tab_edit #statut").val(),
copyright_id : $(".tab_edit #copyrights").val(),
etiquette_id : $(".tab_edit #etiquettes").val(),
tags : $('#tag-editor').tagEditor('getTags')[0].tags,
sites : $(".tab_edit .selector_sites .selector_dataValues").val(),
marques : $(".tab_edit .selector_marques .selector_dataValues").val(),
articles : $(".tab_edit #articles").val(),
}
$.ajax({
url: '/ajax/save-media',
method: 'POST',
dataType : 'json',
data: {
media : media,
},
success: function(result){
$.fancyMessage({title : "Sauvegarde d'un média", message : "Les données ont bien été enregistrées", type : "info"});
},
error: function(jqXHR, textStatus, errorThrown) {
$.fancyMessage({title : "Sauvegarde d'un média", message : "Erreur lors de l'enregistrement. Merci d'actualiser la page.", type : "error"});
}
});
});
// ---- Chargement de la liste des vairantes lors du changement de type de vue
$(".tab_edit #typevues").on("change" , function(event) {
var typevue_id = $(this).val();
$(".tab_edit #variantes option").each(function(){
if($(this).attr('data-typevue')== typevue_id){
$(this).show();
}else{
$(this).hide();
}
});
});
/******************************
@ -888,16 +1148,26 @@ $(document).ready(function() {
});
var currentfiles = [];
var maxFiles = 20;
var counter = 0;
$('#fileupload').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"});
@ -967,6 +1237,7 @@ $(document).ready(function() {
},
stop: function (e,) {
$(".files").html("");
counter = 0;
currentfiles = [];
$('#progress .progress-bar').css('width', '0%');
$('#progress').hide();
@ -1020,7 +1291,22 @@ function initFolderManager(sujetId){
var typevues = result.typevues;
$("#typevues").find('option').remove();
$.each(typevues, function (index, typevue) {
$("#typevues").append('<option value="'+typevue.CODE_TYPEVUE+'">'+typevue.LIBELLE+'</option>')
$("#typevues").append('<option value="'+typevue.codeTypevue+'">'+typevue.libelle+'</option>')
});
// initialisation de la liste variantes
var variantes = result.variantes;
$("#variantes").find('option').remove();
$.each(variantes, function (index, variante) {
$("#variantes").append('<option value="'+variante.codeVariante+'" data-typevue="'+variante.typevue_id+'" >'+variante.libelle+'</option>')
});
// initialisation des formats de vignette disponibles autéléchargement
$(window).data('formats', result.formats);
$('#form_download .download_format').html('');
$('#form_download .download_format').append('<option value="0">Format original</option>');
$.each(result.formats, function (index, format) {
$('#form_download .download_format').append('<option value="'+format.id+'">Vignette '+format.extension+' '+format.libelle.toUpperCase()+' ('+format.largeur+'px)</option>');
});
// ajout du total à la racine
@ -1133,13 +1419,13 @@ function loadMedia(dossier_id, sujet_id){
case 1:
ico = '<i class="fas fa-file-image"></i>';
detail = " - "+item.largeur+"x"+item.hauteur+"px";
thumb = item.source.split('.')[0]+"_thumb."+item.extension;
preview = item.source.split('.')[0]+"_preview."+item.extension;
thumb = item.folder+item.uid+"_thumb."+item.extension;
preview = item.folder+item.uid+"_preview."+item.extension;
break;
case 2:
ico = '<i class="fas fa-file-image"></i>';
thumb = item.source;
preview = item.source;
thumb = item.folder+item.uid+"."+item.extension;
preview = item.folder+item.uid+"."+item.extension;
break;
case 3:
ico = '<i class="fas fa-file-video"></i>';
@ -1154,8 +1440,8 @@ function loadMedia(dossier_id, sujet_id){
case 5:
ico = '<i class="fas fa-file"></i>';
if(item.extension == "pdf" || item.extension == "ai" || item.extension == "psd"){
thumb = item.source.split('.')[0]+"_thumb.png";
preview = item.source.split('.')[0]+"_preview.png";
thumb = item.folder+item.uid+"_thumb.png";
preview = item.folder+item.uid+"_preview.png";
}else{
itemClass = "doc";
}
@ -1164,7 +1450,7 @@ function loadMedia(dossier_id, sujet_id){
}
output += '<div class="imageItem" data-id="'+item.id+'" data-ext="'+item.extension+'" data-typemedia="'+item.typemedia_id+'" data-preview="'+preview+'" data-src="'+ item.source+'" draggable="'+draggable+'" aria-grabbed="false">';
output += '<div class="imageItem" data-id="'+item.id+'" data-ext="'+item.extension+'" data-typemedia="'+item.typemedia_id+'" data-preview="'+preview+'" data-src="'+item.folder+item.uid+"."+item.extension+'" draggable="'+draggable+'" aria-grabbed="false">';
output += '<div class="etiquette" style="background-color:'+item.etiquette.color+'; border-color:'+item.etiquette.color+';" data-id="'+item.etiquette.etiquette_id+'" >'+item.etiquette.libelle+'</div>';
output += '<div class="contextMenu"><ul>';
output += '<li class="menu-option editItem"><i class="fas fa-edit"></i> Editer</li>';
@ -1212,7 +1498,7 @@ function removeMedias(medias){
medias: medias
},
success: function(result){
$.each(medias, function (index, value) {
$.each(result, function (index, value) {
$(".media_container .imageItem[data-id='"+value+"']").remove();
});
@ -1223,7 +1509,17 @@ function removeMedias(medias){
}else{
var count = $(".folder_container .dd3-item[data-id='"+currentFolder+"'] > .dd3-content .count");
}
count.html(parseInt(count.html())-medias.length);
count.html(parseInt(count.html())-result.length);
if(result.length != medias.length){
$.fancybox.close();
console.log(medias.length);
if(medias.length == 1){
$.fancyMessage({title : "Attention", message : "Ce média est lié à Arcadia. Suppression refusée. ", type : "error"});
}else{
$.fancyMessage({title : "Attention", message : "Votre sélection contient des médias liés à Arcadia. Ces médias ne seront pas supprimés.", type : "info"});
}
}
},
error: function(jqXHR, textStatus, errorThrown) {
$.fancybox.close();

View file

@ -310,7 +310,27 @@
}
}
}
}
#form_download{
padding: 30px;
min-width: 300px;
h3{
font-size: 14px;
margin-bottom: 12px;
font-weight: bold;
color: $white;
}
hr{
color: #24272e;
border-bottom: 1px solid #2c2f36;
margin-bottom: 20px;
}
p{
margin-bottom: 40px;
}
}
/******************************************

View file

@ -7,7 +7,7 @@ p{
margin-bottom: 10px;
}
input[type="text"], input[type="password"], , input[type="email"], input[type="url"], select{
input[type="text"], input[type="number"], input[type="password"], , input[type="email"], input[type="url"], select{
border-radius: 3px;
padding: 5px 10px;
border: none;

View file

@ -99,6 +99,7 @@
}
select{
padding: 5px 0px;
color: $grey;
}
}
}
@ -503,7 +504,7 @@
height: 100%;
background-color: $grey3;
position: absolute;
z-index: 999999999999;
z-index: 99990;
left: 0;
top: 0;
@ -529,6 +530,7 @@
font-size: 18px;
position: relative;
padding: 12px;
border: none;
&:after{
content: '';
@ -555,6 +557,18 @@
z-index: 1;
}
}
.form_media_download{
float: right;
font-size: 18px;
position: relative;
padding: 12px;
border: none;
&:hover{
background-color: transparent;
color: $white;
}
}
}
.main_content{
height: calc(100% - 43px);
@ -602,6 +616,9 @@
padding: 8px 50px;
text-align: right;
background-color: $lightdark;
a{
display: inline-block;
}
}
.cloud_tag_plugin{
position: relative;
@ -675,6 +692,12 @@
.row_xl{
width: 100%;
}
.article_selector{
.remove_article{
color: $grey2;
}
}
}
}

View file

@ -41,7 +41,6 @@ body {
color: $grey2;
background-size: 6.10px 5.30px;
height: 100%;
overflow: hidden;
}
ol, ul {
list-style: none;

View file

@ -51,7 +51,7 @@
</div>
<div class="form-field">
{!! Form::label("", "") !!}
{!! Form::select('sujet', $sujets->pluck('LIBELLE', 'CODE_SUJET')) !!}
{!! Form::select('sujet', $sujets->pluck('libelle', 'codeSujet')) !!}
</div>
<div class="form-section">
@ -64,7 +64,7 @@
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</li>
<li data-value="{{$marque->codMarq}}" >{{$marque->libMarq}}</li>
@endforeach
</ul>
<ul class="selector_values" >

View file

@ -51,7 +51,7 @@
</div>
<div class="form-field">
{!! Form::label("", "") !!}
{!! Form::select('sujet', $sujets->pluck('LIBELLE', 'CODE_SUJET'), $dossier->sujet_id) !!}
{!! Form::select('sujet', $sujets->pluck('libelle', 'codeSujet'), $dossier->sujet_id) !!}
</div>
<div class="form-section">
{!! Form::label('marques', 'Marques associées') !!}
@ -63,12 +63,12 @@
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</li>
<li data-value="{{$marque->codMarq}}" >{{$marque->libMarq}}</li>
@endforeach
</ul>
<ul class="selector_values" >
@foreach ($dossierMarques as $dossierMarque)
<li data-value="{{$dossierMarque->COD_MARQUE}}" >{{$dossierMarque->LIBELLE}}</li>
<li data-value="{{$dossierMarque->codMarq}}" >{{$dossierMarque->libMarq}}</li>
@endforeach
</ul>
<input class="selector_dataValues" type="hidden" name="marques" value="">

View file

@ -17,7 +17,7 @@
<select class="filter_sujet" >
<option value="0">Filtrer par sujet</option>
@foreach ($sujets as $sujet)
<option value="{{$sujet->CODE_SUJET}}">{{$sujet->LIBELLE}}</option>
<option value="{{$sujet->codeSujet}}">{{$sujet->libelle}}</option>
@endforeach
</select>
<a href="#" class=" btn btn-black filter_sujet_btn">Ok</a>
@ -37,10 +37,10 @@
</tr>
</thead>
@foreach ($dossiers as $dossier)
<tr class="data_row" attr-sujet="{{ $dossier->sujet->CODE_SUJET}}">
<tr class="data_row" attr-sujet="{{ $dossier->sujet->codeSujet}}">
<td><a href="{{ route('dossier.edit', $dossier) }}">{{ $dossier->libelle }}</a></td>
<td>{{ $dossier->sujet->LIBELLE }}</td>
<td>{{ $dossier->marques->implode('LIBELLE', ', ') }}</td>
<td>{{ $dossier->sujet->libelle }}</td>
<td>{{ $dossier->marques->implode('libMarq', ', ') }}</td>
</tr>
@endforeach
<tfoot>

View file

@ -0,0 +1,19 @@
@extends('layouts.app')
@section('content')
<div class="login_container animated fadeIn">
<div class="col">
<img src="{!! asset('images/ldc-logo.png') !!}" alt="">
<h2>Gestion des médias</h2>
</div>
<div class="col">
<form method="POST" action="{{ route('login') }}">
@csrf
<h1>Maintenance </h1>
<p>l'application est actuellement en maintenance. merci de revenir ultèrieurement.</p>
</form>
</div>
</div>
@endsection

View file

@ -8,7 +8,7 @@
<form class="input_search" action="{{ route('media_manager') }}" method="get">
<div class="select_container"><select name="t" >
@foreach ($sujets as $sujet)
<option value="{{$sujet->CODE_SUJET}}" >{{$sujet->LIBELLE}}</option>
<option value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</option>
@endforeach
</select></div>
<input type="text" name="s" value="" autofocus placeholder="Rechercher un média...">

View file

@ -6,7 +6,9 @@
<a href="#" class="tabbtn form_media_retouch" data-tab="2">Retouche</a>
<a href="#" class="tabbtn form_media_links" data-tab="3">Vignettes</a>
<a href="#" class="tabbtn form_media_history" data-tab="4">Historique</a>
<a href="#" class="form_media_close"><i class="fal fa-times"></i></a>
<a href="#" class="form_media_download" title="Télécharger ce média"><i class="fas fa-arrow-circle-down"></i></a>
</header>
<div class="main_content">
<div class="tab tab_preview active"></div>
@ -14,64 +16,83 @@
<div class="tab_content">
<div class="wrapper">
<h3>Informations générales</h3>
<div class="row">
<label for="arcadia_id">Code Arcadia</label>
<input type="text" value="" id="arcadia_id" name="arcadia_id" @if (!Auth::user()->hasRole(config('roles.const.ADMIN'))) disabled @endif >
</div>
<div class="row">
<label for="libelle">Intitulé <span>*</span></label>
<input type="text" value="" id="libelle" name="libelle" required >
</div>
<div class="row">
<label for="typesujet">Type de sujet</label>
<input id="sujetLibelle" type="text" value="" name="sujetLibelle" disabled >
</div>
<div class="row">
<label for="typevues">Type de vue</label>
<select id="typevues" name="typevues"></select>
</div>
<div class="row">
<label for="typemedias">Type de média</label>
<select id="typemedias" name="typemedias" disabled>
@foreach ($typemedias as $typemedia)
<option value="{{$typemedia->CODE_TYPEMEDIA}}" >{{$typemedia->LIBELLE}}</option>
@endforeach
</select>
</div>
<div class="row">
<label for="variantes">Type de variante</label>
<select id="variantes" name="variantes"></select>
</div>
<div class="row">
<label for="langues">Langue</label>
<select id="langues" name="langues">
@foreach ($langues as $langue)
<option value="{{$langue->langue_id}}" >{{$langue->libelle}}</option>
@endforeach
</select>
</div>
<div class="row">
<label for="commentaire">Commentaire</label>
<textarea id="commentaire" name="commentaire" ></textarea>
</div>
<div class="row">
<label for="version">Version</label>
<input type="text" id="version" name="version" disabled >
</div>
<div class="row">
<label for="created_at">Date de création</label>
<input type="text" id="created_at" name="created_at" disabled >
</div>
<div class="row">
<label for="updated_at">Date de modification</label>
<input type="text" id="updated_at" name="updated_at" disabled >
</div>
<div class="row">
<label for="published_at">Date de publication</label>
<input type="text" id="published_at" name="published_at" disabled >
</div>
<form class="form_edit_media" action="#" method="post">
<div class="row arcadia_fields">
<label for="arcadia_id">Code Arcadia</label>
<div class="">
<input type="number" value="" id="arcadia_id" name="arcadia_id" readonly >
@if (Auth::user()->hasRole(config('roles.const.ADMIN')))
<button class="btn btn-square ml-10 btn-arcadia-link" type="button" name="button"><i class="far fa-link"></i> Lien avec Arcadia</button>
@endif
</div>
</div>
<div class="row">
<label for="libelle">Intitulé <span>*</span></label>
<input type="text" value="" id="libelle" name="libelle" required >
</div>
<div class="row">
<label for="typesujet">Sujet <span>*</span></label>
<input id="sujetLibelle" type="text" value="" name="sujetLibelle" readonly >
</div>
<div class="row">
<label for="typemedias">Type de média</label>
<select id="typemedias" name="typemedias" disabled >
@foreach ($typemedias as $typemedia)
<option value="{{$typemedia->codeTypemedia}}" >{{$typemedia->libelle}}</option>
@endforeach
</select>
</div>
<div class="row">
<label for="typevues">Type de vue</label>
<select id="typevues" name="typevues"></select>
</div>
<div class="row">
<label for="variantes">Type de variante</label>
<select id="variantes" name="variantes"></select>
</div>
<div class="row">
<label for="langues">Langue</label>
<select id="langues" name="langues">
@foreach ($langues as $langue)
<option value="{{$langue->langue_id}}" >{{$langue->libelle}}</option>
@endforeach
</select>
</div>
<div class="row">
<label for="commentaire">Commentaire</label>
<textarea id="commentaire" name="commentaire" ></textarea>
</div>
<div class="row">
<label for="version">Version <span>*</span></label>
<input type="number" id="version" name="version" required >
</div>
<div class="row">
<label for="created_at">Date de création</label>
<input type="text" id="created_at" name="created_at" readonly >
</div>
<div class="row">
<label for="published_at">Créé par</label>
<input type="text" id="created_by" name="created_by" readonly >
</div>
<div class="row">
<label for="updated_at">Date de modification</label>
<input type="text" id="updated_at" name="updated_at" readonly >
</div>
<div class="row">
<label for="published_at">Date de publication</label>
<input type="text" id="published_at" name="published_at" readonly >
</div>
<div class="row">
<label for="typevues">Statut</label>
<select id="statut" name="statut">
<option value="0">Brouillon</option>
<option value="1">Public</option>
<option value="2">Public étendu</option>
</select>
</div>
</form>
</div>
<div class="wrapper">
<div class="wrapper arcadia_fields">
<h3>Informations liées au sujet</h3>
<div class="row site_form dataform">
<label for="site">Site</label>
@ -96,7 +117,7 @@
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</li>
<li data-value="{{$marque->codMarq}}" >{{$marque->libMarq}}</li>
@endforeach
</ul>
<ul class="selector_values" >
@ -120,30 +141,26 @@
<th></th>
</tr>
</thead>
<tr>
<td>94073 : 2 QUICHE 3 FROM FAB.M FE 6X300G</td>
<td>188 : QUICHE - TOURTE - TARTE</td>
<td>44 : NEUTRE groupe LDC (produit pr gms)</td>
<td>3366760035766</td>
<td></td>
<td></td>
<td><i class="far fa-times"></i></td>
</tr>
<tr>
<td>94073 : 2 QUICHE 3 FROM FAB.M FE 6X300G</td>
<td>188 : QUICHE - TOURTE - TARTE</td>
<td>44 : NEUTRE groupe LDC (produit pr gms)</td>
<td>3366760035766</td>
<td></td>
<td></td>
<td><i class="far fa-times"></i></td>
</tr>
<tbody>
</tbody>
<tfoot>
<tr><td colspan="7"></td></tr>
</tfoot>
</table><br/>
<button class="btn btn-black btn-square floatr" type="button" name="button"><i class="far fa-plus"></i> Ajouter</button>
<button class="add_article btn btn-black btn-square floatr" type="button" name="button"><i class="far fa-plus"></i> Ajouter</button>
<input id="articles" type="hidden" name="articles" value="">
</div>
<table class="hidden_row" style="display:none;">
<tr>
<td class="col_lib"></td>
<td class="col_famVente"></td>
<td class="col_marque"></td>
<td class="col_gencodAdm"></td>
<td class="col_gencodSymb"></td>
<td class="col_gencodPds"></td>
<td><a href="#" class="remove_article" data-id=""><i class="far fa-times"></i></a></td>
</tr>
</table>
</div>
</div>
<div class="wrapper">
@ -167,7 +184,7 @@
<h3>Informations techniques</h3>
<div class="row">
<label for="extension">Extension</label>
<input type="text" id="extension" name="extension" disabled >
<input type="text" id="extension" name="extension" readonly >
</div>
<div class="row">
<label for="copyrights">Copyright</label>
@ -179,28 +196,31 @@
</div>
<div class="row">
<label for="largeur">Largeur</label>
<input type="text" id="largeur" name="largeur" disabled >
<input type="text" id="largeur" name="largeur" readonly >
</div>
<div class="row">
<label for="hauteur">Hauteur</label>
<input type="text" id="hauteur" name="hauteur" disabled >
<input type="text" id="hauteur" name="hauteur" readonly >
</div>
<div class="row">
<label for="resolution">Résolution</label>
<input type="text" id="resolution" name="resolution" disabled >
<input type="text" id="resolution" name="resolution" readonly >
</div>
<div class="row">
<label for="largeur_mm">Largeur en mm</label>
<input type="text" id="largeur_mm" name="largeur_mm" disabled >
<input type="text" id="largeur_mm" name="largeur_mm" readonly >
</div>
<div class="row">
<label for="hauteur_mm">Hauteur en mm</label>
<input type="text" id="hauteur_mm" name="hauteur_mm" disabled >
<input type="text" id="hauteur_mm" name="hauteur_mm" readonly >
</div>
</div>
</div>
<div class="button_bar">
<a href="#" class="btn btn-black mr-10 btn_tab_edit_cancel">Annuler</a> <button class="btn btn_tab_edit_save" type="button" name="button">Sauvegarder</button>
<a href="#" class="btn btn-black mr-10 btn_tab_edit_cancel">Fermer</a>
@if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]))
<button class="btn btn_tab_edit_save" type="button" name="button">Sauvegarder</button>
@endif
</div>
</div>
<div class="tab tab_retouch"></div>
@ -208,31 +228,15 @@
<div class="tab_content">
<div class="wrapper">
<h3>Liens vers les vignettes</h3>
<table>
<tr>
<th>FORMAT</th>
<th>URL</th>
</tr>
<tr>
<td>Format original jpg 2683 x 1958 px</td>
<td><input type="text" readonly value="https://dam.ldc.test/medias/5cf67c1be9343/63ab8f4d-4c6d-4c3f-b8d8-beacc9b0ad93_preview.jpg" name="" ><i class="fal fa-copy"></i></td>
</tr>
<tr>
<td>Format pré-généré jpg 1900 x 1387 px</td>
<td><input type="text" readonly value="https://dam.ldc.test/medias/5cf67c1be9343/63ab8f4d-4c6d-4c3f-b8d8-beacc9b0ad93_preview.jpg" name="" ><i class="fal fa-copy"></i></td>
</tr>
<tr>
<td>Format pré-généré jpg 607 x 443 px</td>
<td><input type="text" readonly value="https://dam.ldc.test/medias/5cf67c1be9343/63ab8f4d-4c6d-4c3f-b8d8-beacc9b0ad93_preview.jpg" name="" ><i class="fal fa-copy"></i></td>
</tr>
<tr>
<td>Format pré-généré jpg 224 x 163 px</td>
<td><input type="text" readonly value="https://dam.ldc.test/medias/5cf67c1be9343/63ab8f4d-4c6d-4c3f-b8d8-beacc9b0ad93_preview.jpg" name="" ><i class="fal fa-copy"></i></td>
</tr>
<tr>
<td>Format pré-généré jpg 112 x 82 px</td>
<td><input type="text" readonly value="https://dam.ldc.test/medias/5cf67c1be9343/63ab8f4d-4c6d-4c3f-b8d8-beacc9b0ad93_preview.jpg" name="" ><i class="fal fa-copy"></i></td>
</tr>
<table class="table_links">
<thead>
<tr>
<th>FORMAT</th>
<th>URL</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<td colspan="2">
@ -240,6 +244,14 @@
</tr>
</tfoot>
</table>
<div class="row_copy_hidden" style="display:none;">
<table>
<tr>
<td class="link_libelle"></td>
<td class="link_input"><input type="text" readonly value="" name="" ><i class="fal fa-copy" ></i></td>
</tr>
</table>
</div>
</div>
</div>
</div>

View file

@ -8,7 +8,7 @@
<h1><i class="fas fa-images"></i> Gestion des médias</h1>
<select id="sujet_selector" >
@foreach ($sujets as $sujet)
<option value="{{$sujet->CODE_SUJET}}" >{{$sujet->LIBELLE}}</option>
<option value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</option>
@endforeach
</select>
<input type="hidden" class="currentFolder" value="0">
@ -28,7 +28,7 @@
@endif
</ul>
</div>
<a href="#" class="root_folder" data-id="0">/racine <span class="count"></span></a>
<a href="#" ondragstart="return false;" class="root_folder" data-id="0">/racine <span class="count"></span></a>
<div class="dd">
<ol class="dd-list dd3-list root">
</ol>
@ -113,6 +113,18 @@
</ul>
</div>
<div id="form_download" style="display: none;" data-id="" >
<h3>Téléchargez</h3>
<hr/>
<p>Sélectionnez l'un des formats ci-dessous pour télécharger votre sélection.</p>
<form id="the_form_download" target="_blank" action="{{ route('downloadMedia') }}" method="post">
{{csrf_field()}}
<select class="download_format" name="format"></select>
<input class="medias" type="hidden" name="medias" value="">
<button type="submit" class="btn btn_form_download ml-10"><i class="fas fa-arrow-circle-down"></i> Télécharger</button>
</form>
</div>
<div class="upload_container">
<span class="fileinput-button">
<i class="fas fa-plus-circle"></i><span> Ajouter vos médias</span>

View file

@ -68,7 +68,7 @@
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</li>
<li data-value="{{$marque->codMarq}}" >{{$marque->libMarq}}</li>
@endforeach
</ul>
<ul class="selector_values" >
@ -88,7 +88,7 @@
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($sujets as $sujet)
<li data-value="{{$sujet->CODE_SUJET}}" >{{$sujet->LIBELLE}}</li>
<li data-value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</li>
@endforeach
</ul>
<ul class="selector_values" >

View file

@ -39,19 +39,19 @@
{!! Form::model($user, ['route' => ['user.update', $user], 'enctype' => 'multipart/form-data', 'class' => 'dataform']) !!}
@method('PUT')
<div class="form-field">
{!! Form::label('matricule', 'Matricule') !!}
{!! Form::label('matricule', 'Matricule *') !!}
{!! Form::text('matricule', $user->matricule, ['disabled']) !!}
</div>
<div class="form-field">
{!! Form::label('firstname', 'Prénom') !!}
{!! Form::label('firstname', 'Prénom *') !!}
{!! Form::text('firstname', $user->firstname, ['required']) !!}
</div>
<div class="form-field">
{!! Form::label('lastname', 'Nom') !!}
{!! Form::label('lastname', 'Nom *') !!}
{!! Form::text('lastname', $user->lastname, ['required']) !!}
</div>
<div class="form-field">
{!! Form::label('email', 'Email') !!}
{!! Form::label('email', 'Email *') !!}
{!! Form::email('email', $user->email, ['required']) !!}
</div>
<div class="form-section">
@ -71,12 +71,12 @@
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</li>
<li data-value="{{$marque->codMarq}}" >{{$marque->libMarq}}</li>
@endforeach
</ul>
<ul class="selector_values" >
@foreach ($userMarques as $userMarque)
<li data-value="{{$userMarque->COD_MARQUE}}" >{{$userMarque->LIBELLE}}</li>
<li data-value="{{$userMarque->codMarq}}" >{{$userMarque->libMarq}}</li>
@endforeach
</ul>
<input class="selector_dataValues" type="hidden" name="marques" value="">
@ -85,7 +85,7 @@
</div>
<div class="form-section">
{!! Form::label('sujets', 'Sujets disponibles') !!}
{!! Form::label('sujets', 'Sujets disponibles *') !!}
</div>
<div class="form-field">
{!! Form::label("", "") !!}
@ -94,12 +94,12 @@
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($sujets as $sujet)
<li data-value="{{$sujet->CODE_SUJET}}" >{{$sujet->LIBELLE}}</li>
<li data-value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</li>
@endforeach
</ul>
<ul class="selector_values" >
@foreach ($userSujets as $userSujet)
<li data-value="{{$userSujet->CODE_SUJET}}" >{{$userSujet->LIBELLE}}</li>
<li data-value="{{$userSujet->codeSujet}}" >{{$userSujet->libelle}}</li>
@endforeach
</ul>
<input class="selector_dataValues" type="hidden" name="sujets" value="">

View file

@ -42,7 +42,7 @@
{!! Form::label("", "") !!}
<select size="10" id="marques" name="marques" disabled>
@foreach ($marques as $marque)
<option value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</option>
<option value="{{$marque->codMarq}}" >{{$marque->libMarq}}</option>
@endforeach
<option selected="true" hidden ></option>
</select>
@ -55,7 +55,7 @@
{!! Form::label("", "") !!}
<select size="10" id="sujets" name="sujets" disabled>
@foreach ($sujets as $sujet)
<option value="{{$sujet->CODE_SUJET}}" >{{$sujet->LIBELLE}}</option>
<option value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</option>
@endforeach
<option selected="true" hidden ></option>
</select>

View file

@ -38,6 +38,9 @@ Route::group(['middleware' => ['auth']], function(){
Route::post('/ajax/save-media', 'MediaController@saveMedia');
Route::post('/ajax/apply-sticker', 'MediaController@applySticker');
Route::post('/ajax/edit-photo', 'MediaController@editPhoto');
Route::post('/ajax/set-id-arcadia', 'MediaController@setIdArcdadia');
Route::post('/ajax/get-article', 'MediaController@getArticle');
Route::post('/ajax/download-media', 'MediaController@downloadMedia')->name('downloadMedia');
// Ajax pour la gestion de l'upload de média
Route::post('/ajax/upload-media', 'UploadController@storeMedia');

3
storage/export_arcadia/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
*
!public/
!.gitignore