diff --git a/lms/static/coffee/src/discussion/views/discussion_thread_show_view.coffee b/lms/static/coffee/src/discussion/views/discussion_thread_show_view.coffee
new file mode 100644
index 0000000000..bf7169bf96
--- /dev/null
+++ b/lms/static/coffee/src/discussion/views/discussion_thread_show_view.coffee
@@ -0,0 +1,151 @@
+class @DiscussionThreadShowView extends DiscussionContentView
+
+ events:
+ "click .discussion-vote": "toggleVote"
+ "click .action-follow": "toggleFollowing"
+ "click .action-edit": "edit"
+ "click .action-delete": "delete"
+ "click .action-openclose": "toggleClosed"
+
+ template: _.template($("#thread-show-template").html())
+
+ $: (selector) ->
+ @$el.find(selector)
+
+ initialize: ->
+ super()
+ @model.on "change", @updateModelDetails
+
+ render: ->
+ @$el.html(@template(@model.toJSON()))
+ @delegateEvents()
+ @renderDogear()
+ @renderVoted()
+ @renderAttrs()
+ @$("span.timeago").timeago()
+ @convertMath()
+ @highlight @$(".post-body")
+ @highlight @$("h1")
+ @
+
+ renderDogear: ->
+ if window.user.following(@model)
+ @$(".dogear").addClass("is-followed")
+
+ renderVoted: =>
+ if window.user.voted(@model)
+ @$("[data-role=discussion-vote]").addClass("is-cast")
+ else
+ @$("[data-role=discussion-vote]").removeClass("is-cast")
+
+ updateModelDetails: =>
+ @renderVoted()
+ @$("[data-role=discussion-vote] .votes-count-number").html(@model.get("votes")["up_count"])
+
+ convertMath: ->
+ element = @$(".post-body")
+ element.html DiscussionUtil.postMathJaxProcessor(element.html())
+ MathJax.Hub.Queue ["Typeset", MathJax.Hub, element[0]]
+
+ toggleVote: (event) ->
+ event.preventDefault()
+ if window.user.voted(@model)
+ @unvote()
+ else
+ @vote()
+
+ toggleFollowing: (event) ->
+ $elem = $(event.target)
+ url = null
+ console.log "follow"
+ if not @model.get('subscribed')
+ @model.follow()
+ url = @model.urlFor("follow")
+ else
+ @model.unfollow()
+ url = @model.urlFor("unfollow")
+ DiscussionUtil.safeAjax
+ $elem: $elem
+ url: url
+ type: "POST"
+
+ vote: ->
+ window.user.vote(@model)
+ url = @model.urlFor("upvote")
+ DiscussionUtil.safeAjax
+ $elem: @$(".discussion-vote")
+ url: url
+ type: "POST"
+ success: (response, textStatus) =>
+ if textStatus == 'success'
+ @model.set(response, {silent: true})
+
+ unvote: ->
+ window.user.unvote(@model)
+ url = @model.urlFor("unvote")
+ DiscussionUtil.safeAjax
+ $elem: @$(".discussion-vote")
+ url: url
+ type: "POST"
+ success: (response, textStatus) =>
+ if textStatus == 'success'
+ @model.set(response, {silent: true})
+
+ submitComment: (event) ->
+ event.preventDefault()
+ url = @model.urlFor('reply')
+ body = @getWmdContent("reply-body")
+ return if not body.trim().length
+ @setWmdContent("reply-body", "")
+ comment = new Comment(body: body, created_at: (new Date()).toISOString(), username: window.user.get("username"), votes: { up_count: 0 }, endorsed: false, user_id: window.user.get("id"))
+ comment.set('thread', @model.get('thread'))
+ @renderResponse(comment)
+ @model.addComment()
+
+ DiscussionUtil.safeAjax
+ $elem: $(event.target)
+ url: url
+ type: "POST"
+ dataType: 'json'
+ data:
+ body: body
+ success: (data, textStatus) =>
+ comment.updateInfo(data.annotated_content_info)
+ comment.set(data.content)
+
+ edit: ->
+ @trigger "thread:edit"
+ window.showView = @
+
+ delete: (event) ->
+ @trigger "thread:delete"
+
+ toggleClosed: (event) ->
+ $elem = $(event.target)
+ url = @model.urlFor('close')
+ closed = @model.get('closed')
+ data = { closed: not closed }
+ DiscussionUtil.safeAjax
+ $elem: $elem
+ url: url
+ data: data
+ type: "POST"
+ success: (response, textStatus) =>
+ @model.set('closed', not closed)
+ @model.set('ability', response.ability)
+
+ toggleEndorse: (event) ->
+ $elem = $(event.target)
+ url = @model.urlFor('endorse')
+ endorsed = @model.get('endorsed')
+ data = { endorsed: not endorsed }
+ DiscussionUtil.safeAjax
+ $elem: $elem
+ url: url
+ data: data
+ type: "POST"
+ success: (response, textStatus) =>
+ @model.set('endorsed', not endorsed)
+
+ highlight: (el) ->
+ el.html(el.html().replace(/<mark>/g, "").replace(/<\/mark>/g, ""))
diff --git a/lms/static/coffee/src/discussion/views/discussion_thread_view.coffee b/lms/static/coffee/src/discussion/views/discussion_thread_view.coffee
index 8f1054a310..8d97c4b74e 100644
--- a/lms/static/coffee/src/discussion/views/discussion_thread_view.coffee
+++ b/lms/static/coffee/src/discussion/views/discussion_thread_view.coffee
@@ -1,57 +1,33 @@
class @DiscussionThreadView extends DiscussionContentView
events:
- "click .discussion-vote": "toggleVote"
- "click .action-follow": "toggleFollowing"
"click .discussion-submit-post": "submitComment"
- "click .action-edit": "edit"
- "click .action-delete": "delete"
- "click .action-openclose": "toggleClosed"
template: _.template($("#thread-template").html())
- initLocal: ->
- @$local = @$el.children(".discussion-article").children(".local")
- @$delegateElement = @$local
+ $: (selector) ->
+ @$el.find(selector)
initialize: ->
super()
- @model.on "change", @updateModelDetails
+ @showView = new DiscussionThreadShowView(model: @model)
+ @showView.bind "thread:delete", @delete
+ @showView.bind "thread:edit", @edit
render: ->
@$el.html(@template(@model.toJSON()))
- @initLocal()
@delegateEvents()
- @renderDogear()
- @renderVoted()
+
+ @showView.setElement(@$('.thread-content-wrapper'))
+ @showView.render()
+ @showView.delegateEvents()
+
@renderAttrs()
@$("span.timeago").timeago()
@makeWmdEditor "reply-body"
- @convertMath()
@renderResponses()
- @highlight @$(".post-body")
- @highlight @$("h1")
@
- renderDogear: ->
- if window.user.following(@model)
- @$(".dogear").addClass("is-followed")
-
- renderVoted: =>
- if window.user.voted(@model)
- @$("[data-role=discussion-vote]").addClass("is-cast")
- else
- @$("[data-role=discussion-vote]").removeClass("is-cast")
-
- updateModelDetails: =>
- @renderVoted()
- @$("[data-role=discussion-vote] .votes-count-number").html(@model.get("votes")["up_count"])
-
- convertMath: ->
- element = @$(".post-body")
- element.html DiscussionUtil.postMathJaxProcessor DiscussionUtil.markdownWithHighlight element.html()
- MathJax.Hub.Queue ["Typeset", MathJax.Hub, element[0]]
-
renderResponses: ->
DiscussionUtil.safeAjax
url: "/courses/#{$$course_id}/discussion/forum/#{@model.get('commentable_id')}/threads/#{@model.id}"
@@ -77,50 +53,6 @@ class @DiscussionThreadView extends DiscussionContentView
is_endorsed = @$el.find(".is-endorsed").length
@model.set 'endorsed', is_endorsed
- toggleVote: (event) ->
- event.preventDefault()
- if window.user.voted(@model)
- @unvote()
- else
- @vote()
-
- toggleFollowing: (event) ->
- $elem = $(event.target)
- url = null
- console.log "follow"
- if not @model.get('subscribed')
- @model.follow()
- url = @model.urlFor("follow")
- else
- @model.unfollow()
- url = @model.urlFor("unfollow")
- DiscussionUtil.safeAjax
- $elem: $elem
- url: url
- type: "POST"
-
- vote: ->
- window.user.vote(@model)
- url = @model.urlFor("upvote")
- DiscussionUtil.safeAjax
- $elem: @$(".discussion-vote")
- url: url
- type: "POST"
- success: (response, textStatus) =>
- if textStatus == 'success'
- @model.set(response, {silent: true})
-
- unvote: ->
- window.user.unvote(@model)
- url = @model.urlFor("unvote")
- DiscussionUtil.safeAjax
- $elem: @$(".discussion-vote")
- url: url
- type: "POST"
- success: (response, textStatus) =>
- if textStatus == 'success'
- @model.set(response, {silent: true})
-
submitComment: (event) ->
event.preventDefault()
url = @model.urlFor('reply')
@@ -145,7 +77,6 @@ class @DiscussionThreadView extends DiscussionContentView
edit: ->
-
delete: (event) ->
url = @model.urlFor('delete')
if not @model.can('can_delete')
@@ -160,33 +91,3 @@ class @DiscussionThreadView extends DiscussionContentView
url: url
type: "POST"
success: (response, textStatus) =>
-
- toggleClosed: (event) ->
- $elem = $(event.target)
- url = @model.urlFor('close')
- closed = @model.get('closed')
- data = { closed: not closed }
- DiscussionUtil.safeAjax
- $elem: $elem
- url: url
- data: data
- type: "POST"
- success: (response, textStatus) =>
- @model.set('closed', not closed)
- @model.set('ability', response.ability)
-
- toggleEndorse: (event) ->
- $elem = $(event.target)
- url = @model.urlFor('endorse')
- endorsed = @model.get('endorsed')
- data = { endorsed: not endorsed }
- DiscussionUtil.safeAjax
- $elem: $elem
- url: url
- data: data
- type: "POST"
- success: (response, textStatus) =>
- @model.set('endorsed', not endorsed)
-
- highlight: (el) ->
- el.html(el.html().replace(/<mark>/g, "").replace(/<\/mark>/g, ""))
diff --git a/lms/templates/discussion/_underscore_templates.html b/lms/templates/discussion/_underscore_templates.html
index 4dd668abc5..d2b491cac8 100644
--- a/lms/templates/discussion/_underscore_templates.html
+++ b/lms/templates/discussion/_underscore_templates.html
@@ -1,41 +1,13 @@
+
+