Commit 2e45f2d9 by Rocky Duan

Merge branch 'feature/tomg/new-discussions' of github.com:MITx/mitx into…

Merge branch 'feature/tomg/new-discussions' of github.com:MITx/mitx into feature/tomg/new-discussions
parents 8b0e4592 78ae73cf
...@@ -162,22 +162,22 @@ def forum_form_discussion(request, course_id): ...@@ -162,22 +162,22 @@ def forum_form_discussion(request, course_id):
'discussion_data': map(utils.safe_content, threads), 'discussion_data': map(utils.safe_content, threads),
}) })
else: else:
recent_active_threads = cc.search_recent_active_threads( #recent_active_threads = cc.search_recent_active_threads(
course_id, # course_id,
recursive=False, # recursive=False,
query_params={'follower_id': request.user.id}, # query_params={'follower_id': request.user.id},
) #)
trending_tags = cc.search_trending_tags( #trending_tags = cc.search_trending_tags(
course_id, # course_id,
) #)
escapedict = {'"': '"'} escapedict = {'"': '"'}
context = { context = {
'csrf': csrf(request)['csrf_token'], 'csrf': csrf(request)['csrf_token'],
'course': course, 'course': course,
'content': content, 'content': content,
'recent_active_threads': recent_active_threads, #'recent_active_threads': recent_active_threads,
'trending_tags': trending_tags, #'trending_tags': trending_tags,
'staff_access' : has_access(request.user, course, 'staff'), 'staff_access' : has_access(request.user, course, 'staff'),
'threads': saxutils.escape(json.dumps(threads),escapedict), 'threads': saxutils.escape(json.dumps(threads),escapedict),
'user_info': saxutils.escape(json.dumps(user_info),escapedict), 'user_info': saxutils.escape(json.dumps(user_info),escapedict),
......
...@@ -5,7 +5,7 @@ if Backbone? ...@@ -5,7 +5,7 @@ if Backbone?
initialize: -> initialize: ->
@bind "add", (item) => @bind "add", (item) =>
item.discussion = @ item.discussion = @
@comparator = @sortByDate @comparator = @sortByDateRecentFirst
find: (id) -> find: (id) ->
_.first @where(id: id) _.first @where(id: id)
...@@ -19,6 +19,13 @@ if Backbone? ...@@ -19,6 +19,13 @@ if Backbone?
sortByDate: (thread) -> sortByDate: (thread) ->
thread.get("created_at") thread.get("created_at")
sortByDateRecentFirst: (thread) ->
-(new Date(thread.get("created_at")).getTime())
#return String.fromCharCode.apply(String,
# _.map(thread.get("created_at").split(""),
# ((c) -> return 0xffff - c.charChodeAt()))
#)
sortByVotes: (thread1, thread2) -> sortByVotes: (thread1, thread2) ->
thread1_count = parseInt(thread1.get("votes")['up_count']) thread1_count = parseInt(thread1.get("votes")['up_count'])
thread2_count = parseInt(thread2.get("votes")['up_count']) thread2_count = parseInt(thread2.get("votes")['up_count'])
......
...@@ -8,6 +8,7 @@ DiscussionApp = ...@@ -8,6 +8,7 @@ DiscussionApp =
threads = element.data("threads") threads = element.data("threads")
content_info = element.data("content-info") content_info = element.data("content-info")
window.user = new DiscussionUser(user_info) window.user = new DiscussionUser(user_info)
console.log content_info
Content.loadContentInfos(content_info) Content.loadContentInfos(content_info)
discussion = new Discussion(threads) discussion = new Discussion(threads)
new DiscussionRouter({discussion: discussion}) new DiscussionRouter({discussion: discussion})
......
...@@ -3,7 +3,7 @@ class @DiscussionThreadListView extends Backbone.View ...@@ -3,7 +3,7 @@ class @DiscussionThreadListView extends Backbone.View
events: events:
"click .search": "showSearch" "click .search": "showSearch"
"click .browse": "toggleTopicDrop" "click .browse": "toggleTopicDrop"
"keyup .post-search-field": "performSearch" "keydown .post-search-field": "performSearch"
"click .sort-bar a": "sortThreads" "click .sort-bar a": "sortThreads"
"click .browse-topic-drop-menu": "filterTopic" "click .browse-topic-drop-menu": "filterTopic"
"click .browse-topic-drop-search-input": "ignoreClick" "click .browse-topic-drop-search-input": "ignoreClick"
...@@ -89,7 +89,7 @@ class @DiscussionThreadListView extends Backbone.View ...@@ -89,7 +89,7 @@ class @DiscussionThreadListView extends Backbone.View
$(event.target).addClass("active") $(event.target).addClass("active")
sortBy = $(event.target).data("sort") sortBy = $(event.target).data("sort")
if sortBy == "date" if sortBy == "date"
@displayedCollection.comparator = @displayedCollection.sortByDate @displayedCollection.comparator = @displayedCollection.sortByDateRecentFirst
else if sortBy == "votes" else if sortBy == "votes"
@displayedCollection.comparator = @displayedCollection.sortByVotes @displayedCollection.comparator = @displayedCollection.sortByVotes
else if sortBy == "comments" else if sortBy == "comments"
...@@ -100,8 +100,9 @@ class @DiscussionThreadListView extends Backbone.View ...@@ -100,8 +100,9 @@ class @DiscussionThreadListView extends Backbone.View
clearTimeout(@timer) clearTimeout(@timer)
@timer = setTimeout(callback, ms) @timer = setTimeout(callback, ms)
performSearch: -> performSearch: (event) ->
callback = => if event.which == 13
event.preventDefault()
url = DiscussionUtil.urlFor("search") url = DiscussionUtil.urlFor("search")
text = @$(".post-search-field").val() text = @$(".post-search-field").val()
DiscussionUtil.safeAjax DiscussionUtil.safeAjax
...@@ -112,6 +113,4 @@ class @DiscussionThreadListView extends Backbone.View ...@@ -112,6 +113,4 @@ class @DiscussionThreadListView extends Backbone.View
success: (response, textStatus) => success: (response, textStatus) =>
if textStatus == 'success' if textStatus == 'success'
@collection.reset(response.discussion_data) @collection.reset(response.discussion_data)
@displayedCollection.reset(@collection) @displayedCollection.reset(@collection.models)
@delay(callback, 300)
...@@ -121,7 +121,7 @@ class @DiscussionThreadView extends DiscussionContentView ...@@ -121,7 +121,7 @@ class @DiscussionThreadView extends DiscussionContentView
event.preventDefault() event.preventDefault()
url = @model.urlFor('reply') url = @model.urlFor('reply')
body = @$("#wmd-input").val() body = @$("#wmd-input").val()
response = new Comment(body: body, created_at: (new Date()).toISOString(), username: window.user.get("username"), votes: { up_count: 0 }, endorsed: false) response = 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"))
@renderResponse(response) @renderResponse(response)
@addComment() @addComment()
......
...@@ -66,7 +66,7 @@ class @ThreadResponseView extends DiscussionContentView ...@@ -66,7 +66,7 @@ class @ThreadResponseView extends DiscussionContentView
body = @$(".comment-form-input").val() body = @$(".comment-form-input").val()
if not body.trim().length if not body.trim().length
return return
comment = new Comment(body: body, created_at: (new Date()).toISOString(), username: window.user.get("username")) comment = new Comment(body: body, created_at: (new Date()).toISOString(), username: window.user.get("username"), user_id: window.user.get("id"))
@renderComment(comment) @renderComment(comment)
@trigger "comment:add" @trigger "comment:add"
@$(".comment-form-input").val("") @$(".comment-form-input").val("")
......
...@@ -14,14 +14,17 @@ var $formTopicDropMenu; ...@@ -14,14 +14,17 @@ var $formTopicDropMenu;
var $postListWrapper; var $postListWrapper;
var $dropFilter; var $dropFilter;
var $topicFilter; var $topicFilter;
var $discussionBody;
var sidebarWidth; var sidebarWidth;
var sidebarHeight; var sidebarHeight;
var sidebarHeaderHeight; var sidebarHeaderHeight;
var sidebarXOffset; var sidebarXOffset;
var scrollTop; var scrollTop;
var discussionsBodyTop;
var discussionsBodyBottom;
var tooltipTimer; var tooltipTimer;
var tooltipCoords; var tooltipCoords;
var SIDEBAR_PADDING = -1; var SIDEBAR_PADDING = 10;
var SIDEBAR_HEADER_HEIGHT = 87; var SIDEBAR_HEADER_HEIGHT = 87;
...@@ -35,6 +38,7 @@ $(document).ready(function() { ...@@ -35,6 +38,7 @@ $(document).ready(function() {
$tooltip = $('<div class="tooltip"></div>'); $tooltip = $('<div class="tooltip"></div>');
$newPost = $('.new-post-article'); $newPost = $('.new-post-article');
$sidebar = $('.sidebar'); $sidebar = $('.sidebar');
$discussionBody = $('.discussion-body');
$postListWrapper = $('.post-list-wrapper'); $postListWrapper = $('.post-list-wrapper');
$formTopicDropBtn = $('.new-post-article .form-topic-drop-btn'); $formTopicDropBtn = $('.new-post-article .form-topic-drop-btn');
$formTopicDropMenu = $('.new-post-article .form-topic-drop-menu-wrapper'); $formTopicDropMenu = $('.new-post-article .form-topic-drop-menu-wrapper');
...@@ -61,23 +65,69 @@ $(document).ready(function() { ...@@ -61,23 +65,69 @@ $(document).ready(function() {
'click': hideTooltip 'click': hideTooltip
}); });
//$body.delegate('.browse-topic-drop-btn', 'click', showTopicDrop); $body.delegate('.browse-topic-drop-search-input, .form-topic-drop-search-input', 'keyup', filterDrop);
//$body.delegate('.browse-topic-drop-search-input', 'keyup', filterDrop);
$body.delegate('.form-topic-drop-search-input', 'keyup', filterDrop);
//$body.delegate('.browse-topic-drop-menu-wrapper', 'click', setTopic);
$(window).bind('resize', updateSidebarDimensions); $(window).bind('resize', updateSidebar);
$(window).bind('scroll', updateSidebarCoordinates); $(window).bind('scroll', updateSidebar);
updateSidebarCoordinates(); $('.discussion-column').bind("input", function (e) {
updateSidebarDimensions(); console.log("resized");
updateSidebar();
})
updateSidebar();
}); });
function filterDrop(e) { function filterDrop(e) {
/*
* multiple queries
*/
// var $drop = $(e.target).parents('.form-topic-drop-menu-wrapper, .browse-topic-drop-menu-wrapper');
// var queries = $(this).val().split(' ');
// var $items = $drop.find('a');
// if(queries.length == 0) {
// $items.show();
// return;
// }
// $items.hide();
// $items.each(function(i) {
// var thisText = $(this).children().not('.unread').text();
// $(this).parents('ul').siblings('a').not('.unread').each(function(i) {
// thisText = thisText + ' ' + $(this).text();
// });
// var test = true;
// var terms = thisText.split(' ');
// for(var i = 0; i < queries.length; i++) {
// if(thisText.toLowerCase().search(queries[i].toLowerCase()) == -1) {
// test = false;
// }
// }
// if(test) {
// $(this).show();
// // show children
// $(this).parent().find('a').show();
// // show parents
// $(this).parents('ul').siblings('a').show();
// }
// });
/*
* single query
*/
var $drop = $(e.target).parents('.form-topic-drop-menu-wrapper, .browse-topic-drop-menu-wrapper'); var $drop = $(e.target).parents('.form-topic-drop-menu-wrapper, .browse-topic-drop-menu-wrapper');
var queries = $(this).val().split(' '); var query = $(this).val();
var $items = $drop.find('a'); var $items = $drop.find('a');
if(queries.length == 0) { if(query.length == 0) {
$items.show(); $items.show();
return; return;
} }
...@@ -92,10 +142,8 @@ function filterDrop(e) { ...@@ -92,10 +142,8 @@ function filterDrop(e) {
var test = true; var test = true;
var terms = thisText.split(' '); var terms = thisText.split(' ');
for(var i = 0; i < queries.length; i++) { if(thisText.toLowerCase().search(query.toLowerCase()) == -1) {
if(thisText.toLowerCase().search(queries[i].toLowerCase()) == -1) { test = false;
test = false;
}
} }
if(test) { if(test) {
...@@ -272,92 +320,37 @@ function setFormTopic(e) { ...@@ -272,92 +320,37 @@ function setFormTopic(e) {
$formTopicDropBtn.html(boardName + ' <span class="drop-arrow">▾</span>'); $formTopicDropBtn.html(boardName + ' <span class="drop-arrow">▾</span>');
} }
//function updateSidebarCoordinates(e) { function updateSidebar(e) {
// scrollTop = $(window).scrollTop(); // determine page scroll attributes
// sidebarXOffset = $('.discussion-column').offset().top; scrollTop = $(window).scrollTop();
// discussionsBodyTop = $discussionBody.offset().top;
// var marginTop = scrollTop + SIDEBAR_PADDING > sidebarXOffset ? scrollTop + SIDEBAR_PADDING - sidebarXOffset : 0; discussionsBodyBottom = discussionsBodyTop + $discussionBody.height();
// var windowHeight = $(window).height();
// var discussionColumnHeight = $('.discussion-column').height();
// marginTop = marginTop + sidebarHeight > discussionColumnHeight ? discussionColumnHeight - sidebarHeight + 2 : marginTop; // toggle fixed positioning
// if(scrollTop > discussionsBodyTop - SIDEBAR_PADDING) {
// $sidebar.css('margin-top', marginTop); $sidebar.addClass('fixed');
// updateSidebarDimensions(); $sidebar.css('top', SIDEBAR_PADDING + 'px');
//} } else {
// $sidebar.removeClass('fixed');
//function updateSidebarDimensions(e) { $sidebar.css('top', '0');
// sidebarWidth = $sidebar.width(); }
//
// var visibleHeader = sidebarXOffset - scrollTop > 0 ? sidebarXOffset - scrollTop : 0;
// sidebarHeight = $(window).height() - (visibleHeader + SIDEBAR_PADDING * 2);
// sidebarHeight = sidebarHeight > 500 ? sidebarHeight : 500;
//
// var titleWidth = sidebarWidth - 115;
//
// $sidebar.css('height', sidebarHeight + 'px');
//
// if(!$postListWrapper[0]) {
// $postListWrapper = $('.post-list-wrapper');
// }
//
// $postListWrapper.css('height', (sidebarHeight - SIDEBAR_HEADER_HEIGHT - 4) + 'px');
// $sidebarWidthStyles.html('.discussion-body .post-list a .title { width: ' + titleWidth + 'px !important; }');
//}
function updateSidebarCoordinates(e) {
if (!$('.sidebar').attr('data-top')){
if ($('.sidebar').hasClass('fixed')){
return;
}
var offset = $('.sidebar').offset();
$('.sidebar').attr('data-top', offset.top);
}
$('.sidebar').css('width', .32 * $('.discussion-body').width() + 'px');
scrollTop = $(window).scrollTop();
offset = $('.sidebar').attr('data-top');
if ((offset <= scrollTop)){
$('.sidebar').addClass('fixed');
$('.discussion-column').addClass('sidebar-fixed');
}else{
$('.sidebar').removeClass('fixed');
$('.discussion-column').removeClass('sidebar-fixed');
}
discussionColumnHeight = $('.discussion-column').outerHeight();
discussionColumnBottom = $('.discussion-column').offset().top + discussionColumnHeight;
windowHeight = $(window).height();
if((discussionColumnBottom - scrollTop) < windowHeight){
//difference = minHeight - (discussionColumnBottom - scrollTop);
//$('.sidebar').height(minHeight);
//console.log(minHeight);
//$('.sidebar').css('top', -difference);
//$('.post-list-wrapper').height(minHeight - SIDEBAR_HEADER_HEIGHT - 4);
$('.sidebar').removeClass('fixed');
$('.discussion-column').removeClass('sidebar-fixed');
}
updateSidebarDimensions();
}
function updateSidebarDimensions(e) { // set sidebar width
var sidebarWidth = .32 * $discussionBody.width() - 10;
$sidebar.css('width', sidebarWidth + 'px');
discussionColumnHeight = $('.discussion-column').outerHeight(); // show the entire sidebar at all times
discussionColumnBottom = $('.discussion-column').offset().top + discussionColumnHeight; var sidebarHeight = windowHeight - (scrollTop < discussionsBodyTop - SIDEBAR_PADDING ? discussionsBodyTop - scrollTop : SIDEBAR_PADDING) - SIDEBAR_PADDING - (scrollTop + windowHeight > discussionsBodyBottom + SIDEBAR_PADDING ? scrollTop + windowHeight - discussionsBodyBottom - SIDEBAR_PADDING : 0);
windowHeight = $(window).height(); $sidebar.css('height', sidebarHeight > 400 ? sidebarHeight : 400 + 'px');
sidebarHeight = Math.min(windowHeight, discussionColumnHeight);
$('.sidebar').height(sidebarHeight);
$('.post-list-wrapper').height(sidebarHeight - SIDEBAR_HEADER_HEIGHT - 4);
$('.sidebar').css('width', .32 * $('.discussion-body').width() + 'px');
//$('.sidebar').height(discussionColumnBottom - scrollTop); // update the list height
//$('.post-list-wrapper').height(discussionColumnBottom - scrollTop - SIDEBAR_HEADER_HEIGHT - 4); if(!$postListWrapper[0]) {
$postListWrapper = $('.post-list-wrapper');
}
$postListWrapper.css('height', (sidebarHeight - SIDEBAR_HEADER_HEIGHT - 4) + 'px');
if((discussionColumnBottom - scrollTop) < windowHeight){ // update title wrappers
$('.sidebar').height(discussionColumnHeight); var titleWidth = sidebarWidth - 115;
$('.post-list-wrapper').height(discussionColumnHeight - SIDEBAR_HEADER_HEIGHT - 4); $sidebarWidthStyles.html('.discussion-body .post-list a .title { width: ' + titleWidth + 'px !important; }');
}
} }
...@@ -555,10 +555,9 @@ body.discussion { ...@@ -555,10 +555,9 @@ body.discussion {
width: 32%; width: 32%;
height: 550px; height: 550px;
border: 1px solid #aaa; border: 1px solid #aaa;
border-right: none !important;
box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
background: #f6f6f6; background: #f6f6f6;
border-radius: 3px 0 0 3px; border-radius: 3px;
border-right: 1px solid #bcbcbc; border-right: 1px solid #bcbcbc;
&.fixed { &.fixed {
...@@ -638,6 +637,7 @@ body.discussion { ...@@ -638,6 +637,7 @@ body.discussion {
.search { .search {
cursor: pointer; cursor: pointer;
border-radius: 0 3px 0 0;
&.is-open { &.is-open {
cursor: auto; cursor: auto;
...@@ -1024,10 +1024,10 @@ body.discussion { ...@@ -1024,10 +1024,10 @@ body.discussion {
.discussion-column { .discussion-column {
float: left; float: right;
@include box-sizing(border-box); @include box-sizing(border-box);
border: 1px solid #aaa; border: 1px solid #aaa;
border-radius: 0 3px 3px 0; border-radius: 3px;
background: #fff; background: #fff;
box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
width: 68%; width: 68%;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment