From 89c62040031c79421b912d1a798a74576f35ef13 Mon Sep 17 00:00:00 2001 From: "Suresh, Kamlesh" Date: Tue, 5 May 2020 20:20:50 -0400 Subject: [PATCH 1/6] show error on end editing --- .../Atoms/TextFields/TextEntryField.swift | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 894fadd4..0558fda5 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -244,14 +244,21 @@ import UIKit self.isValid = isValid if previousValidity && !isValid { - showError = true - observingTextFieldDelegate?.isInvalid?(textfield: self) + shouldShowError(true) } else if (!previousValidity && isValid) { - showError = false - observingTextFieldDelegate?.isValid?(textfield: self) + shouldShowError(false) + } + } + + func shouldShowError(_ showError: Bool) { + self.showError = showError + if showError { + observingTextFieldDelegate?.isValid?(textfield: self) + entryFieldContainer.bottomBar?.backgroundColor = UIColor.mvmBlack.cgColor + } else { + observingTextFieldDelegate?.isInvalid?(textfield: self) } } - /// Executes on UITextField.textDidBeginEditingNotification @objc func startEditing() { isSelected = true @@ -268,10 +275,16 @@ import UIKit /// Executes on UITextField.textDidEndEditingNotification @objc func endInputing() { resignFirstResponder() - if isValid { - showError = false - entryFieldContainer.bottomBar?.backgroundColor = UIColor.mvmBlack.cgColor + + // If user did not enter text int ethe field dont show error yet. + if text?.count ?? 0 == 0{ + return } + + if let isValid = (model as? TextEntryFieldModel)?.isValid { + self.isValid = isValid + } + shouldShowError(!isValid) } @objc public func dismissFieldInput(_ sender: Any?) { From 33c1c3f70e0851babd0c82dc48e3bf33f4b6244d Mon Sep 17 00:00:00 2001 From: "Suresh, Kamlesh" Date: Wed, 6 May 2020 12:16:33 -0400 Subject: [PATCH 2/6] rules error handling --- .../Atoms/TextFields/EntryFieldModel.swift | 5 ++- .../Rules/RuleAllValueChangedModel.swift | 1 + .../Rules/Rules/RuleAnyRequiredModel.swift | 1 + .../Rules/RuleAnyValueChangedModel.swift | 1 + .../Rules/Rules/RuleEqualsModel.swift | 36 ++++++++++--------- .../Rules/Rules/RuleRegexModel.swift | 1 + .../Rules/Rules/RuleRequiredModel.swift | 1 + .../Rules/Rules/RulesProtocol.swift | 8 ++++- 8 files changed, 35 insertions(+), 19 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift index f7886848..dcccddda 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift @@ -67,7 +67,10 @@ import Foundation } public func setValidity(_ valid: Bool, rule: RulesProtocol) { - self.isValid = valid + if let fieldKey = fieldKey { + self.errorMessage = rule.errorMessage?[fieldKey] + self.isValid = valid + } } //-------------------------------------------------- diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAllValueChangedModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAllValueChangedModel.swift index 1f50bcc7..aa80f5b0 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAllValueChangedModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAllValueChangedModel.swift @@ -15,6 +15,7 @@ public class RuleAllValueChangedModel: RulesProtocol { public static var identifier: String = "allValueChanged" public var type: String = RuleAllValueChangedModel.identifier + public var errorMessage: [String: String]? public var fields: [String] //-------------------------------------------------- diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyRequiredModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyRequiredModel.swift index 6ca905bf..7f153e83 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyRequiredModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyRequiredModel.swift @@ -17,6 +17,7 @@ public class RuleAnyRequiredModel: RulesProtocol { public static var identifier: String = "anyRequired" public var type: String = RuleRequiredModel.identifier public var fields: [String] + public var errorMessage: [String: String]? //-------------------------------------------------- // MARK: - Methods diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyValueChangedModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyValueChangedModel.swift index 450fdb2a..07cf451f 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyValueChangedModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleAnyValueChangedModel.swift @@ -16,6 +16,7 @@ public class RuleAnyValueChangedModel: RulesProtocol { public static var identifier: String = "anyValueChanged" public var type: String = RuleAnyValueChangedModel.identifier + public var errorMessage: [String: String]? public var fields: [String] //-------------------------------------------------- diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift index fb7585f2..9c5c3837 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift @@ -17,6 +17,7 @@ public class RuleEqualsModel: RulesProtocol { public static var identifier: String = "equals" public var type: String = RuleEqualsModel.identifier public var fields: [String] + public var errorMessage: [String: String]? //-------------------------------------------------- // MARK: - Validation @@ -27,23 +28,24 @@ public class RuleEqualsModel: RulesProtocol { } public func validate(_ fieldMolecules: [String: FormFieldProtocol]) -> Bool { - var valid = true - var compareValue: AnyHashable? - - for formKey in fields { - guard let formField = fieldMolecules[formKey] else { continue } + var valid = true + var compareValue: AnyHashable? - if compareValue == nil { - compareValue = formField.formFieldValue() - continue - } - - if compareValue != formField.formFieldValue() { - valid = false - break - } - } - - return valid + for formKey in fields { + guard let formField = fieldMolecules[formKey] else { continue } + + if compareValue == nil { + compareValue = formField.formFieldValue() + continue + } + + if compareValue != formField.formFieldValue() { + valid = false + (formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self) + break + } + } + + return valid } } diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRegexModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRegexModel.swift index 68eea7e5..5f60a61b 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRegexModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRegexModel.swift @@ -18,6 +18,7 @@ public class RuleRegexModel: RulesProtocol { public var type: String = RuleRegexModel.identifier public var fields: [String] public var regex: String + public var errorMessage: [String: String]? //-------------------------------------------------- // MARK: - Properties diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRequiredModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRequiredModel.swift index b34a24df..c9e7d9f7 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRequiredModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleRequiredModel.swift @@ -16,6 +16,7 @@ public class RuleRequiredModel: RulesProtocol { public static var identifier: String = "allRequired" public var type: String = RuleRequiredModel.identifier + public var errorMessage: [String: String]? public var fields: [String] //-------------------------------------------------- diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift index 305b4c35..a2906411 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift @@ -16,7 +16,9 @@ public enum RulesCodingKey: String, CodingKey { public protocol RulesProtocol: ModelProtocol { // The type of rule var type: String { get } - + + var errorMessage: [String: String]? { get } + // The fields that this rule applies to. var fields: [String] { get set } @@ -33,6 +35,10 @@ public extension RulesProtocol { get { return Self.identifier } } +// var errorMessage: String? { +// return nil +// } + static var categoryCodingKey: String { return "type" } From faf70f555231fb4799f7469d6f486faa3e6be81b Mon Sep 17 00:00:00 2001 From: "Suresh, Kamlesh" Date: Wed, 6 May 2020 12:23:22 -0400 Subject: [PATCH 3/6] error --- .../Atomic/Atoms/TextFields/EntryFieldModel.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift index dcccddda..fc78613b 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift @@ -67,10 +67,12 @@ import Foundation } public func setValidity(_ valid: Bool, rule: RulesProtocol) { - if let fieldKey = fieldKey { - self.errorMessage = rule.errorMessage?[fieldKey] - self.isValid = valid - } + if let fieldKey = fieldKey, + let ruleErrorMessage = rule.errorMessage?[fieldKey] { + self.errorMessage = ruleErrorMessage + } + self.isValid = valid + } //-------------------------------------------------- From 0a79905ef2f1813bf83625c1506f58a96f7af490 Mon Sep 17 00:00:00 2001 From: "Suresh, Kamlesh" Date: Wed, 6 May 2020 12:31:04 -0400 Subject: [PATCH 4/6] remove comment --- MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift index a2906411..7392ea8f 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RulesProtocol.swift @@ -35,10 +35,6 @@ public extension RulesProtocol { get { return Self.identifier } } -// var errorMessage: String? { -// return nil -// } - static var categoryCodingKey: String { return "type" } From 1ea6f9a3b71e1f72d2fa85825d9ed1f157a0d84a Mon Sep 17 00:00:00 2001 From: "Suresh, Kamlesh" Date: Thu, 7 May 2020 20:34:38 -0400 Subject: [PATCH 5/6] fix --- .../Rules/Rules/RuleEqualsModel.swift | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift index 9c5c3837..fa73ed51 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsModel.swift @@ -31,20 +31,22 @@ public class RuleEqualsModel: RulesProtocol { var valid = true var compareValue: AnyHashable? - for formKey in fields { - guard let formField = fieldMolecules[formKey] else { continue } + for formKey in fields { + guard let formField = fieldMolecules[formKey] else { continue } - if compareValue == nil { - compareValue = formField.formFieldValue() - continue - } + if compareValue == nil { + compareValue = formField.formFieldValue() + continue + } - if compareValue != formField.formFieldValue() { - valid = false - (formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self) - break - } - } + if compareValue != formField.formFieldValue() { + valid = false + (formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self) + break + } else { + (formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self) + } + } return valid } From 4fd654c3725a5a49edb486f6bf52daf7246353e9 Mon Sep 17 00:00:00 2001 From: "Suresh, Kamlesh" Date: Mon, 11 May 2020 20:05:51 -0400 Subject: [PATCH 6/6] code review --- MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 0558fda5..9d7c8927 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -254,7 +254,7 @@ import UIKit self.showError = showError if showError { observingTextFieldDelegate?.isValid?(textfield: self) - entryFieldContainer.bottomBar?.backgroundColor = UIColor.mvmBlack.cgColor + entryFieldContainer.originalUI() } else { observingTextFieldDelegate?.isInvalid?(textfield: self) } @@ -276,8 +276,8 @@ import UIKit @objc func endInputing() { resignFirstResponder() - // If user did not enter text int ethe field dont show error yet. - if text?.count ?? 0 == 0{ + // Don't show error till user starts typing. + guard text?.count ?? 0 != 0 else { return }