]> BookStack Code Mirror - bookstack/commitdiff
Added env option for setting dark mode default
authorDan Brown <redacted>
Sun, 7 Feb 2021 23:12:05 +0000 (23:12 +0000)
committerDan Brown <redacted>
Sun, 7 Feb 2021 23:12:05 +0000 (23:12 +0000)
Also allowed config-centralised default user settings for this change
and bought existing user-level view options into that default settings
system to be cleaner in code usage.

For #2081

.env.example.complete
app/Config/app.php
app/Config/setting-defaults.php
app/Http/Controllers/BookController.php
app/Http/Controllers/BookshelfController.php
app/Http/Controllers/HomeController.php
app/Settings/SettingService.php
phpunit.xml
resources/sass/_html.scss
tests/Entity/BookShelfTest.php
tests/User/UserPreferencesTest.php

index 9547b0fcdd69b6bcf59e010ee5f700a45f6adbe2..9b8c8298aef53e60dd5889f7cf02bee74475568e 100644 (file)
@@ -246,11 +246,15 @@ AVATAR_URL=
 DRAWIO=true
 
 # Default item listing view
-# Used for public visitors and user's without a preference
-# Can be 'list' or 'grid'
+# Used for public visitors and user's without a preference.
+# Can be 'list' or 'grid'.
 APP_VIEWS_BOOKS=list
 APP_VIEWS_BOOKSHELVES=grid
 
+# Use dark mode by default
+# Will be overriden by any user/session preference.
+APP_DEFAULT_DARK_MODE=false
+
 # Page revision limit
 # Number of page revisions to keep in the system before deleting old revisions.
 # If set to 'false' a limit will not be enforced.
index 762845e9f2bb681d47504c66a72cf8d37d49cc85..c97e36e62098f48e536444b8d07a48965e29db9d 100755 (executable)
@@ -19,13 +19,6 @@ return [
     // private configuration variables so should remain disabled in public.
     'debug' => env('APP_DEBUG', false),
 
-    // Set the default view type for various lists. Can be overridden by user preferences.
-    // These will be used for public viewers and users that have not set a preference.
-    'views' => [
-        'books' => env('APP_VIEWS_BOOKS', 'list'),
-        'bookshelves' => env('APP_VIEWS_BOOKSHELVES', 'grid'),
-    ],
-
     // The number of revisions to keep in the database.
     // Once this limit is reached older revisions will be deleted.
     // If set to false then a limit will not be enforced.
index d84c0c2641397700da7b551414122c66e88fa24b..08646091a288bc255a9edc559a82f5d0cdd723ac 100644 (file)
@@ -24,4 +24,11 @@ return [
     'app-custom-head'      => false,
     'registration-enabled' => false,
 
+    // User-level default settings
+    'user' => [
+        'dark-mode-enabled' => env('APP_DEFAULT_DARK_MODE', false),
+        'bookshelves_view_type' => env('APP_VIEWS_BOOKSHELVES', 'grid'),
+        'books_view_type' => env('APP_VIEWS_BOOKS', 'grid'),
+    ],
+
 ];
index 3d695ba85dbdae692f35d24e429e4fc553effbd5..59c205d0a9241770e6fd84c8d09e0f5f196cfb3b 100644 (file)
@@ -30,7 +30,7 @@ class BookController extends Controller
      */
     public function index()
     {
-        $view = setting()->getForCurrentUser('books_view_type', config('app.views.books'));
+        $view = setting()->getForCurrentUser('books_view_type');
         $sort = setting()->getForCurrentUser('books_sort', 'name');
         $order = setting()->getForCurrentUser('books_sort_order', 'asc');
 
index 32c22e185fa20116cabc0d3221d621c0e3f70d12..8574c1b48589970039ccf36aee51a4c85b0d3aaa 100644 (file)
@@ -32,7 +32,7 @@ class BookshelfController extends Controller
      */
     public function index()
     {
-        $view = setting()->getForCurrentUser('bookshelves_view_type', config('app.views.bookshelves', 'grid'));
+        $view = setting()->getForCurrentUser('bookshelves_view_type');
         $sort = setting()->getForCurrentUser('bookshelves_sort', 'name');
         $order = setting()->getForCurrentUser('bookshelves_sort_order', 'asc');
         $sortOptions = [
@@ -103,7 +103,7 @@ class BookshelfController extends Controller
 
         Views::add($shelf);
         $this->entityContextManager->setShelfContext($shelf->id);
-        $view = setting()->getForCurrentUser('bookshelf_view_type', config('app.views.books'));
+        $view = setting()->getForCurrentUser('bookshelf_view_type');
 
         $this->setPageTitle($shelf->getShortName());
         return view('shelves.show', [
index 3258f43693d5600a26985caa5de675ab04c6f8a5..31736e1b09ab92bcb778c9d61dd928e3dbfa884a 100644 (file)
@@ -56,7 +56,7 @@ class HomeController extends Controller
         // Add required list ordering & sorting for books & shelves views.
         if ($homepageOption === 'bookshelves' || $homepageOption === 'books') {
             $key = $homepageOption;
-            $view = setting()->getForCurrentUser($key . '_view_type', config('app.views.' . $key));
+            $view = setting()->getForCurrentUser($key . '_view_type');
             $sort = setting()->getForCurrentUser($key . '_sort', 'name');
             $order = setting()->getForCurrentUser($key . '_sort_order', 'asc');
 
index 042ae7aa4bf8e4aa86b5e02a50951c0574d23431..feb54c30a6d95d82d5eb28b195d05da47180acdd 100644 (file)
@@ -29,9 +29,9 @@ class SettingService
      * Gets a setting from the database,
      * If not found, Returns default, Which is false by default.
      */
-    public function get(string $key, $default = false)
+    public function get(string $key, $default = null)
     {
-        if ($default === false) {
+        if (is_null($default)) {
             $default = config('setting-defaults.' . $key, false);
         }
 
@@ -57,8 +57,12 @@ class SettingService
     /**
      * Get a user-specific setting from the database or cache.
      */
-    public function getUser(User $user, string $key, $default = false)
+    public function getUser(User $user, string $key, $default = null)
     {
+        if (is_null($default)) {
+            $default = config('setting-defaults.user.' . $key, false);
+        }
+
         if ($user->isDefault()) {
             return $this->getFromSession($key, $default);
         }
@@ -68,7 +72,7 @@ class SettingService
     /**
      * Get a value for the current logged-in user.
      */
-    public function getForCurrentUser(string $key, $default = false)
+    public function getForCurrentUser(string $key, $default = null)
     {
         return $this->getUser(user(), $key, $default);
     }
index fc1a591a9abbbd2e70b47b09864ec672dedf5869..dd3e53c08f6a41b1e5b5b7ed85bd51c234d86c6a 100644 (file)
@@ -57,5 +57,6 @@
         <server name="LOG_FAILED_LOGIN_MESSAGE" value=""/>
         <server name="LOG_FAILED_LOGIN_CHANNEL" value="testing"/>
         <server name="WKHTMLTOPDF" value="false"/>
+        <server name="APP_DEFAULT_DARK_MODE" value="false"/>
     </php>
 </phpunit>
index 0262956691a0f4fc978b72f6ac6d56a25637cf15..1d5defa9765fea5fdb4d2fca441fcc3a71d15691 100644 (file)
@@ -25,7 +25,6 @@ body {
   line-height: 1.6;
   @include lightDark(color, #444, #AAA);
   -webkit-font-smoothing: antialiased;
-  background-color: #F2F2F2;
   height: 100%;
   display: flex;
   flex-direction: column;
index 9b3290370c197a14bd1d558a9728e1c96cae89e6..29fac5ec56c21777465d2550299f7cf99eba57fe 100644 (file)
@@ -59,7 +59,7 @@ class BookShelfTest extends TestCase
     public function test_book_not_visible_in_shelf_list_view_if_user_cant_view_shelf()
     {
         config()->set([
-            'app.views.bookshelves' => 'list',
+            'setting-defaults.user.bookshelves_view_type' => 'list',
         ]);
         $shelf = Bookshelf::query()->first();
         $book = $shelf->books()->first();
index 7ffc8f9db7085958b9ef5e5a80bc4bfed22a3022..49c49188b2451f0b74cf017210f0b5baafd23f80 100644 (file)
@@ -92,4 +92,17 @@ class UserPreferencesTest extends TestCase
         $home->assertDontSee('Dark Mode');
         $home->assertSee('Light Mode');
     }
+
+    public function test_dark_mode_defaults_to_config_option()
+    {
+        config()->set('setting-defaults.user.dark-mode-enabled', false);
+        $this->assertEquals(false, setting()->getForCurrentUser('dark-mode-enabled'));
+        $home = $this->get('/login');
+        $home->assertElementNotExists('.dark-mode');
+
+        config()->set('setting-defaults.user.dark-mode-enabled', true);
+        $this->assertEquals(true, setting()->getForCurrentUser('dark-mode-enabled'));
+        $home = $this->get('/login');
+        $home->assertElementExists('.dark-mode');
+    }
 }
\ No newline at end of file