Added comment preview functionality to user pages. It works by passing the comment's value as a JSON string to a new handler that lives at /ajax/comment/preview. The query string is decoded, unquoted, and has its leading and trailing quotes removed to match the input that cleaned_markdown_conversion expects.
It does this in real time with a 500ms lag by using a timer. Initially I tried the onChange handler but you need to lose focus for that to process. The javascript timer is only invoked if the add comment button is pressed. A request is only sent if the comment box is not empty and the current value is not the same as the last value.
This commit is contained in:
parent
9da4e8049f
commit
5ab6029961
@ -15,12 +15,24 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
var content="";
|
||||
|
||||
function previewComment(){
|
||||
if ($('#comment_content').val() && (content != $('#comment_content').val())) {
|
||||
content = $('#comment_content').val();
|
||||
$.getJSON($('#previewURL').val(),JSON.stringify($('#comment_content').val()),
|
||||
function(data){
|
||||
$('#comment_preview').replaceWith("<div id=comment_preview><h3>Comment Preview</h3><br />" + decodeURIComponent(data) +
|
||||
"<hr style='border: 1px solid #333;' /></div>");
|
||||
});
|
||||
}
|
||||
}
|
||||
$(document).ready(function(){
|
||||
$('#form_comment').hide();
|
||||
$('#button_addcomment').click(function(){
|
||||
$(this).fadeOut('fast');
|
||||
$('#form_comment').slideDown(function(){
|
||||
setInterval("previewComment()",500);
|
||||
$('#comment_content').focus();
|
||||
});
|
||||
});
|
||||
|
@ -107,7 +107,9 @@
|
||||
<input type="submit" value="{% trans %}Add this comment{% endtrans %}" class="button_action" />
|
||||
{{ csrf_token }}
|
||||
</div>
|
||||
<input type="hidden" value="{{ request.urlgen('mediagoblin.user_pages.media_preview_comment') }}" id="previewURL" />
|
||||
</form>
|
||||
<div id="comment_preview"></div>
|
||||
{% endif %}
|
||||
<ul style="list-style:none">
|
||||
{% for comment in comments %}
|
||||
|
@ -23,7 +23,7 @@ class MediaCommentForm(wtforms.Form):
|
||||
_('Comment'),
|
||||
[wtforms.validators.Required()],
|
||||
description=_(u'You can use '
|
||||
u'<a href="http://daringfireball.net/projects/markdown/basics">'
|
||||
u'<a href="http://daringfireball.net/projects/markdown/basics" target=new>'
|
||||
u'Markdown</a> for formatting.'))
|
||||
|
||||
class ConfirmDeleteForm(wtforms.Form):
|
||||
|
@ -32,6 +32,10 @@ add_route('mediagoblin.user_pages.media_post_comment',
|
||||
'/u/<string:user>/m/<int:media_id>/comment/add/',
|
||||
'mediagoblin.user_pages.views:media_post_comment')
|
||||
|
||||
add_route('mediagoblin.user_pages.media_preview_comment',
|
||||
'/ajax/comment/preview/',
|
||||
'mediagoblin.user_pages.views:media_preview_comment')
|
||||
|
||||
add_route('mediagoblin.user_pages.user_gallery',
|
||||
'/u/<string:user>/gallery/',
|
||||
'mediagoblin.user_pages.views:user_gallery')
|
||||
|
@ -16,19 +16,21 @@
|
||||
|
||||
import logging
|
||||
import datetime
|
||||
import json
|
||||
import urllib
|
||||
|
||||
from mediagoblin import messages, mg_globals
|
||||
from mediagoblin.db.models import (MediaEntry, MediaTag, Collection,
|
||||
CollectionItem, User)
|
||||
from mediagoblin.tools.response import render_to_response, render_404, \
|
||||
redirect, redirect_obj
|
||||
from mediagoblin.tools.text import cleaned_markdown_conversion
|
||||
from mediagoblin.tools.translate import pass_to_ugettext as _
|
||||
from mediagoblin.tools.pagination import Pagination
|
||||
from mediagoblin.user_pages import forms as user_forms
|
||||
from mediagoblin.user_pages.lib import add_media_to_collection
|
||||
from mediagoblin.notifications import trigger_notification, \
|
||||
add_comment_subscription, mark_comment_notification_seen
|
||||
|
||||
from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
|
||||
get_media_entry_by_id,
|
||||
require_active_login, user_may_delete_media, user_may_alter_collection,
|
||||
@ -36,6 +38,7 @@ from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
|
||||
|
||||
from werkzeug.contrib.atom import AtomFeed
|
||||
from werkzeug.exceptions import MethodNotAllowed
|
||||
from werkzeug.wrappers import Response
|
||||
|
||||
|
||||
_log = logging.getLogger(__name__)
|
||||
@ -166,6 +169,7 @@ def media_post_comment(request, media):
|
||||
comment = request.db.MediaComment()
|
||||
comment.media_entry = media.id
|
||||
comment.author = request.user.id
|
||||
print request.form['comment_content']
|
||||
comment.content = unicode(request.form['comment_content'])
|
||||
|
||||
# Show error message if commenting is disabled.
|
||||
@ -193,6 +197,18 @@ def media_post_comment(request, media):
|
||||
return redirect_obj(request, media)
|
||||
|
||||
|
||||
|
||||
def media_preview_comment(request):
|
||||
|
||||
comment = unicode(urllib.unquote(request.query_string).decode('string_escape'))
|
||||
if comment.startswith('"') and comment.endswith('"'):
|
||||
comment = comment[1:-1]
|
||||
print comment
|
||||
#decoderRing = json.JSONDecoder()
|
||||
#comment = decoderRing.decode(request.query_string)
|
||||
|
||||
return Response(json.dumps(cleaned_markdown_conversion(comment)))
|
||||
|
||||
@get_media_entry_by_id
|
||||
@require_active_login
|
||||
def media_collect(request, media):
|
||||
|
Loading…
x
Reference in New Issue
Block a user