diff --git a/VDS/Components/TextFields/EntryFieldBase.swift b/VDS/Components/TextFields/EntryFieldBase.swift index ae91cc7a..5d8957fe 100644 --- a/VDS/Components/TextFields/EntryFieldBase.swift +++ b/VDS/Components/TextFields/EntryFieldBase.swift @@ -13,7 +13,7 @@ import Combine /// Base Class used to build out a Input controls. @objc(VDSEntryField) -open class EntryFieldBase: Control, Changeable, FormFieldable { +open class EntryFieldBase: Control, Changeable, FormFieldInternalValidatable { //-------------------------------------------------- // MARK: - Initializers @@ -153,8 +153,11 @@ open class EntryFieldBase: Control, Changeable, FormFieldable { /// Whether not to show the error. open var showError: Bool = false { didSet { setNeedsUpdate() } } + /// FormFieldValidator + internal var validator: (any FormFieldValidatorable)? + /// Whether or not to show the internal error - open internal(set) var hasInternalError: Bool = false { didSet { setNeedsUpdate() } } + open var hasInternalError: Bool { !(validator?.isValid ?? true) } /// Override UIControl state to add the .error state if showError is true. open override var state: UIControl.State { @@ -175,7 +178,7 @@ open class EntryFieldBase: Control, Changeable, FormFieldable { } } - internal var internalErrorText: String? { + open var internalErrorText: String? { didSet { updateContainerView() updateErrorLabel() @@ -200,19 +203,18 @@ open class EntryFieldBase: Control, Changeable, FormFieldable { open var inputId: String? { didSet { setNeedsUpdate() } } /// The text of this textField. - private var _value: AnyHashable? - open var value: AnyHashable? { + private var _value: String? + open var value: String? { get { _value } set { if let newValue, newValue != _value { _value = newValue - text = newValue as? String + text = newValue } setNeedsUpdate() } } - open var defaultValue: AnyHashable? { didSet { setNeedsUpdate() } } open var required: Bool = false { didSet { setNeedsUpdate() } } @@ -324,6 +326,8 @@ open class EntryFieldBase: Control, Changeable, FormFieldable { updateHelperLabel() backgroundColor = surface.color + validator?.validate() + internalErrorText = validator?.errorMessage } //-------------------------------------------------- diff --git a/VDS/Components/TextFields/InputField/InputField.swift b/VDS/Components/TextFields/InputField/InputField.swift index ac350bc1..ebd76525 100644 --- a/VDS/Components/TextFields/InputField/InputField.swift +++ b/VDS/Components/TextFields/InputField/InputField.swift @@ -89,7 +89,7 @@ open class InputField: EntryFieldBase, UITextFieldDelegate { setNeedsUpdate() } } - + var _showError: Bool = false /// Whether not to show the error. open override var showError: Bool { diff --git a/VDS/Components/TextFields/TextArea/TextArea.swift b/VDS/Components/TextFields/TextArea/TextArea.swift index d30c187f..b5fada0c 100644 --- a/VDS/Components/TextFields/TextArea/TextArea.swift +++ b/VDS/Components/TextFields/TextArea/TextArea.swift @@ -107,17 +107,19 @@ open class TextArea: EntryFieldBase { } /// The text of this textView + private var _text: String? open override var text: String? { get { textView.text } set { - if let newValue, newValue != text { + if let newValue, newValue != _text { + _text = newValue textView.text = newValue value = newValue } setNeedsUpdate() } } - + /// UITextView shown in the TextArea. open var textView = TextView().with { $0.translatesAutoresizingMaskIntoConstraints = false @@ -125,6 +127,8 @@ open class TextArea: EntryFieldBase { $0.isScrollEnabled = false } + open override var maxLength: Int? { willSet { countRule.maxLength = newValue }} + /// Color configuration for error icon. internal var iconColorConfiguration = ControlColorConfiguration().with { $0.setSurfaceColors(VDSColor.elementsPrimaryOnlight, VDSColor.elementsPrimaryOndark, forState: .normal) @@ -147,6 +151,7 @@ open class TextArea: EntryFieldBase { open override func setup() { super.setup() accessibilityLabel = "TextArea" + validator = FormFieldValidator