184 lines
6.0 KiB
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);
|
|
}
|
|
}
|
|
}
|