Merge branch 'ticket765' into develop

This commit is contained in:
Vincent BRIDIER 2022-04-01 12:14:05 +02:00
commit 22e796ec67
No known key found for this signature in database
GPG key ID: 8571BFA20420D512
11 changed files with 455 additions and 212 deletions

View file

@ -2,156 +2,176 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\Bo\AjaxAddMediasBasketRequest;
use App\Http\Requests\Bo\AjaxCreateBasketRequest;
use App\Http\Requests\Bo\AjaxDestroyBasketRequest;
use App\Http\Requests\Bo\AjaxRemoveMediasBasketRequest;
use App\Http\Requests\Bo\AjaxSaveBasketPropsRequest;
use Illuminate\Support\Str;
use App\Models\Panier;
use App\Models\Media;
use App\Models\Format;
use App\Models\Media;
class PanierController extends Controller
{
/**
// * BO
/**
* Page principale des paniers
*
* @return \Illuminate\Http\Response
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
*/
public function index(Request $request)
public function index()
{
$paniers = Auth::user()->paniersOwner;
return view('panier.index')->with([
'paniers'=> $paniers,
]);
/** @var \App\User $user */
$user = \auth()->user();
/** @var \Illuminate\Database\Eloquent\Collection $paniers */
$paniers = $user->paniersOwner;
return view('panier.index')->with([
'paniers' => $paniers,
]);
}
public function getBaskets(Request $request)
// * AJAX
/**
* Get user baskets
*
* @return \Illuminate\Http\JsonResponse
*/
public function getBaskets()
{
return Auth::user()->paniersOwner;
/** @var \App\User $user */
$user = \auth()->user();
/** @var \Illuminate\Database\Eloquent\Collection $paniers */
$paniers = $user->paniersOwner;
return response()->json($paniers);
}
/**
/**
* Ajout de média à un panier
*
* @param AjaxAddMediasBasketRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function addMediasBasket(AjaxAddMediasBasketRequest $request)
{
/** @var \App\Models\Panier $panier */
$panier = Panier::whereId($request->panier_id)
->with('medias')->firstOrFail();
// * Sync every media to basket
$panier->medias()->sync(array_merge(
$panier->medias()->pluck('id')->all(),
$request->medias
));
return response()->json();
}
/**
* Suppression de média à un panier
*
* @param AjaxRemoveMediasBasketRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function removeMediasBasket(AjaxRemoveMediasBasketRequest $request)
{
/** @var \App\Models\Panier $panier */
$panier = Panier::whereId($request->panier_id)
->with('medias')->firstOrFail();
/** @var \App\Models\Media $media */
$media = Media::whereId($request->media_id)->firstOrFail();
$panier->medias()->detach($media);
return response()->json(true);
}
/**
* Ajoute un panier
*
* @param AjaxCreateBasketRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function createBasket(AjaxCreateBasketRequest $request)
{
/** @var \App\Models\User $user */
$user = auth()->user();
$panier = new Panier();
$panier->libelle = $request->title;
$panier->uid = Str::uuid();
$panier->owner()->associate($user);
$panier->saveOrFail();
return response()->json($panier);
}
/**
* Supprimer un panier
*
* @param AjaxDestroyBasketRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroyBasket(AjaxDestroyBasketRequest $request)
{
/** @var \App\Models\Panier $basket */
$basket = Panier::whereId($request->basket_id)->firstOrFail();
// TODO: Replace this with deleteOrFail after laravel bump.
$basket->delete();
return response()->json();
}
// * FO
/**
* Page publique d'un panier
*
* @return \Illuminate\Http\Response
* @param Panier $panier
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
*/
public function showBasket(Request $request)
public function showBasket(Panier $panier)
{
$panier_uid = $request->basket_uid;
$formats = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('system', 1)->get();
$panier = Panier::where('uid', $panier_uid)->first();
if($panier && $panier->statut == 1){
return view('panier.show')->with([
'panier'=> $panier,
'formats' => $formats,
]);
}else{
abort(404, 'Page introuvable');
}
}
/** @var \App\User|null $user */
$user = auth()->user();
/**
* Ajout de média à un panier
*/
public function addMediasBasket(Request $request)
{
$response = false;
$mediasToAdd = $request->input('medias');
$panierId = $request->input('panier_id');
$panier = Panier::where('id', $panierId)->with('medias')->first();
if($panier){
foreach ($mediasToAdd as $media) {
$panier->medias()->attach($media['id']);
// * Ne pas afficher le panier si il n'est pas pas publié et
// * que l'utilisateur n'est pas le propiétaire
if (!$panier->statut) {
if (!$user or \optional($panier->owner)->id !== $user->id) {
abort(404);
}
$response = true;
}
}
return json_encode($response);
/** @var \Illuminate\Database\Eloquent\Collection $formats */
$formats = Format::withoutGlobalScope('App\Scopes\SystemScope')
->where('system', 1)->get();
return view('panier.show')->with([
'panier' => $panier,
'formats' => $formats,
]);
}
/**
* Suppression de média à un panier
*/
public function removeMediasBasket(Request $request)
{
$response = false;
/**
* Enregistre les propriétés d'un panier
*
* @param AjaxSaveBasketPropsRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function saveBasketProperty(AjaxSaveBasketPropsRequest $request)
{
/** @var \App\Models\Panier $panier */
$panier = Panier::whereId($request->basket_id)->firstOrFail();
$mediaToRemove = $request->input('media_id');
$panierId = $request->input('panier_id');
$panier = Panier::where('id', $panierId)->with('medias')->first();
if($panier && $mediaToRemove != ""){
$panier->medias()->detach($mediaToRemove);
$response = true;
}
return json_encode($response);
}
/**
* Ajoute un panier
*/
public function addBasket(Request $request)
{
$response = false;
$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));
$title = $request->input('title');
if($title == ""){
$title = "Panier du ".date("d/m/Y");
}
$panier = new Panier();
$panier->owner = Auth::user()->id;
$panier->libelle = $title;
$panier->uid = $uid;
if($panier->save()){
$response = $panier;
}
return json_encode($response);
}
/**
* Supprimer un panier
*
*/
public function removeBasket(Request $request)
{
$response = false;
$basket_id = $request->input('basket_id');
$panier = Panier::where('id', $basket_id);
if($panier){
$panier->delete();
$response = true;
}
return json_encode($response);
}
/**
* enregistre les propriétés d'un panier
*
*/
public function saveBasketProperty(Request $request)
{
$response = false;
$basket_id = $request->input('basket_id');
$libelle = $request->input('libelle');
$description = $request->input('description');
$statut = $request->input('statut');
$panier = Panier::where('id', $basket_id)->first();
if($panier){
$panier->libelle = $libelle;
$panier->description = $description;
$panier->statut = $statut;
$panier->save();
$response = $panier;
}
return json_encode($response);
}
$panier->fill($request->validated());
$panier->saveOrFail();
return response()->json($panier);
}
}

View file

@ -0,0 +1,32 @@
<?php
namespace App\Http\Requests\Bo;
use Illuminate\Foundation\Http\FormRequest;
class AjaxAddMediasBasketRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize()
{
return auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'panier_id' => 'required|exists:paniers,id,deleted_at,NULL',
'medias' => 'required|array',
'medias.*' => 'required|exists:medias,id,deleted_at,NULL'
];
}
}

View file

@ -0,0 +1,35 @@
<?php
namespace App\Http\Requests\Bo;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Carbon;
class AjaxCreateBasketRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize()
{
$this->merge([
'title' => $this->title ??
sprintf('Panier du %s', Carbon::now()->format('d/m/Y'))
]);
return auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|min:1|max:255'
];
}
}

View file

@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests\Bo;
use Illuminate\Foundation\Http\FormRequest;
class AjaxDestroyBasketRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize()
{
return auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'basket_id' => 'required|exists:paniers,id,deleted_at,NULL'
];
}
}

View file

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests\Bo;
use Illuminate\Foundation\Http\FormRequest;
class AjaxRemoveMediasBasketRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize()
{
return auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'panier_id' => 'required|exists:paniers,id,deleted_at,NULL',
'media_id' => 'required|exists:medias,id,deleted_at,NULL'
];
}
}

View file

@ -0,0 +1,36 @@
<?php
namespace App\Http\Requests\Bo;
use Illuminate\Foundation\Http\FormRequest;
class AjaxSaveBasketPropsRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize()
{
$this->merge([
'statut' => $this->statut ? true : false
]);
return \auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'basket_id' => 'required|exists:paniers,id,deleted_at,NULL',
'libelle' => 'required|string|min:2|max:255',
'description' => 'nullable|string',
'statut' => 'required|boolean'
];
}
}

View file

@ -2,6 +2,7 @@
namespace App\Models;
use App\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
@ -9,61 +10,102 @@ class Panier extends Model
{
use SoftDeletes;
protected $appends = array('mediacount', 'mediacover');
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = [
'mediacount', 'mediacover'
];
/**
* Get the user that owns the panier.
*/
public function owner()
{
return $this->belongsTo('App\User', 'owner');
}
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'description', 'libelle', 'statut'
];
/**
* The users that belong to the panier.
*/
public function usersFavoris()
{
return $this->belongsToMany('App\User', 'paniers_users', 'panier_id', 'user_id');
}
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'statut' => 'boolean'
];
/**
* The medias that belong to the panier.
*/
public function medias()
{
return $this->belongsToMany('App\Models\Media', 'paniers_medias', 'panier_id', 'media_id');
}
// * RELATIONSHIPS
/**
* Get media linked
*/
public function getMediacountAttribute()
{
return $this->medias()->count();
}
/**
* BelongsTo user relation
* Get the user that owns the panier.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function owner()
{
return $this->belongsTo(User::class, 'user_id');
}
/**
* Get media linked
*/
public function getMediacoverAttribute()
{
$cover = "";
$media = $this->medias()->where('typemedia_id', 1)->first();
if($media){
switch ($media->typemedia_id) {
case 1:
if($media->extension == "pdf" || $media->extension == "ai" || $media->extension == "psd"){
$cover = $media->folder.$media->uid."_thumb.png";
}else{
$cover = $media->folder.$media->uid."_thumb.".$media->extension;
}
break;
case 2:
$cover = $media->folder.$media->uid."_thumb.".$media->extension;
break;
}
}
return $cover;
}
/**
* BelongsToMany users relation
* The users that belong to the panier.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function usersFavoris()
{
return $this->belongsToMany(User::class, 'paniers_users', 'panier_id', 'user_id');
}
/**
* BelongsToMany medias relation
* The medias that belong to the panier.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function medias()
{
return $this->belongsToMany(Media::class, 'paniers_medias', 'panier_id', 'media_id');
}
// * GETTERS
/**
* Get mediacount attribute
*
* @return boolean
*/
public function getMediacountAttribute(): int
{
return $this->medias()->count();
}
/**
* Get mediacover attribute
*
* @return string
*/
public function getMediacoverAttribute(): string
{
$cover = '';
if ($media = $this->medias()->where('typemedia_id', 1)->first()) {
switch ($media->typemedia_id) {
case 1:
if ($media->extension == "pdf" || $media->extension == "ai" || $media->extension == "psd") {
$cover = $media->folder . $media->uid . "_thumb.png";
} else {
$cover = $media->folder . $media->uid . "_thumb." . $media->extension;
}
break;
case 2:
$cover = $media->folder . $media->uid . "_thumb." . $media->extension;
break;
}
}
return $cover;
}
}

View file

@ -3,6 +3,7 @@
namespace App\Providers;
use App\Models\Media;
use App\Models\Panier;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
@ -27,6 +28,10 @@ class RouteServiceProvider extends ServiceProvider
Route::bind('media', function ($value) {
return Media::whereUid($value)->firstOrFail();
});
Route::bind('basket_uuid', function ($value) {
return Panier::where('uid', $value)
->with('owner')->firstOrFail();
});
parent::boot();
}

View file

@ -153,7 +153,7 @@ class User extends Authenticatable
*/
public function paniersOwner()
{
return $this->hasMany(Panier::class, 'owner')->with('medias');
return $this->hasMany(Panier::class, 'user_id')->with('medias');
}
/**

View file

@ -2,19 +2,20 @@
<div class="side_menu panier_side_menu collapse">
<header>
<div class="close_side_menu"><i class="fas fa-shopping-basket"></i></div>
<select id="panier_selector" v-model="selectedBasket">
<option v-for="item in storeBaskets" :value="item">{{item.libelle}}</option>
<select v-if="storeBaskets.length" id="panier_selector" v-model="selectedBasket">
<option v-for="item in storeBaskets" :value="item">{{item.libelle}}</option>
</select>
<a id="menu_panier" href="#" class="btn btn-square"><i class="fa fa-bars"></i></a>
<span v-else class="no-basket">Aucun panier disponible</span>
<a id="menu_panier" href="#" class="btn btn-square side-menu-btn"><i class="fa fa-bars"></i></a>
<div class="panier_menu">
<ul class="menu-options">
<!--
<li class="menu-option goto_panier" data-url="{{ route('paniers') }}">Aller au panier</li>
-->
<li class="menu-option goto_panier" @click="openBasket" :data-url="'/basket/' + selectedBasket.uid">Aller au panier</li>
<li v-if="selectedBasket.uid" class="menu-option goto_panier" @click="openBasket" :data-url="'/basket/' + selectedBasket.uid">Aller au panier</li>
<li class="menu-option add_panier" @click="addBasket">Nouveau panier</li>
<li class="menu-option info_panier" @click="showBasketProperties">Propiétés du panier</li>
<li class="menu-option remove_panier" @click="deleteBasket">Supprimer ce panier</li>
<li v-if="selectedBasket.uid" class="menu-option info_panier" @click="showBasketProperties">Propiétés du panier</li>
<li v-if="selectedBasket.uid" class="menu-option remove_panier" @click="deleteBasket">Supprimer ce panier</li>
</ul>
</div>
@ -49,8 +50,8 @@
<p>Statut :</p>
<p>
<select class="form_basket_statut" v-model="selectedBasket.statut">
<option value="0">Désactivé</option>
<option value="1">Activé</option>
<option :value="false">Désactivé</option>
<option :value="true">Activé</option>
</select>
</p>
<p>Créé le : <span class="form_basket_datecreate">{{new Date(this.selectedBasket.created_at).toLocaleDateString('fr-FR', {'hour': '2-digit', 'minute': '2-digit'})}}</span>
@ -75,6 +76,11 @@
storeGrabbed () {
return this.$store.state.grabbed;
},
basketMediaIds() {
return _.map(this.$store.state.grabbed, (media) => {
return media.id
})
}
},
mounted() {
this.init();
@ -297,7 +303,7 @@
}else{
this.$loading.show({delay:0});
axios.post('/ajax/add-media-basket', {
medias: this.storeGrabbed,
medias: this.basketMediaIds,
panier_id : this.selectedBasket.id,
}).then(response => {
_this2.init(this.selectedBasket.id);
@ -323,6 +329,12 @@
}
</script>
<style scoped>
<style lang="scss">
.panier_side_menu {
.no-basket {
display: block;
width: 100%;
padding: 0.7rem;
}
}
</style>

View file

@ -1,20 +1,22 @@
<?php
// TODO : Faire le tri des routes
// TODO: Faire le tri des routes.
use App\Http\Controllers\MediaController;
use App\Http\Controllers\PanierController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
Route::group(['middleware' => ['auth']], function () {
// Les pages Front
// Les pages Front .
Route::get('/', 'CommunController@index')->name('home');
Route::get('/gestion-des-medias', [MediaController::class, 'index'])->name('media_manager');
Route::get('/paniers', 'PanierController@index')->name('paniers');
Route::get('/paniers', [PanierController::class, 'index'])->name('paniers');
Route::get('/media/{media}', [MediaController::class, 'show'])->name('media.show');
// Message de contact
// Message de contact .
Route::post('/send-message', 'CommunController@sendMessage');
// Ajax pour la gestion des dossiers
// 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');
@ -25,7 +27,7 @@ Route::group(['middleware' => ['auth']], function () {
Route::post('/ajax/get-folder-property', 'DossierController@getFolderProperty');
Route::post('/ajax/save-folder-property', 'DossierController@saveFolderProperty');
// Ajax pour la gestion des médias
// 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');
@ -40,18 +42,16 @@ Route::group(['middleware' => ['auth']], function () {
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');
// Ajax pour la gestion des panier .
Route::post('/ajax/add-media-basket', [PanierController::class, 'addMediasBasket']);
Route::post('/ajax/remove-media-basket', [PanierController::class, 'removeMediasBasket']);
Route::post('/ajax/add-basket', [PanierController::class, 'createBasket']);
Route::post('/ajax/favoris-basket', 'UserController@favorisBasket');
Route::post('/ajax/remove-basket', 'PanierController@removeBasket');
Route::post('/ajax/get-basket', 'PanierController@getBasket');
Route::post('/ajax/get-baskets', 'PanierController@getBaskets');
Route::post('/ajax/remove-basket', [PanierController::class, 'destroyBasket']);
Route::post('/ajax/get-baskets', [PanierController::class, 'getBaskets']);
Route::post('/ajax/save-basket-property', 'PanierController@saveBasketProperty');
// Back office
// Back office .
Route::resource('user', 'UserController');
Route::post('/check-matricule', 'UserController@checkMatricule');
Route::get('/dossier/create-sub', 'DossierController@createSub')->name('dossier.create-sub');
@ -71,15 +71,15 @@ Auth::routes([
'register' => false,
]);
// Page pour déposer les médias
// Page pour déposer les médias .
Route::get('/depot', 'UploadController@index');
// Ajax pour ajouter un dossier de dépôt
// 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
// 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_uuid}', [PanierController::class, 'showBasket']);