composer require ldc/web-status-checker-laravel remove Old static status checker Fix ImportMedia WIP commands OK many fixes Fix and try to optimize folder component Fix front icons + actions based on icons Favico front fix alert Fix Media upload on depot fix folder component buttons Full front fix with perf due tu vuejs Download medias Navigate within medias superfix Move media + loader isLocked boolean and remove media fix Folder scroll fix arcadia link color red Fix panier show external Tons of fixes back as front REwrited all
304 lines
11 KiB
PHP
304 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\Bo\Ajax\FetchFoldersRequest;
|
|
use App\Http\Requests\Bo\Ajax\LoadFoldersRequest;
|
|
use App\Http\Requests\Bo\Folders\StoreDepotFolderRequest;
|
|
use App\Http\Requests\Bo\Folders\StoreFolderRequest;
|
|
use App\Http\Requests\Bo\Folders\UpdateFolderRequest;
|
|
use App\Http\Resources\NestedDossiersListResource;
|
|
use App\Models\Dossier;
|
|
use App\Models\Sujet;
|
|
use App\Models\Marque;
|
|
use App\Models\Media;
|
|
use App\Models\Variante;
|
|
use App\Models\Format;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class DossierController extends Controller
|
|
{
|
|
/**
|
|
* Ajax Load folders
|
|
*
|
|
* @param \App\Http\Requests\Bo\Ajax\LoadFoldersRequest $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function loadFolders(LoadFoldersRequest $request): JsonResponse
|
|
{
|
|
/** @var \App\Models\User */
|
|
$user = Auth::user();
|
|
$folders = [];
|
|
|
|
$select = ['id', 'libelle', 'system'];
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers publiques */
|
|
$publicFolders = Dossier::whereHas('sujet', function ($q) use ($request) {
|
|
$q->where('codeSujet', $request->sujet_id);
|
|
})->whereIsPrivate(false)->whereNull('parent_id')->select($select)->get();
|
|
|
|
|
|
// On récupère les dossiers privés.
|
|
/** @var \Illuminate\Database\Eloquent\Builder */
|
|
$privateQuery = Dossier::whereHas('sujet', function ($q) use ($request) {
|
|
$q->where('codeSujet', $request->sujet_id);
|
|
})->select($select)->whereIsPrivate(true);
|
|
|
|
// If not admin, get using brands.
|
|
if (!$user->hasRole(config('roles.const.ADMIN'))) {
|
|
/** @var \Illuminate\Database\Eloquent\Collection<integer> Codes marques */
|
|
$marques = $user->marques()->pluck('codMarq');
|
|
$privateQuery->whereHas('marques', function ($q) use ($marques) {
|
|
$q->whereIn('codMarq', $marques);
|
|
});
|
|
}
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers privés */
|
|
$privateFolders = $privateQuery->get();
|
|
|
|
$foldersCollection = $publicFolders->merge($privateFolders);
|
|
$foldersCollection = $foldersCollection->sortBy('libelle', SORT_NATURAL | SORT_FLAG_CASE)
|
|
->sortBy('favoris')->values();
|
|
|
|
// Ajout du dépôt de fichier pour les admin.
|
|
if ($user->hasRole(config('roles.const.ADMIN'))) {
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers depots */
|
|
$depotQuery = Dossier::whereNull('parent_id')
|
|
->where('system', true)
|
|
->orderBy('libelle', 'ASC')
|
|
->get();
|
|
$foldersCollection = $foldersCollection->merge($depotQuery);
|
|
}
|
|
|
|
$folders['data'] = new NestedDossiersListResource($foldersCollection);
|
|
$folders['racineCount'] = Media::whereSujetId($request->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();
|
|
|
|
return response()->json($folders);
|
|
}
|
|
|
|
/**
|
|
* Chargement des dossiers
|
|
*
|
|
* @param \App\Http\Requests\Bo\Ajax\FetchFoldersRequest $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function loadFolder(FetchFoldersRequest $request): JsonResponse
|
|
{
|
|
/** @var \App\Models\User */
|
|
$user = auth()->user();
|
|
|
|
$response = [];
|
|
$response['variantes'] = Variante::where('sujet_id', $request->sujetId)->get();
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
|
|
$FormatsSujet = Format::whereHas('sujets', function ($query) use ($request) {
|
|
$query->where('sujet_id', $request->sujetId);
|
|
})->get();
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
|
|
$FormatsSystem = Format::withoutGlobalScope('App\Scopes\SystemScope')
|
|
->where('system', true)->get();
|
|
$response['formats'] = $FormatsSujet->merge($FormatsSystem);
|
|
|
|
$response['draggable'] = $user->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
|
|
|
|
// Envoi du role .
|
|
$response['role'] = $user->role;
|
|
|
|
return \response()->json($response);
|
|
}
|
|
|
|
// * CRUD
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function index()
|
|
{
|
|
/** @var \App\Models\User */
|
|
$user = auth()->user();
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
|
|
$dossiers = Dossier::whereNull('parent_id')
|
|
->where('system', false)
|
|
->orderBy('libelle', 'asc')
|
|
->get();
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
$sujets = Sujet::where('sujet_dam', true)->get();
|
|
|
|
return view('dossiers.index')->with([
|
|
'dossiers' => $dossiers,
|
|
'sujets' => $sujets,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
|
|
*/
|
|
public function create(Request $request)
|
|
{
|
|
if ($request->sub) {
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
|
|
$dossiers = Dossier::whereNull('parent_id')->where('system', false)
|
|
->orderBy('libelle', 'asc')->get();
|
|
return view('dossiers.create-sub')->with(['dossiers' => $dossiers]);
|
|
}
|
|
|
|
/** @var \App\Models\User */
|
|
$user = auth()->user();
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
|
|
$marques = Marque::all();
|
|
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
$sujets = Sujet::where('sujet_dam', true)->get();
|
|
|
|
return view('dossiers.create')->with([
|
|
'marques' => $marques, 'sujets' => $sujets
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param \App\Http\Requests\Bo\Folders\StoreFolderRequest $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function store(StoreFolderRequest $request)
|
|
{
|
|
DB::transaction(function () use ($request) {
|
|
/** @var \App\Models\User */
|
|
$user = auth()->user();
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
|
|
// ---- Le dossier
|
|
$dossier = new Dossier();
|
|
$dossier->fill($request->validated());
|
|
|
|
if ($request->sub) {
|
|
/** @var \App\Models\Dossier */
|
|
$parent_dossier = Dossier::findOrFail($request->parent_id);
|
|
$dossier->sujet()->associate($parent_dossier->sujet);
|
|
} else {
|
|
$dossier->sujet()->associate($request->sujet);
|
|
}
|
|
|
|
if ($dossier->saveOrFail()) {
|
|
// ---- Les marques
|
|
if ($request->marques) {
|
|
$dossier->marques()->sync($request->marques);
|
|
}
|
|
return redirect()->route('dossier.edit', ['dossier' => $dossier])
|
|
->with('success', 'Le dossier a été enregistré');
|
|
}
|
|
});
|
|
return back();
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param \App\Models\Dossier $dossier
|
|
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
|
|
*/
|
|
public function edit(Dossier $dossier)
|
|
{
|
|
/** @var \App\Models\User */
|
|
$user = auth()->user();
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
|
|
$marques = Marque::all();
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Marque> */
|
|
$dossierMarques = $dossier->marques;
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
$dossierSujets = $dossier->sujets;
|
|
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
|
$sujets = Sujet::where('sujet_dam', true)->get();
|
|
|
|
return view('dossiers.edit')->with([
|
|
'dossier' => $dossier,
|
|
'dossierMarques' => $dossierMarques,
|
|
'marques' => $marques,
|
|
'sujets' => $sujets
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param \App\Http\Requests\Bo\Folders\UpdateFolderRequest $request
|
|
* @param \App\Models\Dossier $dossier
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function update(UpdateFolderRequest $request, Dossier $dossier): RedirectResponse
|
|
{
|
|
DB::transaction(function () use ($request, $dossier) {
|
|
/** @var \App\Models\User */
|
|
$user = auth()->user();
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
|
|
// ---- Le dossier
|
|
$dossier->fill($request->validated());
|
|
|
|
if ($dossier->saveOrFail()) {
|
|
// ---- Les marques
|
|
if ($request->marques) {
|
|
$dossier->marques()->sync($request->marques);
|
|
}
|
|
return redirect()->route('dossier.edit', ['dossier' => $dossier])
|
|
->with('success', 'Le dossier a été mis à jour');
|
|
}
|
|
});
|
|
return back();
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param \App\Models\Dossier $dossier
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function destroy(Dossier $dossier): RedirectResponse
|
|
{
|
|
/** @var \App\Models\User */
|
|
$user = auth()->user();
|
|
$user->authorizeRoles(config('roles.const.ADMIN'));
|
|
if ($dossier->deleteOrFail()) {
|
|
return \response()->redirectToRoute('dossier.index')
|
|
->with('warning', trans('Le dossier à été supprimé'));
|
|
}
|
|
return back();
|
|
}
|
|
|
|
/**
|
|
* Ajouter un dossier de dépôt
|
|
*
|
|
* @param \App\Http\Requests\Bo\Folders\StoreDepotFolderRequest $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function addDepotFolder(StoreDepotFolderRequest $request): JsonResponse
|
|
{
|
|
// ---- Le dossier
|
|
$dossier = new Dossier($request->validated());
|
|
$dossier->parent_id = 1;
|
|
$dossier->system = true;
|
|
$dossier->saveOrFail();
|
|
return \response()->json([
|
|
'folder_id' => $dossier->id
|
|
]);
|
|
}
|
|
}
|