fixed bugs in validation to match textViewentryfield
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
79d5529991
commit
b1c59124a7
@ -27,11 +27,13 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol,
|
|||||||
options = pickerData.compactMap({ DropdownOptionModel(text: $0) })
|
options = pickerData.compactMap({ DropdownOptionModel(text: $0) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var isEditting: Bool = false
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
public var isValid: Bool = false
|
public var isValid: Bool = true
|
||||||
|
|
||||||
/// Closure passed here will run as picker changes items.
|
/// Closure passed here will run as picker changes items.
|
||||||
public var observeDropdownChange: ((String?, String) -> ())?
|
public var observeDropdownChange: ((String?, String) -> ())?
|
||||||
@ -42,6 +44,12 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol,
|
|||||||
/// When selecting for first responder, allow initial selected value to appear in empty text field.
|
/// When selecting for first responder, allow initial selected value to appear in empty text field.
|
||||||
public var setInitialValueInTextField = true
|
public var setInitialValueInTextField = true
|
||||||
|
|
||||||
|
open override var errorText: String? {
|
||||||
|
get {
|
||||||
|
viewModel.dynamicErrorMessage ?? viewModel.errorMessage
|
||||||
|
}
|
||||||
|
set {}
|
||||||
|
}
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Delegate Properties
|
// MARK: - Delegate Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -90,15 +98,14 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol,
|
|||||||
guard let self, let selectedItem else { return }
|
guard let self, let selectedItem else { return }
|
||||||
viewModel.selectedIndex = control.selectId
|
viewModel.selectedIndex = control.selectId
|
||||||
observeDropdownSelection?(selectedItem.text)
|
observeDropdownSelection?(selectedItem.text)
|
||||||
if let valid = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) {
|
_ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate)
|
||||||
isValid = valid
|
}.store(in: &subscribers)
|
||||||
}
|
|
||||||
}.store(in: &subscribers)
|
|
||||||
|
|
||||||
dropdownField
|
dropdownField
|
||||||
.publisher(for: .editingDidBegin)
|
.publisher(for: .editingDidBegin)
|
||||||
.sink { [weak self] textField in
|
.sink { [weak self] textField in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
|
isEditting = true
|
||||||
setInitialValueFromPicker()
|
setInitialValueFromPicker()
|
||||||
}.store(in: &subscribers)
|
}.store(in: &subscribers)
|
||||||
|
|
||||||
@ -106,12 +113,76 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol,
|
|||||||
.publisher(for: .editingDidEnd)
|
.publisher(for: .editingDidEnd)
|
||||||
.sink { [weak self] textField in
|
.sink { [weak self] textField in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
|
isEditting = false
|
||||||
|
_ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate)
|
||||||
|
if let valid = viewModel.isValid {
|
||||||
|
updateValidation(valid)
|
||||||
|
}
|
||||||
performDropdownAction()
|
performDropdownAction()
|
||||||
}.store(in: &subscribers)
|
}.store(in: &subscribers)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func viewModelDidUpdate() {
|
||||||
|
pickerData = viewModel.options
|
||||||
|
labelText = viewModel.title
|
||||||
|
helperText = viewModel.feedback
|
||||||
|
isEnabled = viewModel.enabled
|
||||||
|
isReadOnly = viewModel.readOnly
|
||||||
|
isRequired = viewModel.required
|
||||||
|
tooltipModel = viewModel.tooltip?.toVDSTooltipModel()
|
||||||
|
|
||||||
|
if let index = viewModel.selectedIndex {
|
||||||
|
selectId = index
|
||||||
|
optionsPicker.selectRow(index, inComponent: 0, animated: false)
|
||||||
|
pickerView(optionsPicker, didSelectRow: index, inComponent: 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewModel.selected ?? false) && !viewModel.wasInitiallySelected {
|
||||||
|
|
||||||
|
viewModel.wasInitiallySelected = true
|
||||||
|
isEditting = true
|
||||||
|
}
|
||||||
|
|
||||||
|
FormValidator.setupValidation(for: viewModel, delegate: delegateObject?.formHolderDelegate)
|
||||||
|
if isEditting {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
_ = self.becomeFirstResponder()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.updateUI = {
|
||||||
|
MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
|
||||||
|
guard let self = self else { return }
|
||||||
|
|
||||||
|
if isEditting {
|
||||||
|
updateValidation(viewModel.isValid ?? true)
|
||||||
|
|
||||||
|
} else if viewModel.isValid ?? true && showError {
|
||||||
|
showError = false
|
||||||
|
}
|
||||||
|
isEnabled = viewModel.enabled
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.updateUIDynamicError = {
|
||||||
|
MVMCoreDispatchUtility.performBlock(onMainThread: { [weak self] in
|
||||||
|
guard let self = self else { return }
|
||||||
|
|
||||||
|
let validState = viewModel.isValid ?? false
|
||||||
|
if !validState && viewModel.shouldClearText {
|
||||||
|
selectId = nil
|
||||||
|
viewModel.shouldClearText = false
|
||||||
|
}
|
||||||
|
updateValidation(validState)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public func updateView(_ size: CGFloat) { }
|
||||||
|
|
||||||
/// Sets the textField with the first value of the available picker data.
|
/// Sets the textField with the first value of the available picker data.
|
||||||
@objc private func setInitialValueFromPicker() {
|
private func setInitialValueFromPicker() {
|
||||||
|
|
||||||
guard !pickerData.isEmpty else { return }
|
guard !pickerData.isEmpty else { return }
|
||||||
|
|
||||||
@ -123,29 +194,21 @@ open class ItemDropdownEntryField: VDS.DropdownSelect, VDSMoleculeViewProtocol,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func viewModelDidUpdate() {
|
private func performDropdownAction() {
|
||||||
pickerData = viewModel.options
|
|
||||||
labelText = viewModel.title
|
|
||||||
helperText = viewModel.feedback
|
|
||||||
isEnabled = viewModel.enabled
|
|
||||||
isReadOnly = viewModel.readOnly
|
|
||||||
isRequired = viewModel.required
|
|
||||||
isSelected = viewModel.selected ?? false
|
|
||||||
tooltipModel = viewModel.tooltip?.toVDSTooltipModel()
|
|
||||||
if let index = viewModel.selectedIndex {
|
|
||||||
selectId = index
|
|
||||||
optionsPicker.selectRow(index, inComponent: 0, animated: false)
|
|
||||||
pickerView(optionsPicker, didSelectRow: index, inComponent: 0)
|
|
||||||
}
|
|
||||||
FormValidator.setupValidation(for: viewModel, delegate: delegateObject?.formHolderDelegate)
|
|
||||||
}
|
|
||||||
|
|
||||||
func performDropdownAction() {
|
|
||||||
guard let actionModel = viewModel.action,
|
guard let actionModel = viewModel.action,
|
||||||
!dropdownField.isFirstResponder
|
!dropdownField.isFirstResponder
|
||||||
else { return }
|
else { return }
|
||||||
MVMCoreUIActionHandler.performActionUnstructured(with: actionModel, sourceModel: viewModel, additionalData: additionalData, delegateObject: delegateObject)
|
MVMCoreUIActionHandler.performActionUnstructured(with: actionModel, sourceModel: viewModel, additionalData: additionalData, delegateObject: delegateObject)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateView(_ size: CGFloat) { }
|
private func updateValidation(_ isValid: Bool) {
|
||||||
|
let previousValidity = self.isValid
|
||||||
|
self.isValid = isValid
|
||||||
|
|
||||||
|
if previousValidity && !isValid {
|
||||||
|
showError = true
|
||||||
|
} else if (!previousValidity && isValid) {
|
||||||
|
showError = false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user