From ac86d925744f00116021e0c511227781cf1fb8ba Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 15 May 2020 09:03:57 -0400 Subject: [PATCH 1/7] No Validate on Emoty --- .../Atomic/Atoms/TextFields/TextEntryField.swift | 2 ++ .../Atoms/TextFields/TextViewEntryField.swift | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 9d7c8927..41254355 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -259,6 +259,7 @@ import UIKit observingTextFieldDelegate?.isInvalid?(textfield: self) } } + /// Executes on UITextField.textDidBeginEditingNotification @objc func startEditing() { isSelected = true @@ -278,6 +279,7 @@ import UIKit // Don't show error till user starts typing. guard text?.count ?? 0 != 0 else { + showError = false return } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift index 546b5c30..35e25075 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift @@ -71,7 +71,7 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele /// The text of this textView. open override var text: String? { - get { return textView.text } + get { return textViewEntryFieldModel?.text } set { textView.text = newValue textViewEntryFieldModel?.text = newValue @@ -207,8 +207,19 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele /// Executes on UITextView.textDidEndEditingNotification @objc func endInputing() { - resignFirstResponder() isSelected = false + resignFirstResponder() + + // Don't show error till user starts typing. + guard text?.count ?? 0 != 0 else { + showError = false + return + } + + if let isValid = (model as? TextEntryFieldModel)?.isValid { + self.isValid = isValid + } + showError = !isValid } From 868836b96312a52720aabd7ea3ee0d0df314b705 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 15 May 2020 09:10:16 -0400 Subject: [PATCH 2/7] changes to prevent validation on no text. --- MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift | 3 ++- MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 41254355..5b131fe6 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -283,9 +283,10 @@ import UIKit return } - if let isValid = (model as? TextEntryFieldModel)?.isValid { + if let isValid = textEntryFieldModel?.isValid { self.isValid = isValid } + shouldShowError(!isValid) } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift index 35e25075..9cbf2c57 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift @@ -216,7 +216,7 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele return } - if let isValid = (model as? TextEntryFieldModel)?.isValid { + if let isValid = textViewEntryFieldModel?.isValid { self.isValid = isValid } From fb7760a329f05d56455d0346dc85210f7ae2ba7c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 15 May 2020 10:55:46 -0400 Subject: [PATCH 3/7] moving validator to parent --- .../Atomic/Atoms/TextFields/EntryField.swift | 29 +++++++++++++++++++ .../Atoms/TextFields/TextEntryField.swift | 22 ++++---------- .../Atoms/TextFields/TextViewEntryField.swift | 22 ++++---------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift index e54cb80f..3a5084c6 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift @@ -49,6 +49,9 @@ import UIKit public var isValid: Bool = false + /// Validate on each entry in the textField. Default: true + public var validateEachCharacter: Bool = true + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -229,6 +232,32 @@ import UIKit entryFieldContainer.updateView(size) } + //-------------------------------------------------- + // MARK: - Validation + //-------------------------------------------------- + + /// Executes on .textDidBeginEditingNotification + @objc func startEditing() { + isSelected = true + } + + /// Executes on .textDidChangeNotification (each character entry) + @objc func valueChanged() { + guard validateEachCharacter else { return } + } + + /// Executes on .textDidEndEditingNotification + @objc func endInputing() { + isSelected = false + resignFirstResponder() + + // Don't show error till user starts typing. + guard text?.count ?? 0 != 0 else { + showError = false + return + } + } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 5b131fe6..969fdfd4 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -51,9 +51,6 @@ import UIKit private var observingForChange: Bool = false - /// Validate on each entry in the textField. Default: true - public var validateEachCharacter: Bool = true - /// Validate when user resigns editing. Default: true public var validateWhenDoneEditing: Bool = true @@ -261,27 +258,20 @@ import UIKit } /// Executes on UITextField.textDidBeginEditingNotification - @objc func startEditing() { - isSelected = true + @objc override func startEditing() { + super.startEditing() textField.becomeFirstResponder() } /// Executes on UITextField.textDidChangeNotification (each character entry) - @objc func valueChanged() { - guard validateEachCharacter else { return } - isSelected = true + @objc override func valueChanged() { + super.valueChanged() validateTextField() } /// Executes on UITextField.textDidEndEditingNotification - @objc func endInputing() { - resignFirstResponder() - - // Don't show error till user starts typing. - guard text?.count ?? 0 != 0 else { - showError = false - return - } + @objc override func endInputing() { + super.endInputing() if let isValid = textEntryFieldModel?.isValid { self.isValid = isValid diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift index 9cbf2c57..4331701c 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift @@ -24,9 +24,6 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele // MARK: - Properties //-------------------------------------------------- - /// Validate on each entry in the textView. Default: true - public var validateEachCharacter: Bool = true - private var observingForChange: Bool = false //-------------------------------------------------- @@ -194,27 +191,20 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele } /// Executes on UITextView.textDidBeginEditingNotification - @objc func startEditing() { - isSelected = true + @objc override func startEditing() { + super.startEditing() _ = textView.becomeFirstResponder() } /// Executes on UITextView.textDidChangeNotification (each character entry) - @objc func valueChanged() { - guard validateEachCharacter else { return } + @objc override func valueChanged() { + super.valueChanged() validateTextView() } /// Executes on UITextView.textDidEndEditingNotification - @objc func endInputing() { - isSelected = false - resignFirstResponder() - - // Don't show error till user starts typing. - guard text?.count ?? 0 != 0 else { - showError = false - return - } + @objc override func endInputing() { + super.endInputing() if let isValid = textViewEntryFieldModel?.isValid { self.isValid = isValid From ad4dfcf74819e888f98cde848a273c1a011a5cdb Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 15 May 2020 12:20:39 -0400 Subject: [PATCH 4/7] further changes to orbservation --- MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift | 6 ------ MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift | 6 ++++++ MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift | 6 ++++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift index 3a5084c6..499fe5a8 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift @@ -250,12 +250,6 @@ import UIKit @objc func endInputing() { isSelected = false resignFirstResponder() - - // Don't show error till user starts typing. - guard text?.count ?? 0 != 0 else { - showError = false - return - } } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 969fdfd4..63ba9e71 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -272,6 +272,12 @@ import UIKit /// Executes on UITextField.textDidEndEditingNotification @objc override func endInputing() { super.endInputing() + + // Don't show error till user starts typing. + guard text?.count ?? 0 != 0 else { + showError = false + return + } if let isValid = textEntryFieldModel?.isValid { self.isValid = isValid diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift index 4331701c..cb8e2cae 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift @@ -206,6 +206,12 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele @objc override func endInputing() { super.endInputing() + // Don't show error till user starts typing. + guard text?.count ?? 0 != 0 else { + showError = false + return + } + if let isValid = textViewEntryFieldModel?.isValid { self.isValid = isValid } From 6a9957d34827516d0cda4277989d546c1720ca4a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 15 May 2020 13:56:57 -0400 Subject: [PATCH 5/7] moved code to parent --- MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift | 4 ++-- MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift | 7 +++++++ MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift | 8 ++++---- .../Atomic/Atoms/TextFields/TextViewEntryField.swift | 8 +++----- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift index 628c7cde..18f61b2d 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift @@ -322,7 +322,7 @@ import UIKit @objc override open func resignFirstResponder() -> Bool { if validateWhenDoneEditing { - validateTextField() + validateText() } selectedDigitBox?.isSelected = false @@ -440,7 +440,7 @@ extension DigitEntryField { selectedDigitBox = nil if !switchFieldsAutomatically && validateWhenDoneEditing { - validateTextField() + validateText() } proprietorTextDelegate?.textFieldDidEndEditing?(textField) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift index 499fe5a8..41fec6bb 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift @@ -236,6 +236,13 @@ import UIKit // MARK: - Validation //-------------------------------------------------- + /// Validates the text of the entry field. + @objc public func validateText() { + if let isValid = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) { + self.isValid = isValid + } + } + /// Executes on .textDidBeginEditingNotification @objc func startEditing() { isSelected = true diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 63ba9e71..e849fc2f 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -223,7 +223,7 @@ import UIKit @discardableResult @objc override open func resignFirstResponder() -> Bool { if validateWhenDoneEditing { - validateTextField() + validateText() } textField.resignFirstResponder() isSelected = false @@ -231,9 +231,9 @@ import UIKit } /// Validates the text of the entry field. - @objc public func validateTextField() { + @objc public override func validateText() { text = textField.text - _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) + super.validateText() } @objc public func updateValidation(_ isValid: Bool) { @@ -266,7 +266,7 @@ import UIKit /// Executes on UITextField.textDidChangeNotification (each character entry) @objc override func valueChanged() { super.valueChanged() - validateTextField() + validateText() } /// Executes on UITextField.textDidEndEditingNotification diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift index cb8e2cae..e08f3843 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift @@ -183,11 +183,9 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele //-------------------------------------------------- /// Validates the text of the entry field. - @objc public func validateTextView() { + @objc public override func validateText() { text = textView.text - if let isValid = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) { - self.isValid = isValid - } + super.validateText() } /// Executes on UITextView.textDidBeginEditingNotification @@ -199,7 +197,7 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele /// Executes on UITextView.textDidChangeNotification (each character entry) @objc override func valueChanged() { super.valueChanged() - validateTextView() + validateText() } /// Executes on UITextView.textDidEndEditingNotification From f8025eb67add0e09757f0c4c1a7248fce594d946 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 18 May 2020 12:27:11 -0400 Subject: [PATCH 6/7] more room for validation --- .../Atomic/Atoms/TextFields/EntryField.swift | 27 ++++++++++++ .../Atoms/TextFields/EntryFieldModel.swift | 7 ++-- .../Atoms/TextFields/TextEntryField.swift | 41 +++++-------------- .../Atoms/TextFields/TextViewEntryField.swift | 4 ++ .../Rules/RuleEqualsIgnoreCaseModel.swift | 5 +++ 5 files changed, 50 insertions(+), 34 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift index 41fec6bb..65b13861 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift @@ -259,6 +259,21 @@ import UIKit resignFirstResponder() } + @objc public func updateValidation(_ isValid: Bool) { + let previousValidity = self.isValid + self.isValid = isValid + + if previousValidity && !isValid { + shouldShowError(true) + } else if (!previousValidity && isValid) { + shouldShowError(false) + } + } + + func shouldShowError(_ showError: Bool) { + self.showError = showError + } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- @@ -285,6 +300,18 @@ import UIKit entryFieldContainer.set(with: model, delegateObject, additionalData) + model.updateUI = { [weak self] in + MVMCoreDispatchUtility.performBlock(onMainThread: { + guard let self = self else { return } + + if self.isSelected { + self.updateValidation(model.isValid ?? true) + } else if model.isValid ?? true && self.showError { + self.showError = false + } + }) + } + title = model.title feedback = model.feedback isEnabled = model.enabled diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift index 1d6e9221..dd2a3c62 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift @@ -71,12 +71,13 @@ import Foundation } public func setValidity(_ valid: Bool, rule: RulesProtocol) { - if let fieldKey = fieldKey, - let ruleErrorMessage = rule.errorMessage?[fieldKey] { + + if let fieldKey = fieldKey, let ruleErrorMessage = rule.errorMessage?[fieldKey] { self.errorMessage = ruleErrorMessage } + self.isValid = valid - + updateUI?() } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index e849fc2f..2daee169 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -236,27 +236,6 @@ import UIKit super.validateText() } - @objc public func updateValidation(_ isValid: Bool) { - let previousValidity = self.isValid - self.isValid = isValid - - if previousValidity && !isValid { - shouldShowError(true) - } else if (!previousValidity && isValid) { - shouldShowError(false) - } - } - - func shouldShowError(_ showError: Bool) { - self.showError = showError - if showError { - observingTextFieldDelegate?.isValid?(textfield: self) - entryFieldContainer.originalUI() - } else { - observingTextFieldDelegate?.isInvalid?(textfield: self) - } - } - /// Executes on UITextField.textDidBeginEditingNotification @objc override func startEditing() { super.startEditing() @@ -310,6 +289,16 @@ import UIKit } } + override func shouldShowError(_ showError: Bool) { + super.shouldShowError(showError) + + if showError { + observingTextFieldDelegate?.isValid?(textfield: self) + } else { + observingTextFieldDelegate?.isInvalid?(textfield: self) + } + } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- @@ -319,16 +308,6 @@ import UIKit guard let model = model as? TextEntryFieldModel else { return } - model.updateUI = { [weak self] in - MVMCoreDispatchUtility.performBlock(onMainThread: { - guard let self = self else { return } - - if self.isSelected { - self.updateValidation(model.isValid ?? true) - } - }) - } - self.delegateObject = delegateObject FormValidator.setupValidation(for: model, delegate: delegateObject?.formHolderDelegate) text = model.text diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift index e08f3843..0556245d 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift @@ -217,6 +217,10 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele showError = !isValid } + override func shouldShowError(_ showError: Bool) { + super.shouldShowError(showError) + } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- diff --git a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsIgnoreCaseModel.swift b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsIgnoreCaseModel.swift index 0bdd7ca3..5e014cff 100644 --- a/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsIgnoreCaseModel.swift +++ b/MVMCoreUI/FormUIHelpers/Rules/Rules/RuleEqualsIgnoreCaseModel.swift @@ -42,6 +42,11 @@ public class RuleEqualsIgnoreCaseModel: RulesProtocol { if let fieldValue = formField.formFieldValue() as? String, compareString.caseInsensitiveCompare(fieldValue) == .orderedSame { valid = true + for formKey in fields { + guard let formField = fieldMolecules[formKey] else { continue } + (formField as? FormRuleWatcherFieldProtocol)?.setValidity(true, rule: self) + } + break } (formField as? FormRuleWatcherFieldProtocol)?.setValidity(valid, rule: self) From d4fd6d8415433176f48f5fedbc6afa051b6fce77 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 18 May 2020 15:32:56 -0400 Subject: [PATCH 7/7] removed unneeded func --- MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift index 0556245d..e08f3843 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift @@ -217,10 +217,6 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele showError = !isValid } - override func shouldShowError(_ showError: Bool) { - super.shouldShowError(showError) - } - //-------------------------------------------------- // MARK: - MoleculeViewProtocol //--------------------------------------------------