- Display Component

- Media Management
- Search
This commit is contained in:
Vincent BRIDIER 2020-07-09 17:36:42 +02:00
parent 1f3aa8c23a
commit ad1a380f62
35 changed files with 73107 additions and 3078 deletions

View file

@ -51,6 +51,7 @@ class reindexElasticMedia extends Command
// ---- index le media dans Elasticsearch
$media->addToIndex();
$bar->advance();
unset($media);
}
$bar->finish();
$this->line("");

View file

@ -2,6 +2,8 @@
namespace App\Http\Controllers;
use App\Models\Typevue;
use App\Models\Variante;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use App\Models\Sujet;
@ -55,4 +57,13 @@ class CommunController extends Controller
}
return json_encode(array('status' => "OK"));
}
public function getDatasBySujet(Request $request) {
$sujet_id = $request->sujet_id;
$response['typesvue'] = Typevue::where('sujet_id', $sujet_id)->get();
$response['typesvariantes'] = Variante::where('sujet_id', $sujet_id)->get();
return response()->json($response);
}
}

View file

@ -21,15 +21,15 @@ class DossierController extends Controller
*/
public function index()
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$dossiers = Dossier::whereNull('parent_id')->where('system', 0)
->get();
$sujets = Sujet::where('sujet_dam', 1)->get();
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$dossiers = Dossier::whereNull('parent_id')->where('system', 0)
->get();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.index')->with([
'dossiers'=> $dossiers,
'sujets'=> $sujets,
]);
return view('dossiers.index')->with([
'dossiers' => $dossiers,
'sujets' => $sujets,
]);
}
/**
@ -39,63 +39,63 @@ class DossierController extends Controller
*/
public function create()
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$marques = Marque::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.create')->with(['marques'=> $marques, 'sujets'=> $sujets]);
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$marques = Marque::all();
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.create')->with(['marques' => $marques, 'sujets' => $sujets]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$validatedData = $request->validate([
'libelle' => 'required',
'sujet' => 'required',
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$validatedData = $request->validate([
'libelle' => 'required',
'sujet' => 'required',
'status' => 'required'
]);
]);
$dossierExist = Dossier::where('libelle', $request->libelle)->where('sujet_id', $request->sujet)->first();
if($dossierExist){
session()->flash('error', "Ce nom de dossier est déjà présent dans l'application pour ce sujet. Ajout impossible.");
return redirect()->route('dossier.create');
}else{
// ---- Le dossier
$dossier = new Dossier();
$dossier->libelle = $request->libelle;
$dossier->description = $request->description;
$dossierExist = Dossier::where('libelle', $request->libelle)->where('sujet_id', $request->sujet)->first();
if ($dossierExist) {
session()->flash('error', "Ce nom de dossier est déjà présent dans l'application pour ce sujet. Ajout impossible.");
return redirect()->route('dossier.create');
} else {
// ---- Le dossier
$dossier = new Dossier();
$dossier->libelle = $request->libelle;
$dossier->description = $request->description;
$dossier->is_private = $request->status;
$dossier->sujet()->associate($request->sujet);
$dossier->sujet()->associate($request->sujet);
if ($dossier->save()){
if ($dossier->save()) {
// ---- Les marques
$sMarques = $request->marques;
if($sMarques != ""){
$marques = explode(",", $sMarques);
foreach($marques as $marqueId){
$dossier->marques()->attach($marqueId);
}
}
// ---- Les marques
$sMarques = $request->marques;
if ($sMarques != "") {
$marques = explode(",", $sMarques);
foreach ($marques as $marqueId) {
$dossier->marques()->attach($marqueId);
}
}
session()->flash('message', "Le dossier à été enregistré");
return redirect()->route('dossier.edit', ['dossier' => $dossier]);
}else{
session()->flash('error', "Une erreur s'est produite, ajout impossible");
return redirect()->route('dossier.create');
}
}
session()->flash('message', "Le dossier à été enregistré");
return redirect()->route('dossier.edit', ['dossier' => $dossier]);
} else {
session()->flash('error', "Une erreur s'est produite, ajout impossible");
return redirect()->route('dossier.create');
}
}
}
/**
* Display the specified resource.
*
* @param \App\Models\Dossier $dossier
* @param \App\Models\Dossier $dossier
* @return \Illuminate\Http\Response
*/
public function show(Dossier $dossier)
@ -106,316 +106,329 @@ class DossierController extends Controller
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Dossier $dossier
* @param \App\Models\Dossier $dossier
* @return \Illuminate\Http\Response
*/
public function edit(Dossier $dossier)
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$dossierMarques = $dossier->marques;
$marques = Marque::all();
$dossierSujets = $dossier->sujets;
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.edit')->with(['dossier'=> $dossier, 'dossierMarques' => $dossierMarques, 'marques' => $marques, 'sujets'=> $sujets]);
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$dossierMarques = $dossier->marques;
$marques = Marque::all();
$dossierSujets = $dossier->sujets;
$sujets = Sujet::where('sujet_dam', 1)->get();
return view('dossiers.edit')->with(['dossier' => $dossier, 'dossierMarques' => $dossierMarques, 'marques' => $marques, 'sujets' => $sujets]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Dossier $dossier
* @param \Illuminate\Http\Request $request
* @param \App\Models\Dossier $dossier
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Dossier $dossier)
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$validatedData = $request->validate([
'libelle' => 'required',
'sujet' => 'required',
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
$validatedData = $request->validate([
'libelle' => 'required',
'sujet' => 'required',
'status' => 'required'
]);
]);
$dossierExist = Dossier::where('libelle', $request->libelle)->where('sujet_id', $request->sujet)->where('id', '<>', $dossier->id)->first();
if($dossierExist){
session()->flash('error', "Ce nom de dossier est déjà présent dans l'application pour ce sujet. Ajout impossible.");
return redirect()->route('dossier.edit', ['dossier' => $dossier]);
}else{
// ---- Le dossier
$dossier->libelle = $request->libelle;
$dossier->description = $request->description;
$dossier->is_private = $request->status;
$dossier->sujet()->dissociate();
$dossier->sujet()->associate($request->sujet);
$dossierExist = Dossier::where('libelle', $request->libelle)->where('sujet_id', $request->sujet)->where('id', '<>', $dossier->id)->first();
if ($dossierExist) {
session()->flash('error', "Ce nom de dossier est déjà présent dans l'application pour ce sujet. Ajout impossible.");
return redirect()->route('dossier.edit', ['dossier' => $dossier]);
} else {
// ---- Le dossier
$dossier->libelle = $request->libelle;
$dossier->description = $request->description;
$dossier->is_private = $request->status;
$dossier->sujet()->dissociate();
$dossier->sujet()->associate($request->sujet);
if ($dossier->save()){
if ($dossier->save()) {
// ---- Les marques
$dossier->marques()->detach();
$sMarques = $request->marques;
if($sMarques != ""){
$marques = explode(",", $sMarques);
foreach($marques as $marqueId){
$dossier->marques()->attach($marqueId);
}
}
// ---- Les marques
$dossier->marques()->detach();
$sMarques = $request->marques;
if ($sMarques != "") {
$marques = explode(",", $sMarques);
foreach ($marques as $marqueId) {
$dossier->marques()->attach($marqueId);
}
}
session()->flash('message', "Le dossier à été mis à jour");
return redirect()->route('dossier.edit', ['dossier' => $dossier]);
}else{
session()->flash('error', "Une erreur s'est produite, enregistrement impossible");
return redirect()->route('dossier.edit');
}
}
session()->flash('message', "Le dossier à été mis à jour");
return redirect()->route('dossier.edit', ['dossier' => $dossier]);
} else {
session()->flash('error', "Une erreur s'est produite, enregistrement impossible");
return redirect()->route('dossier.edit');
}
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Dossier $dossier
* @param \App\Models\Dossier $dossier
* @return \Illuminate\Http\Response
*/
public function destroy(Dossier $dossier)
{
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
if ($dossier->delete()) {
return redirect(route('dossier.index'));
} else {
session()->flash('error', 'Erreur lors de la suppression');
return redirect()->route('dossier.edit', ['user' => $dossier]);
}
Auth::user()->authorizeRoles(config('roles.const.ADMIN'));
if ($dossier->delete()) {
return redirect(route('dossier.index'));
} else {
session()->flash('error', 'Erreur lors de la suppression');
return redirect()->route('dossier.edit', ['user' => $dossier]);
}
}
/**
* Chargement des dossiers
*
*/
public function loadFolder(Request $request)
{
$response = array();
$userId = Auth::user()->id;
$sujetId = $request->input('sujetId');
/**
* Chargement des dossiers
*
*/
public function loadFolder(Request $request)
{
$response = array();
$sujetId = $request->input('sujetId');
$dossierQuery = Dossier::where([
['sujet_id', $sujetId],
$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;
} else {
$response['draggable'] = false;
}
// Envoi du role
$response['role'] = Auth::user()->role;
return json_encode($response);
}
/**
* Ajouter un dossier
*
*/
public function addFolder(Request $request)
{
$response = array();
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$parent_id = $request->input('parent_id');
$libelle = $request->input('libelle');
$description = $request->input('description');
// ---- Le dossier
$dossier = new Dossier();
$dossier->libelle = htmlspecialchars($libelle);
$dossier->description = $description;
$dossier->parent_id = $parent_id;
$dossierParent = Dossier::where('id', $parent_id)->first();
if ($parent_id == 1 || $dossierParent->system == 1) { // dossier de dépôt
$dossier->system = 1;
} else {
$dossier->system = 0;
}
$dossier->sujet_id = $dossierParent->sujet_id;
$dossier->save();
$response['folder_id'] = $dossier->id;
$response['system'] = $dossier->system;
return json_encode($response);
}
/**
* Ajouter un dossier de dépôt
*
*/
public function addDepotFolder(Request $request)
{
$response = array();
$parent_id = $request->input('parent_id');
$libelle = $request->input('libelle');
$description = $request->input('description');
// ---- Le dossier
$dossier = new Dossier();
$dossier->libelle = htmlspecialchars($libelle);
$dossier->description = $description;
$dossier->parent_id = 1;
$dossier->system = 1;
$dossier->save();
$response['folder_id'] = $dossier->id;
return json_encode($response);
}
/**
* supprimer un dossier
*
*/
public function removeFolder(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$dossier_id = $request->input('dossier_id');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if ($dossier && !is_null($dossier->parent_id)) {
if ($dossier->delete()) {
return json_encode($dossier->parent_id);
}
}
return json_encode(false);
}
/**
* déplacer un dossier
*
*/
public function moveFolder(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$dossier_id = $request->input('dossier_id');
$parent_id = $request->input('parent_id');
$sujet_id = $request->input('sujet_id');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if ($dossier && !is_null($dossier->parent_id)) {
$dossier->parent_id = $parent_id;
if ($dossier->save()) {
Media::where('dossier_id', $dossier_id)->update(['sujet_id' => $sujet_id]);
return json_encode(true);
}
}
return json_encode(false);
}
/**
* renommer un dossier
*
*/
public function renameFolder(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$dossier_id = $request->input('dossier_id');
$libelle = $request->input('libelle');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if ($dossier && !is_null($dossier->parent_id)) {
$dossier->libelle = $libelle;
if ($dossier->save()) {
return json_encode(true);
}
}
return json_encode(false);
}
/**
* get propriétés d'un dossier
*
*/
public function getFolderProperty(Request $request)
{
$response = array();
$dossier_id = $request->input('dossier_id');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if ($dossier) {
$response["data"] = $dossier;
}
return json_encode($response);
}
/**
* enregistre les propriétés d'un dossier
*
*/
public function saveFolderProperty(Request $request)
{
$dossier_id = $request->input('dossier_id');
$libelle = $request->input('libelle');
$description = $request->input('description');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if ($dossier && !is_null($dossier->parent_id) && strlen($libelle) > 3) {
$dossier->libelle = $libelle;
$dossier->description = $description;
$dossier->save();
}
return json_encode(true);
}
/* TODO : VUEJS */
public function loadFolders(Request $request)
{
$folders = array();
$user = Auth::user();
$sujet_id = $request->sujet_id;
$dossierQuery = Dossier::where([
['sujet_id', $sujet_id],
['is_private', 0]
])
->whereNull('parent_id');
$dossierQuery = $dossierQuery->get();
->whereNull('parent_id');
$dossierQuery = $dossierQuery->get();
// On récupère les dossiers privés
if(Auth::user()->hasRole(config('roles.const.ADMIN')) ){
$privateQuery = Dossier::where('is_private', 1)->get();
}else{
$marques = Auth::user()->marques()->pluck("marque_id");
$privateQuery = Dossier::where('is_private', 1)->whereHas("marques", function($query) use ($marques){
// On récupère les dossiers privés
if ($user->hasRole(config('roles.const.ADMIN'))) {
$privateQuery = Dossier::where([
['is_private', '=', 1],
['sujet_id', '=', $sujet_id],
])->get();
} else {
$marques = $user->marques()->pluck("marque_id");
$privateQuery = Dossier::where([
['is_private', '=', 1],
['sujet_id', '=', $sujet_id],
])->whereHas("marques", function ($query) use ($marques) {
$query->whereIn("marque_id", $marques);
})->get();
}
$dossierQuery = $dossierQuery->merge($privateQuery);
$dossierQuery = $dossierQuery->sortBy('libelle', SORT_NATURAL | SORT_FLAG_CASE)->values();
$dossierQuery = $dossierQuery->sortBy('libelle', SORT_NATURAL|SORT_FLAG_CASE)->values();
// Ajout du dépôt de fichier pour les admin
if(Auth::user()->hasRole(config('roles.const.ADMIN')) ){
$depotQuery = Dossier::whereNull('parent_id')
->where('system', 1)
// Ajout du dépôt de fichier pour les admin
if ($user->hasRole(config('roles.const.ADMIN'))) {
$depotQuery = Dossier::whereNull('parent_id')
->where('system', 1)
->orderBy('libelle', 'ASC')
->get();
$response['data'] = $dossierQuery->merge($depotQuery);
}else{
$response['data'] = $dossierQuery;
}
->get();
$folders['data'] = $dossierQuery->merge($depotQuery);
} else {
$folders['data'] = $dossierQuery;
}
$folders['racineCount'] = Media::where('sujet_id', $sujet_id)
->whereNull('dossier_id')
->where(function ($query) use ($user) {
$query->where('statut', config('services.statut.public_etendu'))
->orWhere('statut', config('services.statut.public'))
->orWhere('created_by', $user->id);
})
->count();
$response['count'] = Media::where('sujet_id', $sujetId)
->whereNull('dossier_id')
->where(function ($query) use ( $userId ) {
$query->where('statut', config('services.statut.public_etendu'))
->orWhere('statut', config('services.statut.public'))
->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;
}else{
$response['draggable'] = false;
}
// Envoi du role
$response['role'] = Auth::user()->role;
return json_encode($response);
}
/**
* Ajouter un dossier
*
*/
public function addFolder(Request $request)
{
$response = array();
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$parent_id = $request->input('parent_id');
$libelle = $request->input('libelle');
$description = $request->input('description');
// ---- Le dossier
$dossier = new Dossier();
$dossier->libelle = htmlspecialchars($libelle);
$dossier->description = $description;
$dossier->parent_id = $parent_id;
$dossierParent = Dossier::where('id', $parent_id)->first();
if($parent_id == 1 || $dossierParent->system == 1){ // dossier de dépôt
$dossier->system = 1;
}else{
$dossier->system = 0;
}
$dossier->sujet_id = $dossierParent->sujet_id;
$dossier->save();
$response['folder_id'] = $dossier->id;
$response['system'] = $dossier->system;
return json_encode($response);
}
/**
* Ajouter un dossier de dépôt
*
*/
public function addDepotFolder(Request $request)
{
$response = array();
$parent_id = $request->input('parent_id');
$libelle = $request->input('libelle');
$description = $request->input('description');
// ---- Le dossier
$dossier = new Dossier();
$dossier->libelle = htmlspecialchars($libelle);
$dossier->description = $description;
$dossier->parent_id = 1;
$dossier->system = 1;
$dossier->save();
$response['folder_id'] = $dossier->id;
return json_encode($response);
}
/**
* supprimer un dossier
*
*/
public function removeFolder(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$dossier_id = $request->input('dossier_id');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if($dossier && !is_null($dossier->parent_id)){
if ($dossier->delete()) {
return json_encode($dossier->parent_id);
}
}
return json_encode(false);
}
/**
* déplacer un dossier
*
*/
public function moveFolder(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$dossier_id = $request->input('dossier_id');
$parent_id = $request->input('parent_id');
$sujet_id = $request->input('sujet_id');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if($dossier && !is_null($dossier->parent_id)){
$dossier->parent_id = $parent_id;
if ($dossier->save()) {
Media::where('dossier_id', $dossier_id)->update(['sujet_id' => $sujet_id]);
return json_encode(true);
}
}
return json_encode(false);
}
/**
* renommer un dossier
*
*/
public function renameFolder(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$dossier_id = $request->input('dossier_id');
$libelle = $request->input('libelle');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if($dossier && !is_null($dossier->parent_id)){
$dossier->libelle = $libelle;
if ($dossier->save()) {
return json_encode(true);
}
}
return json_encode(false);
}
/**
* get propriétés d'un dossier
*
*/
public function getFolderProperty(Request $request)
{
$response = array();
$dossier_id = $request->input('dossier_id');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if($dossier){
$response["data"] = $dossier;
}
return json_encode($response);
}
/**
* enregistre les propriétés d'un dossier
*
*/
public function saveFolderProperty(Request $request)
{
$dossier_id = $request->input('dossier_id');
$libelle = $request->input('libelle');
$description = $request->input('description');
// ---- Le dossier
$dossier = Dossier::where('id', $dossier_id)->first();
if($dossier && !is_null($dossier->parent_id) && strlen($libelle) > 3 ){
$dossier->libelle = $libelle;
$dossier->description = $description;
$dossier->save();
}
return json_encode(true);
}
return response()->json($folders);
}
}

View file

@ -74,7 +74,6 @@ class MediaController extends Controller
}
}
return view('media_manager')->with([
'sujets' => $sujets,
'typemedias' => $typemedias,
@ -115,16 +114,19 @@ class MediaController extends Controller
{
$response = array();
$userId = Auth::user()->id;
$dossier_id = $request->input('dossier_id');
$sujet_id = $request->input('sujet_id');
$filters = json_decode($request->input('filters'));
$offset = $request->input('offset');
$limit = $request->input('limit');
$orderField = $request->input('orderField');
$order = $request->input('order');
$saveSearch = $request->input('saveSearch');
$dossier_id = $request->folder;
$sujet_id = $request->sujet;
$filters = $request->filters;
$offset = $request->offset;
$limit = $request->limit;
$saveSearch = $request->saveSearch;
$isDepot = 0;
$order = array_search('order', array_column($filters, 'type'));
$orderField = $filters[$order]['value'];
$order = $filters[$order]['order'];
$esMust = [];
$esMustNot = [];
$esShould = [];
@ -165,13 +167,6 @@ class MediaController extends Controller
]
]);
/*$query= Media::where('sujet_id', $sujet_id)
->whereNull('dossier_id')
->where(function ($query) use ( $userId ) {
$query->where('statut', config('services.statut.public_etendu'))
->orWhere('statut', config('services.statut.public'))
->orWhere('created_by', $userId);
}); */
} elseif ($dossier_id == "-1") { // recherche global
$esMust = array_merge($esMust, [
@ -201,12 +196,6 @@ class MediaController extends Controller
]
]);
/*
$query = Media::where('sujet_id', $sujet_id)
->where(function ($query) use ( $userId ) {
$query->where('statut', config('services.statut.public_etendu'))
->orWhere('created_by', $userId);
});*/
} else {
$dossier = Dossier::where('id', $dossier_id)->first();
if ($dossier->parent_id != 1 && $dossier->id != 1) { // dossier classic
@ -265,13 +254,6 @@ class MediaController extends Controller
]
));
/*
$query = Media::where('sujet_id', $sujet_id)
->where('dossier_id', $dossier_id)
->where(function ($query) use ( $userId ) {
$query->where('statut', '<>', config('services.statut.brouillon'))
->orWhere('created_by', $userId);
});*/
} else { // dossier dépôt
$isDepot = 1;
$esMust = array_merge($esMust, [
@ -281,15 +263,13 @@ class MediaController extends Controller
]
]
]);
//$query= Media::where('dossier_id', $dossier_id);
}
}
// Filtre recherche texte
if (property_exists($filters, 'search')) {
if ($tmp = array_search('search', array_column($filters, 'type'))) {
$tmpFilters = [];
$search = strtolower(trim($filters->search->value));
$search = strtolower(trim($filters[$tmp]['value']));
if (strpos($search, '=') !== false){
$tmpSearch = explode('=', $search);
@ -363,6 +343,32 @@ class MediaController extends Controller
]
];
break;
case 'cd': // media id
$tmpFilters = [
[
'bool' => [
'must' => [
'match' => [
'id' => $needle
]
]
]
]
];
break;
case 'cv': // media arcadia_id
$tmpFilters = [
[
'bool' => [
'must' => [
'match' => [
'arcadia_id' => $needle
]
]
]
]
];
break;
}
}else if (strpos($search, '+') !== false){
$tmpSearch = explode('+', $search);
@ -410,7 +416,6 @@ class MediaController extends Controller
]
];
//dd($tmpFilters);exit;
}else{
$tmpFilters = [
[
@ -435,25 +440,6 @@ class MediaController extends Controller
$esMust = array_merge($esMust, $tmpFilters);
/*
$query->where(function ($query) use ( $search ) {
$query->whereRaw("LCASE(libelle) LIKE '%".$search."%'")
->orWhere('arcadia_id', $search)
->orWhereHas("articles", function($query) use ($search){
$query->where("noArt", $search)
->orWhereRaw("LCASE(libCcial) LIKE '%".$search."%'")
->orWhereRaw("LCASE(libMarq) LIKE '%".$search."%'")
->orWhereRaw("LCASE(libFamVte) LIKE '%".$search."%'")
->orWhere('codGencodAdm', $search)
->orWhere('codGencodSymb', $search)
->orWhere('codGencodPds', $search);
})
->orWhereHas("tags", function($query) use ($search){
$query->WhereRaw("LCASE(libelle) LIKE '%".$search."%'");
});
});
*/
// ---- Sauvegarde de la recherche utilisateur
if ($saveSearch == 1) {
$recherche = Recherche::where('libelle', $search)->first();
@ -482,13 +468,13 @@ class MediaController extends Controller
}
// Filtre type de média
if (property_exists($filters, 'typemedia_id')) {
$tmp = [];
foreach ($filters->typemedia_id->value as $type) {
$tmp = array_merge($tmp, [
if ($tmp = array_search('typemedia_id', array_column($filters, 'type'))) {
$oTmp = [];
foreach ($filters[$tmp]['value'] as $type) {
$oTmp = array_merge($oTmp, [
[
'match' => [
'typemedia_id' => $type
'typemedia_id' => $type['codeTypemedia']
]
]
]);
@ -496,23 +482,21 @@ class MediaController extends Controller
$esTypeMedia = [
[
'bool' => [
'should' => $tmp
'should' => $oTmp
]
]
];
$esMust = array_merge($esMust, $esTypeMedia);
//$query->whereIn('typemedia_id', $filters->typemedia_id->value);
}
// Filtre type de vue
if (property_exists($filters, 'typevue_id')) {
$tmp = [];
foreach ($filters->typevue_id->value as $type) {
$tmp = array_merge($tmp, [
if ($tmp = array_search('typevue_id', array_column($filters, 'type'))) {
$oTmp = [];
foreach ($filters[$tmp]['value'] as $type) {
$oTmp = array_merge($oTmp, [
[
'match' => [
'typevue_id' => $type
'typevue_id' => $type['codeTypevue']
]
]
]);
@ -520,17 +504,15 @@ class MediaController extends Controller
$esTypeVue = [
[
'bool' => [
'should' => $tmp
'should' => $oTmp
]
]
];
$esMust = array_merge($esMust, $esTypeVue);
//$query->whereIn('typevue_id', $filters->typevue_id->value);
}
// Filtre liason avec Arcadia
if (property_exists($filters, 'arcadia_id')) {
if ($tmp = array_search('arcadia_id', array_column($filters, 'type'))) {
$esArcadia = [
[
'exists' => [
@ -539,17 +521,16 @@ class MediaController extends Controller
]
];
$esMust = array_merge($esMust, $esArcadia);
//$query->whereNotNull('arcadia_id' );
}
// Filtre etiquette
if (property_exists($filters, 'etiquette_id')) {
$tmp = [];
foreach ($filters->etiquette_id->value as $id) {
$tmp = array_merge($tmp, [
if ($tmp = array_search('etiquette_id', array_column($filters, 'type'))) {
$oTmp = [];
foreach ($filters[$tmp]['value'] as $item) {
$oTmp = array_merge($oTmp, [
[
'match' => [
'etiquette_id' => $id
'etiquette_id' => $item['etiquette_id']
]
]
]);
@ -557,21 +538,13 @@ class MediaController extends Controller
$esEtiquette = [
[
'bool' => [
'should' => $tmp
'should' => $oTmp
]
]
];
$esMust = array_merge($esMust, $esEtiquette);
//$query->whereIn('etiquette_id', $filters->etiquette_id->value);
}
/*
$query->with('Etiquette')
->offset($offset)
->limit($limit)
->orderBy($orderField, $order);
$response['data'] = $query->get(); */
$query = array(
'bool' => array(
'must' => $esMust,
@ -604,6 +577,8 @@ class MediaController extends Controller
$response['isCAQuery'] = $isCAQuery;
}
$response['role'] = Auth::user()->role;
return json_encode($response);
}
@ -792,7 +767,7 @@ class MediaController extends Controller
return json_encode(array('status' => false, 'error' => "Le média est en attente d'un retour d'Arcadia."));
}
$media->libelle = $mediaUpdate->libelle;
$media->libelle = mb_substr($mediaUpdate->libelle, 0, 50, "UTF-8");
$media->typevue_id = $mediaUpdate->typevue_id;
$media->variante_id = $mediaUpdate->variante_id;
$media->langue_id = $mediaUpdate->langue_id;
@ -803,7 +778,7 @@ class MediaController extends Controller
$media->copyright_id = $mediaUpdate->copyright_id;
/*// ---- Historique des actions (etiquette seulement)
// ---- Historique des actions (etiquette seulement)
if ($media->etiquette_id != $mediaUpdate->etiquette_id) {
$curEtiquette = Etiquette::where('etiquette_id', $media->etiquette_id)->first();
$newEtiquette = Etiquette::where('etiquette_id', $mediaUpdate->etiquette_id)->first();
@ -814,7 +789,7 @@ class MediaController extends Controller
$historique->description = $curEtiquette->libelle . " -> " . $newEtiquette->libelle;
$historique->save();
$media->etiquette_id = $mediaUpdate->etiquette_id;
}*/
}
$media->save();
@ -822,10 +797,10 @@ class MediaController extends Controller
$media->tags()->detach();
if (isset($mediaUpdate->tags)) {
foreach ($mediaUpdate->tags as $tag) {
$oTag = Tag::where('libelle', $tag)->first();
$oTag = Tag::where('libelle', $tag['libelle'])->first();
if (!$oTag) {
$oTag = new Tag();
$oTag->libelle = $tag;
$oTag->libelle = $tag['libelle'];
$oTag->save();
}
$media->tags()->attach($oTag->id);
@ -836,30 +811,27 @@ class MediaController extends Controller
// ---- Les sociétés
$media->societes()->detach();
$sSocietes = $mediaUpdate->societes;
if ($sSocietes != "") {
$societes = explode(",", $sSocietes);
foreach ($societes as $societeId) {
$media->societes()->attach($societeId);
if (!empty($sSocietes)) {
foreach ($sSocietes as $societeId) {
$media->societes()->attach($societeId['id']);
}
}
// ---- Les marques
$media->marques()->detach();
$sMarques = $mediaUpdate->marques;
if ($sMarques != "") {
$marques = explode(",", $sMarques);
foreach ($marques as $marqueId) {
$media->marques()->attach($marqueId);
if (!empty($sMarques)) {
foreach ($sMarques as $marqueId) {
$media->marques()->attach($marqueId['codMarq']);
}
}
// ---- Les articles
$media->articles()->detach();
$sArticles = $mediaUpdate->articles;
if ($sArticles) {
$articles = explode(",", $sArticles);
foreach ($articles as $articleId) {
$media->articles()->attach($articleId);
if (!empty($sArticles)) {
foreach ($sArticles as $articleId) {
$media->articles()->attach($articleId['id']);
}
}
@ -1007,80 +979,6 @@ class MediaController extends Controller
return json_encode($response);
}
/**
* Sauvegarde une retouche photo
*
*/
public function editPhoto(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR'), config('roles.const.CONTRIBUTEUR')]);
$response = array();
$media_id = $request->input('media_id');
$cropData = $request->input('cropData');
$media = Media::where('id', $media_id)->first();
if ($media) {
$mediaPath = $media->folder . $media->uid . "." . $media->extension;
$im = new \imagick($mediaPath);
$im->setImageUnits(\imagick::RESOLUTION_PIXELSPERINCH);
$im->setImageFormat($media->extension);
list($top, $left, $width, $height) = $cropData;
$left = round($left * $media->largeur);
$top = round($top * $media->hauteur);
$width = round(min($width * $media->largeur, $media->largeur - $left));
$height = round(min($height * $media->hauteur, $media->hauteur - $top));
$im->setImagePage(0, 0, 0, 0);
$im->setImageResolution($media->resolution, $media->resolution);
$im->cropImage($width, $height, $left, $top);
Storage::put($mediaPath, $im->getImageBlob());
$im->destroy();
$im = new \imagick($mediaPath);
$imageprops = $im->getImageGeometry();
$media->largeur = $imageprops['width'];
$media->hauteur = $imageprops['height'];
$resolutions = $im->getImageResolution();
$media->resolution = round($resolutions['x'] * 2.54, 2);
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();
// ---- Index dans Elasticsearch
$id = $media->id;
$media = Media::find($id);
$media->removeFromIndex();
$media->addToIndex();
$historique = new historique();
$historique->user_id = Auth::user()->id;;
$historique->media_id = $media->id;
$historique->type = "Retouche";
$historique->description = "Retouche de l'image";
$historique->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;
// Lien Arcadia
ArcadiaLink::update($media);
}
return json_encode($response);
}
public function checkRefKey(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN')]);
@ -1206,101 +1104,54 @@ class MediaController extends Controller
}
/**
* Renvoie l'historique des actions d'un média
* Renvoie les infos complémentaires d'un média
*
*/
public function getMediaHistory(Request $request)
public function getMediaOtherInfos(Request $request)
{
$response = array();
if (!$user = Auth::user()) abort(401, 'Cette action n\'est pas autorisée.');
$media_id = $request->input('media_id');
$media = Historique::where('media_id', $media_id)->with('user')->orderBy("created_date", "DESC")->get();
$response = $media;
if (!$user = Auth::user()) abort(401, 'Cette action n\'est pas autorisée.');
$media = Media::find($media_id);
if(!$media)
abort('404', "Ce média n'existe pas.");
$response = array();
$history = Historique::where('media_id', $media_id)->with('user')->orderBy("created_date", "DESC")->get();
$response['history'] = $history;
$response['vignettes'] = $this->getVignettesByMedia($media);
return json_encode($response);
}
/**
* Ajoute un média sans fichier
*
*/
public function addMedia(Request $request)
private function getVignettesByMedia($media)
{
$response = false;
$sujet_id = $request->input('sujet_id');
$dossier_id = $request->input('dossier_id');
if ($dossier_id == 0) $dossier_id = NULL;
// On déplace le média par défaut dans le répertoire des médias
$destinationPath = $this->get_mediaFolder() . "/";
$uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
$filename = $uid . ".jpg";
Storage::copy("images/default.jpg", $destinationPath . $filename);
// on créé un média en bdd
$media = new Media();
$media->dossier_id = $dossier_id;
$media->sujet_id = $sujet_id;
$media->libelle = "Nouveau média";
$media->folder = $destinationPath;
$media->taille = $this->formatBytes($this->get_file_size($destinationPath . $filename));
if ($user = Auth::user()) {
$media->created_by = $user->id;
}
$media->uid = $uid;
$media->extension = "jpg";
$media->typemedia_id = 1;
$im = new \imagick($destinationPath . $filename);
$resolutions = $im->getImageResolution();
$media->resolution = round($resolutions['x'] * 2.54, 2);
$imageprops = $im->getImageGeometry();
$media->largeur = $imageprops['width'];
$media->hauteur = $imageprops['height'];
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 = "";
}
// Par défaut FR
$media->langue_id = 1;
// Par défaut propriété de la marque
$media->copyright_id = 3;
$media->isDefault = 1;
$media->save();
$id = $media->id;
$media = Media::find($id);
// ---- Index dans Elasticsearch
$media = Media::where('id', $media->id)->first();
$media->addToIndex();
$response = $media;
$im->destroy();
// ---- Creation des vignettes de base
$this->create_sys_thumb($media);
// ---- Creation des vignettes en lien avec le sujet du média
if (isset($sujet_id)) {
$this->create_thumb($media);
}
// ---- Historique des actions
$historique = new historique();
if ($user = Auth::user()) {
$historique->user_id = $user->id;
}
$historique->media_id = $media->id;
$historique->type = "Création";
$historique->description = "Média ajouté";
$historique->save();
return json_encode($response);
$vignettes = [];
$vignettes['original'] = [
'url' => config('app.url') . "/" . $media->folder . $media->uid . "." . $media->extension,
'extension' => $media->extension,
'largeur' => $media->largeur,
'hauteur' => $media->hauteur
];
$vignettes['preview'] = [
'url' => config('app.url') . "/" . $media->folder . $media->uid . "_preview" . "." . $media->extension,
'extension' => $media->extension,
'largeur' => '1800',
'hauteur' => '1800'
];
$vignettes['thumb'] = [
'url' => config('app.url') . "/" . $media->folder . $media->uid . "_thumb" . "." . $media->extension,
'extension' => $media->extension,
'largeur' => '200',
'hauteur' => '200'
];
$formats = $media->sujet->formats;
foreach ($formats as $format)
$vignettes[$format->libelle] = [
'url' => config('app.url') . "/" . $media->folder . $media->uid . "_" . $format->libelle . "." . $media->extension,
'extension' => $format->extension,
'largeur' => $format->largeur,
'hauteur' => $format->hauteur
];
return $vignettes;
}
}

View file

@ -3,6 +3,7 @@ namespace App\Http\Controllers;
use App\Http\Traits\ArcadiaLink;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Http\Request;
use App\Models\Media;
@ -138,7 +139,7 @@ class UploadController extends Controller {
$media->extension = $extension;
$media->folder = $destinationPath;
if($replaceMediaId == 0){
$media->libelle = $originalName;
$media->libelle = mb_substr($originalName, 0, 50, "UTF-8");
$media->created_by= Auth::user()->id;
}
$media->uid = $uid;
@ -246,4 +247,257 @@ class UploadController extends Controller {
return $filesa;
}
}
public function storeMediaV2(Request $request)
{
$uid = $request->input('uid');
$sujet_id = $request->input('sujet_id');
$dossier_id = $request->input('dossier_id');
$replaceMediaId = $request->input('replaceMediaId');
if($dossier_id == 0) $dossier_id = NULL;
$filesa = [];
$acceptFileTypes = array('gif','jpeg', 'jpg','png','mp4','mp3','psd','ai','svg','pdf');
if (!$uid)
$uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
$file = $request->file('files');
if (!empty($file)) {
$extension = strtolower($file->getClientOriginalExtension());
$originalName = str_replace( ".".$extension, "", $file->getClientOriginalName());
if (!in_array($extension, $acceptFileTypes)) return array("false");
$filename = $uid . '.' . $extension;
if (!in_array($extension, $acceptFileTypes)) return array("error" => "Ce type de fichier n'est pas accepté.");
// check the error status
if ($file->getError() != 0) {
Log::error('error ' . $file->getError() . ' in file ' . $request->resumableFilename);
}
// init the destination file (format <filename.ext>.part<#chunk>
// the file is stored in a temporary directory
if(isset($request->resumableIdentifier) && trim($request->resumableIdentifier)!=''){
$temp_dir = 'uploads/' . $request->resumableIdentifier;
}
$dest_file = $temp_dir . '/' . $request->resumableFilename . '.part' . $request->resumableChunkNumber;
// create the temporary directory
if (!is_dir($temp_dir)) {
mkdir($temp_dir, 0777, true);
}
// move the temporary file
if (!move_uploaded_file($file->getPathname(), $dest_file)) {
Log::error('Error saving (move_uploaded_file) chunk ' . $request->resumableChunkNumber.' for file ' . $request->resumableFilename);
} else {
// check if all the parts present, and create the final destination file
$isLast = $this->createFileFromChunks($temp_dir, $request->resumableFilename, $request->resumableChunkSize, $request->resumableTotalSize, $request->resumableTotalChunks, $filename);
if ($isLast){
$destinationPath = $this->get_mediaFolder()."/";
// si on upload un média pour remplacer un fichier par un autre
if($replaceMediaId != 0){
// on récupère le média à modifier
$media= Media::where('id', $replaceMediaId)->first();
// On déplace le fichier dans le répertoire des médias
Storage::move("uploads/".$filename, $destinationPath.$filename);
// supprime les fichiers médias stockés sur disque
$filesfF= Storage::files($media->folder."/");
$filepath = preg_quote($media->folder.$media->uid, '/');
$matchingFiles = preg_grep('/^'.$filepath.'/', $filesfF);
Storage::delete($matchingFiles);
$media->isDefault = 0;
$media->save();
}else{
// On déplace le fichier dans le répertoire des médias
Storage::move("uploads/".$filename, $destinationPath.$filename);
// on créé un média en bdd
$media = new Media();
$media->dossier_id = $dossier_id;
$media->sujet_id = $sujet_id;
// Par défaut FR
$media->langue_id = 1;
// Par défaut propriété de la marque
$media->copyright_id = 3;
}
$media->extension = $extension;
$media->folder = $destinationPath;
if($replaceMediaId == 0){
$media->libelle = mb_substr($originalName, 0, 50, "UTF-8");
$media->created_by= Auth::user()->id;
}
$media->uid = $uid;
$media->taille = $this->formatBytes($this->get_file_size($destinationPath.$filename));
switch ($extension) {
// Photo (1)
case 'gif':
case 'jpeg':
case 'jpg':
case 'png':
case 'ai':
case 'pdf':
case 'psd':
$media->typemedia_id = 1;
$im = new \imagick($destinationPath.$filename);
if(in_array($extension, array("pdf", "ai", "psd", "gif")) ){
$im->setIteratorIndex(0);
}
$resolutions = $im->getImageResolution();
$media->resolution = round($resolutions['x'] * 2.54);
$imageprops = $im->getImageGeometry();
$media->largeur = $imageprops['width'];
$media->hauteur = $imageprops['height'];
if($media->resolution != 0){
$media->largeur_mm = ceil(($media->largeur * 2.54 / $media->resolution)*10);
$media->hauteur_mm = ceil(($media->hauteur * 2.54 / $media->resolution)*10);
}else{
$media->largeur_mm = "";
$media->hauteur_mm = "";
}
$media->save();
$im->destroy();
// ---- Creation des vignettes de base
$this->create_sys_thumb($media);
// ---- Creation des vignettes en lien avec le sujet du média
if(isset($sujet_id) ){
$this->create_thumb($media);
}
break;
// Illustration/Vectorielle (2)
case 'svg':
$media->typemedia_id = 2;
$media->save();
break;
// Vidéo (3)
case 'mp4':
$media->typemedia_id =3 ;
$getID3 = new \getID3;
if($fileInfo = $getID3->analyze($destinationPath.$filename)){
$media->largeur = $fileInfo['video']['resolution_x'];
$media->hauteur = $fileInfo['video']['resolution_y'];
$media->duree = $fileInfo['playtime_string'];
}
$media->save();
break;
// Audio (4)
case 'mp3':
$media->typemedia_id = 4;
$getID3 = new \getID3;
if($fileInfo = $getID3->analyze($destinationPath.$filename)){
$media->duree= $fileInfo['playtime_string'];
}
$media->save();
break;
}
$id = $media->id;
$media = Media::find($id);
// ---- Index dans Elasticsearch
$media = Media::where('id', $media->id)->first();
$media->addToIndex();
// ---- Historique des actions
$historique = new historique();
if($user = Auth::user()){
$historique->user_id = $user->id;
}
$historique->media_id = $media->id;
if($replaceMediaId == 0){
$historique->type = "Création";
$historique->description = "Média ajouté";
}else{
$historique->type = "Modification";
$historique->description = "Le média a été remplacé";
}
$historique->save();
return response()->json($media);
}
}
}
}
/**
*
* Check if all the parts exist, and
* gather all the parts of the file together
* @param string $temp_dir - the temporary directory holding all the parts of the file
* @param string $fileName - the original file name
* @param string $chunkSize - each chunk size (in bytes)
* @param string $totalSize - original file size (in bytes)
* @return bool
*/
private function createFileFromChunks($temp_dir, $fileName, $chunkSize, $totalSize, $total_files, $finalName) {
// count all the parts of this file
$total_files_on_server_size = 0;
$temp_total = 0;
foreach(scandir($temp_dir) as $file) {
$temp_total = $total_files_on_server_size;
$tempfilesize = filesize($temp_dir.'/'.$file);
$total_files_on_server_size = $temp_total + $tempfilesize;
}
// check that all the parts are present
// If the Size of all the chunks on the server is equal to the size of the file uploaded.
if ($total_files_on_server_size >= $totalSize) {
// create the final destination file
if (($fp = fopen('uploads/'.$finalName, 'w')) !== false) {
for ($i=1; $i<=$total_files; $i++) {
fwrite($fp, file_get_contents($temp_dir.'/'.$fileName.'.part'.$i));
//Log::info('writing chunk '.$i);
}
fclose($fp);
} else {
Log::error('cannot create the destination file');
return false;
}
// rename the temporary directory (to avoid access from other
// concurrent chunks uploads) and than delete it
if (rename($temp_dir, $temp_dir.'_UNUSED')) {
$this->rrmdir($temp_dir.'_UNUSED');
} else {
$this->rrmdir($temp_dir);
}
return true;
}
return false;
}
/**
*
* Delete a directory RECURSIVELY
* @param string $dir - directory path
* @link http://php.net/manual/en/function.rmdir.php
*/
private function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir . "/" . $object) == "dir") {
$this->rrmdir($dir . "/" . $object);
} else {
unlink($dir . "/" . $object);
}
}
}
reset($objects);
rmdir($dir);
}
}
}

View file

@ -2,17 +2,20 @@
namespace App\Models;
use App\Http\Controllers\CommunController;
use App\Http\Controllers\MediaController;
use App\Http\Traits\ElasticTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Elasticquent\ElasticquentTrait;
use Illuminate\Support\Facades\DB;
class Media extends Model
{
use ElasticquentTrait;
use ElasticTrait;
use SoftDeletes;
protected $with = ["owner", "tags", "etiquette", "articles"];
protected $with = ["owner", "tags", "etiquette", "articles", "sujet", "typemedia", "societes", "marques"];
protected $table = "medias";
/**

View file

@ -14,7 +14,7 @@ return array(
*/
'config' => [
'hosts' => ['http://127.0.0.1:9200'],
'hosts' => ['http://192.168.10.10:9200'],
'retries' => 1,
],

1972
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,7 @@
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"wp": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
"wp": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"axios": "^0.18",
@ -23,5 +23,13 @@
"sass-loader": "^7.1.0",
"vue": "^2.5.17",
"vue-template-compiler": "^2.6.10"
},
"dependencies": {
"resumablejs": "^1.1.0",
"vue-clipboards": "^1.3.0",
"vue-dialog-loading": "^0.5.3",
"vue-infinite-loading": "^2.4.4",
"vue-select": "^3.10.3",
"vuex": "^3.4.0"
}
}

15602
public/css/app.css vendored

File diff suppressed because one or more lines are too long

54095
public/js/app.js vendored

File diff suppressed because one or more lines are too long

16
resources/js/admin.js vendored
View file

@ -184,7 +184,7 @@ window.initSelector = function($selector){
var datavalue = [];
// Init du module
$($selector+" .selector_values li").each(function() {
/*$($selector+" .selector_values li").each(function() {
datavalue.push($(this).attr("data-value"));
});
$($selector+" .selector_choices li").each(function() {
@ -193,10 +193,10 @@ window.initSelector = function($selector){
$(this).addClass('selected');
}
});
$($selector+" .selector_dataValues").val(datavalue.join());
$($selector+" .selector_dataValues").val(datavalue.join());*/
// Recherche d'un élément
$($selector+" .selector_filter").off().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() {
@ -207,10 +207,10 @@ window.initSelector = function($selector){
$(this).css("display", "none");
}
});
});
});*/
// Ajout d'un élément
$($selector+" .selector_choices" ).off().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();
@ -219,9 +219,9 @@ window.initSelector = function($selector){
datavalue.push(id);
$($selector+" .selector_dataValues").val(datavalue.join());
}
});
});*/
// Suppression d'un élément
$($selector+" .selector_values" ).off().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');
@ -231,7 +231,7 @@ window.initSelector = function($selector){
datavalue.splice(index, 1);
}
$($selector+" .selector_dataValues").val(datavalue.join());
});
});*/
}

123
resources/js/app.js vendored
View file

@ -1,3 +1,126 @@
window.axios = require('axios');
window.axios.defaults.headers.common = {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN' : document.querySelector('meta[name="csrf-token"]').getAttribute('content')
};
let _ = require('lodash');
// Vue
import Vue from 'vue';
// Vuex
import Vuex from 'vuex';
// Select
import vSelect from 'vue-select';
Vue.component('v-select', vSelect);
// Infinite Loading
import InfiniteLoading from 'vue-infinite-loading';
// Copy To Clipboard
import VueClipboards from 'vue-clipboards';
// Dialog
import Dialog from 'vue-dialog-loading';
const OpenSeaDragonComponent = Vue.component(
'img-preview',
require('./components/OpenSeadragonComponent.vue').default
);
const DarkroomComponent = Vue.component(
'img-edit',
require('./components/DarkroomComponent.vue').default
);
/* MEDIA MANAGER */
// Folder Component
const FolderComponent = Vue.component(
'mm-folder',
require('./components/media-manager/FolderComponent.vue').default
);
const SideHeaderComponent = Vue.component(
'mm-side-header',
require('./components/media-manager/SideHeaderComponent.vue').default
);
const FiltersComponent = Vue.component(
'mm-filters',
require('./components/media-manager/FiltersComponent.vue').default
);
const SorterComponent = Vue.component(
'mm-sorter',
require('./components/media-manager/SorterComponent.vue').default
);
const DisplayComponent = Vue.component(
'mm-display',
require('./components/media-manager/DisplayComponent.vue').default
);
/* MEDIA EDITOR */
const EditorComponent = Vue.component(
'mm-me-edit',
require('./components/media-manager/media-editor/EditComponents.vue').default
);
const EditorTabPreviewComponent = Vue.component(
'mm-me-tab-preview',
require('./components/media-manager/media-editor/tabs/PreviewComponent.vue').default
);
const EditorTabEditComponent = Vue.component(
'mm-me-tab-edit',
require('./components/media-manager/media-editor/tabs/EditComponent.vue').default
);
const EditorTabLinksComponent = Vue.component(
'mm-me-tab-links',
require('./components/media-manager/media-editor/tabs/LinksComponent.vue').default
);
const EditorTabHistoryComponent = Vue.component(
'mm-me-tab-history',
require('./components/media-manager/media-editor/tabs/HistoryComponent.vue').default
);
Vue.use(Vuex);
Vue.use(InfiniteLoading);
Vue.use(VueClipboards);
Vue.use(Dialog, {
dialogBtnColor: '#0f0'
});
const store = new Vuex.Store({
state: {
sujet: 0,
folder: -1,
filters: [],
role: 2,
media: {},
typesvue: [],
typesvariantes: []
},
mutations: {
updateSujet (state, payload) {
state.sujet = payload.sujet;
},
updateTypesVue (state, payload) {
state.typesvue = payload.typesvue;
},
updateTypesVariantes(state, payload) {
state.typesvariantes = payload.typesvariantes;
},
updateFolder (state, payload) {
state.folder = payload.folder;
},
updateFilters (state, payload) {
state.filters = payload.filters;
},
updateMedia (state, payload) {
state.media = payload.media;
},
updateRole (state, payload) {
state.role = payload.role;
}
}
});
new Vue({
el: '#vue-app',
store,
components: {
OpenSeaDragonComponent, DarkroomComponent,
FolderComponent, SideHeaderComponent, FiltersComponent, SorterComponent, DisplayComponent,
EditorComponent, EditorTabPreviewComponent, EditorTabEditComponent, EditorTabLinksComponent, EditorTabHistoryComponent
}
});
'use strict';

View file

@ -0,0 +1,53 @@
<template>
<div>
<img id="drTarget" :src="url + '?t='+ new Date().getTime()">
</div>
</template>
<script>
export default {
name: "DarkroomComponent",
props: {
url: {
type: String
}
},
data: function () {
return {
dr: null
}
},
updated: function () {
if (this.dr){
this.dr.selfDestroy();
this.dr = null;
}
this.setup();
},
methods: {
setup: function () {
if (!this.dr) {
const _this2 = this;
this.dr = new Darkroom('#drTarget', {
minWidth: 200,
minHeight: 200,
maxWidth: '100%',
maxHeight: '100%',
plugins: {
save: {
callback: function() {
let dr = this.darkroom;
_this2.$emit('newImg', dr.sourceCanvas.toDataURL());
}
},
}
});
}
}
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,55 @@
<template>
<div :id="id" :style="nStyle"></div>
</template>
<script>
export default {
name: "OpenSeadreagonComponent",
props: {
id: {
type: String
},
options: {
type: Object
},
nStyle: {
type: String
}
},
data: function () {
return {
viewer: null
}
},
updated: function () {
if (this.viewer){
this.viewer.destroy();
this.viewer = null;
}
if (this.id !== 'openseadragon_undefined')
this.setup();
},
watch: {
options: {
handler(n, o){
// Pour reload la preivew en cas d'upload d'un nouveau média
this.$forceUpdate();
},
deep: true // Pour checker dans tout l'objet si il y a un changement
}
},
methods: {
setup: function () {
if (!this.viewer && this.options) {
const _options = this.options;
_options.id = this.id;
this.viewer = new OpenSeadragon(_options)
}
}
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,152 @@
<template>
<div>
<div v-show="scrollLoader" class="scrollLoader"><div class="animated slideInUp"><i class="fal fa-circle-notch fa-spin"></i> Chargements des médias</div></div>
<div class="media_container">
<div v-show="loader" class="loader"><i class="fal fa-circle-notch fa-spin"></i></div>
<div class="wrapper">
<div v-for="media in medias.data" v-on:dblclick="edit(media)" class="imageItem" :draggable="medias.draggable" aria-grabbed="false">
<div class="etiquette" :style="'background-color:' + media.etiquette.color + '; border-color:' + media.etiquette.color + ';'" :data-id="media.etiquette.etiquette_id" >{{media.etiquette.libelle}}</div>
<div class="contextMenu">
<ul>
<li class="menu-option editItem"><i class="fas fa-edit"></i> Editer</li>
<li class="menu-option downloadItem"><i class="fas fa-file-download"></i> Télécharger</li>
<li class="menu-option addBasket"><i class="fas fa-shopping-basket"></i> Ajouter au panier</li>
<!--<li v-if="medias.role === 1 || medias.role === 4" class="menu-option deleteItem"><i class="fas fa-trash-alt"></i> Supprimer</li>-->
<li v-if="medias.role !== 2" class="menu-option tagItem"><i class="fas fa-tags"></i> Etiquette</li>
</ul>
</div>
<div v-if="media.typemedia_id === 1 || media.typemedia_id === 5" class="media" :style="'background-image:url('+ media.folder + media.uid +'_thumb.png)'"></div>
<div v-if="media.typemedia_id === 2" class="media" :style="'background-image:url('+ media.folder + media.uid + media.extension + ')'"></div>
<div v-if="media.typemedia_id === 3" class="media video"></div>
<div v-if="media.typemedia_id === 4" class="media son"></div>
<p class="libelle">{{media.libelle}}</p>
<div v-if="media.typemedia_id === 1 || media.typemedia_id === 5" class="info"><i class="fas fa-file-image"></i> {{media.extension}} - {{media.taille}} - {{media.largeur}}x{{media.hauteur}}px - v{{media.version}}</div>
<div v-if="media.typemedia_id === 2" class="info"><i class="fas fa-file-image"></i> {{media.extension}} - {{media.taille}} - v{{media.version}}</div>
<div v-if="media.typemedia_id === 3" class="info"><i class="fas fa-file-video"></i> {{media.extension}} - {{media.taille}} - durée {{media.duree}} - v{{media.version}}</div>
<div v-if="media.typemedia_id === 4" class="info"><i class="fas fa-file-audio"></i> {{media.extension}} - {{media.taille}} - durée {{media.duree}} - v{{media.version}}</div>
<div v-if="media.statut === 0" class="statut stat0">Brouillon</div>
<div v-if="media.statut === 1" class="statut stat1">Public</div>
<div v-if="media.statut === 2" class="statut stat2">Public étendu</div>
</div>
<infinite-loading @infinite="infiniteScroll" :identifier="infiniteId">
<div slot="spinner"></div>
<div slot="no-more"></div>
<div slot="no-results"></div>
</infinite-loading>
</div>
</div>
</div>
</template>
<script>
export default {
name: "DisplayComponent",
computed: {
storeFilters () {
return this.$store.state.filters;
},
storeFolder () {
return this.$store.state.folder;
},
storeSujet () {
return this.$store.state.sujet;
},
storeMedia () {
return this.$store.state.media;
}
},
mounted() {
this.resetInfiniteScroll();
},
data: function () {
return {
medias: [],
offset: 0,
limit: 50,
scrollLoader: false,
loader: false,
infiniteId: '',
}
},
watch: {
storeFilters() {
this.init();
},
storeMedia() {
if (Object.keys(this.storeMedia).length > 0){
this.init();
}
}
},
methods: {
init() {
this.offset = 0;
this.resetInfiniteScroll();
this.loadMedias(this.$store.state);
},
loadMedias($state) {
if (this.offset === 0){
this.medias = [];
this.loader = true;
}else{
this.scrollLoader = true;
}
axios.post('/ajax/load-medias', {
sujet: this.storeSujet,
folder: this.storeFolder,
filters: this.storeFilters,
offset: this.offset,
limit: this.limit,
saveSearch: 0
}).then(response => {
if (this.offset === 0){
this.medias = response.data;
this.loader = false;
this.$store.commit({
type: 'updateRole',
role: response.data.role
});
}else{
if (response.data.data.length){
this.medias.data.push(...response.data.data);
$state.loaded();
this.$store.commit({
type: 'updateRole',
role: response.data.role
});
}else{
$state.complete();
}
this.scrollLoader = false;
}
this.offset = this.offset + this.limit;
})
.catch(function (error) {
console.log(error);
});
},
infiniteScroll($state) {
this.loadMedias($state);
},
resetInfiniteScroll() {
this.infiniteId = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
},
edit(media) {
this.$store.commit({
type: 'updateMedia',
media: media
});
}
},
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,216 @@
<template>
<div class="search_wrapper">
<div class="search_filters group">
<input v-model="sTexte" class="search_value" type="text" placeholder="rechercher un média..." v-on:keyup.enter="addText">
<a @click="addText" href="#" class="btn btn-square btn-black search_btn">Rechercher</a>
<div class="filter_selector filter" data-lib-type="Type de média : " data-type="typemedia_id">
<div class="filter_btn">Type de média <i class="fas fa-caret-down"></i></div>
<div class="list" style="display:none;">
<ul>
<li v-for="item in oTypemedias">
<input v-model="sTypemedias" :id="'typeM_' + item.codeTypemedia" type="checkbox" :value="item">
<label :for="'typeM_' + item.codeTypemedia">{{item.libelle}}</label>
</li>
</ul>
</div>
</div>
<div class="filter_selector filter" data-lib-type="Type de vue : " data-type="typevue_id">
<div class="filter_btn">Type de vue <i class="fas fa-caret-down"></i></div>
<div class="list list_typevue" style="display:none;">
<ul>
<li v-for="item in storeTypesvue">
<input v-model="sTypevue" :id="'typeV_' + item.codeTypevue" type="checkbox" :value="item">
<label :for="'typeV_' + item.codeTypevue">{{item.libelle}}</label>
</li>
</ul>
</div>
</div>
<div class="filter_selector filter" data-lib-type="Etiquette : " data-type="etiquette_id">
<div class="filter_btn">Etiquette <i class="fas fa-caret-down"></i></div>
<div class="list list_etiquette" style="display:none;">
<ul>
<li v-for="item in oEtiquettes">
<input v-model="sEtiquettes" :id="'etiq_' + item.etiquette_id" type="checkbox" :value="item">
<label :for="'etiq_' + item.etiquette_id" :style="'background-color:' + item.color + '; border-color:' + item.color" >{{item.libelle}}</label>
</li>
</ul>
</div>
</div>
<div class="filter" data-lib-type="" data-type="arcadia_id">
<input v-model="sReferentiel" type="checkbox" id="arcadia" name="arcadia" value="1">
<label for="arcadia">Lié au référentiel</label>
</div>
</div>
<div class="filter_wrapper">
<span>Filtres :</span>
<div class="search_filters_list">
<a v-for="(filter, index) in storeFilters" :id="filter.type" class="filter_item" href="#"><span class="libelle">{{ filter.legend }}</span><span class="value">{{ filter.libelle }}</span><i @click="deleteFilter(index)" class="delete_filter fal fa-times"></i></a>
</div>
<a v-if="storeFilters.length > 0" @click="reset" class="reinit_search_btn" href="#">Réinitialiser</a>
</div>
</div>
</template>
<script>
export default {
name: "FiltersComponent",
mounted() {
this.oTypemedias = JSON.parse(this.typemedias);
this.oEtiquettes = JSON.parse(this.etiquettes);
},
props: [
'typemedias',
'etiquettes'
],
computed: {
storeFilters() {
return this.$store.state.filters;
},
storeSujet() {
return this.$store.state.sujet;
},
storeTypesvue() {
return this.$store.state.typesvue;
},
},
data() {
return {
'oTypemedias': [],
'oEtiquettes': [],
'sTypevue': [],
'sTypemedias': [],
'sEtiquettes': [],
'sReferentiel': [],
'sTexte': ''
}
},
watch: {
storeSujet() {
this.reset();
},
sTypevue() {
this.toggleTypevue();
},
sTypemedias() {
this.toggleTypemedias();
},
sEtiquettes() {
this.toggleEtiquettes();
},
sReferentiel() {
this.toggleReferentiel();
}
},
methods: {
addText() {
let filter = this.storeFilters.findIndex(e => e.type === 'search');
if (filter !== -1){
this.$delete(this.storeFilters, filter);
}
if (this.sTexte.length > 0) {
this.storeFilters.push({ type: 'search', legend: 'Recherche : ', value: this.sTexte, libelle: this.sTexte });
}
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
},
toggleTypevue() {
let filter = this.storeFilters.findIndex(e => e.type === 'typevue_id');
if (filter !== -1){
this.$delete(this.storeFilters, filter);
}
if (this.sTypevue.length > 0) {
this.storeFilters.push({ type: 'typevue_id', legend: 'Type(s) de vue : ', value: this.sTypevue, libelle: this.sTypevue.map(function(e){ return e.libelle; }).join(',') });
}
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
},
toggleTypemedias() {
let filter = this.storeFilters.findIndex(e => e.type === 'typemedia_id');
if (filter !== -1){
this.$delete(this.storeFilters, filter);
}
if (this.sTypemedias.length > 0) {
this.storeFilters.push({ type: 'typemedia_id', legend: 'Type(s) de média : ', value: this.sTypemedias, libelle: this.sTypemedias.map(function(e){ return e.libelle; }).join(',') });
}
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
},
toggleEtiquettes() {
let filter = this.storeFilters.findIndex(e => e.type === 'etiquette_id');
if (filter !== -1){
this.$delete(this.storeFilters, filter);
}
if (this.sEtiquettes.length > 0) {
this.storeFilters.push({ type: 'etiquette_id', legend: 'Étiquette(s) : ', value: this.sEtiquettes, libelle: this.sEtiquettes.map(function(e){ return e.libelle; }).join(',') });
}
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
},
toggleReferentiel() {
let filter = this.storeFilters.findIndex(e => e.type === 'arcadia_id');
if (filter !== -1){
this.$delete(this.storeFilters, filter);
}
if (this.sReferentiel.length > 0) {
this.storeFilters.push({ type: 'arcadia_id', legend: 'Lié au référentiel : ', value: '', libelle: 'Oui' });
}
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
},
deleteFilter(index){
if (this.storeFilters[index].type === 'dossier_id')
this.resetFolder();
if (this.storeFilters[index].type === 'typevue_id')
this.sTypevue = [];
if (this.storeFilters[index].type === 'typemedia_id')
this.sTypemedias = [];
if (this.storeFilters[index].type === 'etiquette_id')
this.sEtiquettes = [];
if (this.storeFilters[index].type === 'arcadia_id')
this.sReferentiel = [];
if (this.storeFilters.length > 0){
this.$delete(this.storeFilters, index);
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
}else{
this.reset();
}
},
reset(){
this.resetFolder();
this.sTypevue = [];
this.sTypemedias = [];
this.sEtiquettes = [];
this.sReferentiel = [];
this.sTexte = '';
this.$store.commit({
type: 'updateFilters',
filters: []
});
},
resetFolder() {
this.$store.commit({
type: 'updateFolder',
folder: this.storeSujet > 1 ? 0 : -1
});
}
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,150 @@
<template>
<div class="folder_container">
<div :style="isLoading === true ? 'display:block' : 'display:none;'" class="loader">
<i class="fal fa-circle-notch fa-spin"></i>
</div>
<div class="folder_menu" data-id="">
<ul class="menu-options">
<li class="menu-option propertyItem">Propriétés</li>
<!-- SI ADMIN -->
<li class="menu-option renameItem">Renommer</li>
<li class="menu-option removeItem">Supprimer</li>
<li class="menu-option addItem">Ajouter un dossier</li>
<!-- END SI ADMIN -->
</ul>
</div>
<a href="#" @click="selectFolder({id: 0, libelle: 'racine'})" ondragstart="return false;" :class="storeFolder === 0 ? 'root_folder selected' : 'root_folder'" data-id="0">/racine <span class="count">{{racineCount}}</span></a>
<div class="dd">
<ol class="dd-list dd3-list root">
<li v-for="item in folders"
:class="item.parent_id === null ? 'dd-item dd3-item parent' : 'dd-item dd3-item'"
:data-id="item.id">
<div
:class="item.parent_id === null ? 'dd-handle dd3-handle no-handle' : 'dd-handle dd3-handle'"></div>
<div @click="selectFolder(item)" :class="item.id === storeFolder ? 'dd3-content selected' : 'dd3-content'">
<input type="text" value="" class="input_rename" maxlength="100">
<span>{{item.libelle}}</span>
<div class="count">{{item.mediacount}}</div>
<i v-if="item.system === 0" :class="item.favoris === true ? 'fas fa-star' : 'fal fa-star'"></i>
</div>
<ol v-if="item.sousdossiers.length > 0" class='dd-list'>
<li v-for="item2 in item.sousdossiers"
:class="item2.parent_id === null ? 'dd-item dd3-item parent' : 'dd-item dd3-item'"
:data-id="item2.id">
<div
:class="item2.parent_id === null ? 'dd-handle dd3-handle no-handle' : 'dd-handle dd3-handle'"></div>
<div @click="selectFolder(item2)" :class="item2.id === storeFolder ? 'dd3-content selected' : 'dd3-content'">
<input type="text" value="" class="input_rename" maxlength="100">
<span>{{item2.libelle}}</span>
<div class="count">{{item2.mediacount}}</div>
<i v-if="item2.system === 0"
:class="item2.favoris === true ? 'fas fa-star' : 'fal fa-star'"></i>
</div>
<ol v-if="item2.sousdossiers.length > 0" class='dd-list'>
<li v-for="item3 in item2.sousdossiers"
:class="item3.parent_id === null ? 'dd-item dd3-item parent' : 'dd-item dd3-item'"
:data-id="item3.id">
<div
:class="item3.parent_id === null ? 'dd-handle dd3-handle no-handle' : 'dd-handle dd3-handle'"></div>
<div @click="selectFolder(item3)" :class="item3.id === storeFolder ? 'dd3-content selected' : 'dd3-content'">
<input type="text" value="" class="input_rename" maxlength="100">
<span>{{item3.libelle}}</span>
<div class="count">{{item3.mediacount}}</div>
<i v-if="item3.system === 0"
:class="item3.favoris === true ? 'fas fa-star' : 'fal fa-star'"></i>
</div>
</li>
</ol>
</li>
</ol>
</li>
</ol>
</div>
</div>
</template>
<script>
export default {
name: "FolderComponent",
computed: {
storeSujet() {
return this.$store.state.sujet;
},
storeFolder() {
return this.$store.state.folder;
},
storeFilters() {
return this.$store.state.filters;
},
},
data() {
return {
'isLoading': true,
'oFolders': [],
'racineCount': 0,
'folders': [],
}
},
watch: {
storeSujet() {
this.initFolders();
},
storeFolder() {
if (this.storeFolder === 0){
this.selectFolder({id: 0, libelle: 'racine'});
}
}
},
methods: {
initFolders() {
this.isLoading = true;
this.folders = [];
this.racineCount = 0;
axios.get('/ajax-v2/load-folders', {
params: {
sujet_id: this.storeSujet,
}
}).then(response => {
this.oFolders = response.data.data;
this.racineCount = response.data.racineCount;
this.renderItems();
this.isLoading = false;
}).catch(function (error) {
console.log(error);
});
},
renderItems() {
const favs = this.oFolders.filter(item => item.favoris === true);
favs.forEach(item => {
this.folders.push(item);
});
this.oFolders.forEach(item => {
if (item.favoris === false) {
this.folders.push(item);
}
});
},
selectFolder(item) {
let filter = this.storeFilters.findIndex(e => e.type === 'dossier_id');
if (filter !== -1){
this.$delete(this.storeFilters, filter);
}
this.storeFilters.push({ type: 'dossier_id', legend: 'Dossier : ', value: item.id, libelle: item.libelle });
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
this.$store.commit({
type: 'updateFolder',
folder: item.id
});
}
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,57 @@
<template>
<header>
<h1><i class="fas fa-images"></i> Gestion des médias</h1>
<select v-model="sujet" id="sujet_selector">
<option v-for="sujet in oSujets" :value="sujet.codeSujet">{{sujet.libelle}}</option>
</select>
<div class="close_side_menu"><i class="fas fa-chevron-left"></i></div>
</header>
</template>
<script>
export default {
name: "SideHeaderComponent",
mounted() {
this.oSujets = JSON.parse(this.sujets);
this.sujet = this.current;
},
props: [
'sujets',
'current'
],
data() {
return {
'oSujets': [],
'sujet': 1
}
},
watch: {
sujet() {
axios.get('/ajax-v2/get-datas-by-sujet', {
params: {
sujet_id: this.sujet
}
}).then(response => {
this.$store.commit({
type: 'updateSujet',
sujet: this.sujet
});
this.$store.commit({
type: 'updateTypesVue',
typesvue: response.data.typesvue
});
this.$store.commit({
type: 'updateTypesVariantes',
typesvariantes: response.data.typesvariantes
});
}).catch(function (error) {
console.log(error);
});
}
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,62 @@
<template>
<div class="order">
<v-select v-model="sorter" placeholder="Trier par :" :options="fillSelect" :clearable="false" :searchable="false" @input="changeOrder"></v-select>
</div>
</template>
<script>
export default {
name: "SorterComponent",
created () {
this.sorter = this.fillSelect.find(e => e.value === 'updated_at' && e.order === 'desc');
this.changeOrder();
},
computed: {
storeFilters () {
return this.$store.state.filters
}
},
data: function () {
return {
'sorter': '',
'fillSelect': [
{ value: 'created_at', order: 'asc', label: 'Date de création ▲' },
{ value: 'created_at', order: 'desc', label: 'Date de création ▼' },
{ value: 'updated_at', order: 'asc', label: 'Date de modification ▲' },
{ value: 'updated_at', order: 'desc', label: 'Date de modification ▼' },
{ value: 'libelle', order: 'asc', label: 'Libellé ▲' },
{ value: 'libelle', order: 'desc', label: 'Libellé ▼' },
{ value: 'version', order: 'asc', label: 'Version ▲' },
{ value: 'version', order: 'desc', label: 'Version ▼' },
]
}
},
methods: {
changeOrder() {
let data = this.sorter;
let filter = this.storeFilters.findIndex(e => e.type === 'order');
if (filter !== -1){
this.$delete(this.storeFilters, filter)
}
this.storeFilters.push({ type: 'order', legend: 'Trié par : ', value: data.value, order: data.order, libelle: data.label });
this.$store.commit({
type: 'updateFilters',
filters: this.storeFilters
});
}
},
watch: {
storeFilters() {
let filter = this.storeFilters.find(e => e.type === 'order');
if (!filter){
this.sorter = this.fillSelect.find(e => e.value === 'updated_at' && e.order === 'desc');
this.changeOrder();
}
}
},
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,126 @@
<template>
<div id="form_media" v-show="display">
<input type="text" value="" id="copyclipboard" style="position: absolute; left: -1000px; top: -1000px;">
<header class="group">
<a href="#" @click="currentTab = 'preview'" :class="currentTab === 'preview' ? 'tabbtn form_media_preview active' : 'tabbtn form_media_preview'" data-tab="0">Aperçu</a>
<div v-show="this.storeMedia.dossier_id !== 1">
<a href="#" @click="currentTab = 'edit'" :class="currentTab === 'edit' ? 'tabbtn form_media_edit active' : 'tabbtn form_media_edit'" data-tab="1">Edition</a>
<a href="#" @click="currentTab = 'links'" :class="currentTab === 'links' ? 'tabbtn form_media_links active' : 'tabbtn form_media_links'" data-tab="2">Vignettes</a>
<a href="#" @click="currentTab = 'history'" :class="currentTab === 'history' ? 'tabbtn form_media_history active' : 'tabbtn form_media_history'" data-tab="3">Historique</a>
<a @click="close" href="#" class="form_media_close"><i class="fal fa-times"></i></a>
<a href="#" class="float-right mr-10 copyclipboard" v-clipboard="'https://dam.lesidc.com/media/' + this.storeMedia.uid" title="Copier le lien"><i class="fas fa-link"></i></a>
<a v-show="currentTab === 'edit' && storeMedia.isLocked === 0" @click="$refs.newMedia.click()" href="#" class="form_media_replace" title="Chargez un autre média"><i class="fas fa-file-upload"></i></a>
</div>
<a v-show="this.storeMedia.dossier_id === 1" @click="close" href="#" class="form_media_close"><i class="fal fa-times"></i></a>
</header>
<div class="main_content">
<mm-me-tab-preview :currentTab="currentTab"></mm-me-tab-preview>
<mm-me-tab-edit :currentTab="currentTab" :typemedias="typemedias" :langues="langues" :societes="societes" :marques="marques" :etiquettes="etiquettes" :copyrights="copyrights"></mm-me-tab-edit>
<mm-me-tab-links :currentTab="currentTab"></mm-me-tab-links>
<mm-me-tab-history :currentTab="currentTab"></mm-me-tab-history>
</div>
<div id="newMedia" ref="newMedia" style="display: none"></div>
</div>
</template>
<script>
// ResumableJs
import Resumable from 'resumablejs';
export default {
name: "EditComponent",
props: [
'typemedias',
'langues',
'societes',
'marques',
'etiquettes',
'copyrights'
],
mounted() {
console.log('EditComponent Mounted.');
},
computed: {
storeMedia () {
return this.$store.state.media
},
storeRole () {
return this.$store.state.role
}
},
data (){
return {
display: false,
defaultTab: 'preview',
currentTab: 'preview'
}
},
watch: {
storeMedia() {
this.display = Object.keys(this.storeMedia).length > 0;
if (Object.keys(this.storeMedia).length > 0){
this.setupResumable();
}
}
},
methods: {
setupResumable() {
this.r = new Resumable({
target: '/ajax-v2/upload-media',
simultaneousUploads: 1,
maxFiles: 1,
testChunks: false,
fileParameterName: 'files',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
},
query: {
uid: this.createUUID(),
sujet_id: this.storeMedia.sujet_id,
dossier_id: this.storeMedia.dossier_id,
replaceMediaId: this.storeMedia.id
}
});
this.r.on('fileAdded', this.uploadFileAdded);
this.r.on('fileSuccess', this.uploadFileSuccess);
this.r.on('complete', this.uploadFileComplete);
this.r.assignBrowse(this.$refs.newMedia);
},
createUUID(){
let dt = new Date().getTime();
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
const r = (dt + Math.random() * 16) % 16 | 0;
dt = Math.floor(dt / 16);
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
},
close(){
this.$store.commit({
type: 'updateMedia',
media: {}
});
this.currentTab = this.defaultTab;
},
uploadFileAdded(file, event){
this.$loading.show({delay:0});
this.r.upload();
},
uploadFileSuccess(file, message) {
this.$store.commit({
type: 'updateMedia',
media: JSON.parse(message)
});
this.$loading.hide();
},
uploadFileComplete() {
alert("Media uploadé !");
},
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,472 @@
<template>
<div :class="currentTab === 'edit' ? 'tab tab_edit active' : 'tab tab_edit'">
<div class="tab_content">
<div v-if="Object.keys(this.oMedia).length > 0" class="wrapper">
<h3>Informations générales</h3>
<form class="form_edit_media" action="#" method="post">
<div class="row arcadia_fields">
<label v-if="this.oMedia.arcadia_id !== null">Arcadia ID : {{this.oMedia.arcadia_id}}</label>
<div v-if="storeRole === 1">
<button @click="ArcadiaLink"
v-if="this.oMedia.arcadia_id === null && this.oMedia.isLocked === 0"
class="btn btn-square btn-arcadia-link" type="button" name="button"><i
class="far fa-link"></i> Lier avec Arcadia
</button>
<span v-if="this.oMedia.arcadia_id === null && this.oMedia.isLocked === 1"
class="is-locked">En attente de liaison Arcadia</span>
</div>
</div>
<div class="row">
<label>Sujet <span>*</span> : {{this.oMedia.sujet.libelle}}</label>
<label>Type de média <span>*</span> : {{this.oMedia.typemedia.libelle}}</label>
<label>Date de création : {{this.oMedia.created_at}}</label>
<label>Date de modification : {{this.oMedia.updated_at}}</label>
<label>Créé par : {{this.oMedia.owner.firstname + ' ' + this.oMedia.owner.lastname + ' (' +
this.oMedia.owner.matricule + ')'}}</label>
</div>
<div class="row">
<label>Intitulé <span>*</span></label>
<input type="text" id="libelle" name="libelle" maxlength="50" required v-model="oMedia.libelle">
</div>
<div class="row">
<label>Type de vue <span>*</span></label>
<select id="typevues" name="typevues" required v-model="oMedia.typevue_id"
:disabled="this.oMedia.arcadia_id !== null" @change="oMedia.variante_id = null">
<option v-for="item in storeTypesvue" :value="item.codeTypevue">{{item.libelle}}</option>
</select>
</div>
<div class="row">
<label>Type de variante <span>*</span></label>
<select id="variantes" name="variantes" required v-model="oMedia.variante_id"
:disabled="this.oMedia.arcadia_id !== null">
<option v-for="item in storeTypesvariante.filter(e => e.typevue_id === oMedia.typevue_id)"
:value="item.codeVariante">{{item.libelle}}
</option>
</select>
</div>
<div class="row">
<label>Langue <span>*</span></label>
<select id="langues" name="langues" required disabled v-model="oMedia.langue_id">
<option v-for="item in JSON.parse(langues)" :value="item.langue_id">{{item.libelle}}
</option>
</select>
</div>
<div class="row">
<label>Commentaire</label>
<textarea id="commentaire" name="commentaire" v-model="oMedia.commentaire"></textarea>
</div>
<div class="row">
<label>Version <span>*</span></label>
<input type="number" id="version" name="version" required v-model="oMedia.version"
:disabled="this.oMedia.arcadia_id !== null">
</div>
<!--<div class="row">
<label>Date de publication</label>
<input type="date" id="published_at" name="published_at" v-model="oMedia.published_at">
</div>-->
<div class="row">
<label>Statut</label>
<select id="statut" name="statut" v-model="oMedia.statut">
<option value="0">Brouillon</option>
<option value="1">Public</option>
<option value="2">Public étendu</option>
</select>
</div>
<div class="row">
<label>Copyright</label>
<select id="copyrights" name="copyrights" v-model="oMedia.copyright_id">
<option v-for="item in JSON.parse(copyrights)" :value="item.copyright_id">{{item.libelle}}
</option>
</select>
</div>
</form>
</div>
<div class="wrapper">
<h3>Tags & étiquettes</h3>
<div class="row">
<label>Nuage de tags</label>
<v-select :options="[]" label="libelle" :create-option="item => ({ id: 0, libelle: item })"
v-model="oMedia.tags" taggable multiple></v-select>
</div>
<div class="row">
<label>Etiquette</label>
<select id="etiquettes" name="etiquettes" v-model="oMedia.etiquette_id">
<option v-for="item in JSON.parse(etiquettes)" :value="item.etiquette_id">{{item.libelle}}
</option>
</select>
</div>
</div>
<div v-if="this.oMedia.sujet_id === 1 || this.oMedia.sujet_id === 2 || this.oMedia.sujet_id === 4"
class="wrapper arcadia_fields">
<h3>Informations liées au sujet</h3>
<div v-if="this.oMedia.sujet_id === 4" class="row societe_form dataform">
<label>Société</label>
<div class="selector_form selector_societes">
<input type="text" class="selector_filter" v-model="searchSocietes" name="search" placeholder="Rechercher..."
autocomplete="off">
<div class="selector_list">
<ul class="selector_choices">
<li v-for="item in oSocietes" :data-value="item.id"
@click="AddSocietes(item)">{{item.libelle}}
</li>
</ul>
<ul class="selector_values">
<li v-for="item in this.oMedia.societes" :data-value="item.id"
@click="DeleteSocietes(item.id)">{{item.libelle}}
</li>
</ul>
</div>
</div>
</div>
<div v-if="this.oMedia.sujet_id === 2" class="row marque_form dataform">
<label>Marque</label>
<div class="selector_form selector_marques">
<input type="text" class="selector_filter" v-model="searchMarques" name="search"
placeholder="Rechercher..." autocomplete="off">
<div class="selector_list">
<ul class="selector_choices">
<li v-for="item in oMarques" :data-value="item.codMarq"
@click="AddMarques(item)">{{item.libMarq}}
</li>
</ul>
<ul class="selector_values">
<li v-for="item in this.oMedia.marques" :data-value="item.codMarq"
@click="DeleteMarques(item.codMarq)">{{item.libMarq}}
</li>
</ul>
</div>
</div>
</div>
<div v-if="this.oMedia.sujet_id === 1" class="row_xl article_form">
<label>Articles associées</label>
<div class="article_selector">
<table>
<thead>
<tr>
<th>No Article</th>
<th>Famille Vente</th>
<th>Marque</th>
<th>Gencod Administratif</th>
<th>Gencod Symbolise</th>
<th>Gencod Poids</th>
<th></th>
</tr>
</thead>
<tbody>
<tr v-for="item in oMedia.articles">
<td class="col_lib">{{item.noArt}} : {{item.libCcial}}</td>
<td class="col_famVente">{{item.codFamVte}}</td>
<td class="col_marque">{{item.codMarq}}</td>
<td class="col_gencodAdm">{{item.codGencodAdm}}</td>
<td class="col_gencodSymb">{{item.codGencodSymb}}</td>
<td class="col_gencodPds">{{item.codGencodPds}}</td>
<td><a @click="DeleteArticles(item.id)" href="#" class="remove_article"><i
class="far fa-times"></i></a></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="7"></td>
</tr>
</tfoot>
</table>
<br/>
<button class="add_article btn btn-black btn-square floatr" type="button" name="button"
@click="AddArticles"><i class="far fa-plus"></i> Ajouter
</button>
</div>
</div>
</div>
<div class="wrapper">
<h3>Informations techniques</h3>
<div class="row">
<label>Extension : {{this.oMedia.extension}}</label>
<label>Résolution (dpi) : {{this.oMedia.resolution}}</label>
</div>
<div class="row">
<label>Largeur : {{this.oMedia.largeur}}</label>
<label>Hauteur : {{this.oMedia.hauteur}}</label>
</div>
<div class="row">
<label>Largeur en mm : {{this.oMedia.largeur_mm}}</label>
<label>Hauteur en mm : {{this.oMedia.hauteur_mm}}</label>
</div>
</div>
</div>
<div class="button_bar">
<!--<button v-if="this.storeMedia.role === 1 || this.storeMedia.role === 3" class="btn btn-red btn_tab_edit_delete" type="button" name="button" :disabled="this.oMedia.isLocked === 1">Supprimer</button>-->
<button @click="CheckForm" v-if="storeRole !== 2" class="btn btn_tab_edit_save" type="button" name="button"
:disabled="this.oMedia.isLocked === 1">Sauvegarder
</button>
<!-- <a href="#" class="btn btn-black mr-10 btn_tab_edit_cancel">Fermer</a>-->
</div>
</div>
</template>
<script>
export default {
name: "EditComponent",
props: [
'currentTab',
'typemedias',
'langues',
'societes',
'marques',
'etiquettes',
'copyrights'
],
mounted() {
this.oMarques = JSON.parse(this.marques);
this.oSocietes = JSON.parse(this.societes);
},
computed: {
storeMedia() {
return this.$store.state.media
},
storeTypesvue() {
return this.$store.state.typesvue;
},
storeTypesvariante() {
return this.$store.state.typesvariantes;
},
storeRole() {
return this.$store.state.role
}
},
watch: {
storeMedia() {
this.oMedia = this.storeMedia;
},
searchMarques() {
if (this.searchMarques.length > 0) {
this.oMarques = JSON.parse(this.marques).filter(item => item.libMarq.toLowerCase().indexOf(this.searchMarques.toLowerCase()) >= 0);
}else{
this.oMarques = JSON.parse(this.marques);
}
},
searchSocietes() {
if (this.searchSocietes.length > 0) {
this.oSocietes = JSON.parse(this.societes).filter(item => item.libelle.toLowerCase().indexOf(this.searchSocietes.toLowerCase()) >= 0);
}else{
this.oSocietes = JSON.parse(this.societes);
}
},
},
data() {
return {
oMedia: {},
oMarques: {},
oSocietes: {},
searchMarques: '',
searchSocietes: ''
}
},
methods: {
ArcadiaLink() {
if (this.oMedia.isDefault === 1) {
$.fancyMessage({
title: "Lier un média à Arcadia",
message: "Ce média ne peut pas être lié car il possède un visuel par défaut.",
type: "error"
});
} else if (this.oMedia.statut === 0) {
$.fancyMessage({
title: "Lier un média à Arcadia",
message: "Vous ne pouvez pas lier un brouillon à Arcadia.",
type: "error"
});
} else {
this.CheckRefKey(this.SetIdArcadia);
}
},
CheckRefKey(callback) {
axios.post('/ajax/check-ref-key', {
media_id: this.oMedia.id
}).then(response => {
if (response.data === false) {
$.fancybox.close();
$.fancyMessage({
title: "Erreur",
message: "Vous devez avoir au minimum 1 clé de référentiel.",
type: "error"
});
} else {
let result = confirm("Êtes-vous sur de vouloir lancer le traitement ?");
if (result !== true)
return false;
callback();
}
}).catch(function (error) {
console.log(error);
$.fancybox.close();
$.fancyMessage({
title: "Erreur",
message: "Erreur lors de l'opération, merci d'actualiser la page.",
type: "error"
});
});
},
SetIdArcadia() {
axios.post('/ajax/set-id-arcadia', {
media_id: this.oMedia.id
}).then(response => {
if (response.data === true) {
this.oMedia.isLocked = 1;
$.fancybox.close();
$.fancyMessage({
title: "Lier un média à Arcadia",
message: "La demande à été effectuée, votre média est temporairement bloqué.",
type: "info"
});
} else {
$.fancybox.close();
$.fancyMessage({
title: "Lier un média à Arcadia",
message: "Une erreur est survenue. Traitement impossible.",
type: "error"
});
}
}).catch(function (error) {
$.fancybox.close();
$.fancyMessage({
title: "Lier un média à Arcadia",
message: "Erreur lors de l'opération, merci d'actualiser la page.",
type: "error"
});
console.log(error);
});
},
CheckForm() {
// On check si tous les champs obligatoires sont remplis
if (this.oMedia.libelle.length === 0 || this.oMedia.typevue_id === null || this.oMedia.variante_id === null || this.oMedia.langue_id === null || this.oMedia.version.length === 0) {
$.fancyMessage({
title: "Sauvegarde d'un média",
message: "Le formulaire a mal été renseigné. merci de corriger.",
type: "error"
});
} else {
// Si c'est lié a Arcadia on check les clés refs
if (this.oMedia.arcadia_id !== null) {
this.CheckRefKey(this.SaveMedia);
} else {
this.SaveMedia();
}
}
},
SaveMedia() {
const _this2 = this;
axios.post('/ajax/save-media', {
media: this.oMedia
}).then(response => {
if (response.data.status === true) {
_this2.oMedia = response.data.datas;
this.$store.commit({
type: 'updateMedia',
media: response.data.datas
});
$.fancyMessage({
title: "Sauvegarde d'un média",
message: "Les données ont bien été enregistrées",
type: "info"
});
} else {
$.fancyMessage({title: "Sauvegarde d'un média", message: response.data.error, type: "error"});
}
}).catch(function (error) {
$.fancybox.close();
$.fancyMessage({
title: "Sauvegarde d'un média",
message: "Erreur lors de l'opération, merci d'actualiser la page.",
type: "error"
});
console.log(error);
});
},
AddArticles() {
if (this.oMedia.isLocked === 1)
return;
let arcadia_id = prompt("Indiquez le code Arcadia de l'article.", arcadia_id);
// Si la saisie est vide on affiche le message d'erreur et on n'execute pas l'ajax
if (arcadia_id === null)
return;
if (arcadia_id === "") {
$.fancybox.close();
$.fancyMessage({
title: "Lier un média à un article Arcadia",
message: "Le code Arcadia est vide.",
type: "error"
});
}
axios.post('/ajax/get-article', {
arcadia_id: arcadia_id
}).then(response => {
const result = response.data;
if (result === false) {
$.fancyMessage({
title: "Impossible d'ajouter l'article",
message: "La référence de cet article n'a pas été trouvé.",
type: "error"
});
} else {
if (result.article.utilisableGroupe === 1) {
const index = this.oMedia.articles.find(e => e.noArt === result.article.noArt);
if (!index) {
this.oMedia.articles.push(result.article);
} 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: "Cet article n'est pas actif.",
type: "error"
});
}
}
}).catch(function (error) {
$.fancyMessage({
title: "Attention",
message: "Erreur lors de l'opération, merci d'actualiser la page.",
type: "error"
});
console.log(error);
});
},
DeleteArticles(article_id) {
if (this.oMedia.isLocked === 1)
return;
this.oMedia.articles = this.oMedia.articles.filter(e => e.id !== article_id);
},
AddMarques(marque) {
const index = this.oMedia.marques.find(e => e.codMarq === marque.codMarq);
if (!index) {
this.oMedia.marques.push(marque);
}
},
DeleteMarques(codMarq) {
if (this.oMedia.isLocked === 1)
return;
this.oMedia.marques = this.oMedia.marques.filter(e => e.codMarq !== codMarq);
},
AddSocietes(societe) {
const index = this.oMedia.societes.find(e => e.id === societe.id);
if (!index) {
this.oMedia.societes.push(societe);
}
},
DeleteSocietes(id) {
if (this.oMedia.isLocked === 1)
return;
this.oMedia.societes = this.oMedia.societes.filter(e => e.id !== id);
},
}
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,65 @@
<template>
<div :class="currentTab === 'history' ? 'tab tab_history active' : 'tab tab_history'">
<div class="tab_content">
<div class="wrapper">
<h3>Historique des actions</h3>
<table>
<thead>
<tr>
<th>DATE</th>
<th>UTILISATEUR</th>
<th>TYPE</th>
<th>COMMENTAIRE</th>
</tr>
</thead>
<tbody>
<tr v-for="item in history">
<td>{{item.created_date}}</td>
<td>{{item.user.firstname}} {{item.user.lastname}} ({{item.user.matricule}})</td>
<td>{{item.type}}</td>
<td>{{item.description}}</td>
</tr>
</tbody>
<tfoot><tr><td colspan="4"></td></tr></tfoot>
</table>
</div>
</div>
</div>
</template>
<script>
export default {
name: "HistoryComponent",
props: [
'currentTab',
],
computed: {
storeMedia () {
return this.$store.state.media
},
},
data() {
return {
history: []
}
},
watch: {
storeMedia() {
if (Object.keys(this.storeMedia).length > 0 && (this.storeMedia.history === undefined)){
const _this2 = this;
axios.post('/ajax/get-media-others-infos', {
media_id: this.storeMedia.id
}).then(response => {
_this2.history = response.data.history;
}).catch(error => {
console.log(error);
});
}
}
},
}
</script>
<style scoped>
</style>

View file

@ -0,0 +1,74 @@
<template>
<div :class="currentTab === 'links' ? 'tab tab_links active' : 'tab tab_links'">
<div class="tab_content">
<div class="wrapper">
<h3>Liens vers les vignettes</h3>
<table class="table_links">
<thead>
<tr>
<th>FORMAT</th>
<th>URL</th>
<th></th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in links">
<td class="link_libelle">Format {{index}} {{item.extension}} {{item.largeur}}x{{item.hauteur}}px</td>
<td class="link_input">
<input type="text" readonly :value="item.url">
</td>
<td class="ctas">
<i class="fal fa-copy" v-clipboard="item.url"></i>
<a :href="item.url" :download="storeMedia.libelle.replace(' ', '_') + '_' + item.largeur + 'x' + item.hauteur + 'px'"><i class="fas fa-arrow-circle-down"></i></a>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="3"></td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</template>
<script>
export default {
name: "LinksComponent",
props: [
'currentTab',
],
computed: {
storeMedia () {
return this.$store.state.media
},
},
data() {
return {
links: []
}
},
watch: {
storeMedia() {
if (Object.keys(this.storeMedia).length > 0 && (this.storeMedia.vignettes === undefined)){
const _this2 = this;
axios.post('/ajax/get-media-others-infos', {
media_id: this.storeMedia.id
}).then(response => {
_this2.links = response.data.vignettes;
}).catch(error => {
console.log(error);
});
}
}
},
}
</script>
<style scoped>
.ctas {
display: flex;
}
</style>

View file

@ -0,0 +1,26 @@
<template>
<div :class="currentTab === 'preview' ? 'tab tab_preview active' : 'tab tab_preview'">
<img-preview :id="'openseadragon_' + this.storeMedia.id" nStyle="width: 100%; height: 100%;" :options="{tileSources: {type: 'image', url: this.storeMedia.folder + this.storeMedia.uid + '.' + this.storeMedia.extension + '?t='+ new Date().getTime() }}"></img-preview>
<div v-if="(this.storeMedia.typemedia_id === 1 || this.storeMedia.typemedia_id === 5) && (this.storeMedia.ext === 'gif' || this.storeMedia.ext === 'pdf')">
<img v-if="this.storeMedia.ext === 'gif'" class="svgElt" :src="this.storeMedia.folder + this.storeMedia.uid + '.' + this.storeMedia.extension + '?t='+ new Date().getTime()"/>
<embed v-else-if="this.storeMedia.ext === 'pdf'" :src="this.storeMedia.folder + this.storeMedia.uid + '.' + this.storeMedia.extension + '?t='+ new Date().getTime()" type="application/pdf">
</div>
<img v-if="this.storeMedia.typemedia_id === 2" class="svgElt" :src="this.storeMedia.folder + this.storeMedia.uid + '.' + this.storeMedia.extension + '?t='+ new Date().getTime()"/>
<audio v-if="this.storeMedia.typemedia_id === 4" controls :src="this.storeMedia.folder + this.storeMedia.uid + '.' + this.storeMedia.extension + '?t='+ new Date().getTime()"></audio>
<video v-if="this.storeMedia.typemedia_id === 3" :src="this.storeMedia.folder + this.storeMedia.uid + '.' + this.storeMedia.extension + '?t='+ new Date().getTime()" controls></video>
</div>
</template>
<script>
export default {
name: "PreviewComponent",
props: [
'currentTab'
],
computed: {
storeMedia () {
return this.$store.state.media
}
}
}
</script>

979
resources/js/media.js vendored

File diff suppressed because it is too large Load diff

View file

@ -15,13 +15,13 @@ $(document).ready(function() {
});
// ---- Initialisation du champ de recherche
$(".search_filters .search_value").on('keypress',function(event) {
/*$(".search_filters .search_value").on('keypress',function(event) {
if (event.keyCode == 13) {
$(".search_filters .search_btn").trigger('click');
}
});
});*/
// ---- Clique sur le bouton de recherche
/*// ---- Clique sur le bouton de recherche
$(".search_filters .search_btn").on('click', function(event) {
// on créé un object filtre
var filter = {
@ -32,15 +32,15 @@ $(document).ready(function() {
};
// MAJ du filtre principal et de l'affichage
updateFilter(filter);
//updateFilter(filter);
// On lance la recherche
var sujet_id = $("#sujet_selector").val();
$(window).data('offset', 0);
loadMedia(sujet_id, 1);
});
});*/
// ---- Clique sur un filtre
/*// ---- Clique sur un filtre
$(".filter").on('click', 'input[type="checkbox"]', function(event) {
var values = [];
var libelles = [];
@ -62,15 +62,15 @@ $(document).ready(function() {
});
// MAJ du filtre principal et de l'affichage
updateFilter(filter);
//updateFilter(filter);
// On lance la recherche
var sujet_id = $("#sujet_selector").val();
$(window).data('offset', 0);
loadMedia(sujet_id);
});
});*/
// ---- Réinitialisation de la recherche
/*// ---- Réinitialisation de la recherche
$(".reinit_search_btn").on('click', function(event) {
event.preventDefault();
// Vide la barre recherche
@ -91,10 +91,10 @@ $(document).ready(function() {
var sujet_id = $("#sujet_selector").val();
$(window).data('offset', 0);
loadMedia(sujet_id);
});
});*/
// ---- Suppression d'un filtre
$(".search_filters_list").on('click', '.filter_item', function(event) {
/*$(".search_filters_list").on('click', '.filter_item', function(event) {
event.preventDefault();
var filters = $(window).data('filter');
var type = $(this).attr('id');
@ -126,7 +126,7 @@ $(document).ready(function() {
var sujet_id = $("#sujet_selector").val();
$(window).data('offset', 0);
loadMedia(sujet_id);
});
});*/
}
});
@ -147,16 +147,16 @@ window.updateFilter = function(filter){
$(window).data('filter', filters);
// si le filtre n'existe pas dans la liste on l'ajoute
if(!$(".search_filters_list #"+filter.type).length){
/*if(!$(".search_filters_list #"+filter.type).length){
var output = '<a id="'+filter.type+'" class="filter_item" href="#">';
output += '<span class="libelle">'+filter.legend+'</span>';
output += '<span class="value"></span>';
output += '<i class="delete_filter fal fa-times"></i>';
output += '</a>';
$(".search_filters_list").append(output);
}
}*/
$(".search_filters_list #"+filter.type+" .value").html(filter.libelle.join());
//$(".search_filters_list #"+filter.type+" .value").html(filter.libelle.join());
}
// affiche/masque le bouton de reinitialisation

View file

@ -1,5 +1,6 @@
// Variables
@import "vue-select/src/scss/vue-select.scss";
@import 'partials/app_variables.scss',
'partials/reset.scss',
'partials/animate.scss',
@ -16,4 +17,5 @@
'partials/form.scss',
'partials/media.scss',
'partials/panier.scss',
'partials/user.scss';
'partials/user.scss',
'partials/vselect-custom.scss';

View file

@ -42,9 +42,9 @@
left: 50%;
background-color: #24272e;
padding: 9px;
min-width: 163px;
min-width: 170px;
transform: translateX(-50%);
z-index: 2;
z-index: 55;
&.list_etiquette li label{
color: $white;
@ -100,7 +100,7 @@
}
}
.reinit_search_btn{
display: none;
/*display: none;*/
color: #2ea8e5;
margin-left: 4px;
font-size: 11px;
@ -114,8 +114,8 @@
.action_wrapper{
background-color: $grey;
width: 100%;
height: 45px;
overflow: hidden;
height: 50px;
/*overflow: hidden;*/
a{
font-size: 13px;
@ -171,6 +171,7 @@
}
}
.order{
width: 240px;
float: right;
padding: 11px;
span{
@ -178,10 +179,10 @@
display: none;
}
}
select{
/*select{
padding: 5px 0px;
color: $grey;
}
}*/
}
}
}
@ -210,8 +211,9 @@
overflow-y: auto;
overflow-x: hidden;
scrollbar-color: #272626 #1a1a1a;
position: relative;
position: absolute;
height: calc(100% - 174px);
width: 100%;
.loader{
position: sticky;
@ -230,6 +232,7 @@
.wrapper{
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
.imageItem{
display: inline-block;
@ -783,13 +786,14 @@
position: relative;
padding: 12px;
border: none;
color: white;
&:after{
content: '';
position: absolute;
top: 50%;
left: 50%;
background-color: $lightdark;
background-color: #e74c3c;
transform: translate(-50%,-50%);
transition: 0.2s ease-in-out;
border-radius: 36px;
@ -809,7 +813,7 @@
z-index: 1;
}
}
.form_media_download, .form_media_replace{
.form_media_download, .form_media_replace, .copyclipboard{
float: right;
font-size: 26px;
margin-right: 5px;

View file

@ -266,3 +266,7 @@
color: $white;
font-size: 13px;
}
.dd-empty {
display: none !important;
}

View file

@ -0,0 +1,9 @@
.vs__dropdown-toggle {
background: white!important;
}
.search-form button {
margin-top: 0!important;
}
.v-select {
margin-bottom: 20px!important;
}

View file

@ -23,6 +23,7 @@
</script>
</head>
<body>
<div id="vue-app" style="display: inline;">
@yield('header')
@yield('content')
@ -60,7 +61,7 @@
</div>
</div>
@endif
</div>
<!-- Scripts -->
<script src="{{ asset('js/jquery.fancybox.min.js') }}" defer></script>
<script src="{{ asset('js/app.js') }}?ver=1.7"></script>

View file

@ -1,301 +1,3 @@
@section('media_edit')
<div id="form_media" style="display: none;">
<input type="text" value="" id="copyclipboard" style="position: absolute; left: -1000px; top: -1000px;">
<header class="group">
<a href="#" class="tabbtn form_media_preview active" data-tab="0">Aperçu</a>
<a href="#" class="tabbtn form_media_edit" data-tab="1">Edition</a>
@if (Auth::user()->hasRole([config('roles.const.ADMIN')]))
<a href="#" class="tabbtn form_media_retouch" data-tab="2">Retouche</a>
@endif
@if (Auth::user()->hasRole([config('roles.const.LECTEUR')]))
<a href="#" class="tabbtn form_media_links" data-tab="2">Vignettes</a>
<a href="#" class="tabbtn form_media_history" data-tab="3">Historique</a>
@else
<a href="#" class="tabbtn form_media_links" data-tab="3">Vignettes</a>
<a href="#" class="tabbtn form_media_history" data-tab="4">Historique</a>
@endif
<a href="#" class="form_media_close"><i class="fal fa-times"></i></a>
<a href="#" class="form_media_download" title="Téléchargez ce média"><i class="fas fa-arrow-circle-down"></i></a>
<a href="#" class="form_media_replace" title="Chargez un autre média"><i class="fas fa-file-upload"></i></a>
</header>
<div class="main_content">
<div class="tab tab_preview active"></div>
<div class="tab tab_edit">
<div class="tab_content">
<div class="wrapper">
<h3>Informations générales</h3>
<form class="form_edit_media" action="#" method="post">
<div class="row arcadia_fields">
<label for="arcadia_id">Arcadia</label>
<input type="text" name="arcadia_id" id="arcadia_id" readonly><br>
<div class="">
@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> Lier avec Arcadia</button>
<span class="is-locked" style="display: none;">En attente de liaison Arcadia</span>
@endif
</div>
</div>
<div class="row">
<label for="libelle">Intitulé <span>*</span></label>
<input type="text" value="" id="libelle" name="libelle" maxlength="50" required>
</div>
<div class="row">
<label for="typesujet">Sujet <span>*</span></label>
<input id="sujetLibelle" type="text" value="" name="sujetLibelle" readonly required >
</div>
<div class="row">
<label for="typemedias">Type de média <span>*</span></label>
<select id="typemedias" name="typemedias" disabled required >
@foreach ($typemedias as $typemedia)
<option value="{{$typemedia->codeTypemedia}}" >{{$typemedia->libelle}}</option>
@endforeach
</select>
</div>
<div class="row">
<label for="typevues">Type de vue <span>*</span></label>
<select id="typevues" name="typevues" required></select>
</div>
<div class="row">
<label for="variantes">Type de variante <span>*</span></label>
<select id="variantes" name="variantes" required></select>
</div>
<div class="row">
<label for="langues">Langue <span>*</span></label>
<select id="langues" name="langues" required>
@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="hidden" id="published_at" name="published_at" >
<!--</div>-->
<div class="row">
<label for="statut">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 arcadia_fields">
<h3>Informations liées au sujet</h3>
<div class="row societe_form dataform">
<label for="societe">Société</label>
<div class="selector_form selector_societes">
<input type="text" class="selector_filter" name="search" value="" placeholder="Rechercher..." autocomplete="off">
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($societes as $societe)
<li data-value="{{$societe->id}}" >{{$societe->libelle}}</li>
@endforeach
</ul>
<ul class="selector_values" >
</ul>
<input class="selector_dataValues" type="hidden" name="societes" value="">
</div>
</div>
</div>
<div class="row marque_form dataform">
<label for="marque">Marque</label>
<div class="selector_form selector_marques">
<input type="text" class="selector_filter" name="search" value="" placeholder="Rechercher..." autocomplete="off">
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->codMarq}}" >{{$marque->libMarq}}</li>
@endforeach
</ul>
<ul class="selector_values" >
</ul>
<input class="selector_dataValues" type="hidden" name="marques" value="">
</div>
</div>
</div>
<div class="row_xl article_form">
<label for="tag">Articles associées</label>
<div class="article_selector">
<table>
<thead>
<tr>
<th>No Article</th>
<th>Famille Vente</th>
<th>Marque</th>
<th>Gencod Administratif</th>
<th>Gencod Symbolise</th>
<th>Gencod Poids</th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr><td colspan="7"></td></tr>
</tfoot>
</table><br/>
<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">
<h3>Tags & étiquettes</h3>
<div class="row">
<label for="tag">Nuage de tags</label>
<div class="cloud_tag_plugin">
<textarea id="tag-editor"></textarea>
</div>
</div>
<div class="row">
<label for="etiquettes">Etiquette</label>
<select id="etiquettes" name="etiquettes">
@foreach ($etiquettes as $etiquette)
<option value="{{$etiquette->etiquette_id}}" >{{$etiquette->libelle}}</option>
@endforeach
</select>
</div>
</div>
<div class="wrapper">
<h3>Informations techniques</h3>
<div class="row">
<label for="extension">Extension</label>
<input type="text" id="extension" name="extension" readonly >
</div>
<div class="row">
<label for="copyrights">Copyright</label>
<select id="copyrights" name="copyrights">
@foreach ($copyrights as $copyright)
<option value="{{$copyright->copyright_id}}" >{{$copyright->libelle}}</option>
@endforeach
</select>
</div>
<div class="row">
<label for="largeur">Largeur</label>
<input type="text" id="largeur" name="largeur" readonly >
</div>
<div class="row">
<label for="hauteur">Hauteur</label>
<input type="text" id="hauteur" name="hauteur" readonly >
</div>
<div class="row">
<label for="resolution">Résolution (dpi)</label>
<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" readonly >
</div>
<div class="row">
<label for="hauteur_mm">Hauteur en mm</label>
<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">Fermer</a>
<a href="#" class="btn btn-black mr-10 copyclipboard"><i class="fas fa-link"></i></a>
@if (Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]))
{{--<button class="btn btn-red btn_tab_edit_delete" type="button" name="button">Supprimer</button>--}}
@endif
@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>
@if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]))
<div class="tab tab_retouch"></div>
@endif
<div class="tab tab_links">
<div class="tab_content">
<div class="wrapper">
<h3>Liens vers les vignettes</h3>
<table class="table_links">
<thead>
<tr>
<th>FORMAT</th>
<th>URL</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<td colspan="2">
</td>
</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>
<div class="tab tab_history">
<div class="tab_content">
<div class="wrapper">
<h3>Historique des actions</h3>
<table>
<thead>
<tr>
<th>DATE</th>
<th>UTILISATEUR</th>
<th>TYPE</th>
<th>COMMENTAIRE</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<td colspan="4">
</td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
<mm-me-edit typemedias='@json($typemedias)' langues='@json($langues)' societes='@json($societes)' marques='@json($marques)' etiquettes='@json($etiquettes)' copyrights='@json($copyrights)'></mm-me-edit>
@endsection

View file

@ -4,90 +4,17 @@
@section('content')
<main class="media_manager template_2col">
<div class="side_menu">
<header>
<h1><i class="fas fa-images"></i> Gestion des médias</h1>
<select id="sujet_selector" >
@foreach ($sujets as $sujet)
<option value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</option>
@endforeach
</select>
<input type="hidden" id="sujetParameter" value="{{ $currentSujet }}">
<input type="hidden" id="folderParameter" value="{{ $currentFolder }}">
<input type="hidden" id="filterParameter" value='{!! $currentFilters !!}'>
<div class="close_side_menu"><i class="fas fa-chevron-left"></i></div>
</header>
<div class="folder_container">
<div style="display:none;" class="loader">
<i class="fal fa-circle-notch fa-spin"></i>
</div>
<div class="folder_menu" data-id="">
<ul class="menu-options">
<li class="menu-option propertyItem">Propriétés</li>
@if (Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]))
<li class="menu-option renameItem">Renommer</li>
<li class="menu-option removeItem">Supprimer</li>
<li class="menu-option addItem">Ajouter un dossier</li>
@endif
</ul>
</div>
<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>
</div>
</div>
<mm-side-header sujets='@json($sujets)' current="{{$currentSujet}}"></mm-side-header>
<mm-folder></mm-folder>
</div>
<div class="main_content">
<header>
<div class="search_wrapper">
<div class="search_filters group">
<input class="search_value" type="text" value="" placeholder="rechercher un média...">
<a href="#" class="btn btn-square btn-black search_btn">Rechercher</a>
<div class="filter_selector filter" data-lib-type="Type de média : " data-type="typemedia_id">
<div class="filter_btn">Type de média <i class="fas fa-caret-down"></i></div>
<div class="list" style="display:none;">
<ul>
@foreach ($typemedias as $typemedia)
<li><input id="typeM_{{$typemedia->codeTypemedia}}" type="checkbox" value="{{$typemedia->codeTypemedia}}" name=""><label for="typeM_{{$typemedia->codeTypemedia}}">{{$typemedia->libelle}}</label></li>
@endforeach
</ul>
</div>
</div>
<div class="filter_selector filter" data-lib-type="Type de vue : " data-type="typevue_id">
<div class="filter_btn">Type de vue <i class="fas fa-caret-down"></i></div>
<div class="list list_typevue" style="display:none;">
<ul></ul>
</div>
</div>
<div class="filter_selector filter" data-lib-type="Etiquette : " data-type="etiquette_id">
<div class="filter_btn">Etiquette <i class="fas fa-caret-down"></i></div>
<div class="list list_etiquette" style="display:none;">
<ul>
@foreach ($etiquettes as $etiquette)
<li><input id="etiq_{{$etiquette->etiquette_id}}" type="checkbox" value="{{$etiquette->etiquette_id}}" name=""><label for="etiq_{{$etiquette->etiquette_id}}" style="background-color:{{$etiquette->color}}; border-color:{{$etiquette->color}}" >{{$etiquette->libelle}}</label></li>
@endforeach
</ul>
</div>
</div>
<div class="filter" data-lib-type="" data-type="arcadia_id">
<input type="checkbox" id="arcadia" name="arcadia" value="1">
<label for="arcadia">Lié au référentiel</label>
</div>
</div>
<div class="filter_wrapper">
<span>Filtres :</span>
<div class="search_filters_list">
</div>
<a class="reinit_search_btn" href="#">Réinitialiser</a>
</div>
</div>
<mm-filters typemedias='@json($typemedias)' etiquettes='@json($etiquettes)'></mm-filters>
<div class="action_wrapper group">
@if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]))
<a href="#" class="action_add_media"><i class="fas fa-file-upload"></i> Ajouter un média</a>
@endif
@if (Auth::user()->hasRole([config('roles.const.CONTRIBUTEUR'), config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]))
<a href="#" class="action_download_media"><i class="fas fa-file-download"></i> Télécharger</a>
@endif
<a href="#" class="action_add_basket"><i class="fas fa-shopping-basket"></i> Ajouter au panier</a>
@if (Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]))
{{--<a href="#" class="action_delete_media"><i class="fas fa-trash-alt"></i> Supprimer</a>--}}
@ -103,26 +30,10 @@
<i class="fas fa-th selected"></i>
<i class="fal fa-list"></i>
</div>
<div class="order">
<span>Trier par : </span>
<select id="order_select" >
<option value="created_at" data-order="asc" >Date de création &#9650;</option>
<option value="created_at" data-order="desc" >Date de création &#9660;</option>
<option value="updated_at" data-order="asc" >Date de modification &#9650;</option>
<option value="updated_at" data-order="desc" selected>Date de modification &#9660;</option>
<option value="libelle.keyword" data-order="asc" >Libellé &#9650;</option>
<option value="libelle.keyword" data-order="desc" >Libellé &#9660;</option>
<option value="version" data-order="asc" >Version &#9650;</option>
<option value="version" data-order="desc" >Version &#9660;</option>
</select>
</div>
<mm-sorter></mm-sorter>
</div>
</header>
<div style="display:none;" class="scrollLoader"><div class="animated slideInUp"><i class="fal fa-circle-notch fa-spin"></i> Chargements des médias</div></div>
<div class="media_container">
<div style="display:none;" class="loader"><i class="fal fa-circle-notch fa-spin"></i></div>
<div class="wrapper"></div>
</div>
<mm-display></mm-display>
</div>
<div class="side_menu panier_side_menu collapse">
<header>

View file

@ -11,77 +11,79 @@
|
*/
Route::group(['middleware' => ['auth']], function(){
// Les pages Front
Route::group(['middleware' => ['auth']], function () {
// Les pages Front
Route::get('/', 'CommunController@index')->name('home');
Route::get('/gestion-des-medias', 'MediaController@index')->name('media_manager');
Route::get('/paniers', 'PanierController@index')->name('paniers');
Route::get('/media/{uid}', 'MediaController@show')->name('media.show');
Route::get('/gestion-des-medias', 'MediaController@index')->name('media_manager');
Route::get('/paniers', 'PanierController@index')->name('paniers');
Route::get('/media/{uid}', 'MediaController@show')->name('media.show');
// Message de contact
Route::post('/send-message', 'CommunController@sendMessage');
// Message de contact
Route::post('/send-message', 'CommunController@sendMessage');
// Ajax pour la gestion des dossiers
Route::post('/ajax/load-folder', 'DossierController@loadFolder');
Route::post('/ajax/add-folder', 'DossierController@addFolder');
Route::post('/ajax/remove-folder', 'DossierController@removeFolder');
Route::post('/ajax/move-folder', 'DossierController@moveFolder');
Route::post('/ajax/rename-folder', 'DossierController@renameFolder');
Route::post('/ajax/favoris-folder', 'UserController@favorisFolder');
Route::post('/ajax/get-folder-property', 'DossierController@getFolderProperty');
Route::post('/ajax/save-folder-property', 'DossierController@saveFolderProperty');
// Ajax pour la gestion des dossiers
Route::post('/ajax/load-folder', 'DossierController@loadFolder');
Route::get('/ajax-v2/load-folders', 'DossierController@loadFolders');
Route::post('/ajax/add-folder', 'DossierController@addFolder');
Route::post('/ajax/remove-folder', 'DossierController@removeFolder');
Route::post('/ajax/move-folder', 'DossierController@moveFolder');
Route::post('/ajax/rename-folder', 'DossierController@renameFolder');
Route::post('/ajax/favoris-folder', 'UserController@favorisFolder');
Route::post('/ajax/get-folder-property', 'DossierController@getFolderProperty');
Route::post('/ajax/save-folder-property', 'DossierController@saveFolderProperty');
// Ajax pour la gestion des médias
Route::post('/ajax/load-media', 'MediaController@loadMedia');
Route::post('/ajax/move-media', 'MediaController@moveMedia');
Route::post('/ajax/remove-media', 'MediaController@removeMedia');
// Ajax pour la gestion des médias
Route::post('/ajax/load-medias', 'MediaController@loadMedia');
Route::post('/ajax/move-media', 'MediaController@moveMedia');
Route::post('/ajax/remove-media', 'MediaController@removeMedia');
Route::post('/ajax/recover-media', 'MediaController@recoverMedia');
Route::post('/ajax/get-media', 'MediaController@getOneMedia');
Route::post('/ajax/save-media', 'MediaController@saveMedia');
Route::post('/ajax/get-media', 'MediaController@getOneMedia');
Route::post('/ajax/save-media', 'MediaController@saveMedia');
Route::post('/ajax/duplicate-media', 'MediaController@duplicateMedia');
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/check-ref-key', 'MediaController@checkRefKey');
Route::post('/ajax/get-article', 'MediaController@getArticle');
Route::post('/ajax/download-media', 'MediaController@downloadMedia')->name('downloadMedia');
Route::post('/ajax/get-media-history', 'MediaController@getMediaHistory');
Route::post('/ajax/add-media', 'MediaController@addMedia');
Route::post('/ajax/apply-sticker', 'MediaController@applySticker');
Route::post('/ajax/set-id-arcadia', 'MediaController@setIdArcdadia');
Route::post('/ajax/check-ref-key', 'MediaController@checkRefKey');
Route::post('/ajax/get-article', 'MediaController@getArticle');
Route::post('/ajax/download-media', 'MediaController@downloadMedia')->name('downloadMedia');
Route::post('/ajax/get-media-others-infos', 'MediaController@getMediaOtherInfos');
// Ajax pour la gestion des panier
Route::post('/ajax/add-media-basket', 'PanierController@addMediasBasket');
Route::post('/ajax/remove-media-basket', 'PanierController@removeMediasBasket');
Route::post('/ajax/load-basket', 'PanierController@loadBasket');
Route::post('/ajax/add-basket', 'PanierController@addBasket');
Route::post('/ajax/favoris-basket', 'UserController@favorisBasket');
Route::post('/ajax/remove-basket', 'PanierController@removeBasket');
Route::post('/ajax/get-basket', 'PanierController@getBasket');
Route::post('/ajax/save-basket-property', 'PanierController@saveBasketProperty');
// Ajax pour la gestion des panier
Route::post('/ajax/add-media-basket', 'PanierController@addMediasBasket');
Route::post('/ajax/remove-media-basket', 'PanierController@removeMediasBasket');
Route::post('/ajax/load-basket', 'PanierController@loadBasket');
Route::post('/ajax/add-basket', 'PanierController@addBasket');
Route::post('/ajax/favoris-basket', 'UserController@favorisBasket');
Route::post('/ajax/remove-basket', 'PanierController@removeBasket');
Route::post('/ajax/get-basket', 'PanierController@getBasket');
Route::post('/ajax/save-basket-property', 'PanierController@saveBasketProperty');
// Back office
Route::resource('user', 'UserController');
Route::post('/check-matricule', 'UserController@checkMatricule');
Route::resource('dossier', 'DossierController');
Route::get('/recovery', 'RecoveryController@index')->name('recovery.index');
Route::post('/check-arcadia-id', 'RecoveryController@checkArcadiaId');
Route::get('/arcadia-link', 'ArcadiaLinkController@index')->name('arcadialink.index');
// Back office
Route::resource('user', 'UserController');
Route::post('/check-matricule', 'UserController@checkMatricule');
Route::resource('dossier', 'DossierController');
Route::get('/recovery', 'RecoveryController@index')->name('recovery.index');
Route::post('/check-arcadia-id', 'RecoveryController@checkArcadiaId');
Route::get('/arcadia-link', 'ArcadiaLinkController@index')->name('arcadialink.index');
Route::get('/arcadia-link/{id}/delete', 'ArcadiaLinkController@delete')->name('arcadialink.delete');
Route::get('/ajax-v2/get-datas-by-sujet', 'CommunController@getDatasBySujet');
});
Auth::routes([
'reset' => false,
'verify' => false,
'register' => false,
]);
]);
// Page pour déposer les médias
Route::get('/depot', 'UploadController@index');
Route::get('/depot', 'UploadController@index');
// Ajax pour ajouter un dossier de dépôt
Route::post('/ajax/add-depot-folder', 'DossierController@addDepotFolder');
// Ajax pour ajouter un dossier de dépôt
Route::post('/ajax/add-depot-folder', 'DossierController@addDepotFolder');
// Ajax pour la gestion de l'upload de média
Route::post('/ajax/upload-media', 'UploadController@storeMedia');
// Ajax pour la gestion de l'upload de média
Route::post('/ajax/upload-media', 'UploadController@storeMedia');
Route::post('/ajax-v2/upload-media', 'UploadController@storeMediaV2');
// Les pages Front panier public
Route::get('/basket/{basket_uid}', 'PanierController@showBasket');
// Les pages Front panier public
Route::get('/basket/{basket_uid}', 'PanierController@showBasket');