From c0eb484c2568fc0fb3d77b4a571276700de22c8c Mon Sep 17 00:00:00 2001 From: Dan Vanderkam Date: Mon, 10 Nov 2014 17:39:14 -0500 Subject: [PATCH] Use react-router to fully support /123 URLs --- bower.json | 3 ++- webdiff/app.py | 12 +++++------- webdiff/static/js/components.jsx | 31 ++++++++++++++++++++---------- webdiff/templates/base.html | 1 + webdiff/templates/file_diff.html | 33 ++++++++++++++++++++++++++++++-- 5 files changed, 60 insertions(+), 20 deletions(-) diff --git a/bower.json b/bower.json index 38bbba3..9883cd5 100644 --- a/bower.json +++ b/bower.json @@ -18,6 +18,7 @@ "jquery": "~2.1.1", "highlightjs": "~8.0.0", "underscore": "~1.6.0", - "react": "~0.11.1" + "react": "~0.11.1", + "react-router": "~0.10.2" } } diff --git a/webdiff/app.py b/webdiff/app.py index 8388259..34ed07d 100755 --- a/webdiff/app.py +++ b/webdiff/app.py @@ -143,15 +143,12 @@ def index(): return file_diff('0') -@app.route("/") +@app.route("/") def file_diff(idx): idx = int(idx) return render_template('file_diff.html', idx=idx, - pairs=DIFF, - this_pair=DIFF[idx], - is_image_diff=util.is_image_diff(DIFF[idx]), - num_pairs=len(DIFF)) + pairs=DIFF) @app.route('/favicon.ico') @@ -172,7 +169,8 @@ def seriouslykill(): @app.route('/kill', methods=['POST']) def kill(): - if 'STAY_RUNNING' in app.config: return + if 'STAY_RUNNING' in app.config: + return 'Will stay running.' last_ms = LAST_REQUEST_MS def shutdown(): @@ -183,7 +181,7 @@ def shutdown(): Timer(0.5, shutdown).start() - return "Shutting down..." + return 'Shutting down...' def open_browser(): diff --git a/webdiff/static/js/components.jsx b/webdiff/static/js/components.jsx index aaad720..4a11f21 100644 --- a/webdiff/static/js/components.jsx +++ b/webdiff/static/js/components.jsx @@ -1,30 +1,41 @@ /** @jsx React.DOM */ +var Route = ReactRouter.Route; +var Routes = ReactRouter.Routes; +var Link = ReactRouter.Link; IMAGE_DIFF_MODES = ['side-by-side', 'blink', 'onion-skin', 'swipe']; // Webdiff application root. var Root = React.createClass({ propTypes: { - filePairs: React.PropTypes.array.isRequired + filePairs: React.PropTypes.array.isRequired, + initiallySelectedIndex: React.PropTypes.number, + params: React.PropTypes.object }, + mixins: [ReactRouter.Navigation], getInitialState: () => ({ - selectedFileIndex: 0, imageDiffMode: 'side-by-side' }), - fileChangeHandler: function(idx) { - this.setState({selectedFileIndex: idx}); + selectIndex: function(idx) { + this.transitionTo('pair', {index:idx}); + }, + getIndex: function() { + var idx = this.props.params.index; + if (idx == null) idx = this.props.initiallySelectedIndex; + return Number(idx); }, changeImageDiffModeHandler: function(mode) { this.setState({imageDiffMode: mode}); }, render: function() { - var filePair = this.props.filePairs[this.state.selectedFileIndex]; + var idx = this.getIndex(), + filePair = this.props.filePairs[idx]; return (
- + fileChangeHandler={this.selectIndex} /> @@ -34,14 +45,14 @@ var Root = React.createClass({ componentDidMount: function() { $(document).on('keydown', (e) => { if (!isLegitKeypress(e)) return; - var idx = this.state.selectedFileIndex; + var idx = this.getIndex(); if (e.keyCode == 75) { // j if (idx > 0) { - this.setState({selectedFileIndex: idx - 1}); + this.selectIndex(idx - 1); } } else if (e.keyCode == 74) { // k if (idx < this.props.filePairs.length - 1) { - this.setState({selectedFileIndex: idx + 1}); + this.selectIndex(idx + 1); } } else if (e.keyCode == 83) { // s this.setState({imageDiffMode: 'side-by-side'}); diff --git a/webdiff/templates/base.html b/webdiff/templates/base.html index 39c999d..bf85a10 100644 --- a/webdiff/templates/base.html +++ b/webdiff/templates/base.html @@ -11,6 +11,7 @@ + diff --git a/webdiff/templates/file_diff.html b/webdiff/templates/file_diff.html index db3f681..e0df93f 100644 --- a/webdiff/templates/file_diff.html +++ b/webdiff/templates/file_diff.html @@ -11,13 +11,42 @@ - + + + {% endblock %}