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
|
* 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/>.
|
* 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(){
|
$(document).ready(function(){
|
||||||
$('#form_comment').hide();
|
$('#form_comment').hide();
|
||||||
$('#button_addcomment').click(function(){
|
$('#button_addcomment').click(function(){
|
||||||
$(this).fadeOut('fast');
|
$(this).fadeOut('fast');
|
||||||
$('#form_comment').slideDown(function(){
|
$('#form_comment').slideDown(function(){
|
||||||
|
setInterval("previewComment()",500);
|
||||||
$('#comment_content').focus();
|
$('#comment_content').focus();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -107,7 +107,9 @@
|
|||||||
<input type="submit" value="{% trans %}Add this comment{% endtrans %}" class="button_action" />
|
<input type="submit" value="{% trans %}Add this comment{% endtrans %}" class="button_action" />
|
||||||
{{ csrf_token }}
|
{{ csrf_token }}
|
||||||
</div>
|
</div>
|
||||||
|
<input type="hidden" value="{{ request.urlgen('mediagoblin.user_pages.media_preview_comment') }}" id="previewURL" />
|
||||||
</form>
|
</form>
|
||||||
|
<div id="comment_preview"></div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<ul style="list-style:none">
|
<ul style="list-style:none">
|
||||||
{% for comment in comments %}
|
{% for comment in comments %}
|
||||||
|
@ -23,7 +23,7 @@ class MediaCommentForm(wtforms.Form):
|
|||||||
_('Comment'),
|
_('Comment'),
|
||||||
[wtforms.validators.Required()],
|
[wtforms.validators.Required()],
|
||||||
description=_(u'You can use '
|
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.'))
|
u'Markdown</a> for formatting.'))
|
||||||
|
|
||||||
class ConfirmDeleteForm(wtforms.Form):
|
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/',
|
'/u/<string:user>/m/<int:media_id>/comment/add/',
|
||||||
'mediagoblin.user_pages.views:media_post_comment')
|
'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',
|
add_route('mediagoblin.user_pages.user_gallery',
|
||||||
'/u/<string:user>/gallery/',
|
'/u/<string:user>/gallery/',
|
||||||
'mediagoblin.user_pages.views:user_gallery')
|
'mediagoblin.user_pages.views:user_gallery')
|
||||||
|
@ -16,19 +16,21 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
import datetime
|
import datetime
|
||||||
|
import json
|
||||||
|
import urllib
|
||||||
|
|
||||||
from mediagoblin import messages, mg_globals
|
from mediagoblin import messages, mg_globals
|
||||||
from mediagoblin.db.models import (MediaEntry, MediaTag, Collection,
|
from mediagoblin.db.models import (MediaEntry, MediaTag, Collection,
|
||||||
CollectionItem, User)
|
CollectionItem, User)
|
||||||
from mediagoblin.tools.response import render_to_response, render_404, \
|
from mediagoblin.tools.response import render_to_response, render_404, \
|
||||||
redirect, redirect_obj
|
redirect, redirect_obj
|
||||||
|
from mediagoblin.tools.text import cleaned_markdown_conversion
|
||||||
from mediagoblin.tools.translate import pass_to_ugettext as _
|
from mediagoblin.tools.translate import pass_to_ugettext as _
|
||||||
from mediagoblin.tools.pagination import Pagination
|
from mediagoblin.tools.pagination import Pagination
|
||||||
from mediagoblin.user_pages import forms as user_forms
|
from mediagoblin.user_pages import forms as user_forms
|
||||||
from mediagoblin.user_pages.lib import add_media_to_collection
|
from mediagoblin.user_pages.lib import add_media_to_collection
|
||||||
from mediagoblin.notifications import trigger_notification, \
|
from mediagoblin.notifications import trigger_notification, \
|
||||||
add_comment_subscription, mark_comment_notification_seen
|
add_comment_subscription, mark_comment_notification_seen
|
||||||
|
|
||||||
from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
|
from mediagoblin.decorators import (uses_pagination, get_user_media_entry,
|
||||||
get_media_entry_by_id,
|
get_media_entry_by_id,
|
||||||
require_active_login, user_may_delete_media, user_may_alter_collection,
|
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.contrib.atom import AtomFeed
|
||||||
from werkzeug.exceptions import MethodNotAllowed
|
from werkzeug.exceptions import MethodNotAllowed
|
||||||
|
from werkzeug.wrappers import Response
|
||||||
|
|
||||||
|
|
||||||
_log = logging.getLogger(__name__)
|
_log = logging.getLogger(__name__)
|
||||||
@ -166,6 +169,7 @@ def media_post_comment(request, media):
|
|||||||
comment = request.db.MediaComment()
|
comment = request.db.MediaComment()
|
||||||
comment.media_entry = media.id
|
comment.media_entry = media.id
|
||||||
comment.author = request.user.id
|
comment.author = request.user.id
|
||||||
|
print request.form['comment_content']
|
||||||
comment.content = unicode(request.form['comment_content'])
|
comment.content = unicode(request.form['comment_content'])
|
||||||
|
|
||||||
# Show error message if commenting is disabled.
|
# Show error message if commenting is disabled.
|
||||||
@ -193,6 +197,18 @@ def media_post_comment(request, media):
|
|||||||
return redirect_obj(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
|
@get_media_entry_by_id
|
||||||
@require_active_login
|
@require_active_login
|
||||||
def media_collect(request, media):
|
def media_collect(request, media):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user