|
29 | 29 | ->get(); |
30 | 30 |
|
31 | 31 | echo ' |
32 | | -<div class="container"> |
| 32 | +<div class="container-fluid"> |
33 | 33 | <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> |
41 | 48 | </div> |
42 | 49 | </div> |
43 | 50 | </div> |
44 | | - <div class="col-md-3"> |
| 51 | + <div class="col-md-2 text-right"> |
45 | 52 | <button class="btn btn-warning hidden" type="button" id="riprova_salvataggi" onclick="riprovaSalvataggio()"> |
46 | 53 | <span class="fa fa-save"></span> '.tr('Riprova salvataggi falliti').' |
47 | 54 | </button> |
48 | 55 | </div> |
49 | 56 | </div> |
50 | | -</div> |
| 57 | +</div>'; |
51 | 58 |
|
52 | | -<hr>'; |
| 59 | +echo '<div class="row"> |
| 60 | + <div class="col-md-12"> |
| 61 | + <div class="settings-container modules-impostazioni"> |
| 62 | +'; |
53 | 63 |
|
54 | 64 | foreach ($gruppi as $key => $gruppo) { |
55 | 65 | echo ' |
56 | 66 | <!-- Impostazioni della singola sezione --> |
57 | | -<div class="card card-primary collapsed-card"> |
| 67 | +<div class="card card-primary collapsed-card mb-3"> |
58 | 68 | <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> |
62 | 75 | <div class="card-tools pull-right"> |
63 | 76 | <div class="badge">'.$gruppo->numero.'</div> |
64 | 77 | </div> |
|
69 | 82 | } |
70 | 83 |
|
71 | 84 | echo ' |
| 85 | + </div> |
| 86 | + </div> |
| 87 | +</div> |
| 88 | +
|
72 | 89 | <script> |
73 | 90 |
|
74 | 91 | $(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 |
75 | 98 | $("#ricerca_impostazioni").keyup(function(key) { |
76 | 99 | if (key.which == 13) { |
77 | 100 | $("#search").click(); |
78 | 101 | } |
79 | 102 | }); |
| 103 | +
|
| 104 | + // Focus automatico sul campo di ricerca |
| 105 | + $("#ricerca_impostazioni").focus(); |
80 | 106 | }); |
81 | 107 |
|
82 | 108 | globals.impostazioni = { |
83 | 109 | errors: {}, |
84 | 110 | numero_ricerche: 0, |
| 111 | + filtered_settings: null |
85 | 112 | }; |
86 | 113 |
|
87 | 114 | $("[id^=impostazioni]").click(function() { |
|
91 | 118 | $("#search").on("click", function(){ |
92 | 119 | const ricerca = $("#ricerca_impostazioni").val(); |
93 | 120 | const icon = $(this).parent().find("span"); |
94 | | - $(".card").removeClass("hidden"); |
95 | 121 |
|
96 | 122 | // Segnalazione ricerca in corso |
97 | 123 | globals.impostazioni.numero_ricerche = globals.impostazioni.numero_ricerche + 1; |
| 124 | +
|
98 | 125 | // Impostazione icona di caricamento |
99 | 126 | icon |
100 | 127 | .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"); |
102 | 132 |
|
103 | 133 | if (ricerca) { |
| 134 | + // Aggiungi un effetto di transizione durante la ricerca |
| 135 | + $(".settings-container").css("opacity", "0.7"); |
| 136 | +
|
104 | 137 | $.get("'.$structure->fileurl('actions.php').'?id_module='.$id_module.'&op=ricerca&search=" + ricerca, function(data) { |
105 | 138 | // Segnalazione ricerca completata |
106 | 139 | globals.impostazioni.numero_ricerche = globals.impostazioni.numero_ricerche - 1; |
|
109 | 142 | if (globals.impostazioni.numero_ricerche === 0){ |
110 | 143 | icon |
111 | 144 | .removeClass("fa-spinner fa-spin") |
112 | | - .addClass("fa-search") |
| 145 | + .addClass("fa-search"); |
113 | 146 | } |
114 | 147 |
|
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); |
116 | 154 |
|
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 | + } |
122 | 174 | } |
| 175 | +
|
| 176 | + // Ripristina l\'opacità del container |
| 177 | + $(".settings-container").css("opacity", "1"); |
123 | 178 | }); |
| 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"); |
124 | 194 | } |
125 | 195 | }) |
126 | 196 |
|
127 | 197 | function caricaSezione(header) { |
128 | 198 | let card = $(header).closest(".card"); |
129 | | - card.toggleClass("collapsed-card"); |
| 199 | + let sezione = card.find(".card-header").data("title"); |
130 | 200 |
|
131 | 201 | // Controllo sul caricamento già effettuato |
132 | 202 | let container = card.find(".card-body"); |
133 | | - if (container.html()){ |
134 | | - return ; |
135 | | - } |
136 | 203 |
|
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 | + } |
144 | 245 | } |
145 | 246 |
|
146 | 247 | function salvaImpostazione(id, valore){ |
@@ -178,6 +279,58 @@ function riprovaSalvataggio() { |
178 | 279 | salvaImpostazione(id, valore); |
179 | 280 | } |
180 | 281 | } |
| 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 | +} |
181 | 334 | </script>'; |
182 | 335 |
|
183 | 336 | if (!empty($ricerca)) { |
|
0 commit comments