Skip to content

Commit

Permalink
Rescan for required fields when form is altered
Browse files Browse the repository at this point in the history
Fixes #2244
  • Loading branch information
jcoyne committed Jun 23, 2016
1 parent f9da353 commit 2b5285c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 9 deletions.
9 changes: 8 additions & 1 deletion app/assets/javascripts/sufia/app.js
Expand Up @@ -12,7 +12,14 @@ Sufia = {

saveWorkControl: function () {
var sw = require('sufia/save_work/save_work_control');
new sw.SaveWorkControl($("#form-progress")).activate();
var control = new sw.SaveWorkControl($("#form-progress"))
control.activate();
$('.multi_value.form-group').bind('managed_field:add', function() {
control.formChanged()
})
$('.multi_value.form-group').bind('managed_field:remove', function() {
control.formChanged()
})
},

saveWorkFixed: function () {
Expand Down
14 changes: 10 additions & 4 deletions app/assets/javascripts/sufia/save_work/required_fields.es6
Expand Up @@ -2,12 +2,18 @@ export class RequiredFields {
// Monitors the form and runs the callback if any of the required fields change
constructor(form, callback) {
this.form = form
// ":input" matches all input, select or textarea fields.
this.requiredFields = this.form.find(':input[required]')
this.requiredFields.change(callback)
this.callback = callback
this.reload()
}

get areComplete(){
get areComplete() {
return this.requiredFields.filter((n, elem) => { return $(elem).val().length < 1 } ).length == 0
}

// Reassign requiredFields because fields may have been added or removed.
reload() {
// ":input" matches all input, select or textarea fields.
this.requiredFields = this.form.find(':input[required]')
this.requiredFields.change(this.callback)
}
}
15 changes: 11 additions & 4 deletions app/assets/javascripts/sufia/save_work/save_work_control.es6
Expand Up @@ -56,12 +56,12 @@ export class SaveWorkControl {
if (!this.form) {
return
}
this.requiredFields = new RequiredFields(this.form, () => this.formChanged())
this.uploads = new UploadedFiles(this.form, () => this.formChanged())
this.requiredFields = new RequiredFields(this.form, () => this.formStateChanged())
this.uploads = new UploadedFiles(this.form, () => this.formStateChanged())

this.saveButton = this.element.find(':submit')

this.depositAgreement = new DepositAgreement(this.form, () => this.formChanged())
this.depositAgreement = new DepositAgreement(this.form, () => this.formStateChanged())

this.requiredMetadata = new ChecklistItem(this.element.find('#required-metadata'))
this.requiredFiles = new ChecklistItem(this.element.find('#required-files'))
Expand All @@ -70,10 +70,17 @@ export class SaveWorkControl {
this.formChanged()
}

formChanged() {
// Called when a file has been uploaded, the deposit agreement is clicked or a form field has had text entered.
formStateChanged() {
this.saveButton.prop("disabled", !this.isValid());
}

// called when a new field has been added to the form.
formChanged() {
this.requiredFields.reload();
this.formStateChanged();
}

isValid() {
// avoid short circuit evaluation. The checkboxes should be independent.
let metadataValid = this.validateMetadata()
Expand Down

0 comments on commit 2b5285c

Please sign in to comment.