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>()
override func getColor(_ viewModel: ModelType) -> UIColor {
//only show error is enabled and showError == true
let showErrorColor = !viewModel.disabled && viewModel.showError
let showErrorColor = !viewModel.disabled && viewModel.hasError
if showErrorColor {
return error.getColor(viewModel)

View File

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

View File

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

View File

@ -9,24 +9,54 @@ import Foundation
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 {
print("Pre Cached Selector: \(selectorModel.id): \(selectorModel.selected)")
}
if var oldSelectedModel = selectedModel {
oldSelectedModel.selected = false
replace(viewModel: oldSelectedModel)
}
var newSelectedModel = selected
newSelectedModel.selected = true
replace(viewModel: newSelectedModel)
selectedModel = newSelectedModel
//only select is selected
if selector.selected {
var newSelectedModel = selector
newSelectedModel.selected = true
replace(viewModel: newSelectedModel)
selectedModel = newSelectedModel
} else {
//ensure current value is removed
selectedModel = nil
}
for selectorModel in model.selectors {
print("Post Cached Selector: \(selectorModel.id): \(selectorModel.selected)")

View File

@ -7,7 +7,15 @@
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 var id: UUID = UUID()
public var inputId: String?
@ -16,6 +24,8 @@ public struct DefaultRadioButtonGroupModel: SelectorGroupModel {
public var disabled: Bool = false
public var selectedModel: DefaultRadioButtonModel?
public var selectors: [SelectorType]
public var hasError: Bool = false
public var errorText: String?
public init() { selectors = [] }
public init(selectors: [SelectorType]){
self.selectors = selectors

View File

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

View File

@ -87,7 +87,7 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
@Proxy(\.model.childText)
open var childText: String?
@Proxy(\.model.showError)
@Proxy(\.model.hasError)
open var showError: Bool
@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.
@objc public func toggleAndAction() {
@objc open func toggleAndAction() {
isSelected.toggle()
onChange?()
}
@ -289,7 +289,7 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
return viewModel.selected != model.selected
|| viewModel.labelText != model.labelText
|| viewModel.childText != model.childText
|| viewModel.showError != model.showError
|| viewModel.hasError != model.hasError
|| viewModel.surface != model.surface
|| 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 {
public var selectorViews: [SelectorHandlerType] = []
@Proxy(\.model.selectedModel)
public var selectedModel: SelectorType?
public var onChange: Blocks.ActionBlock?
//--------------------------------------------------
@ -92,7 +89,7 @@ open class SelectorGroupBase<SelectorType, SelectorGroupType: SelectorGroupModel
//add the selectedPublisher for the change
newSelectorView.selectedPublisher().sink { [weak self] model in
guard self?.model.selectors.count ?? 0 > 0 else { return }
self?.didSelect(selected: model)
self?.didSelect(selector: model)
}.store(in: &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
public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable {
public protocol SelectorGroupModel<SelectorType>: Modelable, FormFieldable, Errorable {
associatedtype SelectorType: SelectorModel
var selectedModel: SelectorType? { get set }
var selectors: [SelectorType] { get set }
}
@ -18,6 +17,8 @@ public struct DefaultSelectorGroupModel<SelectorType: SelectorModel>: SelectorGr
public var inputId: String?
public var value: AnyHashable?
public var surface: Surface = .light
public var hasError: Bool = false
public var errorText: String?
public var disabled: Bool = false
public var selectedModel: SelectorType?
public var selectors: [SelectorType]

View File

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

View File

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