]> BookStack Code Mirror - bookstack/commitdiff
Added md editor ui dropdown options & their back-end storage
authorDan Brown <redacted>
Sun, 27 Nov 2022 20:30:14 +0000 (20:30 +0000)
committerDan Brown <redacted>
Sun, 27 Nov 2022 20:30:14 +0000 (20:30 +0000)
Still need to perform actual in-editor functionality for those controls.

app/Config/setting-defaults.php
app/Http/Controllers/UserPreferencesController.php
resources/js/components/markdown-editor.js
resources/sass/_forms.scss
resources/views/pages/parts/markdown-editor.blade.php
routes/web.php

index 5e1e4348ab4e7e351d6067af59179ff83bf8ff42..4e7ba2fcbfcedf5bb63dea389bc108b8e5ea937a 100644 (file)
@@ -29,6 +29,8 @@ return [
         'ui-shortcuts'          => '{}',
         'ui-shortcuts-enabled'  => false,
         'dark-mode-enabled'     => env('APP_DEFAULT_DARK_MODE', false),
+        'md-show-preview'       => true,
+        'md-scroll-sync'        => true,
         'bookshelves_view_type' => env('APP_VIEWS_BOOKSHELVES', 'grid'),
         'bookshelf_view_type'   => env('APP_VIEWS_BOOKSHELF', 'grid'),
         'books_view_type'       => env('APP_VIEWS_BOOKS', 'grid'),
index aef95971288986ceb6344d67b8508c66fce84d3f..11ff338f376a8745e97d633048a4b0dc1d789a8b 100644 (file)
@@ -115,6 +115,9 @@ class UserPreferencesController extends Controller
         return response('', 204);
     }
 
+    /**
+     * Update the favorite status for a code language.
+     */
     public function updateCodeLanguageFavourite(Request $request)
     {
         $validated = $this->validate($request, [
@@ -134,5 +137,27 @@ class UserPreferencesController extends Controller
         }
 
         setting()->putForCurrentUser('code-language-favourites', implode(',', $currentFavorites));
+        return response('', 204);
+    }
+
+    /**
+     * Update a boolean user preference setting.
+     */
+    public function updateBooleanPreference(Request $request)
+    {
+        $allowedKeys = ['md-scroll-sync', 'md-show-preview'];
+        $validated = $this->validate($request, [
+            'name'  => ['required', 'string'],
+            'value' => ['required'],
+        ]);
+
+        if (!in_array($validated['name'], $allowedKeys)) {
+            return response('Invalid boolean preference', 500);
+        }
+
+        $value = $validated['value'] === 'true' ? 'true' : 'false';
+        setting()->putForCurrentUser($validated['name'], $value);
+
+        return response('', 204);
     }
 }
index 671aa4e65fc6e78351d8c51934b7b224d6227837..162dd6771f920d96ad7c20318589de8fd1054bdd 100644 (file)
@@ -14,6 +14,7 @@ export class MarkdownEditor extends Component {
 
         this.display = this.$refs.display;
         this.input = this.$refs.input;
+        this.settingContainer = this.$refs.settingContainer;
 
         this.editor = null;
         initEditor({
@@ -74,6 +75,15 @@ export class MarkdownEditor extends Component {
             toolbarLabel.closest('.markdown-editor-wrap').classList.add('active');
         });
 
+        // Setting changes
+        this.settingContainer.addEventListener('change', e => {
+            const actualInput = e.target.parentNode.querySelector('input[type="hidden"]');
+            const name = actualInput.getAttribute('name');
+            const value = actualInput.getAttribute('value');
+            window.$http.patch('/preferences/update-boolean', {name, value});
+            // TODO - Update state locally
+        });
+
         // Refresh CodeMirror on container resize
         const resizeDebounced = debounce(() => this.editor.cm.refresh(), 100, false);
         const observer = new ResizeObserver(resizeDebounced);
index d9e18a9ed5c2042bd52922ce2672c76c0a908cbb..7d92d0aa0953104d93c0ea4bd61712136ec44853 100644 (file)
@@ -157,6 +157,16 @@ html.markdown-editor-display.dark-mode {
   }
 }
 
+.editor-toolbar .buttons {
+  font-size: $fs-m;
+  .dropdown-menu {
+    padding: 0;
+  }
+  .toggle-switch {
+    margin: $-s 0;
+  }
+}
+
 .editor-toolbar .buttons button {
   font-size: .9rem;
   width: 2rem;
index 3b4b1cb21d73b57d815c5512b93ef6ad7b527460..41ee3933f095c3207e90eb8921d703cdbc344c3a 100644 (file)
             <div class="editor-toolbar-label text-mono px-m py-xs flex-container-row items-center flex">
                 <span>{{ trans('entities.pages_md_editor') }}</span>
             </div>
-            <div class="buttons flex-container-row items-stretch">
+            <div component="dropdown" class="buttons flex-container-row items-stretch">
                 @if(config('services.drawio'))
                     <button class="text-button" type="button" data-action="insertDrawing" title="{{ trans('entities.pages_md_insert_drawing') }}">@icon('drawing')</button>
                 @endif
                 <button class="text-button" type="button" data-action="insertImage" title="{{ trans('entities.pages_md_insert_image') }}">@icon('image')</button>
                 <button class="text-button" type="button" data-action="insertLink" title="{{ trans('entities.pages_md_insert_link') }}">@icon('link')</button>
                 <button class="text-button" type="button" data-action="fullscreen" title="{{ trans('common.fullscreen') }}">@icon('fullscreen')</button>
+                <button refs="dropdown@toggle" class="text-button" type="button" title="{{ trans('common.more') }}">@icon('more')</button>
+                <div refs="dropdown@menu markdown-editor@setting-container" class="dropdown-menu" role="menu">
+                    <div class="px-m">
+                        @include('form.toggle-switch', ['name' => 'md-show-preview', 'label' => 'Show preview', 'value' => setting()->getForCurrentUser('md-show-preview')])
+                    </div>
+                    <hr class="m-none">
+                    <div class="px-m">
+                        @include('form.toggle-switch', ['name' => 'md-scroll-sync', 'label' => 'Sync preview scroll', 'value' => setting()->getForCurrentUser('md-scroll-sync')])
+                    </div>
+                </div>
             </div>
         </div>
 
index 107484939488f5c817ef1b835fa35ae6e1b3b834..95b4ae535236b879e9c9aa83ac2e486251a6d318 100644 (file)
@@ -254,6 +254,7 @@ Route::middleware('auth')->group(function () {
     Route::patch('/preferences/change-expansion/{type}', [UserPreferencesController::class, 'changeExpansion']);
     Route::patch('/preferences/toggle-dark-mode', [UserPreferencesController::class, 'toggleDarkMode']);
     Route::patch('/preferences/update-code-language-favourite', [UserPreferencesController::class, 'updateCodeLanguageFavourite']);
+    Route::patch('/preferences/update-boolean', [UserPreferencesController::class, 'updateBooleanPreference']);
 
     // User API Tokens
     Route::get('/settings/users/{userId}/create-api-token', [UserApiTokenController::class, 'create']);
Morty Proxy This is a proxified and sanitized view of the page, visit original site.