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] = [] public var selectorViews: [ModelHandlerType] = []
@Proxy(\.model.selectedModel) @Proxy(\.model.selectedInputId)
public var selectedModel: ModelHandlerType.ModelType? { public var selectedInputId: String? {
didSet{ didSet{
if hasError, selectedModel != nil { if hasError, selectedInputId != nil {
hasError = false hasError = false
} }
sendActions(for: .valueChanged) sendActions(for: .valueChanged)

View File

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

View File

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

View File

@ -14,12 +14,12 @@ extension RadioButtonGroupModel {
} }
public struct DefaultRadioButtonGroupModel: RadioButtonGroupModel { public struct DefaultRadioButtonGroupModel: RadioButtonGroupModel {
public var selectedInputId: String?
public typealias SelectorModelType = DefaultRadioButtonModel public typealias SelectorModelType = DefaultRadioButtonModel
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 disabled: Bool = false public var disabled: Bool = false
public var selectedModel: DefaultRadioButtonModel?
public var selectors: [SelectorModelType] public var selectors: [SelectorModelType]
public var hasError: Bool = false public var hasError: Bool = false
public var errorText: String? public var errorText: String?

View File

@ -207,8 +207,8 @@ open class RadioSwatchBase<ModelType: RadioSwatchModel>: Control<ModelType>, Cha
let backgroundColor = radioSwatchBackgroundColorConfiguration.getColor(viewModel) let backgroundColor = radioSwatchBackgroundColorConfiguration.getColor(viewModel)
let borderColor = viewModel.selected ? radioSwatchBorderColorConfiguration.getColor(viewModel) : .clear let borderColor = viewModel.selected ? radioSwatchBorderColorConfiguration.getColor(viewModel) : .clear
let fillBorderColor = radioSwatchFillBorderColorConfiguration.getColor(viewModel) let fillBorderColor = radioSwatchFillBorderColorConfiguration.getColor(viewModel)
selectorView.backgroundColor = backgroundColor 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.borderColor = borderColor.cgColor
selectorView.layer.cornerRadius = selectorView.bounds.width * 0.5 selectorView.layer.cornerRadius = selectorView.bounds.width * 0.5
selectorView.layer.borderWidth = viewModel.selected ? selectorBorderWidth : 0 selectorView.layer.borderWidth = viewModel.selected ? selectorBorderWidth : 0

View File

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

View File

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

View File

@ -70,12 +70,23 @@ extension SelectorGroupModelHandlerable {
///MARK: Groups that allow single selections ///MARK: Groups that allow single selections
public protocol SelectorGroupSelectedModelHandlerable: SelectorGroupModelHandlerable { public protocol SelectorGroupSelectedModelHandlerable: SelectorGroupModelHandlerable {
var selectedModel: ModelHandlerType.ModelType? { get set } var selectedInputId: String? { get set }
func didSelect(selector: ModelHandlerType.ModelType) func didSelect(selector: ModelHandlerType.ModelType)
} }
extension SelectorGroupSelectedModelHandlerable { 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 { public func createModelHandler(selector: ModelHandlerType.ModelType) -> ModelHandlerType {
//create view //create view
let newSelectorView = ModelHandlerType(with: selector) let newSelectorView = ModelHandlerType(with: selector)
@ -101,20 +112,23 @@ extension SelectorGroupSelectedModelHandlerable {
} }
public func didSelect(selector: ModelHandlerType.ModelType) { 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) replace(viewModel: oldSelectedModel)
} }
//only select is selected //only select is selected
if selector.selected { if selector.selected {
var newSelectedModel = selector var newSelectedModel = selector
newSelectedModel.selected = true newSelectedModel.selected = true
replace(viewModel: newSelectedModel) replace(viewModel: newSelectedModel)
selectedModel = newSelectedModel selectedInputId = selector.inputId
} else { } else {
//ensure current value is removed //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 ///MARK: Groups that allow single selections
public protocol SelectorGroupSelectedModelable: SelectorGroupModelable { 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
}
}
} }