diff --git a/lms/djangoapps/django_comment_client/forum/views.py b/lms/djangoapps/django_comment_client/forum/views.py index 6c798c7237..8f154f2bd6 100644 --- a/lms/djangoapps/django_comment_client/forum/views.py +++ b/lms/djangoapps/django_comment_client/forum/views.py @@ -13,7 +13,7 @@ from courseware.access import has_access from urllib import urlencode from operator import methodcaller from django_comment_client.permissions import check_permissions_by_view -from django_comment_client.utils import merge_dict, extract, strip_none +from django_comment_client.utils import merge_dict, extract, strip_none, strip_blank import json import django_comment_client.utils as utils @@ -81,7 +81,7 @@ def render_discussion(request, course_id, threads, *args, **kwargs): 'pages_nearby_delta': PAGES_NEARBY_DELTA, 'discussion_type': discussion_type, 'base_url': base_url, - 'query_params': strip_none(extract(query_params, ['page', 'sort_key', 'sort_order', 'tags', 'text'])), + 'query_params': strip_blank(strip_none(extract(query_params, ['page', 'sort_key', 'sort_order', 'tags', 'text']))), 'annotated_content_info': json.dumps(annotated_content_info), 'discussion_data': json.dumps({ discussion_id: threads }), } diff --git a/lms/djangoapps/django_comment_client/helpers.py b/lms/djangoapps/django_comment_client/helpers.py index 6ef1baff23..04411564e5 100644 --- a/lms/djangoapps/django_comment_client/helpers.py +++ b/lms/djangoapps/django_comment_client/helpers.py @@ -41,6 +41,7 @@ def render_content(content, additional_context={}): 'displayed_body': content.get('highlighted_body') or content.get('body', ''), 'raw_tags': ','.join(content.get('tags', [])), } + print content_info if content['type'] == 'thread': content_info['permalink'] = reverse('django_comment_client.forum.views.single_thread', args=[content['course_id'], content['commentable_id'], content['id']]) diff --git a/lms/lib/comment_client/thread.py b/lms/lib/comment_client/thread.py index c203e22d22..1f6d081f7f 100644 --- a/lms/lib/comment_client/thread.py +++ b/lms/lib/comment_client/thread.py @@ -11,6 +11,7 @@ class Thread(models.Model): 'commentable_id', 'username', 'user_id', 'created_at', 'updated_at', 'comments_count', 'at_position_list', 'children', 'type', + 'highlighted_title', 'highlighted_body', ] updatable_fields = [ diff --git a/lms/static/coffee/src/backbone_discussion/content.coffee b/lms/static/coffee/src/backbone_discussion/content.coffee index 14fa140488..3fde83bfc2 100644 --- a/lms/static/coffee/src/backbone_discussion/content.coffee +++ b/lms/static/coffee/src/backbone_discussion/content.coffee @@ -120,7 +120,7 @@ class @ContentView extends Backbone.View else $elem = $.merge @$(".thread-title"), @$showComments() url = @model.urlFor('retrieve') - DiscussionUtil.get $elem, url, (response, textStatus) => + DiscussionUtil.get $elem, url, {}, (response, textStatus) => @showed = true @updateShowComments() @$showComments().addClass("retrieved") @@ -183,8 +183,8 @@ class @ContentView extends Backbone.View @$el.children(".comments").prepend $comment DiscussionUtil.setWmdContent @$el, $.proxy(@$, @), "reply-body", "" comment = @model.addComment response.content - comment.updateInfo response.annotated_content_info commentView = new CommentView el: $comment[0], model: comment + comment.updateInfo response.annotated_content_info @cancelReply() cancelReply: -> @@ -320,6 +320,11 @@ class @ContentView extends Backbone.View @$local = @$el.children(".local") @$delegateElement = @$local + initTitle: -> + $contentTitle = @$(".thread-title") + if $contentTitle.length + $contentTitle.html DiscussionUtil.unescapeHighlightTag DiscussionUtil.stripLatexHighlight $contentTitle.html() + initBody: -> $contentBody = @$(".content-body") $contentBody.html DiscussionUtil.postMathJaxProcessor DiscussionUtil.markdownWithHighlight $contentBody.html() @@ -344,8 +349,8 @@ class @ContentView extends Backbone.View @initBindings() @initLocal() @initTimeago() + @initTitle() @initBody() - #@initPermalink() @initCommentViews() class @Thread extends @Content diff --git a/lms/static/coffee/src/backbone_discussion/discussion.coffee b/lms/static/coffee/src/backbone_discussion/discussion.coffee index 6e670e0767..d38ea47d85 100644 --- a/lms/static/coffee/src/backbone_discussion/discussion.coffee +++ b/lms/static/coffee/src/backbone_discussion/discussion.coffee @@ -9,6 +9,12 @@ class @Discussion extends Backbone.Collection find: (id) -> _.first @where(id: id) + addThread: (thread, options) -> + options ||= {} + model = new Thread thread + @add model + model + class @DiscussionModuleView extends Backbone.View class @DiscussionView extends Backbone.View @@ -34,7 +40,7 @@ class @DiscussionView extends Backbone.View reload: ($elem, url) -> if not url then return - DiscussionUtil.get $elem, url, (response, textStatus) => + DiscussionUtil.get $elem, url, {}, (response, textStatus) => $discussion = $(response.html) $parent = @$el.parent() @$el.replaceWith($discussion) @@ -42,9 +48,104 @@ class @DiscussionView extends Backbone.View view = new DiscussionView el: $discussion[0], model: @model DiscussionUtil.bulkUpdateContentInfo(window.$$annotated_content_info) + loadSimilarPost: (event) -> + console.log "loading" + $title = @$(".new-post-title") + $wrapper = @$(".new-post-similar-posts-wrapper") + $similarPosts = @$(".new-post-similar-posts") + prevText = $title.attr("prev-text") + text = $title.val() + if text == prevText + if @$(".similar-post").length + $wrapper.show() + else if $.trim(text).length + $elem = $(event.target) + url = DiscussionUtil.urlFor 'search_similar_threads', @model.id + data = { text: @$(".new-post-title").val() } + DiscussionUtil.get $elem, url, data, (response, textStatus) => + console.log response + $similarPosts.empty() + if $.type(response) == "array" and response.length + $wrapper.show() + for thread in response + $similarPost = $("").addClass("similar-post") + .html(thread["title"]) + .attr("href", "javascript:void(0)") #TODO + .appendTo($similarPosts) + else + $wrapper.hide() + else + $wrapper.hide() + $title.attr("prev-text", text) + + newPost: -> + if not @$(".wmd-panel").length + view = { discussion_id: @model.id } + @$el.children(".discussion-non-content").append Mustache.render DiscussionUtil.getTemplate("_new_post"), view + $newPostBody = @$(".new-post-body") + DiscussionUtil.makeWmdEditor @$el, $.proxy(@$, @), "new-post-body" + + $input = DiscussionUtil.getWmdInput @$el, $.proxy(@$, @), "new-post-body" + $input.attr("placeholder", "post a new topic...") + if @$el.hasClass("inline-discussion") + $input.bind 'focus', (e) => + @$(".new-post-form").removeClass('collapsed') + else if @$el.hasClass("forum-discussion") + @$(".new-post-form").removeClass('collapsed') + + @$(".new-post-tags").tagsInput DiscussionUtil.tagsInputOptions() + + @$(".new-post-title").blur $.proxy(@loadSimilarPost, @) + + @$(".hide-similar-posts").click => + @$(".new-post-similar-posts-wrapper").hide() + + @$(".discussion-submit-post").click $.proxy(@submitNewPost, @) + @$(".discussion-cancel-post").click $.proxy(@cancelNewPost, @) + + + @$(".new-post-form").show() + + submitNewPost: (event) -> + title = @$(".new-post-title").val() + body = DiscussionUtil.getWmdContent @$el, $.proxy(@$, @), "new-post-body" + tags = @$(".new-post-tags").val() + url = DiscussionUtil.urlFor('create_thread', @model.id) + DiscussionUtil.safeAjax + $elem: $(event.target) + url: url + type: "POST" + dataType: 'json' + data: + title: title + body: body + tags: tags + error: DiscussionUtil.formErrorHandler(@$(".new-post-form-errors")) + success: (response, textStatus) => + DiscussionUtil.clearFormErrors(@$(".new-post-form-errors")) + $thread = $(response.html) + @$el.children(".threads").prepend($thread) + + @$(".new-post-title").val("") + DiscussionUtil.setWmdContent @$el, $.proxy(@$, @), "new-post-body", "" + @$(".new-post-tags").val("") + @$(".new-post-tags").importTags("") + + thread = @model.addThread response.content + threadView = new ThreadView el: $thread[0], model: thread + thread.updateInfo response.annotated_content_info + @cancelNewPost() + + + cancelNewPost: (event) -> + if @$el.hasClass("inline-discussion") + @$(".new-post-form").addClass("collapsed") + else if @$el.hasClass("forum-discussion") + @$(".new-post-form").hide() search: (event) -> + event.preventDefault() $elem = $(event.target) url = URI($elem.attr("action")).addSearch({text: @$(".search-input").val()}) @reload($elem, url) diff --git a/lms/static/coffee/src/backbone_discussion/utils.coffee b/lms/static/coffee/src/backbone_discussion/utils.coffee index 7f443055bf..ce99354a94 100644 --- a/lms/static/coffee/src/backbone_discussion/utils.coffee +++ b/lms/static/coffee/src/backbone_discussion/utils.coffee @@ -70,12 +70,13 @@ class @DiscussionUtil $.ajax(params).always -> $elem.removeAttr("disabled") - @get: ($elem, url, success) -> + @get: ($elem, url, data, success) -> @safeAjax $elem: $elem url: url type: "GET" dataType: "json" + data: data success: success @post: ($elem, url, data, success) -> diff --git a/lms/templates/discussion/mustache/_content.mustache b/lms/templates/discussion/mustache/_content.mustache index c38fc4e37c..34926b57b5 100644 --- a/lms/templates/discussion/mustache/_content.mustache +++ b/lms/templates/discussion/mustache/_content.mustache @@ -15,12 +15,12 @@ {{/thread}} {{#thread}} - {{{content.displayed_title}}} + {{content.displayed_title}}
{{/thread}}