From aa7af4e6fe6b8e397eda47fa6dc8280184818324 Mon Sep 17 00:00:00 2001 From: Arjun Singh Date: Mon, 10 Sep 2012 11:40:52 -0700 Subject: [PATCH] Make thread view with subview work --- .../views/discussion_thread_show_view.coffee | 151 ++++++++++++++++++ .../views/discussion_thread_view.coffee | 119 ++------------ .../discussion/_underscore_templates.html | 66 ++++---- 3 files changed, 196 insertions(+), 140 deletions(-) create mode 100644 lms/static/coffee/src/discussion/views/discussion_thread_show_view.coffee 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 @@ + +