export calendar - modifica impostazioni

This commit is contained in:
2026-05-26 14:10:04 +02:00
parent 60ebd3b652
commit 982d754857
26 changed files with 1609 additions and 289 deletions
@@ -11,12 +11,14 @@ class EmailSettingsController extends Controller
{
public function index()
{
$this->authorizeWrite('settings');
$settings = EmailSetting::first() ?? new EmailSetting();
return view('admin.email-settings.index', compact('settings'));
}
public function save(Request $request)
{
$this->authorizeWrite('settings');
$validated = $request->validate([
'imap_host' => 'required|string|max:255',
'imap_port' => 'required|integer|min:1|max:65535',
@@ -62,6 +64,7 @@ class EmailSettingsController extends Controller
public function testConnection(Request $request)
{
$this->authorizeWrite('settings');
$settings = EmailSetting::first();
if (!$settings) {
@@ -87,6 +90,7 @@ class EmailSettingsController extends Controller
public function testSmtp(Request $request)
{
$this->authorizeWrite('settings');
$request->validate([
'email' => 'required|email',
]);
@@ -164,6 +168,7 @@ class EmailSettingsController extends Controller
public function syncNow()
{
$this->authorizeWrite('settings');
$settings = EmailSetting::getActive();
if (!$settings) {
+7 -3
View File
@@ -67,6 +67,8 @@ class AuthController extends Controller
'documenti' => 1,
'mailing' => 1,
'viste' => 1,
'report' => 0,
'settings' => 0,
];
if ($isFirstUser) {
@@ -75,9 +77,11 @@ class AuthController extends Controller
'gruppi' => 2,
'eventi' => 2,
'documenti' => 2,
'mailing' => 2,
'viste' => 2,
];
'mailing' => 2,
'viste' => 2,
'report' => 0,
'settings' => 0,
];
}
$user = User::create([
+51
View File
@@ -6,7 +6,9 @@ use App\Models\Evento;
use App\Models\Gruppo;
use App\Models\Individuo;
use App\Models\TipologiaEvento;
use App\Services\IcsExportService;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;
class EventoController extends Controller
{
@@ -219,6 +221,55 @@ class EventoController extends Controller
return redirect('/eventi')->with('success', count($eventi) . ' eventi eliminati con successo.');
}
public function exportIcs(int $id, IcsExportService $ics): StreamedResponse
{
$this->authorizeRead('eventi');
$evento = Evento::findOrFail($id);
$content = $ics->generateSingle($evento);
return response()->streamDownload(function () use ($content) {
echo $content;
}, $ics->getFilename($evento), [
'Content-Type' => 'text/calendar; charset=utf-8',
'Content-Length' => strlen($content),
]);
}
public function exportSelectedIcs(Request $request, IcsExportService $ics): StreamedResponse
{
$this->authorizeRead('eventi');
$ids = $request->input('ids', []);
if (!empty($ids) && is_array($ids)) {
$eventi = Evento::whereIn('id', $ids)->get();
} else {
$query = Evento::query();
if ($request->filled('search')) {
$query->where('nome_evento', 'like', '%' . $request->search . '%');
}
if ($request->filled('gruppo_id')) {
$query->whereHas('gruppi', fn($q) => $q->where('gruppi.id', $request->gruppo_id));
}
if ($request->filled('tipo')) {
$query->where('tipo_recorrenza', $request->tipo);
}
$eventi = $query->get();
}
if ($eventi->isEmpty()) {
return redirect('/eventi')->with('error', 'Nessun evento da esportare.');
}
$content = $ics->generateCollection($eventi);
return response()->streamDownload(function () use ($content) {
echo $content;
}, $ics->getCollectionFilename(), [
'Content-Type' => 'text/calendar; charset=utf-8',
'Content-Length' => strlen($content),
]);
}
public function calendar()
{
$this->authorizeRead('eventi');
+19 -17
View File
@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Models\AppSetting;
use App\Models\EmailSetting;
use App\Models\Ruolo;
use App\Models\TipologiaDocumento;
use App\Models\TipologiaEvento;
@@ -13,19 +14,20 @@ class ImpostazioniController extends Controller
{
public function index()
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$tipologie = TipologiaDocumento::orderBy('ordine')->get();
$tipologieEventi = TipologiaEvento::orderBy('ordine')->get();
$ruoli = Ruolo::orderBy('ordine')->get();
$appSettings = AppSetting::first();
$emailSettings = EmailSetting::first() ?? new EmailSetting();
return view('impostazioni.index', compact('tipologie', 'tipologieEventi', 'ruoli', 'appSettings'));
return view('impostazioni.index', compact('tipologie', 'tipologieEventi', 'ruoli', 'appSettings', 'emailSettings'));
}
public function saveAppSettings(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$validated = $request->validate([
'nome_applicazione' => 'nullable|string|max:100',
@@ -52,7 +54,7 @@ class ImpostazioniController extends Controller
public function tipologieStore(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$validated = $request->validate([
'nome' => 'required|string|max:50|unique:tipologie_documenti,nome',
@@ -73,7 +75,7 @@ class ImpostazioniController extends Controller
public function tipologieUpdate(Request $request, $id)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$tipologia = TipologiaDocumento::findOrFail($id);
@@ -90,7 +92,7 @@ class ImpostazioniController extends Controller
public function tipologieDestroy($id)
{
$this->authorizeDelete('viste');
$this->authorizeDelete('settings');
$tipologia = TipologiaDocumento::findOrFail($id);
$count = $tipologia->documenti()->count();
@@ -105,7 +107,7 @@ class ImpostazioniController extends Controller
public function tipologieReorder(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$order = $request->input('order', []);
@@ -118,7 +120,7 @@ class ImpostazioniController extends Controller
public function ruoliStore(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$validated = $request->validate([
'nome' => 'required|string|max:50|unique:ruoli,nome',
@@ -139,7 +141,7 @@ class ImpostazioniController extends Controller
public function ruoliUpdate(Request $request, $id)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$ruolo = Ruolo::findOrFail($id);
@@ -156,7 +158,7 @@ class ImpostazioniController extends Controller
public function ruoliDestroy($id)
{
$this->authorizeDelete('viste');
$this->authorizeDelete('settings');
$ruolo = Ruolo::findOrFail($id);
@@ -176,7 +178,7 @@ class ImpostazioniController extends Controller
public function ruoliReorder(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$order = $request->input('order', []);
@@ -189,7 +191,7 @@ class ImpostazioniController extends Controller
public function tipologieEventiStore(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$validated = $request->validate([
'nome' => 'required|string|max:50|unique:tipologie_eventi,nome',
@@ -210,7 +212,7 @@ class ImpostazioniController extends Controller
public function tipologieEventiUpdate(Request $request, $id)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$tipologia = TipologiaEvento::findOrFail($id);
@@ -227,7 +229,7 @@ class ImpostazioniController extends Controller
public function tipologieEventiDestroy($id)
{
$this->authorizeDelete('viste');
$this->authorizeDelete('settings');
$tipologia = TipologiaEvento::findOrFail($id);
$count = $tipologia->eventi()->count();
@@ -242,7 +244,7 @@ class ImpostazioniController extends Controller
public function tipologieEventiReorder(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$order = $request->input('order', []);
@@ -255,7 +257,7 @@ class ImpostazioniController extends Controller
public function uploadLogo(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$request->validate([
'logo' => 'nullable|image|mimes:png,jpg,jpeg,gif,svg|max:2048',
@@ -285,7 +287,7 @@ class ImpostazioniController extends Controller
public function removeLogo(Request $request)
{
$this->authorizeWrite('viste');
$this->authorizeWrite('settings');
$type = $request->input('type');
+1 -1
View File
@@ -14,7 +14,7 @@ class AdminOnly
return redirect('/login');
}
if (!auth()->user()->isSuperAdmin()) {
if (!auth()->user()->isSuperAdmin() && !auth()->user()->canManage('settings')) {
abort(403, 'Accesso riservato agli amministratori.');
}