find($theme); abort_unless(in_array($item->type(), ['frontend', 'backend'], true), 422, 'Only frontend and backend themes can be activated.'); $settings->put($item->type().'_theme', $item->key(), 'site', 'string', true); return back()->with('status', $item->name().' is now the active '.$item->type().' theme.'); } public function preview(string $theme, Loader $loader, ThemeViewResolver $views) { $item = $loader->find($theme); abort_unless( in_array($item->type(), ['frontend', 'backend'], true), 422, 'Only frontend and backend themes can be previewed.' ); return view('stylist::preview', [ 'themePreview' => true, 'previewTheme' => $item, ]); } public function settings(Request $request, string $theme, Loader $loader, ThemeSettings $settings) { $item = $loader->find($theme); $settings->save( $item, (array) $request->input('settings', []), (string) $request->input('variant', 'light'), $request->string('appearance')->toString() ?: null, $request->string('accent')->toString() ?: null, ); return back()->with('status', 'Theme settings saved.'); } public function install(Request $request, ThemePackageManager $packages) { $request->validate(['theme' => ['required', 'file', 'mimes:zip', 'max:51200']]); $theme = $packages->install($request->file('theme')); return back()->with('status', $theme->name().' installed.'); } public function uninstall(string $theme, Loader $loader, ThemePackageManager $packages) { $item = $loader->find($theme); abort_if(in_array($item->key(), ['sonardesk', 'sonardesk-admin'], true), 403, 'Bundled themes cannot be removed.'); $settings = app(SiteSettingsRepository::class); abort_if($settings->get($item->type().'_theme', null, 'site') === $item->key(), 409, 'Deactivate this theme before uninstalling.'); $packages->uninstall($item); return back()->with('status', $item->name().' uninstalled.'); } public function export(string $theme, Loader $loader, ThemePackageManager $packages) { $item = $loader->find($theme); $path = $packages->export($item); return response()->download($path)->deleteFileAfterSend(); } public function optimize(string $theme, Loader $loader, ThemeOptimizer $optimizer) { $item = $loader->find($theme); $result = $optimizer->optimize($item); return back()->with('status', "Optimised {$result['css']} CSS, {$result['js']} JS and {$result['images']} images."); } public function validateTheme(string $theme, Loader $loader, ThemeAccessibilityValidator $validator) { return response()->json(['issues' => $validator->validate($loader->find($theme))]); } }