From a34b3509a14ed15110d520baac518ae26d82260d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 23 Apr 2020 12:13:03 -0400 Subject: [PATCH 1/6] adding behavior logic for selecting by server. --- MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift | 9 +++++++-- .../Atomic/Atoms/TextFields/TextEntryFieldModel.swift | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index f95c918d..3dd2337b 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -308,13 +308,13 @@ import UIKit guard let model = model as? TextEntryFieldModel else { return } model.updateUI = { [weak self] in - MVMCoreDispatchUtility.performBlock(onMainThread: { + DispatchQueue.main.async { guard let self = self else { return } if self.isSelected { self.updateValidation(model.isValid ?? true) } - }) + } } self.delegateObject = delegateObject @@ -339,6 +339,11 @@ import UIKit uiTextFieldDelegate = delegateObject?.uiTextFieldDelegate observingTextFieldDelegate = delegateObject?.observingTextFieldDelegate setupTextFieldToolbar() + + if isSelected && !model.wasInitiallySelected { + textEntryFieldModel?.wasInitiallySelected = true + startEditing() + } } } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift index 491e9891..46d84484 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift @@ -31,6 +31,7 @@ public var enabledTextColor: Color = Color(uiColor: .mvmBlack) public var disabledTextColor: Color = Color(uiColor: .mvmCoolGray3) public var type: EntryType? + public var wasInitiallySelected: Bool = false //-------------------------------------------------- // MARK: - Keys From aca32d14f7bdd7a7e13a4b798061efec2ed9f4e2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 23 Apr 2020 14:48:20 -0400 Subject: [PATCH 2/6] going back to orgiinal func --- MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 3dd2337b..27ecf3ad 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -308,13 +308,13 @@ import UIKit guard let model = model as? TextEntryFieldModel else { return } model.updateUI = { [weak self] in - DispatchQueue.main.async { + MVMCoreDispatchUtility.performBlock(onMainThread: { guard let self = self else { return } if self.isSelected { self.updateValidation(model.isValid ?? true) } - } + }) } self.delegateObject = delegateObject From 0defd2916a218195cf05f43eb2953690893057cc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 23 Apr 2020 15:30:56 -0400 Subject: [PATCH 3/6] revised selectabel --- MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift | 8 +++++--- MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift | 1 + MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift | 3 +-- .../Atomic/Atoms/TextFields/TextEntryFieldModel.swift | 1 - 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift index 6bb82fe1..b1a3e43e 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift @@ -257,11 +257,13 @@ import UIKit if let isLocked = model.locked { self.isLocked = isLocked - } else if let isSelected = model.selected { - self.isSelected = isSelected + } else if (model.selected ?? false) && !model.wasInitiallySelected { + + model.wasInitiallySelected = true + self.isSelected = true } } - + open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { return 115 } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift index 337d847d..9be330a3 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift @@ -30,6 +30,7 @@ import Foundation public var fieldKey: String? public var groupName: String = FormValidator.defaultGroupName public var baseValue: AnyHashable? + public var wasInitiallySelected: Bool = false public var isValid: Bool? { didSet { updateUI?() } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift index 27ecf3ad..57c9dae9 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift @@ -340,8 +340,7 @@ import UIKit observingTextFieldDelegate = delegateObject?.observingTextFieldDelegate setupTextFieldToolbar() - if isSelected && !model.wasInitiallySelected { - textEntryFieldModel?.wasInitiallySelected = true + if isSelected { startEditing() } } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift index 46d84484..491e9891 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift @@ -31,7 +31,6 @@ public var enabledTextColor: Color = Color(uiColor: .mvmBlack) public var disabledTextColor: Color = Color(uiColor: .mvmCoolGray3) public var type: EntryType? - public var wasInitiallySelected: Bool = false //-------------------------------------------------- // MARK: - Keys From da097cc726fac622309e76892ae0842a4b42cbc7 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 24 Apr 2020 16:19:51 -0400 Subject: [PATCH 4/6] setting values back to model --- .../Atoms/TextFields/DigitEntryField.swift | 22 ++++++++++++++++++- .../Atomic/Atoms/TextFields/EntryField.swift | 4 ++++ .../Atoms/TextFields/EntryFieldModel.swift | 5 ++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift index 8ae4365f..bf20ecde 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift @@ -76,6 +76,10 @@ import UIKit public var digitBoxes: [DigitBox] = [] private var selectedDigitBox: DigitBox? + public var digitEntryModel: DigitEntryFieldModel? { + return model as? DigitEntryFieldModel + } + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -234,6 +238,19 @@ import UIKit layoutIfNeeded() } + public override func reset() { + super.reset() + + accessibilityElements = nil + switchFieldsAutomatically = false + selectedDigitBox = nil + text = "" + digitBoxes.forEach { + $0.removeFromSuperview() + } + digitBoxes = [] + } + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -326,7 +343,7 @@ import UIKit } public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - + guard let model = model as? DigitEntryFieldModel else { return } numberOfDigits = model.digits @@ -378,12 +395,14 @@ extension DigitEntryField { // One character, switch old value with new, select next textfield textField.text = string + digitEntryModel?.text = text selectNextDigitField(textField, clear: false) return false } else if replacementLength == 0 && oldLength == 1 { // Non empty cell, clear and stay. textField.text = "" + digitEntryModel?.text = text return false } @@ -410,6 +429,7 @@ extension DigitEntryField { if !switchFieldsAutomatically { textField.text = "" + digitEntryModel?.text = text } proprietorTextDelegate?.textFieldDidBeginEditing?(textField) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift index b1a3e43e..33672685 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift @@ -60,6 +60,7 @@ import UIKit self.titleLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 self.feedbackLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 self.entryFieldContainer.isEnabled = enabled + self.entryFieldModel?.enabled = enabled } } @@ -69,6 +70,7 @@ import UIKit set (error) { self.feedback = error ? entryFieldModel?.errorMessage : entryFieldModel?.feedback self.entryFieldContainer.showError = error + self.entryFieldModel?.showError = error } } @@ -77,6 +79,7 @@ import UIKit get { return entryFieldContainer.isLocked } set (locked) { self.entryFieldContainer.isLocked = locked + self.entryFieldModel?.locked = locked } } @@ -85,6 +88,7 @@ import UIKit get { return entryFieldContainer.isSelected } set (selected) { self.entryFieldContainer.isSelected = selected + self.entryFieldModel?.selected = selected } } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift index 9be330a3..e902ae22 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift @@ -10,7 +10,6 @@ import Foundation @objcMembers public class EntryFieldModel: MoleculeModelProtocol, FormFieldProtocol, FormRuleWatcherFieldProtocol, EnableableModelProtocol { - //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -24,6 +23,7 @@ import Foundation public var feedback: String? public var errorMessage: String? public var enabled: Bool = true + public var showError: Bool? public var locked: Bool? public var selected: Bool? public var text: String? @@ -52,6 +52,7 @@ import Foundation case errorMessage case locked case selected + case showError case text case fieldKey case groupName @@ -94,6 +95,7 @@ import Foundation text = try typeContainer.decodeIfPresent(String.self, forKey: .text) baseValue = text fieldKey = try typeContainer.decodeIfPresent(String.self, forKey: .fieldKey) + if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } @@ -107,6 +109,7 @@ import Foundation try container.encodeIfPresent(feedback, forKey: .feedback) try container.encodeIfPresent(text, forKey: .text) try container.encodeIfPresent(locked, forKey: .locked) + try container.encodeIfPresent(showError, forKey: .showError) try container.encodeIfPresent(selected, forKey: .selected) try container.encodeIfPresent(errorMessage, forKey: .errorMessage) try container.encode(enabled, forKey: .enabled) From ac1c856124d35a3242b8cde4ed90bba906d8abd5 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 27 Apr 2020 10:10:25 -0400 Subject: [PATCH 5/6] improvements made to digit field --- .../Atomic/Atoms/TextFields/DigitBox.swift | 33 ++++++++----------- .../Atoms/TextFields/DigitEntryField.swift | 6 ++-- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitBox.swift b/MVMCoreUI/Atomic/Atoms/TextFields/DigitBox.swift index 1134a80f..9e860116 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/DigitBox.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/DigitBox.swift @@ -24,7 +24,7 @@ import UIKit textField.setContentCompressionResistancePriority(.required, for: .vertical) textField.setContentCompressionResistancePriority(.required, for: .horizontal) textField.textAlignment = .center - textField.font = MFStyler.fontForTextField() + textField.font = Styler.Font.RegularBodyLarge.getFont() textField.keyboardType = .numberPad return textField }() @@ -48,11 +48,11 @@ import UIKit DispatchQueue.main.async { [weak self] in guard let self = self else { return } - self.borderStrokeColor = error ? .mfPumpkin() : .mfSilver() + self.borderStrokeColor = error ? .mvmOrange : .mvmCoolGray3 let barHeight: CGFloat = self.showError ? 4 : 1 self.bottomBar?.frame = CGRect(x: 0, y: self.bounds.height - barHeight, width: self.bounds.width, height: barHeight) - self.bottomBar?.backgroundColor = self.showError ? UIColor.mfPumpkin().cgColor : UIColor.black.cgColor + self.bottomBar?.backgroundColor = self.showError ? UIColor.mvmOrange.cgColor : UIColor.mvmBlack.cgColor self.setNeedsDisplay() self.layoutIfNeeded() @@ -97,29 +97,24 @@ import UIKit open override func setupView() { super.setupView() - - guard constraints.isEmpty else { return } - - translatesAutoresizingMaskIntoConstraints = false - backgroundColor = .clear - + addSubview(digitField) digitField.delegate = self digitField.didDeleteDelegate = self - NSLayoutConstraint.activate([ - digitField.topAnchor.constraint(equalTo: topAnchor, constant: PaddingOne), - digitField.leadingAnchor.constraint(equalTo: leadingAnchor, constant: PaddingOne), - bottomAnchor.constraint(equalTo: digitField.bottomAnchor, constant: PaddingOne), - trailingAnchor.constraint(equalTo: digitField.trailingAnchor, constant: PaddingOne), - digitField.centerYAnchor.constraint(equalTo: centerYAnchor), - digitField.centerXAnchor.constraint(equalTo: centerXAnchor)]) - widthConstraint = widthAnchor.constraint(equalToConstant: DigitBox.size.width) widthConstraint?.isActive = true heightConstraint = heightAnchor.constraint(equalToConstant: DigitBox.size.height) heightConstraint?.isActive = true + NSLayoutConstraint.activate([ + digitField.topAnchor.constraint(equalTo: topAnchor, constant: Padding.Three), + digitField.leadingAnchor.constraint(equalTo: leadingAnchor), + bottomAnchor.constraint(equalTo: digitField.bottomAnchor, constant: Padding.Three), + trailingAnchor.constraint(equalTo: digitField.trailingAnchor), + digitField.centerYAnchor.constraint(equalTo: centerYAnchor) + ]) + if let bottomBar = bottomBar { layer.addSublayer(bottomBar) } @@ -146,7 +141,7 @@ import UIKit super.reset() backgroundColor = .clear - digitField.font = MFStyler.fontForTextField() + digitField.font = Styler.Font.RegularBodyLarge.getFont() } //-------------------------------------------------- @@ -186,7 +181,7 @@ import UIKit sizeObject?.performBlockBase(onSize: size) widthConstraint?.constant = width heightConstraint?.constant = height - digitField.font = MFFonts.mfFont55Rg(pointSize) + digitField.font = MFFonts.mfFontDSRegular(pointSize) previousSize = size } diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift index bf20ecde..50faacf9 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift @@ -228,14 +228,14 @@ import UIKit //-------------------------------------------------- @objc open override func updateView(_ size: CGFloat) { - super.updateView(size) - + entryFieldContainer.disableAllBorders = true if !self.digitBoxes.isEmpty { self.digitBoxes.forEach { $0.updateView(size) } } - layoutIfNeeded() + + super.updateView(size) } public override func reset() { From e5ab2545793afe57977154e51bb18b2e30cc32cb Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 28 Apr 2020 14:14:26 -0400 Subject: [PATCH 6/6] revised how fields clear themselves --- .../Atomic/Atoms/TextFields/DigitEntryField.swift | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift index 50faacf9..628c7cde 100644 --- a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift @@ -35,6 +35,7 @@ import UIKit digitBoxes.append(newDigitBox) } + self.digitBoxes.forEach { $0.removeFromSuperview() } self.digitBoxes = digitBoxes guard let space = MFSizeObject(standardSize: 5, smalliPhoneSize: 3)?.getValueBasedOnScreenSize() else { return } @@ -228,7 +229,7 @@ import UIKit //-------------------------------------------------- @objc open override func updateView(_ size: CGFloat) { - + entryFieldContainer.disableAllBorders = true if !self.digitBoxes.isEmpty { @@ -245,10 +246,7 @@ import UIKit switchFieldsAutomatically = false selectedDigitBox = nil text = "" - digitBoxes.forEach { - $0.removeFromSuperview() - } - digitBoxes = [] + digitBoxes.forEach { $0.digitField.text = "" } } //-------------------------------------------------- @@ -358,7 +356,7 @@ import UIKit $0.digitField.inputAccessoryView = UIToolbar.getToolbarWithDoneButton(delegate: observingDelegate, action: #selector(observingDelegate.dismissFieldInput)) } - + super.set(with: model, delegateObject, additionalData) }