netgescon-master/netgescon-laravel/app/Http/Controllers/Admin/ThemeController.php

184 lines
6.0 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Helpers\ThemeHelper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ThemeController extends Controller
{
/**
* Mostra la pagina di personalizzazione tema
*/
public function index()
{
$currentTheme = ThemeHelper::getUserTheme();
$presetThemes = ThemeHelper::getPresetThemes();
return view('admin.theme.index', compact('currentTheme', 'presetThemes'));
}
/**
* Salva le impostazioni del tema personalizzato
*/
public function save(Request $request)
{
$request->validate([
'primary_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'secondary_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'success_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'danger_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'warning_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'info_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'light_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'dark_color' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'sidebar_bg' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'sidebar_text' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'header_bg' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'header_text' => 'required|regex:/^#([a-f0-9]{3}){1,2}$/i',
'theme_mode' => 'required|in:light,dark'
]);
$themeData = $request->only([
'primary_color', 'secondary_color', 'success_color', 'danger_color',
'warning_color', 'info_color', 'light_color', 'dark_color',
'sidebar_bg', 'sidebar_text', 'header_bg', 'header_text', 'theme_mode'
]);
$success = ThemeHelper::saveUserTheme(Auth::id(), $themeData);
if ($success) {
return response()->json([
'success' => true,
'message' => 'Tema salvato con successo!',
'css' => ThemeHelper::generateCustomCSS()
]);
} else {
return response()->json([
'success' => false,
'message' => 'Errore nel salvataggio del tema.'
], 500);
}
}
/**
* Applica un tema predefinito
*/
public function applyPreset(Request $request)
{
$request->validate([
'preset' => 'required|string'
]);
$success = ThemeHelper::applyPresetTheme(Auth::id(), $request->preset);
if ($success) {
return response()->json([
'success' => true,
'message' => 'Tema predefinito applicato con successo!',
'css' => ThemeHelper::generateCustomCSS(),
'theme' => ThemeHelper::getUserTheme()
]);
} else {
return response()->json([
'success' => false,
'message' => 'Tema predefinito non trovato.'
], 404);
}
}
/**
* Resetta il tema ai valori di default
*/
public function reset()
{
$success = ThemeHelper::saveUserTheme(Auth::id(), ThemeHelper::DEFAULT_THEME);
if ($success) {
return response()->json([
'success' => true,
'message' => 'Tema ripristinato ai valori di default!',
'css' => ThemeHelper::generateCustomCSS(),
'theme' => ThemeHelper::getUserTheme()
]);
} else {
return response()->json([
'success' => false,
'message' => 'Errore nel ripristino del tema.'
], 500);
}
}
/**
* Ottiene il CSS personalizzato per l'utente corrente
*/
public function getCss()
{
$css = ThemeHelper::generateCustomCSS();
return response($css)
->header('Content-Type', 'text/css')
->header('Cache-Control', 'public, max-age=3600');
}
/**
* Esporta le impostazioni del tema corrente
*/
public function export()
{
$theme = ThemeHelper::getUserTheme();
$filename = 'netgescon_tema_' . Auth::user()->name . '_' . date('Y-m-d') . '.json';
return response()->json($theme)
->header('Content-Disposition', 'attachment; filename="' . $filename . '"');
}
/**
* Importa impostazioni tema da file JSON
*/
public function import(Request $request)
{
$request->validate([
'theme_file' => 'required|file|mimes:json'
]);
try {
$fileContent = file_get_contents($request->file('theme_file')->getRealPath());
$themeData = json_decode($fileContent, true);
if (!$themeData) {
throw new \Exception('File JSON non valido');
}
// Valida che contenga almeno i campi essenziali
$requiredFields = ['primary_color', 'sidebar_bg', 'header_bg'];
foreach ($requiredFields as $field) {
if (!isset($themeData[$field])) {
throw new \Exception("Campo mancante nel file: $field");
}
}
$success = ThemeHelper::saveUserTheme(Auth::id(), $themeData);
if ($success) {
return response()->json([
'success' => true,
'message' => 'Tema importato con successo!',
'css' => ThemeHelper::generateCustomCSS(),
'theme' => ThemeHelper::getUserTheme()
]);
} else {
throw new \Exception('Errore nel salvataggio del tema importato');
}
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Errore nell\'importazione: ' . $e->getMessage()
], 400);
}
}
}