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 @@ + +