changeset 411:ba977a547daa

web: Support browsers without Javascript. * Add development flag to disable Javascript. * Fix editing/previewing pages when there's not Javascript.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 20 Mar 2017 22:18:32 -0700
parents c93ac92aef5b
children 39f0f07805e3
files wikked/commands/web.py wikked/templates/edit-page.html wikked/templates/index.html wikked/templates/nav.html wikked/templates/preview-page.html wikked/templates/special-nav.html wikked/views/__init__.py wikked/views/edit.py wikked/web.py
diffstat 9 files changed, 81 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/commands/web.py	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/commands/web.py	Mon Mar 20 22:18:32 2017 -0700
@@ -38,6 +38,10 @@
                      "code reloading and debugging.",
                 action='store_true')
         parser.add_argument(
+                '--no-js',
+                help="Disable Javascript.",
+                action='store_true')
+        parser.add_argument(
                 '--no-update',
                 help="Don't auto-update the wiki if a page file has been "
                      "touched (which means you can refresh a locally modified "
@@ -81,6 +85,8 @@
         wikked.settings.WIKI_SERVE_FILES = True
         if ctx.args.dev:
             wikked.settings.WIKI_DEV_ASSETS = True
+        if ctx.args.no_js:
+            wikked.settings.WIKI_DEV_NO_JS = True
         if not ctx.args.no_update:
             wikked.settings.WIKI_AUTO_RELOAD = True
 
--- a/wikked/templates/edit-page.html	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/templates/edit-page.html	Mon Mar 20 22:18:32 2017 -0700
@@ -44,8 +44,8 @@
                     </section>
                     <section class="editing-submit">
                         <div class="pure-control-group">
-                            <button type="submit" class="pure-button pure-button-primary"><span class="fa fa-check"></span> Save</button>
-                            <button id="editing-preview-button" type="submit" class="pure-button" data-wiki-url="{{preview_url}}"><span class="fa fa-eye"></span> <span class="editing-preview-button-label">Preview</span></button>
+                            <button name="do-save" type="submit" class="pure-button pure-button-primary"><span class="fa fa-check"></span> Save</button>
+                            <button name="do-preview" id="editing-preview-button" type="submit" class="pure-button" data-wiki-url="{{preview_url}}"><span class="fa fa-eye"></span> <span class="editing-preview-button-label">Preview</span></button>
                             <a id="editing-cancel-button" class="pure-button" href="{%if is_new%}/{%else%}{{get_read_url(meta.url)}}{%endif%}"><span class="fa fa-remove"></span> Cancel</a>
                         </div>
                     </section>
@@ -57,10 +57,12 @@
 {% endblock %}
 {% block scripts %}
 {% if is_dev %}
+{% if not no_js %}
 <script data-main="/dev-assets/js/wikked.js" src="/dev-assets/js/require.js"></script>
 <script>
 require(['wikked.app', 'wikked.edit'], function(app, edit) {});
 </script>
+{% endif %}
 {% else %}
 <script src="/static/js/require.js"></script>
 <script src="/static/js/wikked.app.js"></script>
--- a/wikked/templates/index.html	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/templates/index.html	Mon Mar 20 22:18:32 2017 -0700
@@ -12,7 +12,7 @@
             <div class="nav-wrapper">
                 {% block nav %}{% include 'nav.html' %}{% endblock %}
             </div>
-            <div class="wrapper{%if nav.is_menu_active%} wiki-menu-active{%endif%}{%if is_special_page%} special{%endif%}">
+            <div class="wrapper{%if not nav.hide_menu%} wiki-menu-active{%endif%}{%if is_special_page%} special{%endif%}">
                 {% block content %}{% endblock %}
             </div>
             <div class="footer-wrapper">
@@ -21,10 +21,12 @@
         </div>
         {% block scripts %}
         {% if is_dev %}
+        {% if not no_js %}
         <script data-main="/dev-assets/js/wikked.js" src="/dev-assets/js/require.js"></script>
         <script>
         require(['wikked.app'], function(edit) {});
         </script>
+        {% endif %}
         {% else %}
         <script src="/static/js/require.js"></script>
         <script src="/static/js/wikked.app.js"></script>
--- a/wikked/templates/nav.html	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/templates/nav.html	Mon Mar 20 22:18:32 2017 -0700
@@ -1,13 +1,13 @@
 <a id="wiki-menu-shortcut" class="wiki-logo">
     <span>W</span>
 </a>
-<nav id="wiki-menu" role="navigation" class="pure-menu pure-menu-open{%if nav.is_menu_active%} wiki-menu-active{%endif%}">
+<nav id="wiki-menu" role="navigation" class="pure-menu pure-menu-open{%if not nav.hide_menu %} wiki-menu-active{%endif%}">
     <div id="wiki-menu-pin" title="Pin/unpin the wiki menu.">
         <span class="fa fa-lock"></span>
     </div>
     <ul class="">
-        <li><a href="/"><span class="fa fa-home"></span> Home</a></li>
-        <li><a href="/create/"><span class="fa fa-file"></span> New Page</a></li>
+        {%if nav.url_home%}<li><a href="{{nav.url_home}}"><span class="fa fa-home"></span> Home</a></li>{%endif%}
+        {%if nav.url_new%}<li><a href="{{nav.url_new}}"><span class="fa fa-file"></span> New Page</a></li>{%endif%}
         {%if nav.url_read%}<li><a href="{{nav.url_read}}"><span class="fa fa-book"></span> Read</a></li>{%endif%}
         {%if nav.url_edit%}<li><a href="{{nav.url_edit}}"><span class="fa fa-edit"></span> Edit</a></li>{%endif%}
         {%if nav.url_hist%}<li><a href="{{nav.url_hist}}"><span class="fa fa-road"></span> History</a></li>{%endif%}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wikked/templates/preview-page.html	Mon Mar 20 22:18:32 2017 -0700
@@ -0,0 +1,18 @@
+{% extends 'index.html' %}
+{% block content %}
+<article>
+    <header>
+        <h1>{{meta.title}}</h1>
+        <div class="decorator">Previewing</div>
+    </header>
+    <section class="content">
+        {{text|safe}}
+    </section>
+    <form class="pure-form" action="{{post_back}}" method="POST">
+        <input type="hidden" name="previewed_text" value="{{raw_text}}"></input>
+        <div class="pure-control-group">
+            <button name="do-back-to-edit" type="submit" class="pure-button">Back to Editing</button>
+        </div>
+    </form>
+</article>
+{% endblock %}
--- a/wikked/templates/special-nav.html	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/templates/special-nav.html	Mon Mar 20 22:18:32 2017 -0700
@@ -1,7 +1,7 @@
 <a id="wiki-menu-shortcut" class="wiki-logo">
     <span>W</span>
 </a>
-<nav id="wiki-menu" role="navigation" class="pure-menu pure-menu-open{% if nav.is_menu_active%} wiki-menu-active{%endif%}">
+<nav id="wiki-menu" role="navigation" class="pure-menu pure-menu-open{% if not nav.hide_menu%} wiki-menu-active{%endif%}">
     <div id="wiki-menu-pin" title="Pin/unpin the wiki menu.">
         <span class="fa fa-lock"></span>
     </div>
--- a/wikked/views/__init__.py	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/views/__init__.py	Mon Mar 20 22:18:32 2017 -0700
@@ -1,5 +1,5 @@
 import functools
-from flask import request, render_template
+from flask import request, render_template, url_for
 from flask.ext.login import current_user
 from wikked.web import app, get_wiki
 from wikked.webimpl import PermissionError
@@ -72,7 +72,8 @@
 
 
 def add_navigation_data(
-        url, data,
+        url, data, *,
+        home=True, new_page=True,
         read=False, edit=False, history=False, inlinks=False,
         raw_url=None, extras=None, footers=None):
     if url is not None:
@@ -80,22 +81,26 @@
     elif read or edit or history or inlinks:
         raise Exception("Default navigation entries require a valid URL.")
 
-    nav = {'home': '/', 'extras': [], 'footers': []}
+    nav = {'extras': [], 'footers': []}
+
+    nav['hide_menu'] = (
+            request.cookies.get('wiki-hide-nav') == '1')
 
-    nav['is_menu_active'] = (
-            request.cookies.get('wiki-menu-active') == '1')
-
+    if home:
+        nav['url_home'] = '/'
+    if new_page:
+        nav['url_new'] = url_for('edit_new_page')
     if read:
-        nav['url_read'] = '/read/%s' % url
+        nav['url_read'] = url_for('read', url=url)
     if edit:
-        nav['url_edit'] = '/edit/%s' % url
+        nav['url_edit'] = url_for('edit_page', url=url)
     if history:
-        nav['url_hist'] = '/hist/%s' % url
+        nav['url_hist'] = url_for('page_history', url=url)
 
     if inlinks:
         nav['extras'].append({
             'title': "Pages Linking Here",
-            'url': '/inlinks/' + url,
+            'url': url_for('incoming_links', url=url),
             'icon': 'link'
             })
 
@@ -108,7 +113,7 @@
 
     nav['extras'].append({
             'title': "Special Pages",
-            'url': '/special',
+            'url': url_for('special_pages_dashboard'),
             'icon': 'dashboard'})
 
     if extras:
@@ -122,4 +127,5 @@
 
     if app.config['WIKI_DEV_ASSETS']:
         data['is_dev'] = True
-
+    if app.config['WIKI_DEV_NO_JS']:
+        data['no_js'] = True
--- a/wikked/views/edit.py	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/views/edit.py	Mon Mar 20 22:18:32 2017 -0700
@@ -1,11 +1,12 @@
-from flask import redirect, url_for, request, render_template
+from flask import abort, redirect, url_for, request, render_template
 from flask.ext.login import current_user
 from wikked.views import (
         errorhandling_ui2, show_unauthorized_error,
         add_auth_data, add_navigation_data)
 from wikked.web import app, get_wiki
 from wikked.webimpl import url_from_viewarg
-from wikked.webimpl.edit import get_edit_page, do_edit_page
+from wikked.webimpl.edit import (
+    get_edit_page, do_edit_page, preview_edited_page)
 
 
 @app.route('/create/')
@@ -28,7 +29,7 @@
                 'author': current_user.get_id() or request.remote_addr,
                 'desc': 'Editing ' + url
                 },
-            'post_back': '/edit'
+            'post_back': url_for('edit_page', url=url.lstrip('/'))
             }
     add_auth_data(data)
     add_navigation_data(url, data)
@@ -49,25 +50,42 @@
     user = current_user.get_id()
     url = url_from_viewarg(url)
 
-    if request.method == 'GET':
+    if request.method == 'GET' or (
+            request.method == 'POST' and 'do-back-to-edit' in request.form):
         author = user or request.remote_addr
         custom_data = {
-                'post_back': '/edit/' + url.lstrip('/'),
+                'post_back': url_for('edit_page', url=url.lstrip('/')),
                 'preview_url': url}
         data = get_edit_page(wiki, user, url,
                              author=author, custom_data=custom_data)
+        if 'previewed_text' in request.form:
+            data['text'] = request.form['previewed_text']
         add_auth_data(data)
         add_navigation_data(
                 url, data,
                 read=True, history=True, inlinks=True,
-                raw_url='/api/edit/' + url.lstrip('/'))
+                raw_url=url_for('api_read_page', url=url.lstrip('/')))
         return render_template('edit-page.html', **data)
 
     if request.method == 'POST':
         text = request.form['text']
         author = user or request.form['author'] or request.remote_addr
         message = request.form['message'] or 'Editing ' + url
-        do_edit_page(wiki, user, url, text,
-                     author=author, message=message)
-        return redirect(url_for('read', url=url.lstrip('/')))
 
+        if 'do-preview' in request.form:
+            data = get_edit_page(wiki, user, url, author=author)
+            preview = preview_edited_page(wiki, url, text)
+            data['raw_text'] = text
+            data['text'] = preview
+            data['post_back'] = url_for('edit_page', url=url.lstrip('/'))
+            add_auth_data(data)
+            add_navigation_data(url, data, new_page=False)
+            return render_template('preview-page.html', **data)
+
+        elif 'do-save' in request.form:
+            do_edit_page(wiki, user, url, text,
+                         author=author, message=message)
+            return redirect(url_for('read', url=url.lstrip('/')))
+
+        else:
+            abort(400)
--- a/wikked/web.py	Thu Jan 12 09:19:21 2017 -0800
+++ b/wikked/web.py	Mon Mar 20 22:18:32 2017 -0700
@@ -22,6 +22,7 @@
 app.config.setdefault('SQL_COMMIT_ON_TEARDOWN', False)
 app.config.setdefault('WIKI_ROOT', None)
 app.config.setdefault('WIKI_DEV_ASSETS', False)
+app.config.setdefault('WIKI_DEV_NO_JS', False)
 app.config.setdefault('WIKI_UPDATE_ON_START', True)
 app.config.setdefault('WIKI_AUTO_RELOAD', False)
 app.config.setdefault('WIKI_ASYNC_UPDATE', False)