From b502e0f2c5ac1537a2f0f2bdb5d9b10dc5a1b71f Mon Sep 17 00:00:00 2001 From: Yann Gonidec Date: Fri, 17 May 2019 11:35:41 +0200 Subject: [PATCH] administration des dossiers --- app/Dossier.php | 35 ++++- app/Http/Controllers/CommunController.php | 4 +- app/Http/Controllers/DossierController.php | 175 +++++++++++++++++++++ app/Http/Controllers/UserController.php | 9 +- app/Marque.php | 8 + app/Sujet.php | 9 ++ public/css/app.css | 36 +++++ public/js/app.js | 30 ++++ resources/js/admin.js | 34 ++++ resources/sass/app.scss | 1 + resources/sass/partials/media.scss | 41 +++++ resources/views/dossiers/create.blade.php | 83 ++++++++++ resources/views/dossiers/edit.blade.php | 89 +++++++++++ resources/views/dossiers/index.blade.php | 55 +++++++ resources/views/media_manager.blade.php | 13 +- resources/views/users/create.blade.php | 1 + resources/views/users/edit.blade.php | 3 +- resources/views/users/index.blade.php | 3 +- routes/web.php | 1 + 19 files changed, 622 insertions(+), 8 deletions(-) create mode 100644 app/Http/Controllers/DossierController.php create mode 100644 resources/sass/partials/media.scss create mode 100644 resources/views/dossiers/create.blade.php create mode 100644 resources/views/dossiers/edit.blade.php create mode 100644 resources/views/dossiers/index.blade.php diff --git a/app/Dossier.php b/app/Dossier.php index 6db3403..385d022 100644 --- a/app/Dossier.php +++ b/app/Dossier.php @@ -6,5 +6,38 @@ use Illuminate\Database\Eloquent\Model; class Dossier extends Model { - // + + /** + * The marques that belong to the dossier. + */ + public function marques() + { + return $this->belongsToMany('App\Marque', 'marques_dossiers', 'dossier_id', 'marque_id'); + } + + /** + * Get the sujet that owns the dossier. + */ + public function sujet() + { + return $this->belongsTo('App\Sujet', 'sujet_id'); + } + + /** + * Get the dossiers for the parent. + */ + public function sousdossiers() + { + return $this->hasMany('App\Dossier', 'parent_id'); + } + + /** + * Get the parent that owns the dossiers. + */ + public function dossierParent() + { + return $this->belongsTo('App\Dossier', 'id', 'parent_id'); + } + + } diff --git a/app/Http/Controllers/CommunController.php b/app/Http/Controllers/CommunController.php index ac338aa..20075c1 100644 --- a/app/Http/Controllers/CommunController.php +++ b/app/Http/Controllers/CommunController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Mail; use App\Mail\contact; +use App\Sujet; use Illuminate\Http\Request; class CommunController extends Controller @@ -45,6 +46,7 @@ class CommunController extends Controller */ public function media_manager() { - return view('media_manager'); + $sujets = Sujet::all(); + return view('media_manager')->with(['sujets'=> $sujets]); } } diff --git a/app/Http/Controllers/DossierController.php b/app/Http/Controllers/DossierController.php new file mode 100644 index 0000000..0ddebcf --- /dev/null +++ b/app/Http/Controllers/DossierController.php @@ -0,0 +1,175 @@ +authorizeRoles(config('roles.const.ADMIN')); + $dossiers = Dossier::whereNull('parent_id') + ->get(); + $sujets = Sujet::all(); + return view('dossiers.index')->with(['dossiers'=> $dossiers, 'sujets'=> $sujets]); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + Auth::user()->authorizeRoles(config('roles.const.ADMIN')); + $marques = Marque::all(); + $sujets = Sujet::all(); + return view('dossiers.create')->with(['marques'=> $marques, 'sujets'=> $sujets]); + } + + /** + * Store a newly created resource in storage. + * + * @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', + ]); + + $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->sujet()->associate($request->sujet); + + if ($dossier->save()){ + + // ---- 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'); + } + } + } + + /** + * Display the specified resource. + * + * @param \App\Dossier $dossier + * @return \Illuminate\Http\Response + */ + public function show(Dossier $dossier) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\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::all(); + 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\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', + ]); + + $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->sujet()->dissociate(); + $dossier->sujet()->associate($request->sujet); + + if ($dossier->save()){ + + // ---- 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'); + } + } + } + + /** + * Remove the specified resource from storage. + * + * @param \App\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]); + } + } +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index f03c8fb..6261f75 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -20,7 +20,8 @@ class UserController extends Controller { Auth::user()->authorizeRoles(config('roles.const.ADMIN')); $users = User::all(); - return view('users.index')->with(['users'=> $users]); + $sujets = Sujet::all(); + return view('users.index')->with(['users'=> $users, 'sujets'=> $sujets]); } /** @@ -30,6 +31,7 @@ class UserController extends Controller */ public function create() { + Auth::user()->authorizeRoles(config('roles.const.ADMIN')); $roles = config('roles.label'); $marques = Marque::all(); $sujets = Sujet::all(); @@ -44,7 +46,7 @@ class UserController extends Controller */ public function store(Request $request) { - + Auth::user()->authorizeRoles(config('roles.const.ADMIN')); $validatedData = $request->validate([ 'matricule' => 'required', 'firstname' => 'required', @@ -101,6 +103,7 @@ class UserController extends Controller */ public function checkMatricule(Request $request) { + Auth::user()->authorizeRoles(config('roles.const.ADMIN')); $response = array(); $response["exist_bdd"] = false; $response["exist_ldap"] = false; @@ -169,6 +172,7 @@ class UserController extends Controller */ public function update(Request $request, User $user) { + Auth::user()->authorizeRoles(config('roles.const.ADMIN')); $validatedData = $request->validate([ 'firstname' => 'required', 'lastname' => 'required', @@ -215,6 +219,7 @@ class UserController extends Controller */ public function destroy(User $user) { + Auth::user()->authorizeRoles(config('roles.const.ADMIN')); if ($user->delete()) { return redirect(route('user.index')); } else { diff --git a/app/Marque.php b/app/Marque.php index 4991664..76ecd34 100644 --- a/app/Marque.php +++ b/app/Marque.php @@ -22,4 +22,12 @@ class Marque extends Model return $this->belongsToMany('App\User', 'marques_users', 'marque_id', 'user_id'); } + /** + * The dossier that belong to the marque. + */ + public function dossiers() + { + return $this->belongsToMany('App\Dossier', 'marques_dossier', 'marque_id', 'dossier_id'); + } + } diff --git a/app/Sujet.php b/app/Sujet.php index 79d4c52..715a58a 100644 --- a/app/Sujet.php +++ b/app/Sujet.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Model; class Sujet extends Model { + /** * The primary key associated with the table. * @@ -21,4 +22,12 @@ class Sujet extends Model { return $this->belongsToMany('App\User', 'sujets_users', 'sujet_id', 'user_id'); } + + /** + * Get the dossier for the sujet. + */ + public function dossiers() + { + return $this->hasMany('App\Dossier'); + } } diff --git a/public/css/app.css b/public/css/app.css index f1d5dcf..d1c782f 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -12605,6 +12605,42 @@ table tfoot tr { margin-top: 25px; } +.media_manager .side_menu { + background-color: #3b3b3b; + position: relative; + width: 340px; +} + +.media_manager .side_menu::before { + content: ""; + background-color: #333333; + width: 100%; + position: absolute; + height: 3px; + top: 0; +} + +.media_manager .side_menu header { + padding-left: 12px; +} + +.media_manager .side_menu header h1 { + font-size: 19px; + margin: 19px 0px; +} + +.media_manager .side_menu header h1 i { + background-color: #f6993f; + padding: 10px; + border-radius: 50%; +} + +.media_manager .side_menu .folder_container { + background-color: #333333; + min-height: calc(100% - 77px); + overflow: auto; +} + /****************************************** PAGE LOGIN ******************************************/ diff --git a/public/js/app.js b/public/js/app.js index e76f08f..4b6112f 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -10710,6 +10710,13 @@ $(document).ready(function () { $(".filter_user_input").val(''); var roleId = $(".filter_role").val(); tableSearch('.datatable tr.data_row', 'attr-role', roleId); + }); // ---- Gestion des dossiers : filtre sujet + + $(".filter_sujet_btn").on('click', function (event) { + event.preventDefault(); + $(".filter_user_input").val(''); + var sujetId = $(".filter_sujet").val(); + tableSearch('.datatable tr.data_row', 'attr-sujet', sujetId); }); // ---- Gestion des utilisateurs : recherche d'utilisateur $(".filter_user_btn").on('click', function (event) { @@ -10717,6 +10724,13 @@ $(document).ready(function () { $(".filter_role").val(0); var search = $(".filter_user_input").val(); tableGlobalSearch('.datatable tr.data_row', search, [1, 2, 3]); + }); // ---- Gestion des dossiers : recherche un dossier + + $(".filter_dossier_btn").on('click', function (event) { + event.preventDefault(); + $(".filter_sujet").val(0); + var search = $(".filter_dossier_input").val(); + tableGlobalSearch('.datatable tr.data_row', search, [1]); }); // ---- Edition des utilisateurs : suppression d'utilisateur $(".btn_delete_user").on('click', function (event) { @@ -10733,6 +10747,22 @@ $(document).ready(function () { } } }); + }); // ---- Edition des dossiers : suppression d'un dossier + + $(".btn_delete_dossier").on('click', function (event) { + event.preventDefault(); + var form = $(".deleteform"); + $.fancyConfirm({ + title: "Suppression d'un dossier", + message: "Êtes-vous sûr de vouloir supprimer ce dossier ?", + okButton: 'Supprimer', + noButton: 'Annuler', + callback: function callback(value) { + if (value) { + form.submit(); + } + } + }); }); // ---- Ajout des utilisateurs : vérification du matricule $(".check_matricule").on('blur', function (event) { diff --git a/resources/js/admin.js b/resources/js/admin.js index af7fe0b..bf1d7e4 100644 --- a/resources/js/admin.js +++ b/resources/js/admin.js @@ -9,6 +9,14 @@ $(document).ready(function() { tableSearch('.datatable tr.data_row', 'attr-role', roleId) }); + // ---- Gestion des dossiers : filtre sujet + $(".filter_sujet_btn").on('click', function(event) { + event.preventDefault(); + $(".filter_user_input").val(''); + var sujetId = $(".filter_sujet").val(); + tableSearch('.datatable tr.data_row', 'attr-sujet', sujetId) + }); + // ---- Gestion des utilisateurs : recherche d'utilisateur $(".filter_user_btn").on('click', function(event) { event.preventDefault(); @@ -16,6 +24,15 @@ $(document).ready(function() { var search = $(".filter_user_input").val(); tableGlobalSearch('.datatable tr.data_row', search, [1,2,3]); }); + + // ---- Gestion des dossiers : recherche un dossier + $(".filter_dossier_btn").on('click', function(event) { + event.preventDefault(); + $(".filter_sujet").val(0); + var search = $(".filter_dossier_input").val(); + tableGlobalSearch('.datatable tr.data_row', search, [1]); + }); + // ---- Edition des utilisateurs : suppression d'utilisateur $(".btn_delete_user").on('click', function(event) { event.preventDefault(); @@ -32,6 +49,23 @@ $(document).ready(function() { } }); }); + + // ---- Edition des dossiers : suppression d'un dossier + $(".btn_delete_dossier").on('click', function(event) { + event.preventDefault(); + var form = $(".deleteform"); + $.fancyConfirm({ + title : "Suppression d'un dossier", + message : "Êtes-vous sûr de vouloir supprimer ce dossier ?", + okButton : 'Supprimer', + noButton : 'Annuler', + callback : function (value) { + if (value) { + form.submit(); + } + } + }); + }); // ---- Ajout des utilisateurs : vérification du matricule $(".check_matricule").on('blur', function(event) { var matricule = $(this).val(); diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 7bd049e..7234022 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -10,4 +10,5 @@ 'partials/fontawesome/brands.scss', 'partials/common.scss', 'partials/form.scss', +'partials/media.scss', 'partials/user.scss'; diff --git a/resources/sass/partials/media.scss b/resources/sass/partials/media.scss new file mode 100644 index 0000000..2f7033c --- /dev/null +++ b/resources/sass/partials/media.scss @@ -0,0 +1,41 @@ + + +.media_manager{ + + .side_menu{ + background-color: $grey; + position: relative; + width: 340px; + + &::before{ + content: ''; + background-color: $grey3; + width: 100%; + position: absolute; + height: 3px; + top : 0; + } + + header{ + padding-left: 12px; + + h1{ + font-size: 19px; + margin: 19px 0px; + + i{ + background-color: $orange; + padding: 10px; + border-radius: 50%; + } + } + } + .folder_container{ + background-color: $grey3; + min-height: calc(100% - 77px); + overflow: auto; + } + + } + +} diff --git a/resources/views/dossiers/create.blade.php b/resources/views/dossiers/create.blade.php new file mode 100644 index 0000000..3a17c3f --- /dev/null +++ b/resources/views/dossiers/create.blade.php @@ -0,0 +1,83 @@ +@extends('layouts.app') +@include('layouts.header') +@section('content') +
+ +
+ @if ($errors->any()) +
+ +
    + @foreach ($errors->all() as $error) +
  • {{ __($error) }}
  • + @endforeach +
+
+ @endif + @if (session()->has('error')) +
+ +
    +
  • {{ Session::get('error') }}
  • +
+
+ @endif + @if (session()->has('message')) +
+ +
    +
  • {{ Session::get('message') }}
  • +
+
+ @endif +
+

Ajouter un dossier

+
+ {!! Form::open( ['route' => 'dossier.store', 'class' => 'dataform']) !!} + @method('POST') +
+ {!! Form::label('libelle', 'Libellé') !!} + {!! Form::text('libelle', null, ['required']) !!} +
+
+ {!! Form::label('description', 'Description') !!} + {!! Form::textarea('description', null) !!} +
+
+ {!! Form::label('sujet', 'Sujet associé') !!} +
+
+ {!! Form::label("", "") !!} + {!! Form::select('sujet', $sujets->pluck('LIBELLE', 'CODE_SUJET')) !!} +
+ +
+ {!! Form::label('marques', 'Marques associées') !!} +
+
+ {!! Form::label("", "") !!} +
+ {!! Form::text('search', null, ['class' => "selector_filter", 'placeholder' => "Rechercher...", "autocomplete" => "off"]) !!} +
+
    + @foreach ($marques as $marque) +
  • {{$marque->LIBELLE}}
  • + @endforeach +
+
    +
+ +
+
+
+ +
+ {!! Form::submit('Enregistrer', [ 'class' => 'btn']) !!} Annuler +
+ {!! Form::close() !!} +
+
+@endsection diff --git a/resources/views/dossiers/edit.blade.php b/resources/views/dossiers/edit.blade.php new file mode 100644 index 0000000..cb38e6f --- /dev/null +++ b/resources/views/dossiers/edit.blade.php @@ -0,0 +1,89 @@ +@extends('layouts.app') +@include('layouts.header') +@section('content') +
+ +
+ @if ($errors->any()) +
+ +
    + @foreach ($errors->all() as $error) +
  • {{ __($error) }}
  • + @endforeach +
+
+ @endif + @if (session()->has('error')) +
+ +
    +
  • {{ Session::get('error') }}
  • +
+
+ @endif + @if (session()->has('message')) +
+ +
    +
  • {{ Session::get('message') }}
  • +
+
+ @endif +
+

Edition d'un dossier

+
+ {!! Form::model($dossier, ['route' => ['dossier.update', $dossier], 'enctype' => 'multipart/form-data', 'class' => 'dataform']) !!} + @method('PUT') +
+ {!! Form::label('libelle', 'Libellé') !!} + {!! Form::text('libelle', $dossier->libelle, ['required']) !!} +
+
+ {!! Form::label('description', 'Description') !!} + {!! Form::textarea('description', $dossier->description) !!} +
+
+ {!! Form::label('sujet', 'Sujet associé') !!} +
+
+ {!! Form::label("", "") !!} + {!! Form::select('sujet', $sujets->pluck('LIBELLE', 'CODE_SUJET'), $dossier->sujet_id) !!} +
+
+ {!! Form::label('marques', 'Marques associées') !!} +
+
+ {!! Form::label("", "") !!} +
+ {!! Form::text('search', null, ['class' => "selector_filter", 'placeholder' => "Rechercher...", "autocomplete" => "off"]) !!} +
+
    + @foreach ($marques as $marque) +
  • {{$marque->LIBELLE}}
  • + @endforeach +
+
    + @foreach ($dossierMarques as $dossierMarque) +
  • {{$dossierMarque->LIBELLE}}
  • + @endforeach +
+ +
+
+
+ +
+ {!! Form::submit('Enregistrer', [ 'class' => 'btn']) !!} Annuler + Supprimer ce dossier +
+ {!! Form::close() !!} + {!! Form::model($dossier, ['route' => ['dossier.destroy', $dossier], 'enctype' => 'multipart/form-data', 'class' => 'deleteform']) !!} + @method('DELETE') + {!! Form::close() !!} +
+
+@endsection diff --git a/resources/views/dossiers/index.blade.php b/resources/views/dossiers/index.blade.php new file mode 100644 index 0000000..f28cbad --- /dev/null +++ b/resources/views/dossiers/index.blade.php @@ -0,0 +1,55 @@ +@extends('layouts.app') +@include('layouts.header') +@section('content') +
+ +
+
+

Gestion des dossiers

+ Ajouter +
+ +
+
+ + Ok +
+ +
+ + + + + + + + + + @foreach ($dossiers as $dossier) + + + + + + @endforeach + + + + + +
LIBELLESUJETMARQUES
{{ $dossier->libelle }}{{ $dossier->sujet->LIBELLE }}{{ $dossier->marques->implode('LIBELLE', ', ') }}
+
+
+
+@endsection diff --git a/resources/views/media_manager.blade.php b/resources/views/media_manager.blade.php index 2aec23f..d07cd16 100644 --- a/resources/views/media_manager.blade.php +++ b/resources/views/media_manager.blade.php @@ -1,7 +1,16 @@ @extends('layouts.app') @include('layouts.header') @section('content') -
- +
+
+
+

Gestion des médias

+
+
+ +
+
+
+
@endsection diff --git a/resources/views/users/create.blade.php b/resources/views/users/create.blade.php index 5060af7..f988a2a 100644 --- a/resources/views/users/create.blade.php +++ b/resources/views/users/create.blade.php @@ -4,6 +4,7 @@
@if ($errors->any()) diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php index 9c5ba0b..7a5fcae 100644 --- a/resources/views/users/edit.blade.php +++ b/resources/views/users/edit.blade.php @@ -4,6 +4,7 @@
@if ($errors->any()) @@ -84,7 +85,7 @@
- {!! Form::label('marques', 'Sujets disponibles') !!} + {!! Form::label('sujets', 'Sujets disponibles') !!}
{!! Form::label("", "") !!} diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index 742c7e4..6e2ae1c 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -4,6 +4,7 @@
@@ -46,7 +47,7 @@ @endforeach - + diff --git a/routes/web.php b/routes/web.php index d512acb..0b8ad74 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,6 +17,7 @@ Route::group(['middleware' => ['auth']], function(){ Route::get('/gestion-des-medias', 'CommunController@media_manager')->name('media_manager'); Route::resource('user', 'UserController'); Route::post('/check-matricule', 'UserController@checkMatricule'); + Route::resource('dossier', 'DossierController'); }); Auth::routes([