widget recherche et dossier favoris

This commit is contained in:
Yann Gonidec 2019-07-25 09:43:06 +02:00
parent 364d9a5e1e
commit d63adb9f9d
15 changed files with 346 additions and 90 deletions

View file

@ -5,7 +5,9 @@ namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use App\Sujet;
use App\Recherche;
use App\User;
use App\Dossier;
use App\Mail\contact;
use Illuminate\Http\Request;
@ -18,8 +20,20 @@ class CommunController extends Controller
*/
public function index()
{
$sujets = Auth::user()->sujets;
return view('home')->with(['sujets'=> $sujets]);
$user = Auth::user();
$sujets = $user->sujets;
$recherches = Recherche::where('user_id', $user->id)
->with("sujet")
->limit(10)
->orderBy("created_at", "desc")
->get();
$dossiers = Dossier::whereHas("users", function($query) use ($user){
$query->where('user_id', $user->id);
})
->with("sujet")
->get();
return view('home')->with(['sujets'=> $sujets, 'recherches'=> $recherches, 'dossiers'=> $dossiers]);
}
/**

View file

@ -17,6 +17,7 @@ use App\Marque;
use App\Dossier;
use App\Tag;
use App\Article;
use App\Recherche;
use App\Historique;
use App\Http\Traits\MediaTools;
@ -30,8 +31,9 @@ class MediaController extends Controller
*
* @return \Illuminate\Http\Response
*/
public function index()
public function index(Request $request)
{
$filters = "";
$sujets = Auth::user()->sujets;
$typemedias = Typemedia::all();
$langues = Langue::all();
@ -39,6 +41,37 @@ class MediaController extends Controller
$etiquettes = Etiquette::all();
$sites = Site::orderBy('libelle')->get();
$marques = Marque::all();
$dossier_id = $request->get('d');
$sujet_id = $request->get('s');
$textSearch = $request->get('t');
$recherche_id = $request->get('r');
// ---- Recherche type texte
if($textSearch != "" && $sujet_id != ""){
// on créé un object filtre
$filters = (object) [
"search" => array(
'type' => "search",
'legend' => "Recherche : ",
'value'=> $textSearch,
'libelle' => array($textSearch),
)
];
$filters = json_encode($filters);
// ---- Recherche favorite
}elseif ($recherche_id != "") {
$recherche = Recherche::where('id', $recherche_id)->first();
if($recherche){
$filters = $recherche->filters;
$sujet_id = $recherche->sujet_id;
$dossier_id = $recherche->dossier_id;
}
}
return view('media_manager')->with([
'sujets'=> $sujets,
'typemedias'=> $typemedias,
@ -46,7 +79,10 @@ class MediaController extends Controller
'copyrights'=> $copyrights,
'etiquettes'=> $etiquettes,
'sites'=> $sites,
'marques'=> $marques
'marques'=> $marques,
'currentFolder'=> $dossier_id,
'currentSujet'=> $sujet_id,
'currentFilters'=> $filters,
]);
}
@ -65,6 +101,7 @@ class MediaController extends Controller
$limit = $request->input('limit');
$orderField = $request->input('orderField');
$order = $request->input('order');
$saveSearch = $request->input('saveSearch');
$isDepot = 0;
if($dossier_id == "0"){ // dossier racine
@ -115,6 +152,26 @@ class MediaController extends Controller
$query->WhereRaw("LCASE(libelle) LIKE '%".$search."%'");
});
});
// ---- Sauvegarde de la recherche utilisateur
if($saveSearch == 1){
$recherche = Recherche::where('libelle', $search)->first();
if($recherche){
$recherche->user_id = $userId;
$recherche->sujet_id = $sujet_id;
$recherche->dossier_id = $dossier_id;
$recherche->filters = json_encode($filters);
$recherche->save();
}else{
$recherche = new Recherche();
$recherche->user_id = $userId;
$recherche->sujet_id = $sujet_id;
$recherche->dossier_id = $dossier_id;
$recherche->filters = json_encode($filters);
$recherche->libelle = $search;
$recherche->save();
}
}
}
// Filtre type de média
if(property_exists($filters, 'typemedia_id')){

26
app/Recherche.php Normal file
View file

@ -0,0 +1,26 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Recherche extends Model
{
/**
* Get the sujet that owns the recherche.
*/
public function sujet()
{
return $this->belongsTo('App\Sujet', 'sujet_id');
}
/**
* Get the user that owns the recherche.
*/
public function user()
{
return $this->belongsTo('App\User', 'id');
}
}

View file

@ -61,4 +61,12 @@ class Sujet extends Model
{
return $this->belongsToMany('App\Format', 'sujets_formats', 'sujet_id', 'format_id');
}
/**
* Get the recherches for the sujet.
*/
public function recherches()
{
return $this->hasMany('App\Recherche');
}
}

View file

@ -107,4 +107,12 @@ class User extends Authenticatable
{
return $this->hasMany('App\Historique');
}
/**
* Get the recherches for the user.
*/
public function recherches()
{
return $this->hasMany('App\Recherche');
}
}

49
public/css/app.css vendored
View file

@ -117,11 +117,11 @@ section {
body {
line-height: 1;
background-image: linear-gradient(139deg, #3d3d3d 37.5%, #262626 37.5%, #262626 50%, #3d3d3d 50%, #3d3d3d 87.5%, #262626 87.5%, #262626 100%);
background-image: url("/images/mosaic.jpg");
font-family: "Arial", sans-serif;
font-size: 13px;
color: #aaaaaa;
background-size: 6.1px 5.3px;
background-color: #3b3b3b;
height: 100%;
}
@ -13338,6 +13338,47 @@ readers do not read off random characters that represent icons */
border-left: 1px solid #E1E1E1;*/
}
.home .widget {
display: flex;
flex-direction: row;
justify-content: space-around;
margin-top: 80px;
}
.home .widget .item {
width: 300px;
min-height: 200px;
background-color: #333333;
}
.home .widget .item header {
background-color: #272626;
padding: 10px;
font-size: 14px;
color: #ffffff;
}
.home .widget .item .content {
padding: 10px;
overflow-y: auto;
max-height: 282px;
}
.home .widget .item .content a {
font-size: 14px;
color: #ffffff;
display: block;
margin-bottom: 7px;
}
.home .widget .item .content a i {
margin-right: 5px;
}
.home .widget .item .content a:hover {
text-decoration: underline;
}
/******************************************
FORM
******************************************/
@ -13766,6 +13807,10 @@ table tfoot tr:hover {
margin-right: 3px;
}
.media_manager .main_content header .search_wrapper .filter_wrapper .search_filters_list {
display: inline-flex;
}
.media_manager .main_content header .search_wrapper .filter_wrapper .search_filters_list .filter_item {
border: 1px solid #aaaaaa;
border-radius: 3px;

BIN
public/images/mosaic.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

93
public/js/app.js vendored
View file

@ -11280,32 +11280,25 @@ $(document).ready(function () {
/******************************
Liste des dossiers
**********************************/
// ---- init des dossiers
// ---- init des dossiers et des médias
if ($(".media_manager").length) {
// En cas d'une recherche depuis la home, initialise la page avec une recherche texte
if ($("#searchParameter").val() != "") {
// on créé un object filtre
var filter = {
type: "search",
legend: "Recherche : ",
value: $("#searchParameter").val(),
libelle: [$("#searchParameter").val()]
}; // MAJ du filtre principal et de l'affichage
updateFilter(filter);
$(".search_filters .search_value").val($("#searchParameter").val());
} // En cas d'une recherche depuis la home, initialise la page avec le bon sujet
// initialise la page avec le bon sujet
if ($("#sujetParameter").val() != "") {
// aucun dossier sélectionner
$(window).data('currentFolder', -1);
$("#sujet_selector").val($("#sujetParameter").val());
loadMedia($("#sujet_selector").val());
} // initialise la page avec le bon dossier
if ($("#folderParameter").val() != "") {
$(window).data('currentFolder', $("#folderParameter").val());
} // initialise les paramètres de recherche
if ($("#filterParameter").val() != "") {
var filters = JSON.parse($("#filterParameter").val());
$(window).data('filter', filters);
}
var sujetId = $("#sujet_selector").val();
if (sujetId != "") initFolderManager(sujetId);
initFolderManager($("#sujet_selector").val());
} // ---- collapse/expand side menu
@ -11326,7 +11319,13 @@ $(document).ready(function () {
$("#sujet_selector").on('change', function (event) {
var sujetId = $("#sujet_selector").val();
if (sujetId != "") $('.dd').nestable('destroy');
$(window).data('currentFolder', 0);
$(window).data('currentFolder', 0); // Vide la bar recherche
$(".search_filters_list").html(""); // supprime tous les éléments de recherche
$(window).data('filter', {}); // masque le bouton de reinitialisation
$(".filter_wrapper .reinit_search_btn").hide();
initFolderManager(sujetId);
}); // ---- sélectionner un dossier et favoris
@ -12787,19 +12786,40 @@ function initFolderManager(sujetId) {
}); //('.dd').nestable('collapseAll');
$(".folder_container .dd-empty").remove();
$(".folder_container .loader").hide(); //---- Chargement des médias
$(".folder_container .loader").hide(); // ---- Par défaut déselectionne toutes les checkbox
var currentFolder = $(window).data('currentFolder');
$(".filter").find('input[type="checkbox"]').prop("checked", false); // charge la recherche si necessaire
if (currentFolder == 0 || currentFolder == "") {
if (Object.keys($(window).data('filter')).length > 0) {
var filters = $(window).data('filter');
$.each(filters, function (index, filter) {
// ajoute le widget filtre
updateFilter(filter); // init des champs de recherche
if (filter.type == 'search') {
$(".search_filters .search_value").val(filter.value);
} else {
$('.search_filters .filter[data-type="' + filter.type + '"]').find('input[type="checkbox"]').each(function (index, cb) {
if ($.inArray($(this).val(), filter.value) >= 0) {
$(this).prop("checked", true);
} else {
$(this).prop("checked", false);
}
});
}
});
} // sélection du dossier
if ($(window).data('currentFolder') > 0) {
// on se place sur un dossier spécifique
$('.dd .dd-item[data-id="' + $(window).data('currentFolder') + '"] > .dd3-content').trigger("click");
} else if ($(window).data('currentFolder') == -1) {
loadMedia($("#sujet_selector").val());
} else {
// si pasdossier spécifié alors on se place à la racine
$(window).data('currentFolder', 0);
$(".root_folder").trigger("click");
} else if (currentFolder > 0) {
if ($('.dd .dd-item[data-id="' + currentFolder + '"] > .dd3-content').length) {
$('.dd .dd-item[data-id="' + currentFolder + '"] > .dd3-content').trigger("click");
} else {
$(window).data('currentFolder', 0);
$(".root_folder").trigger("click");
}
}
},
error: function error(jqXHR, textStatus, errorThrown) {
@ -12815,6 +12835,7 @@ function initFolderManager(sujetId) {
window.loadMedia = function (sujet_id) {
var saveSearch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
var output = '';
if ($(window).data('offset') == 0) {
@ -12842,7 +12863,7 @@ window.loadMedia = function (sujet_id) {
limit: $(window).data('limit'),
orderField: $("#order_select").val(),
order: $('#order_select option:selected').attr('data-order'),
filter: $(window).data('filter')
saveSearch: saveSearch
},
success: function success(result) {
var data = result.data;
@ -13120,9 +13141,7 @@ $(document).ready(function () {
**********************************/
// ---- Initialisation du module de recherche
if ($('.search_wrapper').length) {
// ---- Par défaut déselectionne toutes les checkbox
$(".filter").find('input[type="checkbox"]').prop("checked", false); // ---- Initialisation des listes
// ---- Initialisation des listes
$(".filter_selector .filter_btn").on('click', function (event) {
$(".filter_selector .list").not($(this).parent().find(".list")).hide();
$(this).parent().find(".list").toggle();
@ -13147,7 +13166,7 @@ $(document).ready(function () {
var sujet_id = $("#sujet_selector").val();
$(window).data('offset', 0);
loadMedia(sujet_id);
loadMedia(sujet_id, 1);
}); // ---- Clique sur un filtre
$(".filter").on('click', 'input[type="checkbox"]', function (event) {

96
resources/js/media.js vendored
View file

@ -4,34 +4,22 @@ $(document).ready(function() {
Liste des dossiers
**********************************/
// ---- init des dossiers
// ---- init des dossiers et des médias
if ( $( ".media_manager" ).length ) {
// En cas d'une recherche depuis la home, initialise la page avec une recherche texte
if($("#searchParameter").val() != ""){
// on créé un object filtre
var filter = {
type: "search",
legend : "Recherche : ",
value: $("#searchParameter").val(),
libelle: [$("#searchParameter").val()],
};
// MAJ du filtre principal et de l'affichage
updateFilter(filter);
$(".search_filters .search_value").val($("#searchParameter").val());
}
// En cas d'une recherche depuis la home, initialise la page avec le bon sujet
// initialise la page avec le bon sujet
if($("#sujetParameter").val() != ""){
// aucun dossier sélectionner
$(window).data('currentFolder', -1);
$("#sujet_selector").val($("#sujetParameter").val());
loadMedia($("#sujet_selector").val());
}
var sujetId = $("#sujet_selector").val();
if(sujetId != "")
initFolderManager(sujetId);
// initialise la page avec le bon dossier
if($("#folderParameter").val() != ""){
$(window).data('currentFolder', $("#folderParameter").val());
}
// initialise les paramètres de recherche
if($("#filterParameter").val() != ""){
var filters = JSON.parse($("#filterParameter").val());
$(window).data('filter', filters);
}
initFolderManager($("#sujet_selector").val());
}
// ---- collapse/expand side menu
@ -54,6 +42,14 @@ $(document).ready(function() {
if(sujetId != "")
$('.dd').nestable('destroy');
$(window).data('currentFolder', 0);
// Vide la bar recherche
$(".search_filters_list").html("");
// supprime tous les éléments de recherche
$(window).data('filter', {});
// masque le bouton de reinitialisation
$(".filter_wrapper .reinit_search_btn").hide();
initFolderManager(sujetId);
});
@ -1412,18 +1408,44 @@ function initFolderManager(sujetId){
//('.dd').nestable('collapseAll');
$(".folder_container .dd-empty").remove();
$(".folder_container .loader").hide();
//---- Chargement des médias
var currentFolder = $(window).data('currentFolder');
if(currentFolder == 0 || currentFolder == ""){
$(".root_folder").trigger("click");
}else if (currentFolder > 0) {
if($('.dd .dd-item[data-id="'+currentFolder+'"] > .dd3-content').length){
$('.dd .dd-item[data-id="'+currentFolder+'"] > .dd3-content').trigger("click");
}else{
$(window).data('currentFolder', 0);
$(".root_folder").trigger("click");
}
// ---- Par défaut déselectionne toutes les checkbox
$(".filter").find('input[type="checkbox"]').prop( "checked", false );
// charge la recherche si necessaire
if(Object.keys($(window).data('filter')).length > 0){
var filters = $(window).data('filter');
$.each(filters, function (index, filter) {
// ajoute le widget filtre
updateFilter(filter);
// init des champs de recherche
if(filter.type == 'search'){
$(".search_filters .search_value").val(filter.value);
}else{
$('.search_filters .filter[data-type="'+filter.type+'"]').find('input[type="checkbox"]').each(function (index, cb){
if($.inArray($(this).val(), filter.value ) >= 0){
$(this ).prop( "checked", true );
}else{
$(this).prop( "checked", false );
}
});
}
});
}
// sélection du dossier
if($(window).data('currentFolder') > 0){
// on se place sur un dossier spécifique
$('.dd .dd-item[data-id="'+$(window).data('currentFolder')+'"] > .dd3-content').trigger("click");
}else if ($(window).data('currentFolder') == -1) {
loadMedia($("#sujet_selector").val());
}else{
// si pasdossier spécifié alors on se place à la racine
$(window).data('currentFolder', 0);
$(".root_folder").trigger("click");
}
},
error: function(jqXHR, textStatus, errorThrown) {
$(".folder_container .loader").hide();
@ -1433,7 +1455,7 @@ function initFolderManager(sujetId){
}
// ---- Chargement des média
window.loadMedia = function(sujet_id){
window.loadMedia = function(sujet_id, saveSearch = 0){
var output = '';
if($(window).data('offset') == 0){
$(window).data('noMedia', false);
@ -1461,7 +1483,7 @@ window.loadMedia = function(sujet_id){
limit : $(window).data('limit'),
orderField : $("#order_select").val(),
order : $('#order_select option:selected').attr('data-order'),
filter : $(window).data('filter'),
saveSearch : saveSearch,
},
success: function(result){
var data = result.data;

View file

@ -8,9 +8,6 @@ $(document).ready(function() {
// ---- Initialisation du module de recherche
if($('.search_wrapper').length){
// ---- Par défaut déselectionne toutes les checkbox
$(".filter").find('input[type="checkbox"]').prop( "checked", false );
// ---- Initialisation des listes
$(".filter_selector .filter_btn").on('click',function(event) {
$(".filter_selector .list").not($(this).parent().find(".list")).hide();
@ -40,7 +37,7 @@ $(document).ready(function() {
// On lance la recherche
var sujet_id = $("#sujet_selector").val();
$(window).data('offset', 0);
loadMedia(sujet_id);
loadMedia(sujet_id, 1);
});
// ---- Clique sur un filtre

View file

@ -552,4 +552,39 @@
}
}
}
.widget{
display: flex;
flex-direction: row;
justify-content: space-around;
margin-top: 80px;
.item{
width: 300px;
min-height: 200px;
background-color: $grey3;
header{
background-color: $lightdark;
padding: 10px;
font-size: 14px;
color: $white;
}
.content{
padding: 10px;
overflow-y: auto;
max-height: 282px;
a{
font-size: 14px;
color: $white;
display: block;
margin-bottom: 7px;
i{
margin-right: 5px;
}
&:hover{
text-decoration: underline;
}
}
}
}
}
}

View file

@ -78,6 +78,8 @@
margin-right: 3px;
}
.search_filters_list{
display: inline-flex;
.filter_item{
border: 1px solid $grey2;
border-radius: 3px;

View file

@ -35,11 +35,11 @@ footer, header, hgroup, menu, nav, section {
}
body {
line-height: 1;
background-image: linear-gradient(139deg, #3d3d3d 37.50%, #262626 37.50%, #262626 50%, #3d3d3d 50%, #3d3d3d 87.50%, #262626 87.50%, #262626 100%);
background-image: url("/images/mosaic.jpg");
font-family: "Arial", sans-serif;
font-size: 13px;
color: $grey2;
background-size: 6.10px 5.30px;
background-color: $grey;
height: 100%;
}
ol, ul {

View file

@ -6,15 +6,37 @@
<div class="container">
<h1><i class="fas fa-images"></i> Bienvenue</h1>
<form class="input_search" action="{{ route('media_manager') }}" method="get">
<div class="select_container"><select name="t" >
<div class="select_container"><select name="s" >
@foreach ($sujets as $sujet)
<option value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</option>
@endforeach
</select></div>
<input type="text" name="s" value="" autofocus placeholder="Rechercher un média...">
<input type="text" name="t" value="" autofocus placeholder="Rechercher un média...">
<button type="submit"><i class="far fa-search"></i></button>
</form>
</div>
</div>
<div class="widget">
<div class="item">
<header>
Mes dernières recherches
</header>
<div class="content">
@foreach ($recherches as $recherche)
<a href="{{ route('media_manager', ['r' => $recherche->id]) }}" ><i class="far fa-search"></i> {{$recherche->sujet->libelle." - ".$recherche->libelle}}</a>
@endforeach
</div>
</div>
<div class="item">
<header>
Mes dossiers favoris
</header>
<div class="content">
@foreach ($dossiers as $dossier)
<a href="{{ route('media_manager', ['d' => $dossier->id, 's' => $dossier->sujet->codeSujet]) }}" ><i class="far fa-search"></i> {{$dossier->sujet->libelle." - ".$dossier->libelle}}</a>
@endforeach
</div>
</div>
</div>
</main>
@endsection

View file

@ -11,8 +11,9 @@
<option value="{{$sujet->codeSujet}}" >{{$sujet->libelle}}</option>
@endforeach
</select>
<input type="hidden" id="searchParameter" value="{{ Request::get('s') }}">
<input type="hidden" id="sujetParameter" value="{{ Request::get('t') }}">
<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">