administration des dossiers

This commit is contained in:
Yann Gonidec 2019-05-17 11:35:41 +02:00
parent c58d008ec7
commit b502e0f2c5
19 changed files with 622 additions and 8 deletions

View file

@ -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');
}
}

View file

@ -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]);
}
}

View file

@ -0,0 +1,175 @@
<?php
namespace App\Http\Controllers;
use App\Dossier;
use App\Sujet;
use App\Marque;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class DossierController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
Auth::user()->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]);
}
}
}

View file

@ -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 {

View file

@ -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');
}
}

View file

@ -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');
}
}

36
public/css/app.css vendored
View file

@ -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
******************************************/

30
public/js/app.js vendored
View file

@ -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) {

34
resources/js/admin.js vendored
View file

@ -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();

View file

@ -10,4 +10,5 @@
'partials/fontawesome/brands.scss',
'partials/common.scss',
'partials/form.scss',
'partials/media.scss',
'partials/user.scss';

41
resources/sass/partials/media.scss vendored Normal file
View file

@ -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;
}
}
}

View file

@ -0,0 +1,83 @@
@extends('layouts.app')
@include('layouts.header')
@section('content')
<main class="user_index template_2col">
<div class="side_menu">
<a href="{{ route('user.index') }}"><span>Gestion des utilisateurs</span><i class="fas fa-users-cog"></i></a>
<a class="active" href="{{ route('dossier.index') }}"><span>Gestion des dossiers</span><i class="fas fa-folders"></i></a>
</div>
<div class="main_content">
@if ($errors->any())
<div class="alert alert-danger">
<i class="fas fa-times"></i>
<ul>
@foreach ($errors->all() as $error)
<li>{{ __($error) }}</li>
@endforeach
</ul>
</div>
@endif
@if (session()->has('error'))
<div class="alert alert-danger">
<i class="fas fa-times"></i>
<ul>
<li>{{ Session::get('error') }}</li>
</ul>
</div>
@endif
@if (session()->has('message'))
<div class="alert alert-ok">
<i class="fas fa-check"></i>
<ul>
<li>{{ Session::get('message') }}</li>
</ul>
</div>
@endif
<div class="heading">
<h1>Ajouter un dossier</h1>
</div>
{!! Form::open( ['route' => 'dossier.store', 'class' => 'dataform']) !!}
@method('POST')
<div class="form-field">
{!! Form::label('libelle', 'Libellé') !!}
{!! Form::text('libelle', null, ['required']) !!}
</div>
<div class="form-field">
{!! Form::label('description', 'Description') !!}
{!! Form::textarea('description', null) !!}
</div>
<div class="form-section">
{!! Form::label('sujet', 'Sujet associé') !!}
</div>
<div class="form-field">
{!! Form::label("", "") !!}
{!! Form::select('sujet', $sujets->pluck('LIBELLE', 'CODE_SUJET')) !!}
</div>
<div class="form-section">
{!! Form::label('marques', 'Marques associées') !!}
</div>
<div class="form-field">
{!! Form::label("", "") !!}
<div class="selector_form selector_marques">
{!! Form::text('search', null, ['class' => "selector_filter", 'placeholder' => "Rechercher...", "autocomplete" => "off"]) !!}
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</li>
@endforeach
</ul>
<ul class="selector_values" >
</ul>
<input class="selector_dataValues" type="hidden" name="marques" value="">
</div>
</div>
</div>
<div class="button-row">
{!! Form::submit('Enregistrer', [ 'class' => 'btn']) !!} <a href="{{ route('user.index') }}" class="btn btn-black ml-10">Annuler</a>
</div>
{!! Form::close() !!}
</div>
</main>
@endsection

View file

@ -0,0 +1,89 @@
@extends('layouts.app')
@include('layouts.header')
@section('content')
<main class="user_index template_2col">
<div class="side_menu">
<a href="{{ route('user.index') }}"><span>Gestion des utilisateurs</span><i class="fas fa-users-cog"></i></a>
<a class="active" href="{{ route('dossier.index') }}"><span>Gestion des dossiers</span><i class="fas fa-folders"></i></a>
</div>
<div class="main_content">
@if ($errors->any())
<div class="alert alert-danger">
<i class="fas fa-times"></i>
<ul>
@foreach ($errors->all() as $error)
<li>{{ __($error) }}</li>
@endforeach
</ul>
</div>
@endif
@if (session()->has('error'))
<div class="alert alert-danger">
<i class="fas fa-times"></i>
<ul>
<li>{{ Session::get('error') }}</li>
</ul>
</div>
@endif
@if (session()->has('message'))
<div class="alert alert-ok">
<i class="fas fa-check"></i>
<ul>
<li>{{ Session::get('message') }}</li>
</ul>
</div>
@endif
<div class="heading">
<h1>Edition d'un dossier</h1>
</div>
{!! Form::model($dossier, ['route' => ['dossier.update', $dossier], 'enctype' => 'multipart/form-data', 'class' => 'dataform']) !!}
@method('PUT')
<div class="form-field">
{!! Form::label('libelle', 'Libellé') !!}
{!! Form::text('libelle', $dossier->libelle, ['required']) !!}
</div>
<div class="form-field">
{!! Form::label('description', 'Description') !!}
{!! Form::textarea('description', $dossier->description) !!}
</div>
<div class="form-section">
{!! Form::label('sujet', 'Sujet associé') !!}
</div>
<div class="form-field">
{!! Form::label("", "") !!}
{!! Form::select('sujet', $sujets->pluck('LIBELLE', 'CODE_SUJET'), $dossier->sujet_id) !!}
</div>
<div class="form-section">
{!! Form::label('marques', 'Marques associées') !!}
</div>
<div class="form-field">
{!! Form::label("", "") !!}
<div class="selector_form selector_marques">
{!! Form::text('search', null, ['class' => "selector_filter", 'placeholder' => "Rechercher...", "autocomplete" => "off"]) !!}
<div class="selector_list">
<ul class="selector_choices" >
@foreach ($marques as $marque)
<li data-value="{{$marque->COD_MARQUE}}" >{{$marque->LIBELLE}}</li>
@endforeach
</ul>
<ul class="selector_values" >
@foreach ($dossierMarques as $dossierMarque)
<li data-value="{{$dossierMarque->COD_MARQUE}}" >{{$dossierMarque->LIBELLE}}</li>
@endforeach
</ul>
<input class="selector_dataValues" type="hidden" name="marques" value="">
</div>
</div>
</div>
<div class="button-row">
{!! Form::submit('Enregistrer', [ 'class' => 'btn']) !!} <a href="{{ route('dossier.index') }}" class="btn btn-black ml-10">Annuler</a>
<a href="#" class="btn btn-black floatr btn_delete_dossier">Supprimer ce dossier</a>
</div>
{!! Form::close() !!}
{!! Form::model($dossier, ['route' => ['dossier.destroy', $dossier], 'enctype' => 'multipart/form-data', 'class' => 'deleteform']) !!}
@method('DELETE')
{!! Form::close() !!}
</div>
</main>
@endsection

View file

@ -0,0 +1,55 @@
@extends('layouts.app')
@include('layouts.header')
@section('content')
<main class="user_index template_2col">
<div class="side_menu">
<a href="{{ route('user.index') }}"><span>Gestion des utilisateurs</span><i class="fas fa-users-cog"></i></a>
<a class="active" href="{{ route('dossier.index') }}"><span>Gestion des dossiers</span><i class="fas fa-folders"></i></a>
</div>
<div class="main_content">
<div class="heading">
<h1>Gestion des dossiers</h1>
<a href="{{ route('dossier.create') }}" class=" btn"><i class="fal fa-plus"></i> Ajouter</a>
</div>
<div class="filter_row group">
<div class="left_col">
<select class="filter_sujet" >
<option value="0">Filtrer par sujet</option>
@foreach ($sujets as $sujet)
<option value="{{$sujet->CODE_SUJET}}">{{$sujet->LIBELLE}}</option>
@endforeach
</select>
<a href="#" class=" btn btn-black filter_sujet_btn">Ok</a>
</div>
<div class="right_col">
<input type="text" value="" class="filter_dossier_input">
<a href="#" class=" btn btn-black filter_dossier_btn">Rechercher un dossier</a>
</div>
</div>
<table class="datatable">
<thead>
<tr>
<th>LIBELLE</th>
<th>SUJET</th>
<th>MARQUES</th>
</tr>
</thead>
@foreach ($dossiers as $dossier)
<tr class="data_row" attr-sujet="{{ $dossier->sujet->CODE_SUJET}}">
<td><a href="{{ route('dossier.edit', $dossier) }}">{{ $dossier->libelle }}</a></td>
<td>{{ $dossier->sujet->LIBELLE }}</td>
<td>{{ $dossier->marques->implode('LIBELLE', ', ') }}</td>
</tr>
@endforeach
<tfoot>
<tr>
<td colspan="3">
</td>
</tr>
</tfoot>
</table>
</div>
</main>
@endsection

View file

@ -1,7 +1,16 @@
@extends('layouts.app')
@include('layouts.header')
@section('content')
<main class="media_manager">
<main class="media_manager template_2col">
<div class="side_menu">
<header>
<h1><i class="fas fa-images"></i> Gestion des médias</h1>
</header>
<div class="folder_container">
</div>
</div>
<div class="main_content">
</div>
</main>
@endsection

View file

@ -4,6 +4,7 @@
<main class="user_index template_2col">
<div class="side_menu">
<a class="active" href="{{ route('user.index') }}"><span>Gestion des utilisateurs</span><i class="fas fa-users-cog"></i></a>
<a href="{{ route('dossier.index') }}"><span>Gestion des dossiers</span><i class="fas fa-folders"></i></a>
</div>
<div class="main_content">
@if ($errors->any())

View file

@ -4,6 +4,7 @@
<main class="user_index template_2col">
<div class="side_menu">
<a class="active" href="{{ route('user.index') }}"><span>Gestion des utilisateurs</span><i class="fas fa-users-cog"></i></a>
<a href="{{ route('dossier.index') }}"><span>Gestion des dossiers</span><i class="fas fa-folders"></i></a>
</div>
<div class="main_content">
@if ($errors->any())
@ -84,7 +85,7 @@
</div>
<div class="form-section">
{!! Form::label('marques', 'Sujets disponibles') !!}
{!! Form::label('sujets', 'Sujets disponibles') !!}
</div>
<div class="form-field">
{!! Form::label("", "") !!}

View file

@ -4,6 +4,7 @@
<main class="user_index template_2col">
<div class="side_menu">
<a class="active" href="{{ route('user.index') }}"><span>Gestion des utilisateurs</span><i class="fas fa-users-cog"></i></a>
<a href="{{ route('dossier.index') }}"><span>Gestion des dossiers</span><i class="fas fa-folders"></i></a>
</div>
<div class="main_content">
<div class="heading">
@ -46,7 +47,7 @@
@endforeach
<tfoot>
<tr>
<td colspan="5">
<td colspan="4">
</td>
</tr>
</tfoot>

View file

@ -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([