Commit bcaeaffa by alisan617 Committed by GitHub

Merge pull request #14338 from edx/alisan/inline-discussion-sort-TNL-6117

Inline discussion sorting TNL-6117
parents 126229a5 f12dfae2
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
data.text = options.search_text; data.text = options.search_text;
break; break;
case 'commentables': case 'commentables':
url = DiscussionUtil.urlFor('search'); url = DiscussionUtil.urlFor('retrieve_discussion', options.commentable_ids);
data.commentable_ids = options.commentable_ids; data.commentable_ids = options.commentable_ids;
break; break;
case 'all': case 'all':
...@@ -107,6 +107,10 @@ ...@@ -107,6 +107,10 @@
break; break;
case 'followed': case 'followed':
url = DiscussionUtil.urlFor('followed_threads', options.user_id); url = DiscussionUtil.urlFor('followed_threads', options.user_id);
break;
case 'user':
url = DiscussionUtil.urlFor('user_profile', options.user_id);
break;
} }
if (options.group_id) { if (options.group_id) {
data.group_id = options.group_id; data.group_id = options.group_id;
......
...@@ -39,6 +39,9 @@ ...@@ -39,6 +39,9 @@
this.page = 1; this.page = 1;
} }
this.defaultSortKey = 'activity';
this.defaultSortOrder = 'desc';
// By default the view is displayed in a hidden state. If you want it to be shown by default (e.g. in Teams) // By default the view is displayed in a hidden state. If you want it to be shown by default (e.g. in Teams)
// pass showByDefault as an option. This code will open it on initialization. // pass showByDefault as an option. This code will open it on initialization.
if (this.showByDefault) { if (this.showByDefault) {
...@@ -48,7 +51,8 @@ ...@@ -48,7 +51,8 @@
loadDiscussions: function($elem, error) { loadDiscussions: function($elem, error) {
var discussionId = this.$el.data('discussion-id'), var discussionId = this.$el.data('discussion-id'),
url = DiscussionUtil.urlFor('retrieve_discussion', discussionId) + ('?page=' + this.page), url = DiscussionUtil.urlFor('retrieve_discussion', discussionId) + ('?page=' + this.page)
+ ('&sort_key=' + this.defaultSortKey) + ('&sort_order=' + this.defaultSortOrder),
self = this; self = this;
DiscussionUtil.safeAjax({ DiscussionUtil.safeAjax({
...@@ -100,8 +104,7 @@ ...@@ -100,8 +104,7 @@
this.threadListView = new DiscussionThreadListView({ this.threadListView = new DiscussionThreadListView({
el: this.$('.inline-threads'), el: this.$('.inline-threads'),
collection: self.discussion, collection: self.discussion,
courseSettings: self.course_settings, courseSettings: self.course_settings
hideRefineBar: true // TODO: re-enable the search/filter bar when it works correctly
}); });
this.threadListView.render(); this.threadListView.render();
......
...@@ -91,14 +91,13 @@ ...@@ -91,14 +91,13 @@
DiscussionThreadListView.prototype.initialize = function(options) { DiscussionThreadListView.prototype.initialize = function(options) {
var self = this; var self = this;
this.courseSettings = options.courseSettings; this.courseSettings = options.courseSettings;
this.hideRefineBar = options.hideRefineBar;
this.supportsActiveThread = options.supportsActiveThread; this.supportsActiveThread = options.supportsActiveThread;
this.hideReadState = options.hideReadState || false; this.hideReadState = options.hideReadState || false;
this.displayedCollection = new Discussion(this.collection.models, { this.displayedCollection = new Discussion(this.collection.models, {
pages: this.collection.pages pages: this.collection.pages
}); });
this.collection.on('change', this.reloadDisplayedCollection); this.collection.on('change', this.reloadDisplayedCollection);
this.discussionIds = ''; this.discussionIds = this.$el.data('discussion-id') || '';
this.collection.on('reset', function(discussion) { this.collection.on('reset', function(discussion) {
self.displayedCollection.current_page = discussion.current_page; self.displayedCollection.current_page = discussion.current_page;
self.displayedCollection.pages = discussion.pages; self.displayedCollection.pages = discussion.pages;
...@@ -109,7 +108,7 @@ ...@@ -109,7 +108,7 @@
this.sidebar_padding = 10; this.sidebar_padding = 10;
this.boardName = null; this.boardName = null;
this.current_search = ''; this.current_search = '';
this.mode = 'all'; this.mode = options.mode || 'commentables';
this.showThreadPreview = true; this.showThreadPreview = true;
this.searchAlertCollection = new Backbone.Collection([], { this.searchAlertCollection = new Backbone.Collection([], {
model: Backbone.Model model: Backbone.Model
...@@ -199,6 +198,9 @@ ...@@ -199,6 +198,9 @@
isPrivilegedUser: DiscussionUtil.isPrivilegedUser() isPrivilegedUser: DiscussionUtil.isPrivilegedUser()
}) })
); );
if (this.hideReadState) {
this.$('.forum-nav-filter-main').addClass('is-hidden');
}
this.$('.forum-nav-sort-control option').removeProp('selected'); this.$('.forum-nav-sort-control option').removeProp('selected');
this.$('.forum-nav-sort-control option[value=' + this.collection.sort_preference + ']') this.$('.forum-nav-sort-control option[value=' + this.collection.sort_preference + ']')
.prop('selected', true); .prop('selected', true);
...@@ -223,9 +225,6 @@ ...@@ -223,9 +225,6 @@
} }
this.showMetadataAccordingToSort(); this.showMetadataAccordingToSort();
this.renderMorePages(); this.renderMorePages();
if (this.hideRefineBar) {
this.$('.forum-nav-refine-bar').addClass('is-hidden');
}
this.trigger('threads:rendered'); this.trigger('threads:rendered');
}; };
...@@ -284,6 +283,9 @@ ...@@ -284,6 +283,9 @@
case 'followed': case 'followed':
options.user_id = window.user.id; options.user_id = window.user.id;
break; break;
case 'user':
options.user_id = this.$el.parent().data('user-id');
break;
case 'commentables': case 'commentables':
options.commentable_ids = this.discussionIds; options.commentable_ids = this.discussionIds;
if (this.group_id) { if (this.group_id) {
...@@ -319,6 +321,11 @@ ...@@ -319,6 +321,11 @@
gettext('Additional posts could not be loaded. Refresh the page and try again.') gettext('Additional posts could not be loaded. Refresh the page and try again.')
); );
}; };
/*
The options object is being passed to the function below from discussion/discussion.js
which correspondingly forms the ajax url based on the mode via the DiscussionUtil.urlFor
from discussion/utils.js
*/
return this.collection.retrieveAnotherPage(this.mode, options, { return this.collection.retrieveAnotherPage(this.mode, options, {
sort_key: this.$('.forum-nav-sort-control').val() sort_key: this.$('.forum-nav-sort-control').val()
}, error); }, error);
......
...@@ -364,6 +364,7 @@ ...@@ -364,6 +364,7 @@
}); });
sortControl.val(newType).change(); sortControl.val(newType).change();
expect($.ajax).toHaveBeenCalled(); expect($.ajax).toHaveBeenCalled();
expect(view.mode).toBe('commentables');
checkThreadsOrdering(view, sortOrder, newType); checkThreadsOrdering(view, sortOrder, newType);
}; };
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<article class="new-post-article is-hidden"></article> <article class="new-post-article is-hidden"></article>
<div class="inline-discussion-thread-container"> <div class="inline-discussion-thread-container">
<section class="inline-threads"> <section class="inline-threads" data-discussion-id="<%- discussionId %>">
</section> </section>
<div class="inline-thread"> <div class="inline-thread">
......
...@@ -30,6 +30,14 @@ ...@@ -30,6 +30,14 @@
return discussionBoardView; return discussionBoardView;
}; };
describe('Thread List View', function() {
it('should ensure the mode is all', function() {
var discussionBoardView = createDiscussionBoardView().render(),
threadListView = discussionBoardView.discussionThreadListView;
expect(threadListView.mode).toBe('all');
});
});
describe('Search events', function() { describe('Search events', function() {
it('perform search when enter pressed inside search textfield', function() { it('perform search when enter pressed inside search textfield', function() {
var discussionBoardView = createDiscussionBoardView(), var discussionBoardView = createDiscussionBoardView(),
......
...@@ -30,13 +30,22 @@ DiscussionSpecHelper, DiscussionUserProfileView) { ...@@ -30,13 +30,22 @@ DiscussionSpecHelper, DiscussionUserProfileView) {
describe('thread list in user profile page', function() { describe('thread list in user profile page', function() {
it('should render', function() { it('should render', function() {
var discussionUserProfileView = createDiscussionUserProfileView(), var discussionUserProfileView = createDiscussionUserProfileView().render(),
threadListView; threadListView = discussionUserProfileView.discussionThreadListView.render();
discussionUserProfileView.render();
threadListView = discussionUserProfileView.discussionThreadListView;
threadListView.render();
expect(threadListView.$('.forum-nav-thread-list').length).toBe(1); expect(threadListView.$('.forum-nav-thread-list').length).toBe(1);
}); });
it('should ensure discussion thread list view mode is all', function() {
var discussionUserProfileView = createDiscussionUserProfileView().render(),
threadListView = discussionUserProfileView.discussionThreadListView.render();
expect(threadListView.mode).toBe('user');
});
it('should not show the thread list unread unanswered filter', function() {
var discussionUserProfileView = createDiscussionUserProfileView().render(),
threadListView = discussionUserProfileView.discussionThreadListView.render();
expect(threadListView.$('.forum-nav-filter-main')).toHaveClass('is-hidden');
});
}); });
}); });
}); });
...@@ -46,7 +46,8 @@ ...@@ -46,7 +46,8 @@
collection: this.discussion, collection: this.discussion,
el: this.$('.discussion-thread-list-container'), el: this.$('.discussion-thread-list-container'),
courseSettings: this.courseSettings, courseSettings: this.courseSettings,
supportsActiveThread: true supportsActiveThread: true,
mode: this.mode
}).render(); }).render();
this.searchView = new DiscussionSearchView({ this.searchView = new DiscussionSearchView({
el: this.$('.forum-search') el: this.$('.forum-search')
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
initialize: function(options) { initialize: function(options) {
this.courseSettings = options.courseSettings; this.courseSettings = options.courseSettings;
this.discussion = options.discussion; this.discussion = options.discussion;
this.mode = 'all'; this.mode = 'user';
this.listenTo(this.model, 'change', this.render); this.listenTo(this.model, 'change', this.render);
}, },
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
collection: this.discussion, collection: this.discussion,
el: this.$('.inline-threads'), el: this.$('.inline-threads'),
courseSettings: this.courseSettings, courseSettings: this.courseSettings,
hideRefineBar: true, // TODO: re-enable the search/filter bar when it works correctly mode: this.mode,
// @TODO: On the profile page, thread read state for the viewing user is not accessible via API. // @TODO: On the profile page, thread read state for the viewing user is not accessible via API.
// Fix this when the Discussions API can support this query. Until then, hide read state. // Fix this when the Discussions API can support this query. Until then, hide read state.
hideReadState: true hideReadState: true
......
...@@ -76,6 +76,7 @@ from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_str ...@@ -76,6 +76,7 @@ from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_str
data-course-name="${course.display_name_with_default}" data-course-name="${course.display_name_with_default}"
data-threads="${threads}" data-threads="${threads}"
data-user-info="${user_info}" data-user-info="${user_info}"
data-user-id="${django_user.id}"
data-page="${page}" data-page="${page}"
data-num-pages="${num_pages}" data-num-pages="${num_pages}"
data-user-create-comment="${json.dumps(can_create_comment)}" data-user-create-comment="${json.dumps(can_create_comment)}"
......
...@@ -59,7 +59,8 @@ define([ ...@@ -59,7 +59,8 @@ define([
requests, requests,
'GET', 'GET',
interpolate( interpolate(
'/courses/%(courseID)s/discussion/forum/%(topicID)s/inline?page=1&ajax=1', '/courses/%(courseID)s/discussion/forum/%(topicID)s/inline' +
'?page=1&sort_key=activity&sort_order=desc&ajax=1',
{ {
courseID: TeamSpecHelpers.testCourseID, courseID: TeamSpecHelpers.testCourseID,
topicID: TeamSpecHelpers.testTeamDiscussionID topicID: TeamSpecHelpers.testTeamDiscussionID
......
...@@ -137,21 +137,26 @@ ...@@ -137,21 +137,26 @@
@include text-align(left); @include text-align(left);
@include float(left); @include float(left);
box-sizing: border-box; box-sizing: border-box;
display: inline-block;
width: 50%; width: 50%;
} }
.forum-nav-filter-cohort, .forum-nav-sort { .forum-nav-filter-cohort, .forum-nav-sort {
@include text-align(right); @include text-align(right);
@include float(right);
box-sizing: border-box; box-sizing: border-box;
display: inline-block; }
@media (min-width: $bp-screen-md) { .forum-nav-filter-cohort {
.discussion-board & {
@include float(right);
@include text-align(right);
width: 50%; width: 50%;
} }
} }
.forum-nav-sort {
@include float(right);
}
%forum-nav-select { %forum-nav-select {
border: none; border: none;
max-width: 100%; max-width: 100%;
......
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