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] = []
|
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)
|
||||||
|
|||||||
@ -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 = [] }
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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?
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user