changeset 181:87d6922340d9

Page editing: - Fixed broken page editing. - Use the bundled Pagedown library. - Added ability to add new pages. Miscellaneous: - Better UI for subtitles and details.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 01 Feb 2014 14:03:20 -0800
parents ca1a810a4811
children 7533ffec1b5a
files wikked/assets/css/wikked/page.less wikked/assets/js/wikked/app.js wikked/assets/js/wikked/models.js wikked/assets/js/wikked/views.js wikked/assets/tpl/diff-page.html wikked/assets/tpl/edit-page.html wikked/views/edit.py
diffstat 7 files changed, 112 insertions(+), 91 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/assets/css/wikked/page.less	Sat Feb 01 14:01:27 2014 -0800
+++ b/wikked/assets/css/wikked/page.less	Sat Feb 01 14:03:20 2014 -0800
@@ -74,6 +74,22 @@
     }*/
 }
 
+// Page title decorator
+.decorator, .decorator-sm {
+    text-transform: uppercase;
+    font-family: @font-family-sans-serif;
+    font-weight: 200;
+    font-size: 0.7em;
+    letter-spacing: 0.1em;
+    color: @color-footer;
+    .rev_id {
+        font-family: @font-family-monospace;
+    }
+}
+.decorator-sm {
+    font-size: 0.5em;
+}
+
 // Page info
 section.info {
     margin: @line-height-computed 0 0 0;
@@ -124,16 +140,7 @@
 .special>article footer {
     background: @colorGreen;
 }
-.decorator {
-    text-transform: uppercase;
-    font-weight: lighter;
-    font-size: 0.7em;
-    letter-spacing: 0.1em;
-    color: @colorBlue;
-    .rev_id {
-        font-family: @font-family-monospace;
-    }
-}*/
+*/
 
 // Search
 ul#search-preview {
@@ -227,6 +234,9 @@
     article, .footer-wrapper {
         width: 700px;
     }
+    .wide {
+        width: 100%;
+    }
 }
 
 /* Medium devices (desktops, 992px and up) */
--- a/wikked/assets/js/wikked/app.js	Sat Feb 01 14:01:27 2014 -0800
+++ b/wikked/assets/js/wikked/app.js	Sat Feb 01 14:03:20 2014 -0800
@@ -64,6 +64,7 @@
         routes: {
             'read/*path':           "readPage",
             '':                     "readMainPage",
+            'create/*path':         "createPage",
             'edit/*path':           "editPage",
             'changes/*path':        "showPageHistory",
             'inlinks/*path':        "showIncomingLinks",
@@ -92,6 +93,13 @@
         readMainPage: function() {
             this.readPage('');
         },
+        createPage: function(path) {
+            var view = new Views.PageEditView({
+                model: new Models.PageEditModel({ is_new: true, create_in: path })
+            });
+            this.viewManager.switchView(view);
+            this.navigate('/create/' + path);
+        },
         editPage: function(path) {
             var view = new Views.PageEditView({
                 model: new Models.PageEditModel({ path: path })
--- a/wikked/assets/js/wikked/models.js	Sat Feb 01 14:01:27 2014 -0800
+++ b/wikked/assets/js/wikked/models.js	Sat Feb 01 14:03:20 2014 -0800
@@ -55,7 +55,7 @@
             this.navigate('/search/' + $(form.q).val(), { trigger: true });
         },
         doNewPage: function(form) {
-            this.navigate('/edit/', { trigger: true });
+            this.navigate('/create/', { trigger: true });
         },
         _onChangePath: function(path) {
             this.set({
@@ -286,6 +286,10 @@
         action: 'edit',
         urlRoot: '/api/edit/',
         doEdit: function(form) {
+            if (this.get('is_new')) {
+                this.set('path', $('input[name="title"]', form).val());
+            }
+
             var $model = this;
             $.post(this.url(), $(form).serialize(), null, 'json')
                 .done(function(data) {
--- a/wikked/assets/js/wikked/views.js	Sat Feb 01 14:01:27 2014 -0800
+++ b/wikked/assets/js/wikked/views.js	Sat Feb 01 14:03:20 2014 -0800
@@ -9,6 +9,9 @@
         'bootstrap_tooltip',
         'bootstrap_alert',
         'bootstrap_collapse',
+        'pagedown_converter',
+        'pagedown_editor',
+        'pagedown_sanitizer',
         'js/wikked/client',
         'js/wikked/models',
         'js/wikked/util',
@@ -32,7 +35,10 @@
         'text!tpl/special-changes.html',
         'text!tpl/special-orphans.html'
         ],
-    function($, _, Backbone, Handlebars, BootstrapTooltip, BootstrapAlert, BootstrapCollapse, Client, Models, Util,
+    function($, _, Backbone, Handlebars,
+        BootstrapTooltip, BootstrapAlert, BootstrapCollapse,
+        PageDownConverter, PageDownEditor, PageDownSanitizer,
+        Client, Models, Util,
         tplReadPage, tplMetaPage, tplEditPage, tplHistoryPage, tplRevisionPage, tplDiffPage, tplInLinksPage,
         tplNav, tplFooter, tplSearchResults, tplLogin,
         tplErrorNotAuthorized, tplErrorNotFound, tplErrorUnauthorizedEdit, tplStateWarning,
@@ -336,17 +342,16 @@
             // Cache some stuff.
             this._ctrlInput = $('#wmd-input');
             this._ctrlPreview = $('#wmd-preview');
-            this._originalInputHeight = this._ctrlInput.height();
 
             // Create the Markdown editor.
             var formatter = new Client.PageFormatter();
             formatter.baseUrl = this.model.get('path').match(/.*\//);
-            var converter = new Markdown.Converter();
+            var converter = PageDownConverter.getSanitizingConverter();
             converter.hooks.chain("preConversion", function(text) {
                 return formatter.formatText(text);
             });
             var $view = this;
-            var editor = new Markdown.Editor(converter); //TODO: pass options
+            var editor = new PageDownConverter.Editor(converter); //TODO: pass options
             editor.hooks.chain("onPreviewRefresh", function() {
                 $view._updateUI(true);
             });
@@ -354,7 +359,7 @@
 
             // Setup UI.
             this._updateUI();
-            $('#wmd-preview-wrapper').hide();
+            $('.preview').hide();
         },
         events: {
             "mousedown #wmd-input-grip": "_inputGripMouseDown",
@@ -388,36 +393,23 @@
             return false;
         },
         _addPreview: function() {
-            $('#app')
-                .removeClass('container')
-                .addClass('container-fluid');
-            $('#page-edit')
-                .removeClass('row')
-                .addClass('row-fluid');
-            $('#wmd-form-wrapper')
-                .removeClass('span12')
-                .addClass('span6');
-            $('#wmd-preview-wrapper')
-                .show()
-                .addClass('span6');
+            $('article').addClass('container-fluid').addClass('wide');
+            $('.header-wrapper').addClass('row');
+            $('.header-wrapper>header').addClass('col-md-12');
+            $('.editing-wrapper').addClass('row');
+            $('.editing-wrapper>.editing').addClass('col-md-6');
+            $('.editing-wrapper>.preview').addClass('col-md-6').show();
 
             this._updateUI(true);
         },
         _removePreview: function() {
-            $('#wmd-form-wrapper')
-                .removeClass('span6')
-                .addClass('span12');
-            $('#wmd-preview-wrapper')
-                .hide()
-                .removeClass('span6');
-            $('#page-edit')
-                .removeClass('row-fluid')
-                .addClass('row');
-            $('#app')
-                .removeClass('container-fluid')
-                .addClass('container');
-
-            this._ctrlInput.height(this._originalInputHeight);
+            $('article').removeClass('container-fluid').removeClass('wide');
+            $('.header-wrapper').removeClass('row');
+            $('.header-wrapper>header').removeClass('col-md-12');
+            $('.editing-wrapper').removeClass('row');
+            $('.editing-wrapper>.editing').removeClass('col-md-6');
+            $('.editing-wrapper>.preview').removeClass('col-md-6').hide();
+        
             this._updateUI();
         },
         _toggleFullPreview: function(e) {
--- a/wikked/assets/tpl/diff-page.html	Sat Feb 01 14:01:27 2014 -0800
+++ b/wikked/assets/tpl/diff-page.html	Sat Feb 01 14:03:20 2014 -0800
@@ -2,7 +2,8 @@
     <header>
         <h1>
             {{meta.title}}
-            <span class="decorator">Diff:
+            <span class="decorator">Diff</span></br/>
+            <span class="decorator-sm">
             {{#if disp_rev2}}
             <span class="rev_id">{{disp_rev1}}</span> to <span class="rev_id">{{disp_rev2}}</span>
             {{else}}
--- a/wikked/assets/tpl/edit-page.html	Sat Feb 01 14:01:27 2014 -0800
+++ b/wikked/assets/tpl/edit-page.html	Sat Feb 01 14:03:20 2014 -0800
@@ -1,52 +1,57 @@
 <article>
-    <header>
-        <h1>{{meta.title}} <span class="decorator">Editing</span></h1>
-    </header>
-    <form id="page-edit" class="row">
-        <div id="wmd-form-wrapper" class="span12">
-            <section id="wmd-button-bar-wrapper">
-                <div id="wmd-button-bar"></div>
-                <div id="wmd-extra-bar">
-                    <ul class="wmd-button-row">
-                        <li class="wmd-button" id="wmd-preview-button" title="Toggle Preview"><span></span></li>
-                    </ul>
-                </div>
-            </section>
-            {{#if error}}
-            <section class="alert alert-danger">
-                <p><strong>Error:</strong> {{error.message}}</p>
-            </section>
-            {{/if}}
-            <section id="wmd-input-wrapper">
-                <textarea id="wmd-input" name="text" placeholder="Your page's contents go here...">{{content}}</textarea>
-                <div id="wmd-input-grip"></div>
-            </section>
-            <section id="wmd-meta-wrapper">
-                <div id="wmd-meta" class="controls commit-meta">
-                    <div class="control-group input-prepend">
-                        <label for="author" class="control-label add-on">Author: </label>
-                        <input type="text" name="author" class="" placeholder="{{commit_meta.author}}"></input>
+    <form id="page-edit">
+        <div class="header-wrapper">
+            <header>
+                {{#if is_new}}
+                <input type="text" name="title" class="input-xxlarge" placeholder="New Page"></input>
+                {{else}}
+                <h1>{{meta.title}} <span class="decorator">Editing</span></h1>
+                {{/if}}
+            </header>
+        </div>
+        <div class="editing-wrapper">
+            <div class="editing">
+                <section id="wmd-button-bar-wrapper">
+                    <div id="wmd-button-bar"></div>
+                    <div id="wmd-extra-bar">
+                        <ul class="wmd-button-row">
+                            <li class="wmd-button" id="wmd-preview-button" title="Toggle Preview"><span></span></li>
+                        </ul>
                     </div>
-                    <div class="control-group input-prepend">
-                        <label for="message" class="control-label add-on">Change Description: </label>
-                        <input type="text" name="message" class="input-xxlarge" placeholder="{{commit_meta.desc}}"></input>
+                </section>
+                {{#if error}}
+                <section class="alert alert-danger">
+                    <p><strong>Error:</strong> {{error.message}}</p>
+                </section>
+                {{/if}}
+                <section id="wmd-input-wrapper">
+                    <textarea id="wmd-input" name="text" placeholder="Your page's contents go here...">{{content}}</textarea>
+                    <div id="wmd-input-grip"></div>
+                </section>
+                <section id="wmd-meta-wrapper">
+                    <div id="wmd-meta" class="controls commit-meta">
+                        <div class="control-group input-prepend">
+                            <label for="author" class="control-label add-on">Author: </label>
+                            <input type="text" name="author" class="" placeholder="{{commit_meta.author}}"></input>
+                        </div>
+                        <div class="control-group input-prepend">
+                            <label for="message" class="control-label add-on">Change Description: </label>
+                            <input type="text" name="message" class="input-xxlarge" placeholder="{{commit_meta.desc}}"></input>
+                        </div>
                     </div>
-                </div>
-            </section>
-            <section id="wmd-commit-wrapper" class="row">
-                <div id="wmd-commit">
-                    <button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> Save</button>
-                    <a href="{{url_read}}" class="btn">Cancel</a>
-                </div>
-            </section>
-        </div>
-        <div id="wmd-preview-wrapper">
-            <h3>Preview</h3>
-            <button id="wmd-full-preview-button" class="btn">Full Preview</button>
-            <div id="wmd-preview"></div>
+                </section>
+                <section id="wmd-commit-wrapper" class="row">
+                    <div id="wmd-commit">
+                        <button type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> Save</button>
+                        <a href="{{url_read}}" class="btn">Cancel</a>
+                    </div>
+                </section>
+            </div>
+            <div class="preview">
+                <h3>Preview</h3>
+                <button id="wmd-full-preview-button" class="btn">Full Preview</button>
+                <div id="wmd-preview"></div>
+            </div>
         </div>
     </form>
 </article>
-<script type="text/javascript" src="/static/js/pagedown/Markdown.Converter.js"></script>
-<script type="text/javascript" src="/static/js/pagedown/Markdown.Sanitizer.js"></script>
-<script type="text/javascript" src="/static/js/pagedown/Markdown.Editor.js"></script>
--- a/wikked/views/edit.py	Sat Feb 01 14:01:27 2014 -0800
+++ b/wikked/views/edit.py	Sat Feb 01 14:03:20 2014 -0800
@@ -17,7 +17,7 @@
         self._text = text
 
     def _loadData(self):
-        extension = self.wiki.config.get('wiki', 'default_extension')
+        extension = self.wiki.fs.default_extension
         data = PageData()
         data.path = '__preview__.' + extension
         data.filename = '__preview__'
@@ -30,7 +30,8 @@
         data.local_meta = ctx.meta
         data.local_links = ctx.out_links
 
-        data.title = make_page_title(self.url)
+        data.title = (data.local_meta.get('title') or
+                make_page_title(self.url))
 
         return data