updated for not caching model, just the inputId

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2022-08-31 13:12:40 -05:00
parent f13c9488a4
commit 1306c9e2a9
9 changed files with 73 additions and 23 deletions

View File

@ -16,10 +16,10 @@ public class RadioBoxGroup: Control<DefaultRadioBoxGroupModel>, SelectorGroupSel
//--------------------------------------------------
public var selectorViews: [ModelHandlerType] = []
@Proxy(\.model.selectedModel)
public var selectedModel: ModelHandlerType.ModelType? {
@Proxy(\.model.selectedInputId)
public var selectedInputId: String? {
didSet{
if hasError, selectedModel != nil {
if hasError, selectedInputId != nil {
hasError = false
}
sendActions(for: .valueChanged)

View File

@ -16,7 +16,7 @@ public struct DefaultRadioBoxGroupModel: RadioBoxGroupModel {
public var surface: Surface = .light
public var disabled: Bool = false
public var selectors: [SelectorModelType]
public var selectedModel: DefaultRadioBoxModel?
public var selectedInputId: String?
public var hasError: Bool = false
public var errorText: String?
public init() { selectors = [] }

View File

@ -16,10 +16,10 @@ public class RadioButtonGroup: Control<DefaultRadioButtonGroupModel>, SelectorGr
//--------------------------------------------------
public var selectorViews: [ModelHandlerType] = []
@Proxy(\.model.selectedModel)
public var selectedModel: ModelHandlerType.ModelType? {
@Proxy(\.model.selectedInputId)
public var selectedInputId: String? {
didSet{
if hasError, selectedModel != nil {
if hasError, selectedInputId != nil {
hasError = false
}
sendActions(for: .valueChanged)
@ -30,7 +30,7 @@ public class RadioButtonGroup: Control<DefaultRadioButtonGroupModel>, SelectorGr
get { model.hasError }
set {
var newHasError = newValue
if selectedModel != nil, newHasError {
if selectedInputId != nil, newHasError {
newHasError = false
}
let selectors = model.selectors.compactMap { existing in

View File

@ -14,12 +14,12 @@ extension RadioButtonGroupModel {
}
public struct DefaultRadioButtonGroupModel: RadioButtonGroupModel {
public var selectedInputId: String?
public typealias SelectorModelType = DefaultRadioButtonModel
public var inputId: String?
public var value: AnyHashable?
public var surface: Surface = .light
public var disabled: Bool = false
public var selectedModel: DefaultRadioButtonModel?
public var selectors: [SelectorModelType]
public var hasError: Bool = false
public var errorText: String?

View File

@ -207,8 +207,8 @@ open class RadioSwatchBase<ModelType: RadioSwatchModel>: Control<ModelType>, Cha
let backgroundColor = radioSwatchBackgroundColorConfiguration.getColor(viewModel)
let borderColor = viewModel.selected ? radioSwatchBorderColorConfiguration.getColor(viewModel) : .clear
let fillBorderColor = radioSwatchFillBorderColorConfiguration.getColor(viewModel)
selectorView.backgroundColor = backgroundColor
print("input: \(viewModel.inputId) enabled: \(viewModel.disabled) surface: \(viewModel.surface) selected: \(viewModel.selected) backgroundColor: \(backgroundColor.hexString)")
selectorView.layer.borderColor = borderColor.cgColor
selectorView.layer.cornerRadius = selectorView.bounds.width * 0.5
selectorView.layer.borderWidth = viewModel.selected ? selectorBorderWidth : 0

View File

@ -12,6 +12,7 @@ public class RadioSwatchGroup: RadioSwatchGroupBase<DefaultRadioSwatchGroupModel
public override func didSelect(selector: DefaultRadioSwatchModel) {
//reset the old model
//see if there is a selected one and then get the cached version
if let selectedModel {
let oldSelectedModel = selectedModel.copyWith {
$0.selected = false
@ -26,23 +27,34 @@ public class RadioSwatchGroup: RadioSwatchGroupBase<DefaultRadioSwatchGroupModel
label.text = newSelectedModel.text
replace(viewModel: newSelectedModel)
selectedModel = newSelectedModel
selectedInputId = newSelectedModel.inputId
}
}
public class RadioSwatchGroupBase<GroupModelType: RadioSwatchGroupModel, ModelHandlerType: ModelHandlerable & UIView>: Control<GroupModelType>, Changable, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate where GroupModelType.SelectorModelType == ModelHandlerType.ModelType {
public class RadioSwatchGroupBase<GroupModelType: RadioSwatchGroupModel, ModelHandlerType: ModelHandlerable & UIControl>: Control<GroupModelType>, Changable, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate where GroupModelType.SelectorModelType == ModelHandlerType.ModelType {
//--------------------------------------------------
// MARK: - Public Properties
//--------------------------------------------------
@Proxy(\.model.selectedModel)
public var selectedModel: ModelHandlerType.ModelType? {
@Proxy(\.model.selectedInputId)
public var selectedInputId: String? {
didSet {
sendActions(for: .valueChanged)
}
}
public var selectedModel: ModelHandlerType.ModelType? {
guard let selectedInputId else { return nil }
if let index = model.selectors.firstIndex(where: { element in
return element.inputId == selectedInputId
}) {
return model.selectors[index]
} else {
return nil
}
}
public var onChange: Blocks.ActionBlock?
//--------------------------------------------------
@ -128,7 +140,7 @@ public class RadioSwatchGroupBase<GroupModelType: RadioSwatchGroupModel, ModelHa
}
model.selectors = selectors
}
public func replace(viewModel: ModelHandlerType.ModelType){
if let index = model.selectors.firstIndex(where: { element in
return element.inputId == viewModel.inputId
@ -137,6 +149,16 @@ public class RadioSwatchGroupBase<GroupModelType: RadioSwatchGroupModel, ModelHa
}
}
public func getCachedSelector(viewModel: ModelHandlerType.ModelType) -> ModelHandlerType.ModelType? {
if let index = model.selectors.firstIndex(where: { element in
return element.inputId == viewModel.inputId
}) {
return model.selectors[index]
} else {
return nil
}
}
//--------------------------------------------------
// MARK: - UICollectionViewDelegateFlowLayout
//--------------------------------------------------

View File

@ -28,7 +28,7 @@ public struct DefaultRadioSwatchGroupModel: RadioSwatchGroupModel {
public var surface: Surface = .light
public var disabled: Bool = false
public var selectors: [SelectorModelType]
public var selectedModel: DefaultRadioSwatchModel?
public var selectedInputId: String?
public init() { selectors = [] }
public init(selectors: [SelectorModelType]){
self.selectors = selectors

View File

@ -70,12 +70,23 @@ extension SelectorGroupModelHandlerable {
///MARK: Groups that allow single selections
public protocol SelectorGroupSelectedModelHandlerable: SelectorGroupModelHandlerable {
var selectedModel: ModelHandlerType.ModelType? { get set }
var selectedInputId: String? { get set }
func didSelect(selector: ModelHandlerType.ModelType)
}
extension SelectorGroupSelectedModelHandlerable {
public var selectedModel: ModelHandlerType.ModelType? {
guard let selectedInputId else { return nil }
if let index = model.selectors.firstIndex(where: { element in
return element.inputId == selectedInputId
}) {
return model.selectors[index]
} else {
return nil
}
}
public func createModelHandler(selector: ModelHandlerType.ModelType) -> ModelHandlerType {
//create view
let newSelectorView = ModelHandlerType(with: selector)
@ -101,20 +112,23 @@ extension SelectorGroupSelectedModelHandlerable {
}
public func didSelect(selector: ModelHandlerType.ModelType) {
if var oldSelectedModel = selectedModel {
oldSelectedModel.selected = false
if let selectedModel, let cached = getCachedSelector(viewModel: selectedModel) {
let oldSelectedModel = cached.copyWith {
$0.selected = false
}
replace(viewModel: oldSelectedModel)
}
//only select is selected
if selector.selected {
var newSelectedModel = selector
newSelectedModel.selected = true
replace(viewModel: newSelectedModel)
selectedModel = newSelectedModel
selectedInputId = selector.inputId
} else {
//ensure current value is removed
selectedModel = nil
selectedInputId = nil
}
}
}

View File

@ -15,5 +15,19 @@ public protocol SelectorGroupModelable: Modelable, FormFieldable {
///MARK: Groups that allow single selections
public protocol SelectorGroupSelectedModelable: SelectorGroupModelable {
var selectedModel: SelectorModelType? { get set }
var selectedInputId: String? { get set }
var selectedModel: SelectorModelType? { get }
}
extension SelectorGroupSelectedModelable {
public var selectedModel: SelectorModelType? {
guard let selectedInputId else { return nil }
if let index = selectors.firstIndex(where: { element in
return element.inputId == selectedInputId
}) {
return selectors[index]
} else {
return nil
}
}
}