diff --git a/app/Config/setting-defaults.php b/app/Config/setting-defaults.php index 5e1e4348a..4e7ba2fcb 100644 --- a/app/Config/setting-defaults.php +++ b/app/Config/setting-defaults.php @@ -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'), diff --git a/app/Http/Controllers/UserPreferencesController.php b/app/Http/Controllers/UserPreferencesController.php index aef959712..11ff338f3 100644 --- a/app/Http/Controllers/UserPreferencesController.php +++ b/app/Http/Controllers/UserPreferencesController.php @@ -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); } } diff --git a/resources/js/components/markdown-editor.js b/resources/js/components/markdown-editor.js index 671aa4e65..162dd6771 100644 --- a/resources/js/components/markdown-editor.js +++ b/resources/js/components/markdown-editor.js @@ -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); diff --git a/resources/sass/_forms.scss b/resources/sass/_forms.scss index d9e18a9ed..7d92d0aa0 100644 --- a/resources/sass/_forms.scss +++ b/resources/sass/_forms.scss @@ -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; diff --git a/resources/views/pages/parts/markdown-editor.blade.php b/resources/views/pages/parts/markdown-editor.blade.php index 3b4b1cb21..41ee3933f 100644 --- a/resources/views/pages/parts/markdown-editor.blade.php +++ b/resources/views/pages/parts/markdown-editor.blade.php @@ -10,13 +10,23 @@
{{ trans('entities.pages_md_editor') }}
-
+
@if(config('services.drawio')) @endif + +
diff --git a/routes/web.php b/routes/web.php index 107484939..95b4ae535 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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']);