Skip to content

Commit bcca089

Browse files
author
Michael Brewer-Davis
committed
inline cyoe interface
- inline cyoe interface in assignments, discussions, quizzes - integrate into form validation, saving refs CYOE-183 Test plan: Tested in conjunction with g/83054 from conditional-release For each of assignment, discussion topics, quizzes 1. Verify that normal usage is unaffected (including in non-CYOE-enabled environment) 2. Verify that CYOE content is saved alongside main canvas content 3. Verify that errors in saving CYOE prevent full saves in Canvas Change-Id: I4a15ca3b1440c9596c4a0e91da3b386ca05781a8 Reviewed-on: https://gerrit.instructure.com/82930 Tested-by: Jenkins Reviewed-by: Dan Minkevitch <dan@instructure.com> QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com> Product-Review: Michael Brewer-Davis <mbd@instructure.com>
1 parent aae4cdd commit bcca089

19 files changed

Lines changed: 729 additions & 457 deletions

File tree

app/coffeescripts/bundles/assignment_edit.coffee

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ require [
4141
else
4242
'#edit_assignment_header'
4343

44-
editHeaderView = new EditHeaderView
45-
el: headerEl
46-
model: assignment
47-
editHeaderView.render()
48-
4944
editView = new EditView
5045
el: '#edit_assignment_form'
5146
model: assignment
@@ -57,4 +52,11 @@ require [
5752
'js-assignment-overrides': new OverrideView
5853
model: dueDateList
5954
views: {}
60-
editView.render()
55+
56+
editHeaderView = new EditHeaderView
57+
el: headerEl
58+
model: assignment
59+
views:
60+
'edit_assignment_form': editView
61+
62+
editHeaderView.render()

app/coffeescripts/views/DiscussionTopics/EditView.coffee

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ ConditionalRelease) ->
5353
'change #use_for_grading' : 'toggleGradingDependentOptions'
5454
'change #discussion_topic_assignment_points_possible' : 'handlePointsChange'
5555
'change' : 'onChange'
56+
'tabsbeforeactivate #discussion-edit-view' : 'onTabChange'
5657
)
5758

5859
messages:
@@ -66,7 +67,7 @@ ConditionalRelease) ->
6667
@assignment = @model.get("assignment")
6768
@initialPointsPossible = @assignment.pointsPossible()
6869
@dueDateOverrideView = options.views['js-assignment-overrides']
69-
@model.on 'sync', =>
70+
@on 'success', =>
7071
@unwatchUnload()
7172
window.location = @model.get 'html_url'
7273
super
@@ -255,6 +256,18 @@ ConditionalRelease) ->
255256
@$('.attachmentRow').remove()
256257
@$('[name="attachment"]').show().focus()
257258

259+
saveFormData: =>
260+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
261+
super.pipe (data, status, xhr) =>
262+
assignment = data.assignment if data.set_assignment
263+
@conditionalReleaseEditor.updateAssignment(assignment)
264+
# Restore expected promise values
265+
@conditionalReleaseEditor.save().pipe(
266+
=> new $.Deferred().resolve(data, status, xhr).promise()
267+
(err) => new $.Deferred().reject(xhr, err).promise())
268+
else
269+
super
270+
258271
submit: (event) =>
259272
event.preventDefault()
260273
event.stopPropagation()
@@ -308,6 +321,10 @@ ConditionalRelease) ->
308321
if @isAnnouncement()
309322
unless data.message?.length > 0
310323
errors['message'] = [{type: 'message_required_error', message: I18n.t("A message is required")}]
324+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
325+
crErrors = @conditionalReleaseEditor.validateBeforeSave()
326+
errors['conditional_release'] = crErrors if crErrors
327+
311328
errors
312329

313330
_validatePointsPossible: (data, errors) =>
@@ -325,6 +342,13 @@ ConditionalRelease) ->
325342
# before calling super
326343
# see getFormValues in DueDateView.coffee
327344
delete errors.assignmentOverrides
345+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
346+
# switch to a tab with errors
347+
if errors['conditional_release']
348+
@$discussionEditView.tabs("option", "active", 1)
349+
@$conditionalReleaseTarget.get(0).scrollIntoView()
350+
else
351+
@$discussionEditView.tabs("option", "active", 0)
328352
super(errors)
329353

330354
toggleGradingDependentOptions: ->
@@ -348,4 +372,10 @@ ConditionalRelease) ->
348372
onChange: ->
349373
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED && !@assignmentDirty
350374
@assignmentDirty = true
351-
@conditionalReleaseEditor.setProps({ assignmentDirty: true })
375+
376+
onTabChange: ->
377+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED && @assignmentDirty
378+
assignmentData = @getFormData().assignment?.attributes
379+
@conditionalReleaseEditor.updateAssignment(assignmentData)
380+
@assignmentDirty = false
381+
true

app/coffeescripts/views/assignments/EditHeaderView.coffee

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,27 @@ define [
1414
events:
1515
'click .delete_assignment_link': 'onDelete'
1616
'change #grading_type_selector': 'onGradingTypeUpdate'
17-
'change' : 'onChange'
17+
'tabsbeforeactivate': 'onTabChange'
18+
1819

1920
messages:
2021
confirm: I18n.t('confirms.delete_assignment', 'Are you sure you want to delete this assignment?')
2122

2223
els:
2324
'#edit-assignment-header-tabs': '$headerTabs'
2425
'#edit-assignment-header-cr-tabs': '$headerTabsCr'
25-
'#conditional-release-target': '$conditionalReleaseTarget'
26+
27+
initialize: (options) ->
28+
super
29+
@editView = options.views['edit_assignment_form']
30+
@editView.on 'show-errors', @onShowErrors
2631

2732
afterRender: ->
2833
# doubled for conditional release
2934
@$headerTabs.tabs()
3035
@$headerTabsCr.tabs()
31-
3236
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
3337
@toggleConditionalReleaseTab(@model.gradingType())
34-
@conditionalReleaseEditor = ConditionalRelease.attach(
35-
@$conditionalReleaseTarget.get(0),
36-
I18n.t('assignment'),
37-
ENV.CONDITIONAL_RELEASE_ENV)
3838

3939
onDelete: (e) =>
4040
e.preventDefault()
@@ -64,12 +64,19 @@ define [
6464
else
6565
@$headerTabsCr.tabs("option", "disabled", false)
6666

67+
onTabChange: ->
68+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
69+
@editView.updateConditionalRelease()
70+
71+
onShowErrors: (errors) =>
72+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
73+
if errors['conditional_release']
74+
@$headerTabsCr.tabs("option", "active", 1)
75+
@editView.$conditionalReleaseTarget.get(0).scrollIntoView()
76+
else
77+
@$headerTabsCr.tabs("option", "active", 0)
78+
6779
toJSON: ->
6880
json = @model.toView()
6981
json['CONDITIONAL_RELEASE_SERVICE_ENABLED'] = ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
7082
json
71-
72-
onChange: ->
73-
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED && !@assignmentDirty
74-
@assignmentDirty = true
75-
@conditionalReleaseEditor.setProps({ assignmentDirty: true })

app/coffeescripts/views/assignments/EditView.coffee

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ define [
1515
'compiled/views/assignments/GroupCategorySelector'
1616
'compiled/jquery/toggleAccessibly'
1717
'compiled/views/editor/KeyboardShortcuts'
18+
'jsx/shared/conditional_release/ConditionalRelease'
1819
'jqueryui/dialog'
1920
'jquery.toJSON'
2021
'compiled/jquery.rails_flash_notifications'
2122
], (INST, I18n, ValidatedFormView, _, $, RichContentEditor, template,
2223
userSettings, TurnitinSettings, TurnitinSettingsDialog, preventDefault, MissingDateDialog,
23-
AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardShortcuts) ->
24+
AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardShortcuts,
25+
ConditionalRelease) ->
2426

2527
RichContentEditor.preloadRemoteModule()
2628

@@ -56,6 +58,7 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
5658
PEER_REVIEWS_BOX = '#assignment_peer_reviews'
5759
GROUP_CATEGORY_BOX = '#has_group_category'
5860
MODERATED_GRADING_BOX = '#assignment_moderated_grading'
61+
CONDITIONAL_RELEASE_TARGET = '#conditional_release_target'
5962

6063
els: _.extend({}, @::els, do ->
6164
els = {}
@@ -82,6 +85,7 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
8285
els["#{ASSIGNMENT_POINTS_POSSIBLE}"] = '$assignmentPointsPossible'
8386
els["#{ASSIGNMENT_POINTS_CHANGE_WARN}"] = '$pointsChangeWarning'
8487
els["#{MODERATED_GRADING_BOX}"] = '$moderatedGradingBox'
88+
els["#{CONDITIONAL_RELEASE_TARGET}"] = '$conditionalReleaseTarget'
8589
els
8690
)
8791

@@ -99,6 +103,8 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
99103
events["change #{PEER_REVIEWS_BOX}"] = 'handleModeratedGradingChange'
100104
events["change #{GROUP_CATEGORY_BOX}"] = 'handleModeratedGradingChange'
101105
events["change #{MODERATED_GRADING_BOX}"] = 'handleModeratedGradingChange'
106+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
107+
events["change"] = 'onChange'
102108
events
103109
)
104110

@@ -112,8 +118,10 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
112118
@assignment = @model
113119
@setDefaultsIfNew()
114120
@dueDateOverrideView = options.views['js-assignment-overrides']
115-
@model.on 'sync', -> window.location = @get 'html_url'
121+
@on 'success', => window.location = @model.get 'html_url'
116122
@gradingTypeSelector.on 'change:gradingType', @handleGradingTypeChange
123+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
124+
@gradingTypeSelector.on 'change:gradingType', @onChange
117125

118126
handleCancel: (ev) =>
119127
ev.preventDefault()
@@ -236,6 +244,11 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
236244
@handleModeratedGradingChange()
237245
if ENV?.HAS_GRADED_SUBMISSIONS
238246
@disableCheckbox(@$moderatedGradingBox, I18n.t("Moderated grading setting cannot be changed if graded submissions exist"))
247+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
248+
@conditionalReleaseEditor = ConditionalRelease.attach(
249+
@$conditionalReleaseTarget.get(0),
250+
I18n.t('assignment'),
251+
ENV.CONDITIONAL_RELEASE_ENV)
239252
this
240253

241254
toJSON: =>
@@ -245,6 +258,7 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
245258
postToSISEnabled: ENV?.POST_TO_SIS or false
246259
isLargeRoster: ENV?.IS_LARGE_ROSTER or false
247260
submissionTypesFrozen: _.include(data.frozenAttributes, 'submission_types')
261+
conditionalReleaseServiceEnabled: ENV?.CONDITIONAL_RELEASE_SERVICE_ENABLED or false
248262

249263
# separated out so we can easily stub it
250264
scrollSidebar: $.scrollSidebar
@@ -283,6 +297,17 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
283297
data.published = true if @shouldPublish
284298
return data
285299

300+
saveFormData: =>
301+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
302+
super.pipe (data, status, xhr) =>
303+
@conditionalReleaseEditor.updateAssignment(data)
304+
# Restore expected promise values
305+
@conditionalReleaseEditor.save().pipe(
306+
=> new $.Deferred().resolve(data, status, xhr).promise()
307+
(err) => new $.Deferred().reject(xhr, err).promise())
308+
else
309+
super
310+
286311
submit: (event) =>
287312
event.preventDefault()
288313
event.stopPropagation()
@@ -355,6 +380,7 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
355380
# see getFormValues in DueDateView.coffee
356381
delete errors.assignmentOverrides
357382
super(errors)
383+
@trigger 'show-errors', errors
358384

359385
validateBeforeSave: (data, errors) =>
360386
errors = @_validateTitle data, errors
@@ -369,6 +395,9 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
369395
data2 =
370396
assignment_overrides: @dueDateOverrideView.getAllDates()
371397
errors = @dueDateOverrideView.validateBeforeSave(data2,errors)
398+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED
399+
crErrors = @conditionalReleaseEditor.validateBeforeSave()
400+
errors['conditional_release'] = crErrors if crErrors
372401
errors
373402

374403
_validateTitle: (data, errors) =>
@@ -424,3 +453,13 @@ AssignmentGroupSelector, GroupCategorySelector, toggleAccessibly, RCEKeyboardSho
424453
message: I18n.t 'External Tool URL cannot be left blank'
425454
]
426455
errors
456+
457+
onChange: ->
458+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED && !@assignmentDirty
459+
@assignmentDirty = true
460+
461+
updateConditionalRelease: ->
462+
if ENV.CONDITIONAL_RELEASE_SERVICE_ENABLED && @assignmentDirty
463+
assignmentData = @getFormData()
464+
@conditionalReleaseEditor.updateAssignment(assignmentData)
465+
@assignmentDirty = false

app/controllers/assignments_controller.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,6 @@ def edit
450450
append_sis_data(hash)
451451
js_env(hash)
452452
conditional_release_js_env(@assignment)
453-
@padless = true
454453
render :edit
455454
end
456455
end

0 commit comments

Comments
 (0)