updated for not caching model, just the inputId
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
f13c9488a4
commit
1306c9e2a9
@ -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)
|
||||
|
||||
@ -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 = [] }
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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?
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
//--------------------------------------------------
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user