diff --git a/app/Console/Commands/ResetDemoSettings.php b/app/Console/Commands/ResetDemoSettings.php index 2a7621ee91..eb1a1ea097 100644 --- a/app/Console/Commands/ResetDemoSettings.php +++ b/app/Console/Commands/ResetDemoSettings.php @@ -50,8 +50,8 @@ class ResetDemoSettings extends Command $settings->alert_email = 'service@snipe-it.io'; $settings->login_note = 'Use `admin` / `password` to login to the demo.'; $settings->header_color = '#3c8dbc'; - $settings->link_dark_color = '#296282'; - $settings->link_light_color = '#296282;'; + $settings->link_dark_color = '#084d73'; + $settings->link_light_color = '#86cbf2;'; $settings->label2_2d_type = 'QRCODE'; $settings->default_currency = 'USD'; $settings->brand = 2; @@ -81,6 +81,8 @@ class ResetDemoSettings extends Command if ($user = User::where('username', '=', 'admin')->first()) { $user->locale = 'en-US'; + $user->enable_confetti = 1; + $user->enable_sounds = 1; $user->save(); } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index d1ae6afab9..f9dbe04700 100755 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -56,6 +56,9 @@ class ProfileController extends Controller $user->phone = $request->input('phone'); $user->enable_sounds = $request->input('enable_sounds', false); $user->enable_confetti = $request->input('enable_confetti', false); + $user->link_light_color = $request->input('link_light_color', '#296282'); + $user->link_dark_color = $request->input('link_dark_color', '#296282'); + $user->nav_link_color = $request->input('nav_link_color', '#FFFFFF'); if (! config('app.lock_passwords')) { $user->locale = $request->input('locale'); diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 6eb136365a..41bbfcf86a 100644 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -402,6 +402,7 @@ class SettingsController extends Controller $setting->header_color = $request->input('header_color'); $setting->link_light_color = $request->input('link_light_color', '#296282'); $setting->link_dark_color = $request->input('link_dark_color', '#296282'); + $setting->nav_link_color = $request->input('nav_link_color', '#FFFFFF'); $setting->support_footer = $request->input('support_footer'); $setting->version_footer = $request->input('version_footer'); $setting->footer_text = $request->input('footer_text'); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 729fe75175..f8005879e5 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -44,6 +44,7 @@ class Kernel extends HttpKernel \App\Http\Middleware\CheckForTwoFactor::class, \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, \App\Http\Middleware\AssetCountForSidebar::class, + \App\Http\Middleware\CheckColorSettings::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], diff --git a/app/Http/Middleware/CheckColorSettings.php b/app/Http/Middleware/CheckColorSettings.php new file mode 100644 index 0000000000..be3a039e4c --- /dev/null +++ b/app/Http/Middleware/CheckColorSettings.php @@ -0,0 +1,68 @@ +auth = $auth; + } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if ($settings = Setting::getSettings()) { + $nav_color = $settings->nav_link_color; + $link_dark_color = $settings->link_dark_color; + $link_light_color = $settings->link_light_color; + } + + + // Override system settings + if ($request->user()) { + + if ($request->user()->nav_color) { + $nav_color = $request->user()->nav_color; + } + if ($request->user()->link_dark_color) { + $link_dark_color = $request->user()->link_dark_color; + } + if ($request->user()->nav_color) { + $link_light_color = $request->user()->link_light_color; + } + } + + + view()->share('nav_link_color', $nav_color); + view()->share('link_dark_color', $link_dark_color); + view()->share('link_light_color', $link_light_color); + + return $next($request); + + } +} diff --git a/database/migrations/2025_11_28_175733_add_link_colors_to_settings.php b/database/migrations/2025_11_28_175733_add_link_colors_to_settings.php index 31f07c9619..e1d0e3634f 100644 --- a/database/migrations/2025_11_28_175733_add_link_colors_to_settings.php +++ b/database/migrations/2025_11_28_175733_add_link_colors_to_settings.php @@ -12,69 +12,93 @@ return new class extends Migration */ public function up(): void { - $setting = DB::table('settings')->select(['skin'])->first(); - + $setting = DB::table('settings')->select(['skin', 'header_color'])->first(); Schema::table('settings', function (Blueprint $table) { $table->string('link_dark_color')->after('header_color')->nullable()->default(null); $table->string('link_light_color')->after('header_color')->nullable()->default(null); + $table->string('nav_link_color')->after('header_color')->nullable()->default(null); + }); + + Schema::table('users', function (Blueprint $table) { + $table->string('link_dark_color')->after('skin')->nullable()->default(null); + $table->string('link_light_color')->after('skin')->nullable()->default(null); + $table->string('nav_link_color')->after('skin')->nullable()->default(null); }); - + // Set Snipe-IT defaults $link_dark_color = '#36aff5'; $link_light_color = '#296282'; + $nav_color = '#ffffff'; + $header_color = '#3c8dbc'; if ($setting) { + switch ($setting->skin) { - case 'green': + case ('green' || 'green-dark'): + $header_color = '#00a65a'; $link_dark_color = '#00a65a'; $link_light_color = '#00a65a'; - case 'green-dark': - $link_dark_color = '#00a65a'; - $link_light_color = '#00a65a'; - case 'red': + $nav_color = '#ffffff'; + + case ('red' || 'red-dark'): + $header_color = '#dd4b39'; $link_dark_color = '#dd4b39'; $link_light_color = '#dd4b39'; - case 'red-dark': - $link_dark_color = '#dd4b39'; - $link_light_color = '#dd4b39'; - case 'orange': + $nav_color = '#ffffff'; + + case ('orange' || 'orange-dark'): + $header_color = '#FF851B'; $link_dark_color = '#FF851B'; $link_light_color = '#FF851B'; - case 'orange-dark': - $link_dark_color = '#FF8C00'; - $link_light_color = '#FF8C00'; - case 'black': + $nav_color = '#ffffff'; + + case ('black' || 'black-dark'): + $header_color = '#000000'; $link_dark_color = '#111'; $link_light_color = '#111'; - case 'black-dark': - $link_dark_color = '#111'; - $link_light_color = '#111'; - case 'purple': + $nav_color = '#ffffff'; + + case ('purple' || 'purple-dark'): + $header_color = '#605ca8'; $link_dark_color = '#605ca8'; $link_light_color = '#605ca8'; - case 'purple-dark': - $link_dark_color = '#605ca8'; - $link_light_color = '#605ca8'; - case 'yellow': - $link_dark_color = '#f39c12'; - $link_light_color = '#f39c12'; - case 'yellow-dark': + $nav_color = '#ffffff'; + + case ('yellow' || 'yellow-dark') : + $header_color = '#f39c12'; $link_dark_color = '#f39c12'; $link_light_color = '#f39c12'; + $nav_color = '#ffffff'; + case 'contrast': + $header_color = '#001F3F'; $link_dark_color = '#86cbf2'; $link_light_color = '#084d73'; + $nav_color = '#ffffff'; + break; + } + + // Override the header color if the settings have one + if ($setting->header_color) { + $header_color = $setting->header_color; + \Log::debug('A header color was found, so lets use that instead: '.$setting->header_color); } - DB::table('settings')->update(['link_light_color' => $link_light_color, 'link_dark_color' => $link_dark_color]); + DB::table('settings')->update([ + 'link_light_color' => $link_light_color, + 'link_dark_color' => $link_dark_color, + 'nav_link_color' => $nav_color, + 'header_color' => $header_color]); + + DB::table('users')->whereNull('skin')->update([ + 'link_light_color' => $link_light_color, + 'link_dark_color' => $link_dark_color, + 'nav_link_color' => $nav_color]); } - - - } /** @@ -85,6 +109,13 @@ return new class extends Migration Schema::table('settings', function ($table) { $table->dropColumn('link_dark_color'); $table->dropColumn('link_light_color'); + $table->dropColumn('nav_link_color'); + }); + + Schema::table('users', function ($table) { + $table->dropColumn('link_dark_color'); + $table->dropColumn('link_light_color'); + $table->dropColumn('nav_link_color'); }); } }; diff --git a/resources/lang/en-US/admin/settings/general.php b/resources/lang/en-US/admin/settings/general.php index e47a5a5ead..ca4b76a3d9 100644 --- a/resources/lang/en-US/admin/settings/general.php +++ b/resources/lang/en-US/admin/settings/general.php @@ -81,6 +81,8 @@ return [ 'header_color' => 'Primary Theme Color', 'header_color_help' => 'Selecting a new color here will let you preview the color with your logo selection (if you have a site logo uploaded) in the header, however it will not be saved until you click the Save button.', 'link_dark_color' => 'Link Color for Dark Mode', + 'nav_link_color' => 'Header Nav Link Color', + 'nav_link_color_help' => 'Select a color for the links in your top level navigation. This color should be high enough contrast against your header color to be easily readable.', 'link_dark_color_help' => 'Select a color that will provide enough contrast for people that use Snipe-IT in dark mode.', 'link_light_color' => 'Link Color for Light Mode', 'link_light_color_help' => 'Select a color that will provide enough contrast for people that use Snipe-IT in light mode.', @@ -494,11 +496,13 @@ return [ 'general' => 'General', 'intervals' => 'Intervals & Thresholds', 'logos' => 'Logos & Display', + 'display' => 'Display Preferences', 'mapping' => 'LDAP Field Mapping', 'test' => 'Test LDAP Connection', 'misc' => 'Miscellaneous', 'misc_display' => 'Miscellaneous Display Options', 'profiles' => 'User Profiles', + 'your_details' => 'Your Details', 'server' => 'Server Settings', 'scoping' => 'Scoping', 'security' => 'Security Preferences', diff --git a/resources/views/account/profile.blade.php b/resources/views/account/profile.blade.php index cc0933553b..a1ddba43c3 100755 --- a/resources/views/account/profile.blade.php +++ b/resources/views/account/profile.blade.php @@ -15,161 +15,206 @@
-
- {!! trans('general.gravatar_url') !!}
-
{{ trans('general.feature_disabled') }}
+ @endif + +
+
+ {!! trans('general.gravatar_url') !!}
+
{{ trans('admin/settings/general.two_factor_enabled_warning') }}
+ @else +{{ trans('admin/settings/general.two_factor_enabled_edit_not_allowed') }}
+ @endcan + @if (config('app.lock_passwords')) +{{ trans('general.feature_disabled') }}
+ @endif +{{ trans('admin/settings/general.two_factor_enabled_warning') }}
- @else -{{ trans('admin/settings/general.two_factor_enabled_edit_not_allowed') }}
- @endcan - @if (config('app.lock_passwords')) -{{ trans('general.feature_disabled') }}
- @endif -