Skip to content

Commit

Permalink
Merge pull request ResearchKit#43 from syoung-smallwisdom/ui-bug-fixes-2
Browse files Browse the repository at this point in the history
Ui bug fixes 2
  • Loading branch information
syoung-smallwisdom committed Jul 19, 2018
2 parents 0f09433 + 19bbd45 commit 473d535
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 13 deletions.
11 changes: 11 additions & 0 deletions Research/Research/RSDChoicePickerTableItemGroup.swift
Expand Up @@ -192,4 +192,15 @@ public final class RSDBooleanTableItemGroup : RSDChoicePickerTableItemGroup {
}
try super.setAnswer(from: result)
}

/// Override to set the default answer to false if the checkbox is not checked.
public override func setDefaultAnswerIfValid() -> Bool {
if singleCheckbox && (self.answer is NSNull) {
try? super.setAnswer(false)
return true
}
else {
return false
}
}
}
33 changes: 22 additions & 11 deletions Research/Research/RSDFormStepDataSourceObject.swift
Expand Up @@ -324,26 +324,37 @@ open class RSDFormStepDataSourceObject : RSDTableDataSource {
/// a previous result. For example, a form should be populated with previous answers, but an active
/// test should not.
open func populateInitialResults() {
guard let results = self.initialResult?.inputResults, results.count > 0 else { return }

var stepResult = self.collectionResult()
var hasChanges: Bool = false

for result in results {
if let itemGroup = itemGroup(with: result.identifier) as? RSDInputFieldTableItemGroup {
do {
try itemGroup.setAnswer(from: result)
if let result = self.instantiateAnswerResult(for: itemGroup) {
stepResult.appendInputResults(with: result)
hasChanges = true
func appendResults(for itemGroup: RSDInputFieldTableItemGroup) {
guard let result = self.instantiateAnswerResult(for: itemGroup) else { return }
stepResult.appendInputResults(with: result)
hasChanges = true
}

if let results = self.initialResult?.inputResults, results.count > 0 {
results.forEach { (result) in
if let itemGroup = itemGroup(with: result.identifier) as? RSDInputFieldTableItemGroup {
do {
try itemGroup.setAnswer(from: result)
appendResults(for: itemGroup)
} catch let err {
// ignore error but do not save the result
debugPrint("Failed to restore answer from result. \(err)")
}
} catch let err {
// ignore error but do not save the result
debugPrint("Failed to restore answer from result. \(err)")
}
}
}

itemGroups.forEach {
if let itemGroup = $0 as? RSDInputFieldTableItemGroup,
itemGroup.setDefaultAnswerIfValid() {
appendResults(for: itemGroup)
}
}

if hasChanges {
self.taskPath.appendStepHistory(with: stepResult)
}
Expand Down
2 changes: 1 addition & 1 deletion Research/Research/RSDInputFieldObject.swift
Expand Up @@ -69,7 +69,7 @@ open class RSDInputFieldObject : RSDSurveyInputField, RSDMutableInputField, RSDC
open var range: RSDRange?

/// A Boolean value indicating whether the user can skip the input field without providing an answer.
open var isOptional: Bool = false
open var isOptional: Bool = true

/// A list of survey rules associated with this input field.
open var surveyRules: [RSDSurveyRule]?
Expand Down
22 changes: 22 additions & 0 deletions Research/Research/RSDInputFieldTableItemGroup.swift
Expand Up @@ -105,6 +105,28 @@ open class RSDInputFieldTableItemGroup : RSDTableItemGroup {
try textItem.setAnswer(newValue)
}

/// Set the default answer for the item group. The base class implementation does nothing.
/// - returns: `true` if the answer was updated and `false` if the answer was unchanged.
open func setDefaultAnswerIfValid() -> Bool {
// At this level, only the "date" has a default value.
guard self.items.count == 1,
let textItem = self.items.first as? RSDTextInputTableItem,
textItem.answer == nil,
let defaultDate = (textItem.pickerSource as? RSDDatePickerDataSource)?.defaultDate
else {
return false
}

do {
try textItem.setAnswer(defaultDate)
return true
}
catch let err {
debugPrint("Failed to set the default answer: \(err)")
return false
}
}

/// Set the new answer value from a previous result. This will throw an error if the result isn't valid.
/// Otherwise, it will set the answer.
/// - parameter result: The result that *may* have a previous answer.
Expand Down
2 changes: 1 addition & 1 deletion Research/Research/RSDTableItemGroup.swift
Expand Up @@ -51,7 +51,7 @@ open class RSDTableItemGroup {

/// Determine if the current answer is valid. Also checks the case where answer is required but one has not
/// been provided.
public var isAnswerValid: Bool {
open var isAnswerValid: Bool {
return true
}

Expand Down

0 comments on commit 473d535

Please sign in to comment.