Skip to content

Commit 4fc1453

Browse files
committed
srgb - mute/unmute assignments
also clean up some specs fixes CNVS-10022 test plan - in screenreader gradebook - pull up some muted assignments, unmuted them - pull up some unmuted assignments, mute them - checkbox should update to reflect muted state - aria-label should update to reflect muted state - database should save new muted state Change-Id: Ic5b9c189b654bf387a983b54dcd8b6cb9728b3ec Reviewed-on: https://gerrit.instructure.com/27895 Reviewed-by: Matthew Irish <mirish@instructure.com> Tested-by: Jenkins <jenkins@instructure.com> QA-Review: Amber Taniuchi <amber@instructure.com> Product-Review: Liz Abinante <labinante@instructure.com>
1 parent 909097c commit 4fc1453

9 files changed

Lines changed: 258 additions & 70 deletions

File tree

app/coffeescripts/AssignmentMuter.coffee

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ define [
99
], (I18n, $, mute_dialog_template) ->
1010

1111
class AssignmentMuter
12-
constructor: (@$link, @assignment, @url) ->
12+
constructor: (@$link, @assignment, @url, @setter) ->
1313
@$link = $(@$link)
1414
@updateLink()
1515
@$link.click (event) =>
@@ -32,7 +32,10 @@ define [
3232
width: 400
3333

3434
afterUpdate: (serverResponse) =>
35-
@assignment.muted = serverResponse.assignment.muted
35+
if @setter
36+
@setter @assignment, 'muted', serverResponse.assignment.muted
37+
else
38+
@assignment.muted = serverResponse.assignment.muted
3639
@updateLink()
3740
@$dialog.dialog('close')
3841
$.publish('assignment_muting_toggled', [@assignment])
@@ -41,7 +44,7 @@ define [
4144
@$dialog = $('<div />')
4245
.text(I18n.t('unmute_dialog', "This assignment is currently muted. That means students can't see their grades and feedback. Would you like to unmute now?"))
4346
.dialog
44-
buttons: [{
47+
buttons: [{
4548
text: I18n.t('unmute_button', 'Unmute Assignment')
4649
'data-text-while-loading': I18n.t('unmuting_assignment', 'Unmuting Assignment...')
4750
click: =>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
define [
2+
'i18n!sr_gradebook'
3+
'ember'
4+
'compiled/AssignmentMuter'
5+
], (I18n, Ember, AssignmentMuter) ->
6+
7+
# http://emberjs.com/guides/components/
8+
# http://emberjs.com/api/classes/Ember.Component.html
9+
10+
AssignmentMuterComponent = Ember.Component.extend
11+
12+
click: (e) ->
13+
e.preventDefault()
14+
if this.get('assignment.muted') then @unmute() else @mute()
15+
mute: -> AssignmentMuter::showDialog.call @muter
16+
unmute: -> AssignmentMuter::confirmUnmute.call @muter
17+
18+
tagName: 'input'
19+
type: 'checkbox'
20+
attributeBindings: ['type', 'checked', 'ariaLabel:aria-label']
21+
22+
checked: (->
23+
this.get('assignment.muted')
24+
).property('assignment.muted')
25+
26+
ariaLabel: (->
27+
if this.get('assignment.muted')
28+
I18n.t "assignment_muted", "Click to unmute."
29+
else
30+
I18n.t "assignment_unmuted", "Click to mute."
31+
).property('assignment.muted')
32+
33+
setup: (->
34+
assignment = this.get('assignment')
35+
url = "#{ENV.GRADEBOOK_OPTIONS.context_url}/assignments/#{assignment.id}/mute"
36+
@muter = new AssignmentMuter(null, assignment, url, Em.set)
37+
).observes('assignment').on('init')

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,15 @@
116116
<button
117117
id="prev_student"
118118
{{action 'selectItem' 'selectedStudent' 'previous'}}
119-
{{bind-attr aria-disabled='ariaDisabledPrevStudent'}}
120-
{{bind-attr disabled='disablePrevStudentButton'}}
119+
{{bind-attr aria-disabled=ariaDisabledPrevStudent disabled=disablePrevStudentButton}}
121120
>
122121
{{#t 'previous_student'}}Previous Student{{/t}}
123122
</button>
124123

125124
<button
126125
id="next_student"
127126
{{action 'selectItem' 'selectedStudent' 'next'}}
128-
{{bind-attr aria-disabled='ariaDisabledNextStudent'}}
129-
{{bind-attr disabled='disableNextStudentButton'}}
127+
{{bind-attr aria-disabled=ariaDisabledNextStudent disabled=disableNextStudentButton}}
130128
>
131129
{{#t 'next_student'}}Next Student{{/t}}
132130
</button>
@@ -164,17 +162,15 @@
164162
<button
165163
id="prev_assignment"
166164
{{action 'selectItem' 'selectedAssignment' 'previous'}}
167-
{{bind-attr aria-disabled='ariaDisabledPrevAssignment'}}
168-
{{bind-attr disabled='disablePrevAssignmentButton'}}
165+
{{bind-attr aria-disabled=ariaDisabledPrevAssignment disabled=disablePrevAssignmentButton}}
169166
>
170167
{{#t 'previous_assignment'}}Previous Assignment{{/t}}
171168
</button>
172169

173170
<button
174171
id="next_assignment"
175172
{{action 'selectItem' 'selectedAssignment' 'next'}}
176-
{{bind-attr aria-disabled='ariaDisabledNextAssignment'}}
177-
{{bind-attr disabled='disableNextAssignmentButton'}}
173+
{{bind-attr aria-disabled=ariaDisabledNextAssignment disabled=disableNextAssignmentButton}}
178174
>
179175
{{#t 'next_assignment'}}Next Assignment{{/t}}
180176
</button>
@@ -267,14 +263,22 @@
267263
<!-- how many points is the assignment worth -->
268264

269265
<div>Points possible: {{points_possible}}</div>
270-
<!-- is the assignment muted -->
271266

267+
{{/with}}
268+
269+
<!-- is the assignment muted -->
272270
<div>
273-
<label for="muted">Muted</label>
274-
<input type="checkbox" name="muted" id="muted" value="muted"><br>
271+
<label for="assignment_muted_check">
272+
{{#t 'assignment_is_muted'}}Muted?{{/t}}
273+
{{
274+
assignment-muter
275+
assignment=selectedAssignment
276+
id='assignment_muted_check'
277+
name='assignment_muted_check'
278+
}}
279+
</label>
275280
</div>
276281

277-
{{/with}}
278282
<!-- assignment stats: average/high/low score + submission count -->
279283
{{#if assignmentDetails}}
280284
{{#with assignmentDetails }}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
define [
2+
'ember'
3+
'../../components/assignment_muter_component'
4+
'../start_app'
5+
'../shared_ajax_fixtures'
6+
'jquery'
7+
], (Ember, AssignmentMuter, startApp, fixtures, $) ->
8+
9+
{ContainerView, run} = Ember
10+
11+
fixtures.create()
12+
mutedAssignment = fixtures.assignment_groups[0].assignments[1]
13+
unmutedAssignment = fixtures.assignment_groups[0].assignments[0]
14+
15+
compareIdentity = (assignment, fixture) ->
16+
equal assignment.muted, fixture.muted, 'muted status'
17+
equal assignment.id, fixture.id, 'assignment id'
18+
19+
20+
module 'screenreader_gradebook assignment_muter_component: setup',
21+
setup: ->
22+
App = startApp()
23+
run =>
24+
@assignment = Ember.copy(mutedAssignment, true)
25+
@component = App.AssignmentMuterComponent.create(assignment: @assignment)
26+
teardown: ->
27+
run =>
28+
@component.destroy()
29+
@component = null
30+
31+
test 'it works', ->
32+
compareIdentity(@component.get('assignment'), mutedAssignment)
33+
34+
Ember.run =>
35+
@assignment = Ember.copy(unmutedAssignment, true)
36+
@component.setProperties
37+
assignment: @assignment
38+
39+
compareIdentity(@component.get('assignment'), unmutedAssignment)

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

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -37,30 +37,25 @@ define [
3737

3838

3939
test 'calculates students properly', ->
40-
andThen =>
41-
equal @srgb.get('students.length'), 10
42-
equal @srgb.get('students.firstObject').name, fixtures.students[0].user.name
40+
equal @srgb.get('students.length'), 10
41+
equal @srgb.get('students.firstObject').name, fixtures.students[0].user.name
4342

4443
test 'calculates assignments properly', ->
45-
andThen =>
46-
equal @srgb.get('assignments.length'), 6
47-
ok !@srgb.get('assignments').findBy('name', 'Not Graded')
48-
equal @srgb.get('assignments.firstObject').name, fixtures.assignment_groups[0].assignments[0].name
44+
equal @srgb.get('assignments.length'), 6
45+
ok !@srgb.get('assignments').findBy('name', 'Not Graded')
46+
equal @srgb.get('assignments.firstObject').name, fixtures.assignment_groups[0].assignments[0].name
4947

5048
test 'studentsHash returns the expected hash', ->
51-
andThen =>
52-
_.each @srgb.studentsHash(), (obj) =>
53-
strictEqual @srgb.get('students').findBy('id', obj.id), obj
49+
_.each @srgb.studentsHash(), (obj) =>
50+
strictEqual @srgb.get('students').findBy('id', obj.id), obj
5451

5552
test 'assignmentGroupsHash retuns the expected hash', ->
56-
andThen =>
57-
_.each @srgb.assignmentGroupsHash(), (obj) =>
58-
strictEqual @srgb.get('assignment_groups').findBy('id', obj.id), obj
53+
_.each @srgb.assignmentGroupsHash(), (obj) =>
54+
strictEqual @srgb.get('assignment_groups').findBy('id', obj.id), obj
5955

6056
test 'student objects have isLoaded flag set to true once submissions are loaded', ->
61-
andThen =>
62-
@srgb.get('students').forEach (s) ->
63-
equal Ember.get(s, 'isLoaded'), true
57+
@srgb.get('students').forEach (s) ->
58+
equal Ember.get(s, 'isLoaded'), true
6459

6560
test 'displayName is hiddenName when hideStudentNames is true', ->
6661
@srgb.set('hideStudentNames', true)
@@ -76,8 +71,7 @@ define [
7671
strictEqual student["assignment_#{submission.assignment_id}"], submission
7772

7873
test 'selectedSubmissionGrade is - if there is no selectedSubmission', ->
79-
andThen =>
80-
equal @srgb.get('selectedSubmissionGrade'), '-'
74+
equal @srgb.get('selectedSubmissionGrade'), '-'
8175

8276
test 'studentsInSelectedSection is the same as students when selectedSection is null', ->
8377
ok (!@srgb.get('selectedSection'))
@@ -173,23 +167,20 @@ define [
173167
teardown.call this
174168

175169
test 'selectedSubmissionGrade is computed properly', ->
176-
andThen =>
177-
equal @srgb.get('selectedSubmissionGrade'), fixtures.submissions[0].submissions[0].grade
170+
equal @srgb.get('selectedSubmissionGrade'), fixtures.submissions[0].submissions[0].grade
178171

179172
test 'assignmentDetails is computed properly', ->
180-
andThen =>
181-
ad = @srgb.get('assignmentDetails')
182-
selectedAssignment = @srgb.get('selectedAssignment')
183-
strictEqual ad.assignment, selectedAssignment
184-
strictEqual ad.cnt, 0
173+
ad = @srgb.get('assignmentDetails')
174+
selectedAssignment = @srgb.get('selectedAssignment')
175+
strictEqual ad.assignment, selectedAssignment
176+
strictEqual ad.cnt, 0
185177

186178
test 'selectedSubmission is computed properly', ->
187-
andThen =>
188-
selectedSubmission = @srgb.get('selectedSubmission')
189-
sub = _.find(fixtures.submissions, (s) => s.user_id == @student.id)
190-
submission = _.find(sub.submissions, (s) => s.assignment_id == @assignment.id)
191-
_.each submission, (val, key) =>
192-
equal selectedSubmission[key], val, "#{key} is the expected value on selectedSubmission"
179+
selectedSubmission = @srgb.get('selectedSubmission')
180+
sub = _.find(fixtures.submissions, (s) => s.user_id == @student.id)
181+
submission = _.find(sub.submissions, (s) => s.assignment_id == @assignment.id)
182+
_.each submission, (val, key) =>
183+
equal selectedSubmission[key], val, "#{key} is the expected value on selectedSubmission"
193184

194185
module 'screenreader_gradebook_controller: with selected assignment',
195186
setup: ->

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

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ define [
1010
fixtures.create()
1111

1212
buttonDisabled = (trigger, expectedBoolean) ->
13-
equal($(trigger).prop('disabled'), expectedBoolean)
14-
equal($(trigger).attr('aria-disabled'), expectedBoolean.toString())
13+
equal find(trigger).prop('disabled'), expectedBoolean
14+
equal find(trigger).attr('aria-disabled'), expectedBoolean.toString()
1515

1616
checkSelection = (id, selection) ->
17-
equal(id, $(selection).val())
17+
equal id, find(selection).val()
1818

1919
checkText = (text, selection) ->
20-
equal(text, $(selection).find('option:selected').text())
20+
equal text, find(selection).find('option:selected').text()
2121

2222
studentSectionAssertions = (selected, currentIndex, expectedIndex) ->
23-
equal(currentIndex, expectedIndex)
23+
equal currentIndex, expectedIndex
2424
checkSelection(selected.id, '#student_select')
2525
checkText(selected.name, '#student_select')
2626

@@ -231,31 +231,30 @@ define [
231231
Ember.run App, 'destroy'
232232

233233
test 'prev/next still work', ->
234-
visit('/').then =>
234+
buttonDisabled('#prev_student', true)
235+
buttonDisabled('#next_student', false)
236+
237+
# first in section
238+
click('#next_student').then =>
239+
first = @controller.get('selectedStudent')
240+
index = @controller.get('studentIndex')
235241
buttonDisabled('#prev_student', true)
236-
buttonDisabled('#next_student', false)
242+
studentSectionAssertions(first, index, 0)
237243

238-
# first in section
244+
# second in section
239245
click('#next_student').then =>
240-
first = @controller.get('selectedStudent')
246+
second = @controller.get('selectedStudent')
241247
index = @controller.get('studentIndex')
242-
buttonDisabled('#prev_student', true)
243-
studentSectionAssertions(first, index, 0)
244-
245-
# second in section
246-
click('#next_student').then =>
247-
second = @controller.get('selectedStudent')
248-
index = @controller.get('studentIndex')
249-
buttonDisabled('#prev_student', false)
250-
studentSectionAssertions(second, index, 1)
251-
notEqual(first, second)
248+
buttonDisabled('#prev_student', false)
249+
studentSectionAssertions(second, index, 1)
250+
notEqual(first, second)
252251

253-
click('#prev_student').then =>
254-
buttonDisabled('#prev_student', true)
255-
buttonDisabled('#next_student', false)
252+
click('#prev_student').then =>
253+
buttonDisabled('#prev_student', true)
254+
buttonDisabled('#next_student', false)
256255

257256
test 'resets selectedStudent when student is not in both sections', ->
258-
visit('/').then => click('#next_student').then =>
257+
click('#next_student').then =>
259258
firstStudent = @controller.get('selectedStudent')
260259

261260
Ember.run =>

0 commit comments

Comments
 (0)