From 1f8cf7c4d03fa439f48e4dfac496bcd162849bbf Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 13 Apr 2020 16:28:02 -0400 Subject: [PATCH] EntryField updates --- .../TextFields/BaseDropdownEntryField.swift | 8 ++++- .../Atoms/TextFields/DigitEntryField.swift | 10 ++++++ .../Atomic/Atoms/TextFields/EntryField.swift | 16 ++++----- .../Atoms/TextFields/EntryFieldModel.swift | 4 ++- .../Atoms/TextFields/MdnEntryField.swift | 24 +++++++++++++- .../Atoms/TextFields/TextEntryField.swift | 31 +++--------------- .../alert_standard.imageset/Contents.json | 23 +++++++++++++ .../alert_standard @1x.png | Bin 0 -> 279 bytes .../alert_standard @2x.png | Bin 0 -> 525 bytes .../alert_standard @3x.png | Bin 0 -> 771 bytes 10 files changed, 76 insertions(+), 40 deletions(-) create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/Contents.json create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @1x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @2x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @3x.png diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryField.swift index bf1dbfab..f7083df5 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryField.swift @@ -64,7 +64,13 @@ import UIKit super.setupFieldContainerContent(container) container.addSubview(dropDownCaretView) - accessoryView = dropDownCaretView + + textFieldTrailingConstraint?.isActive = false + textFieldTrailingConstraint = dropDownCaretView.leadingAnchor.constraint(equalTo: textField.trailingAnchor, constant: 6) + textFieldTrailingConstraint?.isActive = true + + container.trailingAnchor.constraint(equalTo: dropDownCaretView.trailingAnchor, constant: 16).isActive = true + dropDownCaretView.centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true } public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift index 9d2c02cb..25900f27 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift @@ -76,6 +76,15 @@ import UIKit public var digitBoxes: [DigitBox] = [] private var selectedDigitBox: DigitBox? + public lazy var errorImage: UIImageView = { + let image = MVMCoreUIUtility.imageNamed("alert_standard") + let imageView = UIImageView(image: image) + imageView.translatesAutoresizingMaskIntoConstraints = false + imageView.heightAnchor.constraint(equalToConstant: 20).isActive = true + imageView.widthAnchor.constraint(equalToConstant: 20).isActive = true + return imageView + }() + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -205,6 +214,7 @@ import UIKit isAccessibilityElement = false entryFieldContainer.disableAllBorders = true + usesAccessoryView = false } @objc private func createDigitField() -> DigitBox { diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift index 8eb94f4e..23225a57 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift @@ -48,14 +48,6 @@ import UIKit //-------------------------------------------------- public var isValid: Bool = false - public var errorMessage: String? - public var standardMessage: String? { - didSet { - if !showError { - feedback = standardMessage - } - } - } //-------------------------------------------------- // MARK: - Computed Properties @@ -75,7 +67,7 @@ import UIKit public var showError: Bool { get { return entryFieldContainer.showError } set (error) { - self.feedback = error ? self.errorMessage : self.standardMessage + self.feedback = error ? entryFieldModel?.errorMessage : entryFieldModel?.informativeMessage self.entryFieldContainer.showError = error } } @@ -121,6 +113,10 @@ import UIKit } } + public var entryFieldModel: EntryFieldModel? { + return model as? EntryFieldModel + } + //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- @@ -242,6 +238,7 @@ import UIKit titleLabel.textColor = .mvmBlack feedbackLabel.font = Styler.Font.RegularMicro.getFont() feedbackLabel.textColor = .mvmBlack + feedbackLabel.text = nil entryFieldContainer.reset() } @@ -255,7 +252,6 @@ import UIKit title = model.title feedback = model.feedback - errorMessage = model.errorMessage isEnabled = model.enabled if let isLocked = model.locked { diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift index efd47e1d..1f0e3d78 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift @@ -22,7 +22,8 @@ import Foundation public var backgroundColor: Color? public var title: String = "" public var feedback: String? - public var errorMessage: String = "" + public var errorMessage: String? + public var informativeMessage: String? public var enabled: Bool = true public var locked: Bool? public var selected: Bool? @@ -86,6 +87,7 @@ import Foundation } feedback = try typeContainer.decodeIfPresent(String.self, forKey: .feedback) + informativeMessage = feedback if let errorMessage = try typeContainer.decodeIfPresent(String.self, forKey: .errorMessage) { self.errorMessage = errorMessage diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryField.swift index 4f9f5d8c..dfca1b76 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryField.swift @@ -86,6 +86,28 @@ import MVMCore textField.inputAccessoryView = toolbar } + public func constrainAccessoryView() { + + guard let accessoryView = accessoryView else { return } + + entryFieldContainer.addSubview(accessoryView) + + textFieldTrailingConstraint?.isActive = false + textFieldTrailingConstraint = accessoryView.leadingAnchor.constraint(equalTo: textField.trailingAnchor, constant: Padding.Two) + textFieldTrailingConstraint?.isActive = true + + accessoryViewTrailingConstraint = entryFieldContainer.trailingAnchor.constraint(equalTo: accessoryView.trailingAnchor, constant: Padding.Four) + accessoryViewTrailingConstraint?.isActive = true + accessoryView.centerYAnchor.constraint(equalTo: entryFieldContainer.centerYAnchor).isActive = true + } + + public func unconstrainAccessoryView() { + + textFieldTrailingConstraint = entryFieldContainer.trailingAnchor.constraint(equalTo: textField.trailingAnchor, constant: Padding.Four) + textFieldTrailingConstraint?.isActive = true + } + + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -114,7 +136,7 @@ import MVMCore showError = false } else { - errorMessage = errorMessage ?? MVMCoreUIUtility.hardcodedString(withKey: "textfield_phone_format_error_message") + entryFieldModel?.errorMessage = entryFieldModel?.errorMessage ?? MVMCoreUIUtility.hardcodedString(withKey: "textfield_phone_format_error_message") showError = true UIAccessibility.post(notification: .layoutChanged, argument: textField) } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 9d78416d..c013a246 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -35,11 +35,7 @@ import UIKit textField.smartInsertDeleteType = .no return textField }() - - public var accessoryView: View? { - didSet { accessoryView == nil ? removeAccessoryView() : constrainAccessoryView() } - } - + //-------------------------------------------------- // MARK: - Stored Properties //-------------------------------------------------- @@ -52,6 +48,8 @@ import UIKit /// Validate on each entry in the textField. Default: true public var validateEachCharacter: Bool = true + var usesAccessoryView: Bool = true + /// Validate when user resigns editing. Default: true public var validateWhenDoneEditing: Bool = true @@ -82,7 +80,7 @@ import UIKit set (error) { if error { - textField.accessibilityValue = String(format: MVMCoreUIUtility.hardcodedString(withKey: "textfield_error_message") ?? "", textField.text ?? "", errorMessage ?? "") + textField.accessibilityValue = String(format: MVMCoreUIUtility.hardcodedString(withKey: "textfield_error_message") ?? "", textField.text ?? "", entryFieldModel?.errorMessage ?? "") } else { textField.accessibilityValue = nil } @@ -141,27 +139,6 @@ import UIKit public var textFieldTrailingConstraint: NSLayoutConstraint? public var accessoryViewTrailingConstraint: NSLayoutConstraint? - public func constrainAccessoryView() { - - textFieldTrailingConstraint?.isActive = false - textFieldTrailingConstraint = accessoryView?.leadingAnchor.constraint(equalTo: textField.trailingAnchor, constant: Padding.Two) - textFieldTrailingConstraint?.isActive = true - - if let accessoryView = accessoryView { - accessoryViewTrailingConstraint = entryFieldContainer.trailingAnchor.constraint(equalTo: accessoryView.trailingAnchor, constant: Padding.Four) - accessoryViewTrailingConstraint?.isActive = true - accessoryView.centerYAnchor.constraint(equalTo: entryFieldContainer.centerYAnchor).isActive = true - } - } - - public func removeAccessoryView() { - - accessoryView?.removeFromSuperview() - - textFieldTrailingConstraint = entryFieldContainer.trailingAnchor.constraint(equalTo: textField.trailingAnchor, constant: Padding.Four) - textFieldTrailingConstraint?.isActive = true - } - //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/Contents.json b/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/Contents.json new file mode 100644 index 00000000..af2434ac --- /dev/null +++ b/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "alert_standard @1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "alert_standard @2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "alert_standard @3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @1x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f5fbe367cf64f711290e7b32a70ec1a601d97264 GIT binary patch literal 279 zcmV+y0qFjTP)Px#(Md!>R5%f(mB9_dFbqX2!InL6<;Da|!I>?X09Igy9=Zbu{Hj<=Lu@DEOJB9( zpQlE#+G&b4OJqr={!3@s{SjZ2saYG6!cN(4>LF+irrd6*2kVAfu$PcPsTTt!uY=-G3584g$pu?~d%FyDWZ=u5U d$(%O-0>1XbOgi*8)%^ef002ovPDHLkV1iTmbsPWy literal 0 HcmV?d00001 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @2x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d40e714930cf2c5fd9e0c850db453c7bac83e141 GIT binary patch literal 525 zcmV+o0`mQdP)Px$$4Nv%R9Fek+09MFKn#ZA2<~*jl^*zOfHOxrfEJ((&Tya^ieNe;+B(eNXdYS#wm^oZIWwMv9xU{teq>cs#%_p%nZ zvYCk!+gL#AOkknc?jX~pv+aBFx~z-Ev9i`FKD6C`w@Dq1Kc~3XMFNN;mpOX97YU7P z+-B(W+9tI(N?h;nm>S3KIwZdz%O*z0Az3{~KZt5rsAh*WAT; P00000NkvXXu0mjfMds}x literal 0 HcmV?d00001 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @3x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/alert_standard.imageset/alert_standard @3x.png new file mode 100644 index 0000000000000000000000000000000000000000..00589541efe77d734e8d84564871b848afbed248 GIT binary patch literal 771 zcmV+e1N{7nP)Px%y-7qtRA>d=+c8fRK@K*a}^5-I1zeRH2 zTE#9jpONE4avzUbi`awW7jg<~<2;7Pb{z!#MjDFSYviXzviAGBMiZMpv)?iH3~9ld zW8I^tu#ZjZwjApkJqK&$@=Fl~;&7f;ySB@^l zzJOp%l4CcC>Tga;u|$=C`Tf<<3akQL1+BuWz@ca*RtXM4tFdaZ6di$$087wO*eGxj zIugr;Jx7j7a!e7kPg&7eqIQrem}9EAG5QHQrdJnvorx1D;{hg1!5mY@6q?4raR*;N zBK<-luxxfW>BF8JQ%4R>Bdx<5WDP8PF@7MeAM2>dp=lkCk+uL{828tWxnCVun9%yM zjtpA-#r_jE`+~Fu@Qy%qoTGvDV;vndS--Ehqq}A1|K`Sg?S|t@f-l|l4^c<|N_(WQ z-7;h)Esxx6mjs`=fm^7Lkm}QsYcY7Ful+HKng&{Yobo}<(-Ql=LfYRH>xjs`LjOB0 zu^~^&xjTIk&-6?5GB9g(tqWCi&i)&D_ed)?bNMfy1zBv;rKC zRiaD5)vzjb3Aj2|g|>O-Y*&W0MJiv&Y|g3e%CWYv8t7)QHPFprBhk%bBhbxbmFRA; z3Uqha5_GrNWzgMY4ZV*dca6+n_h#Mof5RKrw)-ej^fkuT@AD