Skip to content

Commit 4ef82f9

Browse files
author
Dan Minkevitch
committed
Reorder course sort by newest terms
Fixes CNVS-32660 Test Plan: * As an admin with multiple courses in various terms across different dates * Go to any course * Go to that course's settings * Click "Import content into this course" * Select "Copy a Canvas Course" * The dropdown that appears should be prefilled with courses in order from newest to oldest terms, then alphabetically by course Change-Id: I11d5af9da3dd6f779b816d7fd0f43b79afa8dc35 Reviewed-on: https://gerrit.instructure.com/95564 Tested-by: Jenkins Reviewed-by: Clay Diffrient <cdiffrient@instructure.com> QA-Review: Deepeeca Soundarrajan <dsoundarrajan@instructure.com> Product-Review: Chris Ward <cward@instructure.com>
1 parent 8ad743f commit 4ef82f9

3 files changed

Lines changed: 85 additions & 12 deletions

File tree

app/coffeescripts/views/content_migrations/subviews/CourseFindSelectView.coffee

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ define [
33
'Backbone'
44
'underscore'
55
'i18n!content_migrations'
6+
'compiled/util/natcompare'
67
'jst/content_migrations/subviews/CourseFindSelect'
78
'jst/courses/autocomplete_item'
89
'jquery.ajaxJSON'
910
'jquery.disableWhileLoading'
1011
'jqueryui/autocomplete'
11-
], ($, Backbone, _, I18n, template, autocompleteItemTemplate) ->
12+
], ($, Backbone, _, I18n, natcompare, template, autocompleteItemTemplate) ->
1213
class CourseFindSelectView extends Backbone.View
1314
@optionProperty 'current_user_id', 'show_select'
1415
template: template
@@ -28,7 +29,14 @@ define [
2829
@$el.disableWhileLoading dfd
2930
dfd.done (data) =>
3031
@courses = data
31-
@coursesByTerms = _.groupBy data, (course) -> course.term
32+
@coursesByTerms = _.chain(@courses)
33+
.groupBy((course) ->
34+
course.term
35+
).map((value, key) ->
36+
{term: key, courses: value.sort(natcompare.byKey('label'))}
37+
).sort((a, b) ->
38+
new Date(b.courses[0].enrollment_start) - new Date(a.courses[0].enrollment_start)
39+
).value()
3240
super
3341

3442
afterRender: ->

app/views/jst/content_migrations/subviews/CourseFindSelect.handlebars

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
{{#if show_select}}
55
<select id="courseSelect" class="span3">
66
<option value="default">{{#t "select_default"}}Select a course{{/t}}</option>
7-
{{#eachProp terms}}
8-
<optgroup label="{{property}}">
9-
{{#each value}}
7+
{{#each terms}}
8+
<optgroup label="{{term}}">
9+
{{#each courses}}
1010
<option value="{{id}}">{{label}}</option>
1111
{{/each}}
1212
</optgroup>
13-
{{/eachProp}}
13+
{{/each}}
1414
</select>
1515
{{#t "or"}}or{{/t}}
1616
{{/if}}
@@ -25,5 +25,3 @@
2525
{{#t 'include_completed_courses'}}Include completed courses{{/t}}
2626
</label>
2727
</div>
28-
29-
Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,55 @@
11
define [
22
'Backbone'
33
'compiled/views/content_migrations/subviews/CourseFindSelectView'
4-
], (Backbone, CourseFindSelectView) ->
5-
module 'CourseFindSelectView: #setSourceCourseId'
4+
'helpers/fakeENV'
5+
'underscore'
6+
], (Backbone, CourseFindSelectView, fakeENV, _) ->
7+
module 'CourseFindSelectView: #setSourceCourseId',
8+
setup: ->
9+
fakeENV.setup()
10+
@url = '/users/101/manageable_courses'
11+
@server = sinon.fakeServer.create()
12+
@courses = [
13+
{
14+
"id": 5,
15+
"term": "Default Term",
16+
"label": "A",
17+
"enrollment_start": null
18+
},
19+
{
20+
"id": 4,
21+
"term": "Spring 2016",
22+
"label": "B",
23+
"enrollment_start": "2016-01-01T07:00:00Z"
24+
},
25+
{
26+
"id": 3,
27+
"term": "Spring 2016",
28+
"label": "A",
29+
"enrollment_start": "2016-01-01T07:00:00Z"
30+
},
31+
{
32+
"id": 2,
33+
"term": "Fall 2016",
34+
"label": "B",
35+
"enrollment_start": "2016-10-01T09:00:00Z"
36+
},
37+
{
38+
"id": 1,
39+
"term": "Fall 2016",
40+
"label": "A",
41+
"enrollment_start": "2016-10-01T09:00:00Z"
42+
}
43+
]
44+
@server.respondWith('GET', @url, [200, { "Content-Type": "application/json" }, JSON.stringify(@courses)])
45+
46+
teardown: ->
47+
fakeENV.teardown()
48+
@server.restore()
49+
650
test 'Triggers "course_changed" when course is found by its id', ->
751
courseFindSelectView = new CourseFindSelectView
8-
model: new Backbone.Model
9-
52+
model: new Backbone.Model
1053

1154
course = {id: 42}
1255
courseFindSelectView.courses = [course]
@@ -16,3 +59,27 @@ define [
1659
courseFindSelectView.setSourceCourseId 42
1760

1861
ok sinonSpy.calledWith('course_changed', course), "Triggered course_changed with a course"
62+
63+
test 'Sorts courses by most recent term to least, then alphabetically', ->
64+
courseFindSelectView = new CourseFindSelectView
65+
model: new Backbone.Model,
66+
current_user_id: 101
67+
68+
courseFindSelectView.courses = @courses
69+
courseFindSelectView.render()
70+
@server.respond()
71+
72+
# Gets the array of arrays (terms) of course objects
73+
sortedCourses = courseFindSelectView.toJSON().terms
74+
75+
# Gets the courses in grouped arrays
76+
# with each group corresponding to the term,
77+
# then flattens by ID in the order they
78+
# should be in
79+
groupedIds = sortedCourses.map((item) -> item.courses.map((course) -> course.id))
80+
result = [].concat.apply([], groupedIds)
81+
82+
# Array of ordered IDs from @courses
83+
expected = [1, 2, 3, 4, 5]
84+
85+
ok _.isEqual(result, expected)

0 commit comments

Comments
 (0)