From 69799be944224d41f3325ed81a4df2d0b41d82df Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 19 Jan 2022 10:38:23 -0600 Subject: [PATCH] reverse order of method to do FormFieldEffects first, then validation. This is so the validation only runs 1 time instead of 2 times which could cause UI issues. Signed-off-by: Matt Bruce --- MVMCoreUI/FormUIHelpers/FormValidator.swift | 45 +++++++++------------ 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/MVMCoreUI/FormUIHelpers/FormValidator.swift b/MVMCoreUI/FormUIHelpers/FormValidator.swift index 4a1d36c7..42c385e8 100644 --- a/MVMCoreUI/FormUIHelpers/FormValidator.swift +++ b/MVMCoreUI/FormUIHelpers/FormValidator.swift @@ -111,22 +111,6 @@ import MVMCore /// - counter: keeps track of how many times causes another group validation /// - Returns: validity for the FormGroupRule.rules public func validateGroup(_ group: FormGroupRule, counter: Int = 0) throws -> Bool { - let tuple = group.validate(fields) - - group.rules.forEach { rule in - for formKey in rule.fields { - guard let formField = fields[formKey] as? FormRuleWatcherFieldProtocol, - let fieldValidity = tuple.fieldValidity[formKey] else { continue } - formField.setValidity(fieldValidity, rule: rule) - } - } - - // Notify the group watchers of validity. - for watcher in groupWatchers.filter({$0.groupName == group.groupName}) { - watcher.setValidity(tuple.valid) - } - - var ruleChange = false //loop the effects group.effects?.forEach({ effect in @@ -140,24 +124,30 @@ import MVMCore //update the group form rules if let ruleIds = effect.activatedRuleIds { - let didChange = self.updateRules(for: group, with: effectTuple.valid, for: effect.fieldKey, and: ruleIds) - if(didChange) { - ruleChange = didChange - } + self.updateRules(for: group, with: effectTuple.valid, for: effect.fieldKey, and: ruleIds) } } }) - if ruleChange { - if counter > 3 { - throw ValidationError.other(error: "Effect caused validation loop error") - } else { - return try self.validateGroup(group, counter: counter + 1) + //validate the form + let tuple = group.validate(fields) + + //set the validity for the fields + group.rules.forEach { rule in + for formKey in rule.fields { + guard let formField = fields[formKey] as? FormRuleWatcherFieldProtocol, + let fieldValidity = tuple.fieldValidity[formKey] else { continue } + formField.setValidity(fieldValidity, rule: rule) } - } else { - return tuple.valid } + // Notify the group watchers of validity. + for watcher in groupWatchers.filter({$0.groupName == group.groupName}) { + watcher.setValidity(tuple.valid) + } + + return tuple.valid + } /// Updates the Fields in which a specific rule within a FormGroupRule validates against. @@ -166,6 +156,7 @@ import MVMCore /// - validity: If you the fieldKey should be added or removed from a rule /// - fieldKey: FieldKey that will be added or removed from a rule /// - ruleIds: Array of ruleIds to add or remove the fieldKey into the rule.fields property + @discardableResult public func updateRules(for group: FormGroupRule, with validity: Bool, for fieldKey: String, and ruleIds: [String]) -> Bool{ //update the group rules based on the validation of this rule to show/hide var ruleChange = false