diff --git a/lms/djangoapps/django_comment_client/forum/views.py b/lms/djangoapps/django_comment_client/forum/views.py
index e77e11066b..afbd39e6fe 100644
--- a/lms/djangoapps/django_comment_client/forum/views.py
+++ b/lms/djangoapps/django_comment_client/forum/views.py
@@ -1,3 +1,6 @@
+import json
+import logging
+
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
from django.http import HttpResponse, Http404
@@ -15,7 +18,6 @@ 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, strip_blank, get_courseware_context
-import json
import django_comment_client.utils as utils
import comment_client as cc
import xml.sax.saxutils as saxutils
@@ -24,6 +26,7 @@ THREADS_PER_PAGE = 200
INLINE_THREADS_PER_PAGE = 5
PAGES_NEARBY_DELTA = 2
+log = logging.getLogger("edx.discussions")
def _general_discussion_id(course_id):
return course_id.replace('/', '_').replace('.', '_')
diff --git a/lms/static/coffee/src/discussion/views/discussion_thread_edit_view.coffee b/lms/static/coffee/src/discussion/views/discussion_thread_edit_view.coffee
new file mode 100644
index 0000000000..f6dc2c39bc
--- /dev/null
+++ b/lms/static/coffee/src/discussion/views/discussion_thread_edit_view.coffee
@@ -0,0 +1,26 @@
+class @DiscussionThreadEditView extends Backbone.View
+
+ events:
+ "click .post-update": "update"
+ "click .post-cancel": "cancel_edit"
+
+ template: _.template($("#thread-edit-template").html())
+
+ $: (selector) ->
+ @$el.find(selector)
+
+ initialize: ->
+ super()
+
+ render: ->
+ @$el.html(@template(@model.toJSON()))
+ @delegateEvents()
+ DiscussionUtil.makeWmdEditor @$el, $.proxy(@$, @), "edit-post-body"
+ @$(".edit-post-tags").tagsInput DiscussionUtil.tagsInputOptions()
+ @
+
+ update: (event) ->
+ @trigger "thread:update", event
+
+ cancel_edit: (event) ->
+ @trigger "thread:cancel_edit", event
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
index cd164f2689..61bb3c29d7 100644
--- a/lms/static/coffee/src/discussion/views/discussion_thread_show_view.coffee
+++ b/lms/static/coffee/src/discussion/views/discussion_thread_show_view.coffee
@@ -57,7 +57,6 @@ class @DiscussionThreadShowView extends DiscussionContentView
toggleFollowing: (event) ->
$elem = $(event.target)
url = null
- console.log "follow"
if not @model.get('subscribed')
@model.follow()
url = @model.urlFor("follow")
@@ -113,12 +112,11 @@ class @DiscussionThreadShowView extends DiscussionContentView
comment.updateInfo(data.annotated_content_info)
comment.set(data.content)
- edit: ->
- @trigger "thread:edit"
- window.showView = @
+ edit: (event) ->
+ @trigger "thread:edit", event
delete: (event) ->
- @trigger "thread:delete"
+ @trigger "thread:delete", event
toggleClosed: (event) ->
$elem = $(event.target)
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 8bb207da2b..2b3630e7df 100644
--- a/lms/static/coffee/src/discussion/views/discussion_thread_view.coffee
+++ b/lms/static/coffee/src/discussion/views/discussion_thread_view.coffee
@@ -11,18 +11,13 @@ if Backbone?
initialize: ->
super()
- @showView = new DiscussionThreadShowView(model: @model)
- @showView.bind "thread:delete", @delete
- @showView.bind "thread:edit", @edit
+ @createShowView()
render: ->
@$el.html(@template(@model.toJSON()))
@delegateEvents()
- @showView.setElement(@$('.thread-content-wrapper'))
- @showView.render()
- @showView.delegateEvents()
-
+ @renderShowView()
@renderAttrs()
@$("span.timeago").timeago()
@makeWmdEditor "reply-body"
@@ -76,15 +71,94 @@ if Backbone?
comment.updateInfo(data.annotated_content_info)
comment.set(data.content)
- edit: ->
+ edit: (event) =>
+ @createEditView()
+ @renderEditView()
- delete: (event) ->
+ update: (event) =>
+
+ newTitle = @editView.$(".edit-post-title").val()
+ newTags = @editView.$(".edit-post-tags").val()
+ newBody = @editView.$(".edit-post-body textarea").val()
+
+ url = DiscussionUtil.urlFor('update_thread', @model.id)
+
+ DiscussionUtil.safeAjax
+ $elem: $(event.target)
+ $loading: $(event.target) if event
+ url: url
+ type: "POST"
+ dataType: 'json'
+ async: false # TODO when the rest of the stuff below is made to work properly..
+ data:
+ title: newTitle
+ body: newBody
+ tags: newTags
+ error: DiscussionUtil.formErrorHandler(@$(".edit-post-form-errors"))
+ success: (response, textStatus) =>
+
+ # TODO: Move this out of the callback, this makes it feel sluggish
+
+ @editView.$(".edit-post-title").val("").attr("prev-text", "")
+ @editView.$(".edit-post-body textarea").val("").attr("prev-text", "")
+ @editView.$(".edit-post-tags").val("")
+ @editView.$(".edit-post-tags").importTags("")
+ @editView.$(".wmd-preview p").html("")
+
+ @model.set
+ title: newTitle
+ body: newBody
+ tags: newTags
+
+ @createShowView()
+ @renderShowView()
+
+ createEditView: () ->
+
+ if @showView?
+ @showView.undelegateEvents()
+ @showView.$el.empty()
+ @showView = null
+
+ @editView = new DiscussionThreadEditView(model: @model)
+ @editView.bind "thread:update", @update
+ @editView.bind "thread:cancel_edit", @cancelEdit
+
+ renderEditView: () ->
+ @editView.setElement(@$('.thread-content-wrapper'))
+ @editView.render()
+ @editView.delegateEvents()
+
+ createShowView: () ->
+
+ if @editView?
+ @editView.undelegateEvents()
+ @editView.$el.empty()
+ @editView = null
+
+ @showView = new DiscussionThreadShowView(model: @model)
+ @showView.bind "thread:delete", @delete
+ @showView.bind "thread:edit", @edit
+
+ renderShowView: () ->
+ @showView.setElement(@$('.thread-content-wrapper'))
+ @showView.render()
+ @showView.delegateEvents()
+
+ cancelEdit: (event) =>
+ @createShowView()
+ @renderShowView()
+
+
+ delete: (event) =>
url = @model.urlFor('delete')
if not @model.can('can_delete')
return
if not confirm "Are you sure to delete thread \"#{@model.get('title')}\"?"
return
@model.remove()
+ @showView.undelegateEvents()
+ @undelegateEvents()
@$el.empty()
$elem = $(event.target)
DiscussionUtil.safeAjax
diff --git a/lms/static/sass/_discussion.scss b/lms/static/sass/_discussion.scss
index 1201ebad88..c2278fe968 100644
--- a/lms/static/sass/_discussion.scss
+++ b/lms/static/sass/_discussion.scss
@@ -270,6 +270,46 @@ body.discussion {
}
}
+ .edit-post-form {
+ width: 100%;
+ margin-bottom: 20px;
+ @include clearfix;
+ .post-cancel {
+ @include white-button;
+ border-color: #444;
+ float: left;
+ margin: 10px 0 0 15px;
+ }
+
+ .post-update {
+
+ @include blue-button;
+ float: left;
+ height: 37px;
+ margin-top: 10px;
+ border-color: #333;
+ padding-bottom: 2px;
+
+ &:hover {
+ border-color: #222;
+ }
+ }
+
+ .edit-post-title, .edit-post-tags {
+ width: 100%;
+ height: 40px;
+ padding: 0 10px;
+ box-sizing: border-box;
+ border-radius: 3px;
+ border: 1px solid #333;
+ font-size: 16px;
+ font-family: 'Open Sans', sans-serif;
+ color: #333;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3) inset;
+ }
+
+ }
+
.new-post-form {
width: 100%;
margin-bottom: 20px;
@@ -369,14 +409,6 @@ body.discussion {
&:hover {
border-color: #222;
}
-
- .author-moderator:after{
- content: " (moderator)"
- }
-
- .author-administrator:after{
- content: " (instructor)"
- }
}
.new-post-cancel {
diff --git a/lms/templates/discussion/_underscore_templates.html b/lms/templates/discussion/_underscore_templates.html
index d2b491cac8..17837494db 100644
--- a/lms/templates/discussion/_underscore_templates.html
+++ b/lms/templates/discussion/_underscore_templates.html
@@ -50,6 +50,26 @@
+
+