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); } } }