refactored to hasError

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2022-08-11 17:30:54 -05:00
parent 706c55d0f2
commit 9d440aaeac
11 changed files with 71 additions and 28 deletions

View File

@ -126,7 +126,7 @@ open class CheckboxBase<ModelType: CheckboxModel>: SelectorBase<ModelType> {
public let error = BinarySurfaceColorConfiguration<ModelType>() public let error = BinarySurfaceColorConfiguration<ModelType>()
override func getColor(_ viewModel: ModelType) -> UIColor { override func getColor(_ viewModel: ModelType) -> UIColor {
//only show error is enabled and showError == true //only show error is enabled and showError == true
let showErrorColor = !viewModel.disabled && viewModel.showError let showErrorColor = !viewModel.disabled && viewModel.hasError
if showErrorColor { if showErrorColor {
return error.getColor(viewModel) return error.getColor(viewModel)

View File

@ -24,7 +24,7 @@ public struct DefaultCheckboxModel: CheckboxModel {
public var childText: String? public var childText: String?
public var childTextAttributes: [LabelAttributeModel]? public var childTextAttributes: [LabelAttributeModel]?
public var showError: Bool = false public var hasError: Bool = false
public var errorText: String? public var errorText: String?
public var inputId: String? public var inputId: String?

View File

@ -57,6 +57,11 @@ open class RadioButtonBase<ModelType: RadioButtonModel>: SelectorBase<ModelType>
return config return config
}() }()
open override func toggleAndAction() {
guard !isSelected else { return }
super.toggleAndAction()
}
//-------------------------------------------------- //--------------------------------------------------
// MARK: - RadioButton View // MARK: - RadioButton View
//-------------------------------------------------- //--------------------------------------------------
@ -107,7 +112,7 @@ open class RadioButtonBase<ModelType: RadioButtonModel>: SelectorBase<ModelType>
public let error = BinarySurfaceColorConfiguration<ModelType>() public let error = BinarySurfaceColorConfiguration<ModelType>()
override func getColor(_ viewModel: ModelType) -> UIColor { override func getColor(_ viewModel: ModelType) -> UIColor {
//only show error is enabled and showError == true //only show error is enabled and showError == true
let showErrorColor = !viewModel.disabled && viewModel.showError let showErrorColor = !viewModel.disabled && viewModel.hasError
if showErrorColor { if showErrorColor {
return error.getColor(viewModel) return error.getColor(viewModel)

View File

@ -9,24 +9,54 @@ import Foundation
public class RadioButtonGroup: RadioButtonGroupBase<DefaultRadioButtonGroupModel, RadioButton> {} public class RadioButtonGroup: RadioButtonGroupBase<DefaultRadioButtonGroupModel, RadioButton> {}
public class RadioButtonGroupBase<RadioButtonGroupModelType: SelectorGroupModel, RadioButtonType: RadioButtonBase<RadioButtonGroupModelType.SelectorType>>: SelectorGroupBase<RadioButtonGroupModelType.SelectorType, RadioButtonGroupModelType, RadioButtonType> { public class RadioButtonGroupBase<RadioButtonGroupModelType: RadioButtonGroupModel, RadioButtonType: RadioButtonBase<RadioButtonGroupModelType.SelectorType>>: SelectorGroupBase<RadioButtonGroupModelType.SelectorType, RadioButtonGroupModelType, RadioButtonType> {
public override func didSelect(selected: RadioButtonGroupModelType.SelectorType) { @Proxy(\.model.selectedModel)
public var selectedModel: RadioButtonGroupModelType.SelectorType? {
didSet{
if hasError, selectedModel != nil {
hasError = false
}
}
}
public var hasError: Bool {
get { model.hasError }
set {
var newHasError = newValue
if selectedModel != nil, newHasError {
newHasError = false
}
let selectors = model.selectors.compactMap { existing in
return updated(existing){
$0.hasError = newHasError
}
}
model.selectors = selectors
}
}
public override func didSelect(selector: RadioButtonGroupModelType.SelectorType) {
for selectorModel in model.selectors { for selectorModel in model.selectors {
print("Pre Cached Selector: \(selectorModel.id): \(selectorModel.selected)") print("Pre Cached Selector: \(selectorModel.id): \(selectorModel.selected)")
} }
if var oldSelectedModel = selectedModel { if var oldSelectedModel = selectedModel {
oldSelectedModel.selected = false oldSelectedModel.selected = false
replace(viewModel: oldSelectedModel) replace(viewModel: oldSelectedModel)
} }
var newSelectedModel = selected //only select is selected
newSelectedModel.selected = true if selector.selected {
replace(viewModel: newSelectedModel) var newSelectedModel = selector
newSelectedModel.selected = true
selectedModel = newSelectedModel replace(viewModel: newSelectedModel)
selectedModel = newSelectedModel
} else {
//ensure current value is removed
selectedModel = nil
}
for selectorModel in model.selectors { for selectorModel in model.selectors {
print("Post Cached Selector: \(selectorModel.id): \(selectorModel.selected)") print("Post Cached Selector: \(selectorModel.id): \(selectorModel.selected)")

View File

@ -7,7 +7,15 @@
import Foundation import Foundation
public struct DefaultRadioButtonGroupModel: SelectorGroupModel { public protocol RadioButtonGroupModel: SelectorGroupModel {
var selectedModel: SelectorType? { get set }
}
extension RadioButtonGroupModel {
public var errorText: String? { return nil }
}
public struct DefaultRadioButtonGroupModel: RadioButtonGroupModel {
public typealias SelectorType = DefaultRadioButtonModel public typealias SelectorType = DefaultRadioButtonModel
public var id: UUID = UUID() public var id: UUID = UUID()
public var inputId: String? public var inputId: String?
@ -16,6 +24,8 @@ public struct DefaultRadioButtonGroupModel: SelectorGroupModel {
public var disabled: Bool = false public var disabled: Bool = false
public var selectedModel: DefaultRadioButtonModel? public var selectedModel: DefaultRadioButtonModel?
public var selectors: [SelectorType] public var selectors: [SelectorType]
public var hasError: Bool = false
public var errorText: String?
public init() { selectors = [] } public init() { selectors = [] }
public init(selectors: [SelectorType]){ public init(selectors: [SelectorType]){
self.selectors = selectors self.selectors = selectors

View File

@ -25,7 +25,7 @@ public struct DefaultRadioButtonModel: RadioButtonModel {
public var childText: String? public var childText: String?
public var childTextAttributes: [LabelAttributeModel]? public var childTextAttributes: [LabelAttributeModel]?
public var showError: Bool = false public var hasError: Bool = false
public var errorText: String? public var errorText: String?
public var inputId: String? public var inputId: String?

View File

@ -87,7 +87,7 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
@Proxy(\.model.childText) @Proxy(\.model.childText)
open var childText: String? open var childText: String?
@Proxy(\.model.showError) @Proxy(\.model.hasError)
open var showError: Bool open var showError: Bool
@Proxy(\.model.errorText) @Proxy(\.model.errorText)
@ -260,7 +260,7 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
} }
/// This will checkbox the state of the Checkbox and execute the actionBlock if provided. /// This will checkbox the state of the Checkbox and execute the actionBlock if provided.
@objc public func toggleAndAction() { @objc open func toggleAndAction() {
isSelected.toggle() isSelected.toggle()
onChange?() onChange?()
} }
@ -289,7 +289,7 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
return viewModel.selected != model.selected return viewModel.selected != model.selected
|| viewModel.labelText != model.labelText || viewModel.labelText != model.labelText
|| viewModel.childText != model.childText || viewModel.childText != model.childText
|| viewModel.showError != model.showError || viewModel.hasError != model.hasError
|| viewModel.surface != model.surface || viewModel.surface != model.surface
|| viewModel.disabled != model.disabled || viewModel.disabled != model.disabled
} }

View File

@ -12,10 +12,7 @@ import Combine
open class SelectorGroupBase<SelectorType, SelectorGroupType: SelectorGroupModel, SelectorHandlerType: SelectorBase<SelectorType>>: View<SelectorGroupType>, Changable where SelectorType == SelectorGroupType.SelectorType { open class SelectorGroupBase<SelectorType, SelectorGroupType: SelectorGroupModel, SelectorHandlerType: SelectorBase<SelectorType>>: View<SelectorGroupType>, Changable where SelectorType == SelectorGroupType.SelectorType {
public var selectorViews: [SelectorHandlerType] = [] public var selectorViews: [SelectorHandlerType] = []
@Proxy(\.model.selectedModel)
public var selectedModel: SelectorType?
public var onChange: Blocks.ActionBlock? public var onChange: Blocks.ActionBlock?
//-------------------------------------------------- //--------------------------------------------------
@ -92,7 +89,7 @@ open class SelectorGroupBase<SelectorType, SelectorGroupType: SelectorGroupModel
//add the selectedPublisher for the change //add the selectedPublisher for the change
newSelectorView.selectedPublisher().sink { [weak self] model in newSelectorView.selectedPublisher().sink { [weak self] model in
guard self?.model.selectors.count ?? 0 > 0 else { return } guard self?.model.selectors.count ?? 0 > 0 else { return }
self?.didSelect(selected: model) self?.didSelect(selector: model)
}.store(in: &subscribers) }.store(in: &subscribers)
//add model update to the subscribers //add model update to the subscribers
@ -127,6 +124,6 @@ open class SelectorGroupBase<SelectorType, SelectorGroupType: SelectorGroupModel
} }
} }
open func didSelect(selected: SelectorType) { } open func didSelect(selector: SelectorType) { }
} }

View File

@ -7,9 +7,8 @@
import Foundation import Foundation
public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable { public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable, Errorable {
associatedtype SelectorType: SelectorModel associatedtype SelectorType: SelectorModel
var selectedModel: SelectorType? { get set }
var selectors: [SelectorType] { get set } var selectors: [SelectorType] { get set }
} }
@ -18,6 +17,8 @@ public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGr
public var inputId: String? public var inputId: String?
public var value: AnyHashable? public var value: AnyHashable?
public var surface: Surface = .light public var surface: Surface = .light
public var hasError: Bool = false
public var errorText: String?
public var disabled: Bool = false public var disabled: Bool = false
public var selectedModel: SelectorType? public var selectedModel: SelectorType?
public var selectors: [SelectorType] public var selectors: [SelectorType]

View File

@ -26,7 +26,7 @@ extension SelectorModel {
} }
public var shouldShowError: Bool { public var shouldShowError: Bool {
guard showError && !disabled && errorText?.isEmpty == false else { return false } guard hasError && !disabled && errorText?.isEmpty == false else { return false }
return true return true
} }
@ -64,7 +64,7 @@ extension SelectorModel {
} }
public var errorModel: DefaultLabelModel? { public var errorModel: DefaultLabelModel? {
guard let errorText = errorText, showError else { return nil } guard let errorText = errorText, hasError else { return nil }
var model = DefaultLabelModel() var model = DefaultLabelModel()
model.fontSize = .medium model.fontSize = .medium
model.textPosition = .left model.textPosition = .left

View File

@ -8,6 +8,6 @@
import Foundation import Foundation
public protocol Errorable { public protocol Errorable {
var showError: Bool { get set } var hasError: Bool { get set }
var errorText: String? { get set } var errorText: String? { get set }
} }