diff --git a/common/static/coffee/spec/discussion/view/discussion_thread_list_view_spec.coffee b/common/static/coffee/spec/discussion/view/discussion_thread_list_view_spec.coffee
index 2c8a0a1afe..7db88fb7af 100644
--- a/common/static/coffee/spec/discussion/view/discussion_thread_list_view_spec.coffee
+++ b/common/static/coffee/spec/discussion/view/discussion_thread_list_view_spec.coffee
@@ -137,13 +137,21 @@ describe "DiscussionThreadListView", ->
-
+
+
+ Show all
+ Unread
+ Unanswered
+ Flagged
+
+
+
by recent activity
by most activity
by most votes
-
+
@@ -201,6 +209,31 @@ describe "DiscussionThreadListView", ->
collection: discussion
)
+ expectFilter = (filterVal) ->
+ $.ajax.andCallFake((params) ->
+ _.each(["unread", "unanswered", "flagged"], (paramName)->
+ if paramName == filterVal
+ expect(params.data[paramName]).toEqual(true)
+ else
+ expect(params.data[paramName]).toBeUndefined()
+ )
+ {always: ->}
+ )
+
+ describe "should filter correctly", ->
+ _.each(["all", "unread", "unanswered", "flagged"], (filterVal) ->
+ it "for #{filterVal}", ->
+ expectFilter(filterVal)
+ @view.$(".forum-nav-filter-main-control").val(filterVal).change()
+ expect($.ajax).toHaveBeenCalled()
+ )
+
+ it "search should clear filter", ->
+ expectFilter(null)
+ @view.$(".forum-nav-filter-main-control").val("flagged")
+ @view.searchFor("foobar")
+ expect(@view.$(".forum-nav-filter-main-control").val()).toEqual("all")
+
checkThreadsOrdering = (view, sort_order, type) ->
expect(view.$el.find(".forum-nav-thread").children().length).toEqual(3)
expect(view.$el.find(".forum-nav-thread:nth-child(1) .forum-nav-thread-title").text()).toEqual(sort_order[0])
diff --git a/common/static/coffee/src/discussion/discussion.coffee b/common/static/coffee/src/discussion/discussion.coffee
index 8b6162f54b..6a6bdbb932 100644
--- a/common/static/coffee/src/discussion/discussion.coffee
+++ b/common/static/coffee/src/discussion/discussion.coffee
@@ -34,6 +34,8 @@ if Backbone?
retrieveAnotherPage: (mode, options={}, sort_options={}, error=null)->
data = { page: @current_page + 1 }
+ if _.contains(["unread", "unanswered", "flagged"], options.filter)
+ data[options.filter] = true
switch mode
when 'search'
url = DiscussionUtil.urlFor 'search'
diff --git a/common/static/coffee/src/discussion/views/discussion_thread_list_view.coffee b/common/static/coffee/src/discussion/views/discussion_thread_list_view.coffee
index a271cc99bc..fd8ee0081d 100644
--- a/common/static/coffee/src/discussion/views/discussion_thread_list_view.coffee
+++ b/common/static/coffee/src/discussion/views/discussion_thread_list_view.coffee
@@ -10,6 +10,7 @@ if Backbone?
"change .forum-nav-sort-control": "sortThreads"
"click .forum-nav-thread-link": "threadSelected"
"click .forum-nav-load-more-link": "loadMorePages"
+ "change .forum-nav-filter-main-control": "chooseFilter"
"change .forum-nav-filter-cohort-control": "chooseCohort"
initialize: ->
@@ -173,7 +174,7 @@ if Backbone?
loadingElem = loadMoreElem.find(".forum-nav-loading")
DiscussionUtil.makeFocusTrap(loadingElem)
loadingElem.focus()
- options = {}
+ options = {filter: @filter}
switch @mode
when 'search'
options.search_text = @current_search
@@ -378,11 +379,13 @@ if Backbone?
@retrieveDiscussions(discussionIds)
@$(".forum-nav-filter-cohort").toggle(item.data('cohorted') == true)
- chooseCohort: (event) ->
+ chooseFilter: (event) =>
+ @filter = $(".forum-nav-filter-main-control :selected").val()
+ @retrieveFirstPage()
+
+ chooseCohort: (event) =>
@group_id = @$('.forum-nav-filter-cohort-control :selected').val()
- @collection.current_page = 0
- @collection.reset()
- @loadMorePages(event)
+ @retrieveFirstPage()
retrieveDiscussion: (discussion_id, callback=null) ->
url = DiscussionUtil.urlFor("retrieve_discussion", discussion_id)
@@ -434,6 +437,7 @@ if Backbone?
searchFor: (text) ->
@clearSearchAlerts()
+ @clearFilters()
@mode = 'search'
@current_search = text
url = DiscussionUtil.urlFor("search")
@@ -500,6 +504,10 @@ if Backbone?
@$(".forum-nav-search-input").val("")
@current_search = ""
+ clearFilters: ->
+ @$(".forum-nav-filter-main-control").val("all")
+ @$(".forum-nav-filter-cohort-control").val("all")
+
retrieveFollowed: () =>
@mode = 'followed'
@retrieveFirstPage()
diff --git a/lms/djangoapps/django_comment_client/forum/views.py b/lms/djangoapps/django_comment_client/forum/views.py
index 8cef0b6ea8..17a276d31e 100644
--- a/lms/djangoapps/django_comment_client/forum/views.py
+++ b/lms/djangoapps/django_comment_client/forum/views.py
@@ -103,11 +103,24 @@ def get_threads(request, course_id, discussion_id=None, per_page=THREADS_PER_PAG
#so by default, a moderator sees all items, and a student sees his cohort
- query_params = merge_dict(default_query_params,
- strip_none(extract(request.GET,
- ['page', 'sort_key',
- 'sort_order', 'text',
- 'commentable_ids', 'flagged'])))
+ query_params = merge_dict(
+ default_query_params,
+ strip_none(
+ extract(
+ request.GET,
+ [
+ 'page',
+ 'sort_key',
+ 'sort_order',
+ 'text',
+ 'commentable_ids',
+ 'flagged',
+ 'unread',
+ 'unanswered',
+ ]
+ )
+ )
+ )
threads, page, num_pages, corrected_text = cc.Thread.search(query_params)
@@ -368,13 +381,30 @@ def followed_threads(request, course_id, user_id):
try:
profiled_user = cc.User(id=user_id, course_id=course_id)
- query_params = {
- 'page': request.GET.get('page', 1),
+ default_query_params = {
+ 'page': 1,
'per_page': THREADS_PER_PAGE, # more than threads_per_page to show more activities
- 'sort_key': request.GET.get('sort_key', 'date'),
- 'sort_order': request.GET.get('sort_order', 'desc'),
+ 'sort_key': 'date',
+ 'sort_order': 'desc',
}
+ query_params = merge_dict(
+ default_query_params,
+ strip_none(
+ extract(
+ request.GET,
+ [
+ 'page',
+ 'sort_key',
+ 'sort_order',
+ 'flagged',
+ 'unread',
+ 'unanswered',
+ ]
+ )
+ )
+ )
+
threads, page, num_pages = profiled_user.subscribed_threads(query_params)
query_params['page'] = page
query_params['num_pages'] = num_pages
diff --git a/lms/static/sass/discussion/elements/_navigation.scss b/lms/static/sass/discussion/elements/_navigation.scss
index d7b8a81674..24ca8aa083 100644
--- a/lms/static/sass/discussion/elements/_navigation.scss
+++ b/lms/static/sass/discussion/elements/_navigation.scss
@@ -127,23 +127,37 @@
background-color: $gray-l5;
padding: ($baseline/4) ($baseline/2);
color: $black;
+ text-align: right;
+}
+
+.forum-nav-filter-main {
+ @include box-sizing(border-box);
+ display: inline-block;
+ width: 50%;
+ text-align: left;
+}
+
+.forum-nav-filter-cohort, .forum-nav-sort {
+ @include box-sizing(border-box);
+ display: inline-block;
+ width: 50%;
+ text-align: right;
}
%forum-nav-select {
border: none;
max-width: 100%;
background-color: transparent;
- font: inherit;
+}
+
+.forum-nav-filter-main-control {
+ @extend %forum-nav-select;
}
.forum-nav-filter-cohort-control {
@extend %forum-nav-select;
}
-.forum-nav-sort {
- float: right;
-}
-
.forum-nav-sort-control {
@extend %forum-nav-select;
}
diff --git a/lms/static/sass/discussion/utilities/_shame.scss b/lms/static/sass/discussion/utilities/_shame.scss
index 2e92cccc8b..83e1bfc17d 100644
--- a/lms/static/sass/discussion/utilities/_shame.scss
+++ b/lms/static/sass/discussion/utilities/_shame.scss
@@ -66,9 +66,16 @@
// navigation - sort and filter bar
// --------------------------------
-// Override global span rules
-.forum-nav-sort-label {
- color: inherit;
+// Override global label rules
+.forum-nav-filter-main, .forum-nav-filter-cohort, .forum-nav-sort {
+ font: inherit;
+ line-height: 1em;
+ margin-bottom: 0;
+}
+
+// Override global select rules
+.forum-nav-filter-main-control, .forum-nav-filter-cohort-control, .forum-nav-sort-control {
+ font: inherit;
}
// --------------------------------
diff --git a/lms/templates/discussion/_thread_list_template.html b/lms/templates/discussion/_thread_list_template.html
index 2dac6167e8..66ef69120f 100644
--- a/lms/templates/discussion/_thread_list_template.html
+++ b/lms/templates/discussion/_thread_list_template.html
@@ -20,18 +20,41 @@
<%include file="_filter_dropdown.html" />
+
+ ## Translators: This labels a filter menu in forum navigation
+ ${_("Filter:")}
+
+ ## Translators: This is a menu option for showing all forum threads unfiltered
+ ${_("Show all")}
+ ## Translators: This is a menu option for showing only unread forum threads
+ ${_("Unread")}
+ ## Translators: This is a menu option for showing only unanswered forum
+ ## question threads
+ ${_("Unanswered")}
+ %if flag_moderator:
+ ## Translators: This is a menu option for showing only forum threads flagged
+ ## for abuse
+ ${_("Flagged")}
+ %endif
+
+ \
%if is_course_cohorted and is_moderator:
-
+## Lack of indentation is intentional to avoid whitespace between this and siblings
+
+ ## Translators: This labels a cohort menu in forum navigation
+ ${_("Cohort:")}
- ${_("View all cohorts")}
+ ${_("in all cohorts")}
%for c in cohorts:
- ${_("View as {cohort_name}").format(cohort_name=c['name'])}
+ ${c['name']}
%endfor
-
+ \
%endif
-
-
+## Lack of indentation is intentional to avoid whitespace between this and siblings
+
+ ## Translators: This labels a sort menu in forum navigation
+ ${_("Sort:")}
## Translators: This is a menu option for sorting forum threads
${_("by recent activity")}
@@ -40,7 +63,7 @@
## Translators: This is a menu option for sorting forum threads
${_("by most votes")}
-
+