Skip to content

Commit f1fb95f

Browse files
author
Matthew Irish
committed
submissions loading changes in screenreader GB
now loads submissions like we do in GB2 closes CNVS-9886 test plan ========= - navigate to screenreader gradebook for a large class - verify that submission are loaded after we get enrollments back Change-Id: I284b9c64f019c7e53e64fd1a78e23606b8a9da6a Reviewed-on: https://gerrit.instructure.com/27724 Tested-by: Jenkins <jenkins@instructure.com> Reviewed-by: Simon Williams <simon@instructure.com> Reviewed-by: Stanley Stuart <stanley@instructure.com> Product-Review: Matthew Irish <mirish@instructure.com> QA-Review: Matthew Irish <mirish@instructure.com>
1 parent dc021d3 commit f1fb95f

8 files changed

Lines changed: 117 additions & 93 deletions

File tree

app/coffeescripts/ember/screenreader_gradebook/controllers/screenreader_gradebook_controller.coffee

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
define [
2+
'../../shared/xhr/fetch_all_pages'
23
'i18n!sr_gradebook'
34
'ember'
45
'underscore'
56
'compiled/AssignmentDetailsDialog'
67
'compiled/AssignmentMuter'
7-
], (I18n, Ember, _, AssignmentDetailsDialog, AssignmentMuter ) ->
8+
], (fetchAllPages, I18n, Ember, _, AssignmentDetailsDialog, AssignmentMuter ) ->
89

9-
{get} = Ember
10+
{get, set} = Ember
1011

1112
# http://emberjs.com/guides/controllers/
1213
# http://emberjs.com/api/classes/Ember.Controller.html
@@ -55,12 +56,11 @@ define [
5556
subs_proxy = @get('submissions')
5657
selected = @get('selectedSubmission')
5758
submissions.forEach (submission) =>
58-
submissionsForStudent = subs_proxy.findBy('user_id', submission.user_id).submissions
59-
oldSubmission = submissionsForStudent.find (sub) ->
60-
submission.assignment_id == sub.assignment_id
59+
submissionsForStudent = subs_proxy.findBy('user_id', submission.user_id)
60+
oldSubmission = submissionsForStudent.submissions.findBy('assignment_id', submission.assignment_id)
6161

62-
submissionsForStudent.removeObject oldSubmission
63-
submissionsForStudent.addObject submission
62+
submissionsForStudent.submissions.removeObject oldSubmission
63+
submissionsForStudent.submissions.addObject submission
6464
@updateSubmission submission, students.findBy('id', submission.user_id)
6565
if selected and selected.assignment_id == submission.assignment_id and selected.user_id == submission.user_id
6666
@set('selectedSubmission', submission)
@@ -83,28 +83,40 @@ define [
8383
#selectedAssignment
8484

8585
studentGrades: (->
86-
selected = @get('selectedStudent').enrollment.grades
86+
selected = @get('selectedStudent')
87+
return null if not selected
88+
#will always find the first one, but this should be OK
89+
enrollment = @get('enrollments').findBy('user_id', selected.id)
90+
enrollment.grades
8791
).property('selectedStudent')
8892

93+
fetchStudentSubmissions: (->
94+
Ember.run.once =>
95+
notYetLoaded = @get('students').filter (student) ->
96+
return false if get(student, 'isLoaded') or get(student, 'isLoading')
97+
set(student, 'isLoading', true)
98+
student
99+
100+
return unless notYetLoaded.length
101+
student_ids = notYetLoaded.mapBy('id')
102+
fetchAllPages(ENV.GRADEBOOK_OPTIONS.submissions_url, student_ids: student_ids, @get('submissions'))
103+
).observes('students.@each').on('init')
104+
89105
submissionsLoaded: (->
90106
submissions = @get('submissions')
91107
submissions.forEach ((submission) ->
92108
student = @get('students').findBy('id', submission.user_id)
93-
Ember.set(student, 'isLoaded', true)
109+
submission.submissions.forEach ((s) ->
110+
@updateSubmission(s, student)
111+
), this
112+
set(student, 'isLoading', false)
113+
set(student, 'isLoaded', true)
94114
), this
95115
).observes('submissions.@each')
96116

97117
updateSubmission: (submission, student) ->
98118
submission.submitted_at = $.parseFromISO(submission.submitted_at) if submission.submitted_at
99-
student["assignment_#{submission.assignment_id}"] = submission
100-
101-
studentLoadedObserver: (->
102-
@get('students').filterBy('isLoaded', true).forEach (student) =>
103-
@get('submissions').findBy('user_id', student.id).submissions?.forEach ((submission) ->
104-
return if student["assignment_#{submission.assignment_id}"]
105-
@updateSubmission(submission, student)
106-
), this
107-
).observes('students.@each.isLoaded')
119+
set(student, "assignment_#{submission.assignment_id}", submission)
108120

109121
assignments: (->
110122
_.flatten(@get('assignment_groups').map (ag) -> ag.assignments)
@@ -119,12 +131,11 @@ define [
119131
selectedSubmission: (->
120132
return null unless @get('selectedStudent')? and @get('selectedAssignment')?
121133
student = @get 'selectedStudent'
122-
sub = @get('submissions').findBy('user_id', student.id).submissions?.find (submission) =>
123-
submission.user_id == @get('selectedStudent').id and
124-
submission.assignment_id == @get('selectedAssignment').id
134+
assignment = @get 'selectedAssignment'
135+
sub = get student, "assignment_#{assignment.id}"
125136
sub or {
126-
user_id: @get('selectedStudent').id
127-
assignment_id: @get('selectedAssignment').id
137+
user_id: student.id
138+
assignment_id: assignment.id
128139
}
129140
).property('selectedStudent', 'selectedAssignment')
130141

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
define [
22
'ember',
33
'ic-ajax',
4-
'../../shared/xhr/fetch_all_pages',
5-
'underscore'
4+
'../../shared/xhr/fetch_all_pages'
65
]
7-
, (Ember, ajax, fetchAllPages, _) ->
6+
, (Ember, ajax, fetchAllPages) ->
87

98
ScreenreaderGradebookRoute = Ember.Route.extend
109

1110
model: ->
12-
#TODO figure out why submissions isn't paginating
1311
enrollments: fetchAllPages(ENV.GRADEBOOK_OPTIONS.students_url)
1412
assignment_groups: fetchAllPages(ENV.GRADEBOOK_OPTIONS.assignment_groups_url)
15-
submissions: fetchAllPages(ENV.GRADEBOOK_OPTIONS.submissions_url, student_ids: 'all')
13+
submissions: Em.ArrayProxy.create(content: [])
1614
sections: fetchAllPages(ENV.GRADEBOOK_OPTIONS.sections_url)

app/coffeescripts/ember/screenreader_gradebook/templates/screenreader_gradebook.hbs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,23 +151,20 @@
151151

152152
<!-- student -->
153153
<!-- -------- -->
154-
155154
{{#if selectedStudent}}
156-
{{#with selectedStudent}}
157155

158156
<div id="student_information">
159157

160158
<h2>Student Information</h2>
161159

162-
<div>Selected Student: {{name}}</div>
160+
<div>Selected Student: {{selectedStudent.name}}</div>
163161

164162
<!-- what section they are in -->
165163

166164
<div>Section: Section 3</div>
167-
168165
<!-- secondary id -->
169-
{{#unless isLoaded}}
170-
<div>Secondary ID: {{login_id}}</div>
166+
{{#if selectedStudent.isLoaded}}
167+
<div>Secondary ID: {{selectedStudent.login_id}}</div>
171168

172169
<!-- final score/grade -->
173170

@@ -178,11 +175,10 @@
178175
<div>Assignment Group Grade: 30% (50% of grade)</div>
179176
{{else}}
180177
<p>Submissions for this student are still loading...</p>
181-
{{/unless}}
178+
{{/if}}
182179

183180
</div>
184181

185-
{{/with}}
186182
{{/if}}
187183

188184
<!-- assignment -->

app/coffeescripts/ember/screenreader_gradebook/tests/app.spec.coffee

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,23 @@ define [
1515
Ember.run App, 'destroy'
1616

1717
test 'fetches enrollments', ->
18-
controller = App.__container__.lookup('controller:screenreader_gradebook')
19-
equal controller.get('enrollments').objectAt(0).user.name, 'Bob'
20-
equal controller.get('enrollments').objectAt(1).user.name, 'Fred'
18+
visit('/').then ->
19+
controller = App.__container__.lookup('controller:screenreader_gradebook')
20+
equal controller.get('enrollments').objectAt(0).user.name, 'Bob'
21+
equal controller.get('enrollments').objectAt(1).user.name, 'Fred'
2122

2223
test 'fetches assignment_groups', ->
23-
controller = App.__container__.lookup('controller:screenreader_gradebook')
24-
equal controller.get('assignment_groups').objectAt(0).name, 'AG1'
24+
visit('/').then ->
25+
controller = App.__container__.lookup('controller:screenreader_gradebook')
26+
equal controller.get('assignment_groups').objectAt(0).name, 'AG1'
2527

2628
#test 'fetches submissions', ->
2729
#controller = App.__container__.lookup('controller:screenreader_gradebook')
2830
#equal controller.get('submissions').objectAt(0).submissions[0].grade, '3'
2931
#equal controller.get('submissions').objectAt(1).submissions[0].grade, '9'
3032

3133
test 'fetches sections', ->
32-
controller = App.__container__.lookup('controller:screenreader_gradebook')
33-
equal controller.get('sections').objectAt(0).name, 'Section 1'
34-
equal controller.get('sections').objectAt(1).name, 'Section 2'
34+
visit('/').then ->
35+
controller = App.__container__.lookup('controller:screenreader_gradebook')
36+
equal controller.get('sections').objectAt(0).name, 'Section 1'
37+
equal controller.get('sections').objectAt(1).name, 'Section 2'

app/coffeescripts/ember/screenreader_gradebook/tests/controllers/screenreader_gradebook.spec.coffee

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ define [
1414

1515
setup = ->
1616
App = startApp()
17-
@srgb = SRGController.create()
18-
@srgb.set('model', {
19-
enrollments: Ember.ArrayProxy.create(content: clone fixtures.students)
20-
assignment_groups: Ember.ArrayProxy.create(content: clone fixtures.assignment_groups)
21-
submissions: Ember.ArrayProxy.create(content: clone fixtures.submissions)
22-
sections: Ember.ArrayProxy.create(content: clone fixtures.sections)
23-
})
17+
Ember.run.join =>
18+
@srgb = SRGController.create()
19+
@srgb.set('model', {
20+
enrollments: Ember.ArrayProxy.create(content: clone fixtures.students)
21+
assignment_groups: Ember.ArrayProxy.create(content: clone fixtures.assignment_groups)
22+
submissions: Ember.ArrayProxy.create(content: [])
23+
sections: Ember.ArrayProxy.create(content: clone fixtures.sections)
24+
})
2425

2526

2627
module 'screenreader_gradebook_controller',
@@ -30,24 +31,29 @@ define [
3031
Ember.run App, 'destroy'
3132

3233
test 'calculates students properly', ->
33-
equal @srgb.get('students.length'), 2
34-
equal @srgb.get('students.firstObject').name, fixtures.students[0].user.name
34+
andThen =>
35+
equal @srgb.get('students.length'), 2
36+
equal @srgb.get('students.firstObject').name, fixtures.students[0].user.name
3537

3638
test 'calculates assignments properly', ->
37-
equal @srgb.get('assignments.length'), 2
38-
equal @srgb.get('assignments.firstObject').name, fixtures.assignment_groups[0].assignments[0].name
39+
andThen =>
40+
equal @srgb.get('assignments.length'), 2
41+
equal @srgb.get('assignments.firstObject').name, fixtures.assignment_groups[0].assignments[0].name
3942

4043
test 'studentsHash returns the expected hash', ->
41-
_.each @srgb.studentsHash(), (obj) =>
42-
strictEqual @srgb.get('students').findBy('id', obj.id), obj
44+
andThen =>
45+
_.each @srgb.studentsHash(), (obj) =>
46+
strictEqual @srgb.get('students').findBy('id', obj.id), obj
4347

4448
test 'assignmentGroupsHash retuns the expected hash', ->
45-
_.each @srgb.assignmentGroupsHash(), (obj) =>
46-
strictEqual @srgb.get('assignment_groups').findBy('id', obj.id), obj
49+
andThen =>
50+
_.each @srgb.assignmentGroupsHash(), (obj) =>
51+
strictEqual @srgb.get('assignment_groups').findBy('id', obj.id), obj
4752

4853
test 'student objects have isLoaded flag set to true once submissions are loaded', ->
49-
@srgb.get('students').forEach (s) ->
50-
equal Ember.get(s, 'isLoaded'), true
54+
andThen =>
55+
@srgb.get('students').forEach (s) ->
56+
equal Ember.get(s, 'isLoaded'), true
5157

5258
test 'updateSubmission attaches the submission to the student', ->
5359
student = clone fixtures.students[0].user
@@ -57,14 +63,15 @@ define [
5763
strictEqual student["assignment_#{submission.assignment_id}"], submission
5864

5965
test 'selectedSubmissionGrade is - if there is no selectedSubmission', ->
60-
equal @srgb.get('selectedSubmissionGrade'), '-'
66+
andThen =>
67+
equal @srgb.get('selectedSubmissionGrade'), '-'
6168

6269

6370
module 'screenreader_gradebook_controller: with selected student',
6471
setup: ->
6572
setup.call this
66-
student = @srgb.get('students.firstObject')
6773
Ember.run =>
74+
student = @srgb.get('students.firstObject')
6875
@srgb.set('selectedStudent', student)
6976
teardown: ->
7077
Ember.run App, 'destroy'
@@ -75,28 +82,31 @@ define [
7582
module 'screenreader_gradebook_controller: with selected student and selected assignment',
7683
setup: ->
7784
setup.call this
78-
@student = @srgb.get('students.firstObject')
79-
@assignment = @srgb.get('assignments.firstObject')
8085
Ember.run =>
86+
@student = @srgb.get('students.firstObject')
87+
@assignment = @srgb.get('assignments.firstObject')
8188
@srgb.set('selectedStudent', @student)
8289
@srgb.set('selectedAssignment', @assignment)
8390

8491
teardown: ->
8592
Ember.run App, 'destroy'
8693

8794
test 'selectedSubmissionGrade is computed properly', ->
88-
equal @srgb.get('selectedSubmissionGrade'), fixtures.submissions[0].submissions[0].grade
95+
andThen =>
96+
equal @srgb.get('selectedSubmissionGrade'), fixtures.submissions[0].submissions[0].grade
8997

9098
test 'assignmentDetails is computed properly', ->
91-
ad = @srgb.get('assignmentDetails')
92-
selectedAssignment = @srgb.get('selectedAssignment')
93-
strictEqual ad.assignment, selectedAssignment
94-
strictEqual ad.cnt, 0
99+
andThen =>
100+
ad = @srgb.get('assignmentDetails')
101+
selectedAssignment = @srgb.get('selectedAssignment')
102+
strictEqual ad.assignment, selectedAssignment
103+
strictEqual ad.cnt, 0
95104

96105
test 'selectedSubmission is computed properly', ->
97-
selectedSubmission = @srgb.get('selectedSubmission')
98-
sub = _.find(fixtures.submissions, (s) => s.user_id == @student.id)
99-
submission = _.find(sub.submissions, (s) => s.assignment_id == @assignment.id)
100-
_.each submission, (val, key) =>
101-
equal selectedSubmission[key], val, "#{key} is the expected value on selectedSubmission"
106+
andThen =>
107+
selectedSubmission = @srgb.get('selectedSubmission')
108+
sub = _.find(fixtures.submissions, (s) => s.user_id == @student.id)
109+
submission = _.find(sub.submissions, (s) => s.assignment_id == @assignment.id)
110+
_.each submission, (val, key) =>
111+
equal selectedSubmission[key], val, "#{key} is the expected value on selectedSubmission"
102112

app/coffeescripts/ember/screenreader_gradebook/tests/integration/dialogs.spec.coffee

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ define [
2929
server.respond 'POST', url, [
3030
200
3131
'Content-Type': 'application/json'
32-
JSON.stringify response
32+
JSON.stringify Ember.copy response, true
3333
]
3434

3535
module 'screenreader_gradebook: dialogs open and close',
@@ -39,10 +39,12 @@ define [
3939
Ember.run App, 'destroy'
4040

4141
test 'upload scores dialog displays properly', ->
42-
visit('/').then -> openAndCloseDialog('#upload', 'Choose a CSV to Upload')
42+
visit('/')
43+
openAndCloseDialog('#upload', 'Choose a CSV to Upload')
4344

4445
test 'set group weights dialog displays propery', ->
45-
visit('/').then -> openAndCloseDialog('#ag_weights', 'Manage assignment group weighting')
46+
visit('/')
47+
openAndCloseDialog('#ag_weights', 'Manage assignment group weighting')
4648

4749

4850
module 'screenreader_gradebook: assignment dialogs open and close',
@@ -62,12 +64,12 @@ define [
6264
#openAndCloseDialog('#message_students', "Message students for #{@selected.name}")
6365

6466
test 'default grade dialog displays properly', ->
65-
visit('/').then =>
66-
openAndCloseDialog('#set_default_grade', "Default grade for #{@selected.name}")
67+
visit('/')
68+
openAndCloseDialog('#set_default_grade', "Default grade for #{@selected.name}")
6769

6870
test 'curve grades dialog displays properly', ->
69-
visit('/').then =>
70-
openAndCloseDialog('#curve_grades', "Curve Grades for #{@selected.name}")
71+
visit('/')
72+
openAndCloseDialog('#curve_grades', "Curve Grades for #{@selected.name}")
7173

7274

7375
module 'screenreader_gradebook: assignment dialogs saving',
@@ -79,6 +81,7 @@ define [
7981
@server = sinon.fakeServer.create()
8082
@alert = sinon.stub(window, 'alert')
8183
Ember.run =>
84+
controller.set('submissions', Em.copy fixtures.submissions, true)
8285
controller.set('selectedAssignment', @selAssignment)
8386
controller.set('selectedStudent', @selStudent)
8487

@@ -94,14 +97,15 @@ define [
9497
test 'default grade dialog updates the current students grade', ->
9598
$dialog = null
9699
server = @server
97-
visit('/').then ->
98-
openDialog('#set_default_grade').then ->
100+
visit('/').then =>
101+
openDialog('#set_default_grade').then =>
99102
$dialog = find('.ui-dialog:visible', 'body')
100-
fillIn(find('[name=default_grade]', $dialog), 100).then ->
101-
click(find('[name=overwrite_existing_grades]', $dialog)).then ->
103+
fillIn(find('[name=default_grade]', $dialog), 100).then =>
104+
click(find('[name=overwrite_existing_grades]', $dialog)).then =>
102105
click('.button_type_submit', $dialog)
103-
sendSuccess(server, "/courses/#{ENV.GRADEBOOK_OPTIONS.context_id}/gradebook/update_submission", fixtures.set_default_grade_response)
106+
sendSuccess(@server, "/courses/#{ENV.GRADEBOOK_OPTIONS.context_id}/gradebook/update_submission", fixtures.set_default_grade_response)
107+
104108

105109
andThen ->
106-
Ember.run.next ->
107-
equal parseInt(find('#student_and_assignment_grade').val(), 10), 100
110+
equal parseInt(find('#student_and_assignment_grade').val(), 10), 100
111+

0 commit comments

Comments
 (0)