]> BookStack Code Mirror - bookstack/commitdiff
Added editor control in admin settings & Fixed some markdown editor bugs
authorDan Brown <redacted>
Tue, 29 Mar 2016 18:26:13 +0000 (19:26 +0100)
committerDan Brown <redacted>
Tue, 29 Mar 2016 18:26:13 +0000 (19:26 +0100)
Also updated the setting system with a more sane approach to handling default values. (Now done via the setting-defaults config file)

app/Repos/PageRepo.php
app/Services/SettingService.php
config/setting-defaults.php [new file with mode: 0644]
database/migrations/2016_03_25_123157_add_markdown_support.php
resources/assets/js/controllers.js
resources/views/pages/form.blade.php
resources/views/settings/index.blade.php

index 4c3512fa79ab67da996c619b2ebe3a5ea120ec10..9a750275476651f5a3a258fdbca4d5073987d3df 100644 (file)
@@ -312,6 +312,7 @@ class PageRepo extends EntityRepo
         $page->fill($input);
         $page->html = $this->formatHtml($input['html']);
         $page->text = strip_tags($page->html);
+        if (setting('app-editor') !== 'markdown') $page->markdown = '';
         $page->updated_by = $userId;
         $page->save();
 
@@ -348,6 +349,7 @@ class PageRepo extends EntityRepo
     public function saveRevision(Page $page)
     {
         $revision = $this->pageRevision->fill($page->toArray());
+        if (setting('app-editor') !== 'markdown') $revision->markdown = '';
         $revision->page_id = $page->id;
         $revision->slug = $page->slug;
         $revision->book_slug = $page->book->slug;
@@ -386,6 +388,8 @@ class PageRepo extends EntityRepo
         }
 
         $draft->fill($data);
+        if (setting('app-editor') !== 'markdown') $draft->markdown = '';
+        
         $draft->save();
         return $draft;
     }
index bcc7eae31a0a8c3713eb5f6935875f84be81aa45..bf5fa918e2b54cf7aadda0f6ff18c0875311d058 100644 (file)
@@ -44,28 +44,39 @@ class SettingService
 
     /**
      * Gets a setting value from the cache or database.
+     * Looks at the system defaults if not cached or in database.
      * @param $key
      * @param $default
      * @return mixed
      */
     protected function getValueFromStore($key, $default)
     {
+        // Check for an overriding value
         $overrideValue = $this->getOverrideValue($key);
         if ($overrideValue !== null) return $overrideValue;
 
+        // Check the cache
         $cacheKey = $this->cachePrefix . $key;
         if ($this->cache->has($cacheKey)) {
             return $this->cache->get($cacheKey);
         }
 
+        // Check the database
         $settingObject = $this->getSettingObjectByKey($key);
-
         if ($settingObject !== null) {
             $value = $settingObject->value;
             $this->cache->forever($cacheKey, $value);
             return $value;
         }
 
+        // Check the defaults set in the app config.
+        $configPrefix = 'setting-defaults.' . $key;
+        if (config()->has($configPrefix)) {
+            $value = config($configPrefix);
+            $this->cache->forever($cacheKey, $value);
+            return $value;
+        }
+
         return $default;
     }
 
diff --git a/config/setting-defaults.php b/config/setting-defaults.php
new file mode 100644 (file)
index 0000000..17bae18
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+/**
+ * The defaults for the system settings that are saved in the database.
+ */
+return [
+
+    'app-editor' => 'wysiwyg'
+
+];
\ No newline at end of file
index 45efe5a09a8577ef99fb45aa583138c72317e3fc..2daa32cfbaadcdd1e3338dd7c787ab7d65dd0fe4 100644 (file)
@@ -13,11 +13,11 @@ class AddMarkdownSupport extends Migration
     public function up()
     {
         Schema::table('pages', function (Blueprint $table) {
-            $table->longText('markdown');
+            $table->longText('markdown')->default('');
         });
 
         Schema::table('page_revisions', function (Blueprint $table) {
-            $table->longText('markdown');
+            $table->longText('markdown')->default('');
         });
     }
 
index 09187c0c259654061ce818632fe544725d1d38d9..dbd2e1ae6557712f7cbc15d87e13fce821ffb106 100644 (file)
@@ -258,6 +258,10 @@ module.exports = function (ngApp, events) {
             }
         }
 
+        if (!isMarkdown) {
+            $scope.editorChange = function() {};
+        }
+
         /**
          * Start the AutoSave loop, Checks for content change
          * before performing the costly AJAX request.
@@ -292,8 +296,6 @@ module.exports = function (ngApp, events) {
 
             if (isMarkdown) data.markdown = $scope.editContent;
 
-            console.log(data.markdown);
-
             $http.put('/ajax/page/' + pageId + '/save-draft', data).then((responseData) => {
                 $scope.draftText = responseData.data.message;
                 if (!$scope.isNewPageDraft) $scope.isUpdateDraft = true;
index 6b16cb87065b73b9cb4830e732cb03327c69b6d3..fe3d28cbcf0fb003e90d1c3ffb27b1d319cbea10 100644 (file)
@@ -1,5 +1,5 @@
 
-<div class="page-editor flex-fill flex" ng-controller="PageEditController" editor-type="{{ config('app.editor') }}" page-id="{{ $model->id or 0 }}" page-new-draft="{{ $model->draft or 0 }}" page-update-draft="{{ $model->isDraft or 0 }}">
+<div class="page-editor flex-fill flex" ng-controller="PageEditController" editor-type="{{ setting('app-editor') }}" page-id="{{ $model->id or 0 }}" page-new-draft="{{ $model->draft or 0 }}" page-update-draft="{{ $model->isDraft or 0 }}">
 
     {{ csrf_field() }}
     <div class="faded-small toolbar">
@@ -42,7 +42,7 @@
         </div>
     </div>
     <div class="edit-area flex-fill flex">
-        @if(config('app.editor') === 'html')
+        @if(setting('app-editor') === 'wysiwyg')
             <textarea id="html-editor" tinymce="editorOptions" mce-change="editorChange" mce-model="editContent"  name="html" rows="5"
                       @if($errors->has('html')) class="neg" @endif>@if(isset($model) || old('html')){{htmlspecialchars( old('html') ? old('html') : $model->html)}}@endif</textarea>
             @if($errors->has('html'))
@@ -50,7 +50,7 @@
             @endif
         @endif
 
-        @if(config('app.editor') === 'markdown')
+        @if(setting('app-editor') === 'markdown')
             <div id="markdown-editor" markdown-editor class="flex-fill flex">
 
                 <div class="markdown-editor-wrap">
index f946232561d05877151106520ccf42a2089aee15..eb580bb8b68ff451fd5df1ae59d705dac195e55f 100644 (file)
             <div class="col-md-6">
                 <div class="form-group">
                     <label for="setting-app-name">Application name</label>
-                    <input type="text" value="{{ Setting::get('app-name', 'BookStack') }}" name="setting-app-name" id="setting-app-name">
+                    <input type="text" value="{{ setting('app-name', 'BookStack') }}" name="setting-app-name" id="setting-app-name">
                 </div>
                 <div class="form-group">
                     <label>Allow public viewing?</label>
-                    <toggle-switch name="setting-app-public" value="{{ Setting::get('app-public') }}"></toggle-switch>
+                    <toggle-switch name="setting-app-public" value="{{ setting('app-public') }}"></toggle-switch>
                 </div>
                 <div class="form-group">
                     <label>Enable higher security image uploads?</label>
                     <p class="small">For performance reasons, all images are public by default, This option adds a random, hard-to-guess characters in front of image names. Ensure directory indexes are not enabled to prevent easy access.</p>
-                    <toggle-switch name="setting-app-secure-images" value="{{ Setting::get('app-secure-images') }}"></toggle-switch>
+                    <toggle-switch name="setting-app-secure-images" value="{{ setting('app-secure-images') }}"></toggle-switch>
+                </div>
+                <div class="form-group">
+                    <label for="setting-app-editor">Page Editor</label>
+                    <p class="small">Select which editor will be used by all users to edit pages.</p>
+                    <select name="setting-app-editor" id="setting-app-editor">
+                        <option @if(setting('app-editor') === 'wysiwyg') selected @endif value="wysiwyg">WYSIWYG</option>
+                        <option @if(setting('app-editor') === 'markdown') selected @endif value="markdown">Markdown</option>
+                    </select>
                 </div>
             </div>
             <div class="col-md-6">
                 <div class="form-group" id="logo-control">
                     <label for="setting-app-logo">Application Logo</label>
                     <p class="small">This image should be 43px in height. <br>Large images will be scaled down.</p>
-                    <image-picker resize-height="43" show-remove="true" resize-width="200" current-image="{{ Setting::get('app-logo', '') }}" default-image="/logo.png" name="setting-app-logo" image-class="logo-image"></image-picker>
+                    <image-picker resize-height="43" show-remove="true" resize-width="200" current-image="{{ setting('app-logo', '') }}" default-image="/logo.png" name="setting-app-logo" image-class="logo-image"></image-picker>
                 </div>
                 <div class="form-group" id="color-control">
                     <label for="setting-app-color">Application Primary Color</label>
                     <p class="small">This should be a hex value. <br> Leave empty to reset to the default color.</p>
-                    <input  type="text" value="{{ Setting::get('app-color', '') }}" name="setting-app-color" id="setting-app-color" placeholder="#0288D1">
-                    <input  type="hidden" value="{{ Setting::get('app-color-light', '') }}" name="setting-app-color-light" id="setting-app-color-light" placeholder="rgba(21, 101, 192, 0.15)">
+                    <input  type="text" value="{{ setting('app-color', '') }}" name="setting-app-color" id="setting-app-color" placeholder="#0288D1">
+                    <input  type="hidden" value="{{ setting('app-color-light', '') }}" name="setting-app-color-light" id="setting-app-color-light" placeholder="rgba(21, 101, 192, 0.15)">
                 </div>
             </div>
         </div>
             <div class="col-md-6">
                 <div class="form-group">
                     <label for="setting-registration-enabled">Allow registration?</label>
-                    <toggle-switch name="setting-registration-enabled" value="{{ Setting::get('registration-enabled') }}"></toggle-switch>
+                    <toggle-switch name="setting-registration-enabled" value="{{ setting('registration-enabled') }}"></toggle-switch>
                 </div>
                 <div class="form-group">
                     <label for="setting-registration-role">Default user role after registration</label>
                     <select id="setting-registration-role" name="setting-registration-role" @if($errors->has('setting-registration-role')) class="neg" @endif>
                         @foreach(\BookStack\Role::all() as $role)
                             <option value="{{$role->id}}"
-                                    @if(\Setting::get('registration-role', \BookStack\Role::first()->id) == $role->id) selected @endif
+                                    @if(setting('registration-role', \BookStack\Role::first()->id) == $role->id) selected @endif
                                     >
                                 {{ $role->display_name }}
                             </option>
@@ -70,7 +78,7 @@
                 <div class="form-group">
                     <label for="setting-registration-confirmation">Require email confirmation?</label>
                     <p class="small">If domain restriction is used then email confirmation will be required and the below value will be ignored.</p>
-                    <toggle-switch name="setting-registration-confirmation" value="{{ Setting::get('registration-confirmation') }}"></toggle-switch>
+                    <toggle-switch name="setting-registration-confirmation" value="{{ setting('registration-confirmation') }}"></toggle-switch>
                 </div>
             </div>
             <div class="col-md-6">
@@ -78,7 +86,7 @@
                     <label for="setting-registration-restrict">Restrict registration to domain</label>
                     <p class="small">Enter a comma separated list of email domains you would like to restrict registration to. Users will be sent an email to confirm their address before being allowed to interact with the application.
                         <br> Note that users will be able to change their email addresses after successful registration.</p>
-                    <input type="text" id="setting-registration-restrict" name="setting-registration-restrict" placeholder="No restriction set" value="{{ Setting::get('registration-restrict', '') }}">
+                    <input type="text" id="setting-registration-restrict" name="setting-registration-restrict" placeholder="No restriction set" value="{{ setting('registration-restrict', '') }}">
                 </div>
             </div>
         </div>