Commit f12dfae2 by alisan617

inline discussion component filtering and sorting

TNL-6117
parent 78d13364
......@@ -99,7 +99,7 @@
data.text = options.search_text;
break;
case 'commentables':
url = DiscussionUtil.urlFor('search');
url = DiscussionUtil.urlFor('retrieve_discussion', options.commentable_ids);
data.commentable_ids = options.commentable_ids;
break;
case 'all':
......@@ -107,6 +107,10 @@
break;
case 'followed':
url = DiscussionUtil.urlFor('followed_threads', options.user_id);
break;
case 'user':
url = DiscussionUtil.urlFor('user_profile', options.user_id);
break;
}
if (options.group_id) {
data.group_id = options.group_id;
......
......@@ -39,6 +39,9 @@
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)
// pass showByDefault as an option. This code will open it on initialization.
if (this.showByDefault) {
......@@ -48,7 +51,8 @@
loadDiscussions: function($elem, error) {
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;
DiscussionUtil.safeAjax({
......@@ -100,8 +104,7 @@
this.threadListView = new DiscussionThreadListView({
el: this.$('.inline-threads'),
collection: self.discussion,
courseSettings: self.course_settings,
hideRefineBar: true // TODO: re-enable the search/filter bar when it works correctly
courseSettings: self.course_settings
});
this.threadListView.render();
......
......@@ -91,14 +91,13 @@
DiscussionThreadListView.prototype.initialize = function(options) {
var self = this;
this.courseSettings = options.courseSettings;
this.hideRefineBar = options.hideRefineBar;
this.supportsActiveThread = options.supportsActiveThread;
this.hideReadState = options.hideReadState || false;
this.displayedCollection = new Discussion(this.collection.models, {
pages: this.collection.pages
});
this.collection.on('change', this.reloadDisplayedCollection);
this.discussionIds = '';
this.discussionIds = this.$el.data('discussion-id') || '';
this.collection.on('reset', function(discussion) {
self.displayedCollection.current_page = discussion.current_page;
self.displayedCollection.pages = discussion.pages;
......@@ -109,7 +108,7 @@
this.sidebar_padding = 10;
this.boardName = null;
this.current_search = '';
this.mode = 'all';
this.mode = options.mode || 'commentables';
this.showThreadPreview = true;
this.searchAlertCollection = new Backbone.Collection([], {
model: Backbone.Model
......@@ -199,6 +198,9 @@
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[value=' + this.collection.sort_preference + ']')
.prop('selected', true);
......@@ -223,9 +225,6 @@
}
this.showMetadataAccordingToSort();
this.renderMorePages();
if (this.hideRefineBar) {
this.$('.forum-nav-refine-bar').addClass('is-hidden');
}
this.trigger('threads:rendered');
};
......@@ -284,6 +283,9 @@
case 'followed':
options.user_id = window.user.id;
break;
case 'user':
options.user_id = this.$el.parent().data('user-id');
break;
case 'commentables':
options.commentable_ids = this.discussionIds;
if (this.group_id) {
......@@ -319,6 +321,11 @@
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, {
sort_key: this.$('.forum-nav-sort-control').val()
}, error);
......
......@@ -364,6 +364,7 @@
});
sortControl.val(newType).change();
expect($.ajax).toHaveBeenCalled();
expect(view.mode).toBe('commentables');
checkThreadsOrdering(view, sortOrder, newType);
};
......
......@@ -6,7 +6,7 @@
<article class="new-post-article is-hidden"></article>
<div class="inline-discussion-thread-container">
<section class="inline-threads">
<section class="inline-threads" data-discussion-id="<%- discussionId %>">
</section>
<div class="inline-thread">
......
......@@ -30,6 +30,14 @@
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() {
it('perform search when enter pressed inside search textfield', function() {
var discussionBoardView = createDiscussionBoardView(),
......
......@@ -30,13 +30,22 @@ DiscussionSpecHelper, DiscussionUserProfileView) {
describe('thread list in user profile page', function() {
it('should render', function() {
var discussionUserProfileView = createDiscussionUserProfileView(),
threadListView;
discussionUserProfileView.render();
threadListView = discussionUserProfileView.discussionThreadListView;
threadListView.render();
var discussionUserProfileView = createDiscussionUserProfileView().render(),
threadListView = discussionUserProfileView.discussionThreadListView.render();
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 @@
collection: this.discussion,
el: this.$('.discussion-thread-list-container'),
courseSettings: this.courseSettings,
supportsActiveThread: true
supportsActiveThread: true,
mode: this.mode
}).render();
this.searchView = new DiscussionSearchView({
el: this.$('.forum-search')
......
......@@ -26,7 +26,7 @@
initialize: function(options) {
this.courseSettings = options.courseSettings;
this.discussion = options.discussion;
this.mode = 'all';
this.mode = 'user';
this.listenTo(this.model, 'change', this.render);
},
......@@ -39,7 +39,7 @@
collection: this.discussion,
el: this.$('.inline-threads'),
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.
// Fix this when the Discussions API can support this query. Until then, hide read state.
hideReadState: true
......
......@@ -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-threads="${threads}"
data-user-info="${user_info}"
data-user-id="${django_user.id}"
data-page="${page}"
data-num-pages="${num_pages}"
data-user-create-comment="${json.dumps(can_create_comment)}"
......
......@@ -59,7 +59,8 @@ define([
requests,
'GET',
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,
topicID: TeamSpecHelpers.testTeamDiscussionID
......
......@@ -137,21 +137,26 @@
@include text-align(left);
@include float(left);
box-sizing: border-box;
display: inline-block;
width: 50%;
}
.forum-nav-filter-cohort, .forum-nav-sort {
@include text-align(right);
@include float(right);
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%;
}
}
.forum-nav-sort {
@include float(right);
}
%forum-nav-select {
border: none;
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