diff --git a/VDS/Components/Checkbox/Checkbox.swift b/VDS/Components/Checkbox/Checkbox.swift index ee9bea06..a03213d9 100644 --- a/VDS/Components/Checkbox/Checkbox.swift +++ b/VDS/Components/Checkbox/Checkbox.swift @@ -126,7 +126,7 @@ open class CheckboxBase: SelectorBase { public let error = BinarySurfaceColorConfiguration() 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) diff --git a/VDS/Components/Checkbox/CheckboxModel.swift b/VDS/Components/Checkbox/CheckboxModel.swift index 84fce76e..d03e441a 100644 --- a/VDS/Components/Checkbox/CheckboxModel.swift +++ b/VDS/Components/Checkbox/CheckboxModel.swift @@ -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? diff --git a/VDS/Components/RadioButton/RadioButton.swift b/VDS/Components/RadioButton/RadioButton.swift index bb863e10..2d6e139a 100644 --- a/VDS/Components/RadioButton/RadioButton.swift +++ b/VDS/Components/RadioButton/RadioButton.swift @@ -57,6 +57,11 @@ open class RadioButtonBase: SelectorBase return config }() + open override func toggleAndAction() { + guard !isSelected else { return } + super.toggleAndAction() + } + //-------------------------------------------------- // MARK: - RadioButton View //-------------------------------------------------- @@ -107,7 +112,7 @@ open class RadioButtonBase: SelectorBase public let error = BinarySurfaceColorConfiguration() 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) diff --git a/VDS/Components/RadioButton/RadioButtonGroup.swift b/VDS/Components/RadioButton/RadioButtonGroup.swift index 468175d2..34fc7875 100644 --- a/VDS/Components/RadioButton/RadioButtonGroup.swift +++ b/VDS/Components/RadioButton/RadioButtonGroup.swift @@ -9,24 +9,54 @@ import Foundation public class RadioButtonGroup: RadioButtonGroupBase {} -public class RadioButtonGroupBase>: SelectorGroupBase { +public class RadioButtonGroupBase>: SelectorGroupBase { - 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)") diff --git a/VDS/Components/RadioButton/RadioButtonGroupModel.swift b/VDS/Components/RadioButton/RadioButtonGroupModel.swift index fdfa33b0..a023fe23 100644 --- a/VDS/Components/RadioButton/RadioButtonGroupModel.swift +++ b/VDS/Components/RadioButton/RadioButtonGroupModel.swift @@ -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 diff --git a/VDS/Components/RadioButton/RadioButtonModel.swift b/VDS/Components/RadioButton/RadioButtonModel.swift index 9f1910c7..50ffb504 100644 --- a/VDS/Components/RadioButton/RadioButtonModel.swift +++ b/VDS/Components/RadioButton/RadioButtonModel.swift @@ -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? diff --git a/VDS/Components/Selector/SelectorBase.swift b/VDS/Components/Selector/SelectorBase.swift index bb2e17d7..9110bf1d 100644 --- a/VDS/Components/Selector/SelectorBase.swift +++ b/VDS/Components/Selector/SelectorBase.swift @@ -87,7 +87,7 @@ open class SelectorBase: Control, 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: Control, 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: Control, 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 } diff --git a/VDS/Components/Selector/SelectorGroupBase.swift b/VDS/Components/Selector/SelectorGroupBase.swift index 0c7d6ea8..05fd0f81 100644 --- a/VDS/Components/Selector/SelectorGroupBase.swift +++ b/VDS/Components/Selector/SelectorGroupBase.swift @@ -12,10 +12,7 @@ import Combine open class SelectorGroupBase>: View, 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 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: Modelable, FormFieldable { +public protocol SelectorGroupModel: Modelable, FormFieldable, Errorable { associatedtype SelectorType: SelectorModel - var selectedModel: SelectorType? { get set } var selectors: [SelectorType] { get set } } @@ -18,6 +17,8 @@ public struct DefaultSelectorGroupModel: 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] diff --git a/VDS/Components/Selector/SelectorModel.swift b/VDS/Components/Selector/SelectorModel.swift index 6b9ece3f..df730437 100644 --- a/VDS/Components/Selector/SelectorModel.swift +++ b/VDS/Components/Selector/SelectorModel.swift @@ -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 diff --git a/VDS/Protocols/Errorable.swift b/VDS/Protocols/Errorable.swift index bd9b41de..19fd5e04 100644 --- a/VDS/Protocols/Errorable.swift +++ b/VDS/Protocols/Errorable.swift @@ -8,6 +8,6 @@ import Foundation public protocol Errorable { - var showError: Bool { get set } + var hasError: Bool { get set } var errorText: String? { get set } }