Skip to content

Commit 8960204

Browse files
committed
fix: ricerca impostazioni
1 parent b2670a1 commit 8960204

2 files changed

Lines changed: 207 additions & 41 deletions

File tree

modules/impostazioni/actions.php

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,26 @@
5151

5252
case 'ricerca':
5353
$search = filter('search');
54-
$sezioni = Setting::select('sezione')
55-
->where('sezione', 'like', '%'.$search.'%')
56-
->orWhere('nome', 'like', '%'.$search.'%')
57-
->groupBy(['sezione'])
58-
->get()->pluck('sezione');
5954

60-
echo json_encode($sezioni);
55+
// Trova le impostazioni che corrispondono alla ricerca
56+
$settings = Setting::select('id', 'nome', 'sezione')
57+
->where('nome', 'like', '%'.$search.'%')
58+
->orWhere('sezione', 'like', '%'.$search.'%')
59+
->get();
60+
61+
// Raggruppa le impostazioni per sezione
62+
$results = [];
63+
foreach ($settings as $setting) {
64+
if (!isset($results[$setting->sezione])) {
65+
$results[$setting->sezione] = [];
66+
}
67+
$results[$setting->sezione][] = [
68+
'id' => $setting->id,
69+
'nome' => $setting->nome
70+
];
71+
}
72+
73+
echo json_encode($results);
6174

6275
break;
6376

modules/impostazioni/edit.php

Lines changed: 188 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,36 +29,49 @@
2929
->get();
3030

3131
echo '
32-
<div class="container">
32+
<div class="container-fluid">
3333
<div class="row">
34-
<div class="col-md-6 offset-md-3">
35-
<div class="input-group">
36-
<input type="text" class="form-control form-control-lg text-center" id="ricerca_impostazioni" placeholder="'.tr('Cerca').'...">
37-
<div class="input-group-append">
38-
<button class="btn btn-primary" type="button" id="search">
39-
<span class="fa fa-search"></span>
40-
</button>
34+
<div class="col-md-8 offset-md-2">
35+
<div class="search-container mb-4">
36+
<div class="input-group">
37+
<div class="input-group-prepend">
38+
<span class="input-group-text bg-primary border-primary text-white">
39+
<i class="fa fa-cog"></i>
40+
</span>
41+
</div>
42+
<input type="text" class="form-control form-control-lg" id="ricerca_impostazioni" placeholder="'.tr('Cerca impostazioni').'...">
43+
<div class="input-group-append">
44+
<button class="btn btn-primary" type="button" id="search">
45+
<span class="fa fa-search"></span>
46+
</button>
47+
</div>
4148
</div>
4249
</div>
4350
</div>
44-
<div class="col-md-3">
51+
<div class="col-md-2 text-right">
4552
<button class="btn btn-warning hidden" type="button" id="riprova_salvataggi" onclick="riprovaSalvataggio()">
4653
<span class="fa fa-save"></span> '.tr('Riprova salvataggi falliti').'
4754
</button>
4855
</div>
4956
</div>
50-
</div>
57+
</div>';
5158

52-
<hr>';
59+
echo '<div class="row">
60+
<div class="col-md-12">
61+
<div class="settings-container modules-impostazioni">
62+
';
5363

5464
foreach ($gruppi as $key => $gruppo) {
5565
echo '
5666
<!-- Impostazioni della singola sezione -->
57-
<div class="card card-primary collapsed-card">
67+
<div class="card card-primary collapsed-card mb-3">
5868
<div class="card-header clickable" data-title="'.$gruppo->nome.'" id="impostazioni-'.$key.'">
59-
<div class="card-title">'.tr('_SEZIONE_', [
60-
'_SEZIONE_' => $gruppo->nome,
61-
]).'</div>
69+
<div class="card-title">
70+
<i class="fa fa-sliders mr-2"></i>
71+
'.tr('_SEZIONE_', [
72+
'_SEZIONE_' => $gruppo->nome,
73+
]).'
74+
</div>
6275
<div class="card-tools pull-right">
6376
<div class="badge">'.$gruppo->numero.'</div>
6477
</div>
@@ -69,19 +82,33 @@
6982
}
7083

7184
echo '
85+
</div>
86+
</div>
87+
</div>
88+
7289
<script>
7390
7491
$(document).ready(function() {
92+
// Animazione per le card al caricamento
93+
$(".card").each(function(index) {
94+
$(this).delay(100 * index).animate({opacity: 1}, 300);
95+
});
96+
97+
// Gestione ricerca con tasto invio
7598
$("#ricerca_impostazioni").keyup(function(key) {
7699
if (key.which == 13) {
77100
$("#search").click();
78101
}
79102
});
103+
104+
// Focus automatico sul campo di ricerca
105+
$("#ricerca_impostazioni").focus();
80106
});
81107
82108
globals.impostazioni = {
83109
errors: {},
84110
numero_ricerche: 0,
111+
filtered_settings: null
85112
};
86113
87114
$("[id^=impostazioni]").click(function() {
@@ -91,16 +118,22 @@
91118
$("#search").on("click", function(){
92119
const ricerca = $("#ricerca_impostazioni").val();
93120
const icon = $(this).parent().find("span");
94-
$(".card").removeClass("hidden");
95121
96122
// Segnalazione ricerca in corso
97123
globals.impostazioni.numero_ricerche = globals.impostazioni.numero_ricerche + 1;
124+
98125
// Impostazione icona di caricamento
99126
icon
100127
.addClass("fa-spinner fa-spin")
101-
.removeClass("fa-search")
128+
.removeClass("fa-search");
129+
130+
// Mostra tutte le card prima di filtrare
131+
$(".card").removeClass("hidden");
102132
103133
if (ricerca) {
134+
// Aggiungi un effetto di transizione durante la ricerca
135+
$(".settings-container").css("opacity", "0.7");
136+
104137
$.get("'.$structure->fileurl('actions.php').'?id_module='.$id_module.'&op=ricerca&search=" + ricerca, function(data) {
105138
// Segnalazione ricerca completata
106139
globals.impostazioni.numero_ricerche = globals.impostazioni.numero_ricerche - 1;
@@ -109,38 +142,106 @@
109142
if (globals.impostazioni.numero_ricerche === 0){
110143
icon
111144
.removeClass("fa-spinner fa-spin")
112-
.addClass("fa-search")
145+
.addClass("fa-search");
113146
}
114147
115-
$(".card-header").addClass("hidden");
148+
// Nascondi tutte le card
149+
$(".card").addClass("hidden");
150+
151+
// Mostra solo le card corrispondenti alla ricerca
152+
let risultati = JSON.parse(data);
153+
let sezioni = Object.keys(risultati);
116154
117-
let sezioni = JSON.parse(data);
118-
for(const sezione of sezioni){
119-
$(`.card-header[data-title="` + sezione + `"]`).removeClass("hidden")
120-
let card = $(`.card-header[data-title="` + sezione + `"]`).removeClass("hidden")
121-
caricaSezione(card);
155+
// Se non ci sono risultati, mostra un messaggio
156+
if (sezioni.length === 0) {
157+
let searchText = $("#ricerca_impostazioni").val();
158+
$(".settings-container").html(\'<div class="alert alert-info text-center mt-4"><i class="fa fa-info-circle mr-2"></i> \' +
159+
tr("Nessun risultato trovato per") + \' <strong>"\' + searchText + \'"</strong></div>\');
160+
} else {
161+
// Salva gli ID delle impostazioni da mostrare per ogni sezione
162+
globals.impostazioni.filtered_settings = risultati;
163+
164+
// Mostra le sezioni trovate con un effetto di fade-in
165+
for(const sezione of sezioni){
166+
const card = $(`.card-header[data-title="` + sezione + `"]`).closest(".card");
167+
card.removeClass("hidden")
168+
.css("opacity", "0")
169+
.animate({opacity: 1}, 300);
170+
171+
// Carica la sezione e mostra solo le impostazioni corrispondenti
172+
caricaSezioneConFiltro(card.find(".card-header"), risultati[sezione]);
173+
}
122174
}
175+
176+
// Ripristina l\'opacità del container
177+
$(".settings-container").css("opacity", "1");
123178
});
179+
} else {
180+
// Se la ricerca è vuota, mostra tutte le card
181+
$(".card").removeClass("hidden")
182+
.css("opacity", "0")
183+
.each(function(index) {
184+
$(this).delay(50 * index).animate({opacity: 1}, 200);
185+
});
186+
187+
// Rimuovi eventuali filtri precedenti
188+
globals.impostazioni.filtered_settings = null;
189+
190+
// Ripristina l\'icona di ricerca
191+
icon
192+
.removeClass("fa-spinner fa-spin")
193+
.addClass("fa-search");
124194
}
125195
})
126196
127197
function caricaSezione(header) {
128198
let card = $(header).closest(".card");
129-
card.toggleClass("collapsed-card");
199+
let sezione = card.find(".card-header").data("title");
130200
131201
// Controllo sul caricamento già effettuato
132202
let container = card.find(".card-body");
133-
if (container.html()){
134-
return ;
135-
}
136203
137-
// Caricamento della sezione di impostazioni
138-
let sezione = card.find(".card-header").data("title");
139-
localLoading(container, true);
140-
return $.get("'.$structure->fileurl('sezione.php').'?id_module='.$id_module.'&sezione=" + sezione, function(data) {
141-
container.html(data);
142-
localLoading(container, false);
143-
});
204+
// Animazione per l\'apertura/chiusura della card
205+
if (card.hasClass("collapsed-card")) {
206+
// Se c\'è una ricerca attiva, usa la funzione di caricamento con filtro
207+
if (globals.impostazioni.filtered_settings && globals.impostazioni.filtered_settings[sezione]) {
208+
return caricaSezioneConFiltro(header, globals.impostazioni.filtered_settings[sezione]);
209+
}
210+
211+
card.removeClass("collapsed-card");
212+
card.find(".card-header").addClass("bg-light");
213+
214+
// Se il contenuto è già caricato, mostra con animazione
215+
if (container.html() && container.html().trim() !== "") {
216+
container.slideDown(300);
217+
return;
218+
}
219+
220+
// Caricamento della sezione di impostazioni
221+
localLoading(container, true);
222+
return $.get("'.$structure->fileurl('sezione.php').'?id_module='.$id_module.'&sezione=" + sezione, function(data) {
223+
container.hide();
224+
container.html(data);
225+
localLoading(container, false);
226+
227+
// Inizializza i tooltip per gli elementi appena caricati
228+
container.find("[data-toggle=\'tooltip\']").tooltip();
229+
230+
// Mostra il contenuto con animazione
231+
container.slideDown(300);
232+
233+
// Evidenzia brevemente i nuovi elementi
234+
container.find(".form-group").each(function(index) {
235+
$(this).delay(50 * index).animate({backgroundColor: "#f8f9fa"}, 300).delay(300).animate({backgroundColor: "transparent"}, 300);
236+
});
237+
});
238+
} else {
239+
// Chiudi la card con animazione
240+
container.slideUp(300, function() {
241+
card.addClass("collapsed-card");
242+
card.find(".card-header").removeClass("bg-light");
243+
});
244+
}
144245
}
145246
146247
function salvaImpostazione(id, valore){
@@ -178,6 +279,58 @@ function riprovaSalvataggio() {
178279
salvaImpostazione(id, valore);
179280
}
180281
}
282+
283+
// Funzione per caricare una sezione e mostrare solo le impostazioni filtrate
284+
function caricaSezioneConFiltro(header, impostazioni_filtrate) {
285+
let card = $(header).closest(".card");
286+
287+
// Rimuovi la classe collapsed-card per espandere la sezione
288+
card.removeClass("collapsed-card");
289+
card.find(".card-header").addClass("bg-light");
290+
291+
// Controllo sul caricamento già effettuato
292+
let container = card.find(".card-body");
293+
294+
// Caricamento della sezione di impostazioni
295+
let sezione = card.find(".card-header").data("title");
296+
localLoading(container, true);
297+
298+
return $.get("'.$structure->fileurl('sezione.php').'?id_module='.$id_module.'&sezione=" + sezione, function(data) {
299+
container.hide();
300+
container.html(data);
301+
localLoading(container, false);
302+
303+
// Inizializza i tooltip per gli elementi appena caricati
304+
container.find("[data-toggle=\'tooltip\']").tooltip();
305+
306+
// Filtra le impostazioni: nascondi quelle che non corrispondono alla ricerca
307+
const ids_da_mostrare = impostazioni_filtrate.map(item => item.id);
308+
309+
container.find(".col-md-4").each(function() {
310+
const setting_id = $(this).find("[name^=\'setting[\']").attr("name");
311+
if (setting_id) {
312+
const id = parseInt(setting_id.match(/setting\[(\d+)\]/)[1]);
313+
314+
// Nascondi le impostazioni che non corrispondono alla ricerca
315+
if (!ids_da_mostrare.includes(id)) {
316+
$(this).hide();
317+
$(this).next("script").hide();
318+
} else {
319+
// Evidenzia le impostazioni trovate
320+
$(this).addClass("found-setting");
321+
$(this).find(".form-group").css({
322+
"border-left": "3px solid #007bff",
323+
"padding-left": "10px",
324+
"background-color": "#f8f9fa"
325+
});
326+
}
327+
}
328+
});
329+
330+
// Mostra il contenuto con animazione
331+
container.slideDown(300);
332+
});
333+
}
181334
</script>';
182335

183336
if (!empty($ricerca)) {

0 commit comments

Comments
 (0)