Merge branch 'feature/fix_form_rules' into 'develop'
iterate throw all rules See merge request BPHV_MIPS/mvm_core_ui!698
This commit is contained in:
commit
fb053a7e29
@ -96,8 +96,13 @@ import MVMCore
|
|||||||
public func validateGroup(_ group: FormGroupRule) -> Bool {
|
public func validateGroup(_ group: FormGroupRule) -> Bool {
|
||||||
// Validate each rule.
|
// Validate each rule.
|
||||||
var valid = true
|
var valid = true
|
||||||
|
var previousValidity: [String: Bool] = [:]
|
||||||
for rule in group.rules {
|
for rule in group.rules {
|
||||||
valid = valid && rule.validate(fields)
|
let tuple = rule.validate(fields, previousValidity)
|
||||||
|
let isValidRule = tuple.valid
|
||||||
|
let returnedValidity = tuple.fieldValidity
|
||||||
|
previousValidity = previousValidity.merging(returnedValidity) { (_, new) in new }
|
||||||
|
valid = valid && isValidRule
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify the group watchers of validity.
|
// Notify the group watchers of validity.
|
||||||
|
|||||||
@ -36,15 +36,23 @@ public class RuleAnyRequiredModel: RulesProtocol {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
public func validate(_ fieldMolecules: [String: FormFieldProtocol]) -> Bool {
|
public func validate(_ fieldMolecules: [String: FormFieldProtocol],_ previousFieldValidity: [String: Bool]) -> (valid: Bool, fieldValidity: [String: Bool]) {
|
||||||
|
|
||||||
|
var previousValidity: [String: Bool] = [:]
|
||||||
for formKey in fields {
|
for formKey in fields {
|
||||||
guard let formField = fieldMolecules[formKey] else { continue }
|
guard let formField = fieldMolecules[formKey] else { continue }
|
||||||
|
|
||||||
if isValid(formField) {
|
var fieldValidity = isValid(formField)
|
||||||
return true
|
// If past rule is invalid for a field, the current rule should not flip the validity of a field
|
||||||
|
if let validity = previousFieldValidity[formKey], !validity, fieldValidity {
|
||||||
|
fieldValidity = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if fieldValidity {
|
||||||
|
return (fieldValidity, previousValidity)
|
||||||
|
}
|
||||||
|
previousValidity[formKey] = false
|
||||||
}
|
}
|
||||||
return false
|
return (valid: false, fieldValidity: previousValidity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,13 +27,21 @@ public class RuleAnyValueChangedModel: RulesProtocol {
|
|||||||
return formField.baseValue != formField.formFieldValue()
|
return formField.baseValue != formField.formFieldValue()
|
||||||
}
|
}
|
||||||
|
|
||||||
public func validate(_ fieldMolecules: [String: FormFieldProtocol]) -> Bool {
|
public func validate(_ fieldMolecules: [String: FormFieldProtocol],_ previousFieldValidity: [String: Bool]) -> (valid: Bool, fieldValidity: [String: Bool]) {
|
||||||
|
var previousValidity: [String: Bool] = [:]
|
||||||
for formKey in fields {
|
for formKey in fields {
|
||||||
guard let formField = fieldMolecules[formKey] else { continue }
|
guard let formField = fieldMolecules[formKey] else { continue }
|
||||||
if isValid(formField) {
|
var fieldValidity = isValid(formField)
|
||||||
return true
|
// If past rule is invalid forr a field, the current rule should not flip the validity of a field
|
||||||
|
if let validity = previousFieldValidity[formKey], !validity, fieldValidity {
|
||||||
|
fieldValidity = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if fieldValidity {
|
||||||
|
return (true, previousValidity)
|
||||||
|
}
|
||||||
|
previousValidity[formKey] = false
|
||||||
}
|
}
|
||||||
return false
|
return (valid: false, fieldValidity: previousValidity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,10 +27,11 @@ public class RuleEqualsIgnoreCaseModel: RulesProtocol {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
public func validate(_ fieldMolecules: [String: FormFieldProtocol]) -> Bool {
|
public func validate(_ fieldMolecules: [String: FormFieldProtocol],_ previousFieldValidity: [String: Bool]) -> (valid: Bool, fieldValidity: [String: Bool]) {
|
||||||
var valid = false
|
var valid = false
|
||||||
var compareText: String?
|
var compareText: String?
|
||||||
|
|
||||||
|
var previousValidity: [String: Bool] = [:]
|
||||||
for formKey in fields {
|
for formKey in fields {
|
||||||
guard let formField = fieldMolecules[formKey] else { continue }
|
guard let formField = fieldMolecules[formKey] else { continue }
|
||||||
|
|
||||||
@ -42,6 +43,13 @@ public class RuleEqualsIgnoreCaseModel: RulesProtocol {
|
|||||||
if let fieldValue = formField.formFieldValue() as? String,
|
if let fieldValue = formField.formFieldValue() as? String,
|
||||||
compareString.caseInsensitiveCompare(fieldValue) == .orderedSame {
|
compareString.caseInsensitiveCompare(fieldValue) == .orderedSame {
|
||||||
valid = true
|
valid = true
|
||||||
|
|
||||||
|
var fieldValidity = valid
|
||||||
|
// If past rule is invalid for a field, the current rule should not flip the validity of a field
|
||||||
|
if let validity = previousFieldValidity[formKey], !validity, fieldValidity {
|
||||||
|
fieldValidity = false
|
||||||
|
}
|
||||||
|
|
||||||
for formKey in fields {
|
for formKey in fields {
|
||||||
guard let formField = fieldMolecules[formKey] else { continue }
|
guard let formField = fieldMolecules[formKey] else { continue }
|
||||||
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(true, rule: self)
|
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(true, rule: self)
|
||||||
@ -49,9 +57,9 @@ public class RuleEqualsIgnoreCaseModel: RulesProtocol {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
previousValidity[formKey] = valid
|
||||||
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self)
|
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self)
|
||||||
}
|
}
|
||||||
|
return (valid: valid, fieldValidity: previousValidity)
|
||||||
return valid
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,9 +27,10 @@ public class RuleEqualsModel: RulesProtocol {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
public func validate(_ fieldMolecules: [String: FormFieldProtocol]) -> Bool {
|
public func validate(_ fieldMolecules: [String: FormFieldProtocol],_ previousFieldValidity: [String: Bool]) -> (valid: Bool, fieldValidity: [String: Bool]) {
|
||||||
var valid = true
|
var valid = true
|
||||||
var compareValue: AnyHashable?
|
var compareValue: AnyHashable?
|
||||||
|
var previousValidity: [String: Bool] = [:]
|
||||||
|
|
||||||
for formKey in fields {
|
for formKey in fields {
|
||||||
guard let formField = fieldMolecules[formKey] else { continue }
|
guard let formField = fieldMolecules[formKey] else { continue }
|
||||||
@ -41,13 +42,18 @@ public class RuleEqualsModel: RulesProtocol {
|
|||||||
|
|
||||||
if compareValue != formField.formFieldValue() {
|
if compareValue != formField.formFieldValue() {
|
||||||
valid = false
|
valid = false
|
||||||
|
previousValidity[formKey] = valid
|
||||||
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self)
|
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self)
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self)
|
var fieldValidity = valid
|
||||||
|
// If past rule is invalid for a field, the current rule should not flip the validity of a field
|
||||||
|
if let validity = previousFieldValidity[formKey], !validity, fieldValidity {
|
||||||
|
fieldValidity = false
|
||||||
|
}
|
||||||
|
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(fieldValidity, rule: self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return (valid: valid, fieldValidity: previousValidity)
|
||||||
return valid
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@ public protocol RulesProtocol: ModelProtocol {
|
|||||||
func isValid(_ formField: FormFieldProtocol) -> Bool
|
func isValid(_ formField: FormFieldProtocol) -> Bool
|
||||||
|
|
||||||
// Validates the rule and returns the result.
|
// Validates the rule and returns the result.
|
||||||
func validate(_ fieldMolecules: [String: FormFieldProtocol]) -> Bool
|
func validate(_ fieldMolecules: [String: FormFieldProtocol],_ previousFieldValidity: [String: Bool]) -> (valid: Bool, fieldValidity: [String: Bool])
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension RulesProtocol {
|
public extension RulesProtocol {
|
||||||
@ -38,14 +38,21 @@ public extension RulesProtocol {
|
|||||||
static var categoryName: String { "\(RulesProtocol.self)" }
|
static var categoryName: String { "\(RulesProtocol.self)" }
|
||||||
|
|
||||||
// Individual rule can override the function to validate based on the rule type.
|
// Individual rule can override the function to validate based on the rule type.
|
||||||
func validate(_ fieldMolecules: [String: FormFieldProtocol]) -> Bool {
|
func validate(_ fieldMolecules: [String: FormFieldProtocol],_ previousFieldValidity: [String: Bool]) -> (valid: Bool, fieldValidity: [String: Bool]) {
|
||||||
var valid = true
|
var valid = true
|
||||||
for formKey in fields {
|
var previousValidity: [String: Bool] = [:]
|
||||||
guard let formField = fieldMolecules[formKey] else { continue }
|
for formKey in fields {
|
||||||
let fieldValidity = isValid(formField)
|
guard let formField = fieldMolecules[formKey] else { continue }
|
||||||
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(fieldValidity, rule: self)
|
|
||||||
valid = valid && fieldValidity
|
var fieldValidity = isValid(formField)
|
||||||
}
|
// If past rule is invalid for a field, the current rule should not flip the validity of a field
|
||||||
return valid
|
if let validity = previousFieldValidity[formKey], !validity, fieldValidity {
|
||||||
|
fieldValidity = false
|
||||||
|
}
|
||||||
|
(formField as? FormRuleWatcherFieldProtocol)?.setValidity(fieldValidity, rule: self)
|
||||||
|
valid = valid && fieldValidity
|
||||||
|
previousValidity[formKey] = fieldValidity
|
||||||
|
}
|
||||||
|
return (valid: valid, fieldValidity: previousValidity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user