diff --git a/VDS/Components/RadioBox/RadioBoxGroup.swift b/VDS/Components/RadioBox/RadioBoxGroup.swift index 98516b02..a1cc6261 100644 --- a/VDS/Components/RadioBox/RadioBoxGroup.swift +++ b/VDS/Components/RadioBox/RadioBoxGroup.swift @@ -8,10 +8,9 @@ import Foundation import UIKit -public class RadioBoxGroup: Control, SelectorGroupSelectedModelHandlerable, Changable { - public typealias ModelHandlerType = RadioBox +public class RadioBoxGroup: RadioBoxGroupBase { - public func didSelect(_ selectedControl: ModelHandlerType) { + public override func didSelect(_ selectedControl: ModelHandlerType) { //only changes local model in control, //this is now disconnected from the parent model for (index, control) in selectorViews.enumerated() { @@ -30,131 +29,12 @@ public class RadioBoxGroup: Control, SelectorGroupSel } } - sendActions(for: .valueChanged) - - } - - //-------------------------------------------------- - // MARK: - Public Properties - //-------------------------------------------------- - public var selectorViews: [ModelHandlerType] = [] - - public var onChange: Blocks.ActionBlock? - - //-------------------------------------------------- - // MARK: - Private Properties - //-------------------------------------------------- - private var mainStackView: UIStackView = { - return UIStackView().with { - $0.translatesAutoresizingMaskIntoConstraints = false - $0.spacing = 12 - } - }() - - //-------------------------------------------------- - // MARK: - Overrides - //-------------------------------------------------- - override public var disabled: Bool { - didSet { - updateSelectors() - } - } - - override public var surface: Surface { - didSet { - updateSelectors() - } - } - - private func ensureDevice() { - if UIDevice.isIPad { - mainStackView.axis = .horizontal - mainStackView.distribution = .fillEqually - } else { - if UIDevice.current.orientation.isPortrait || UIDevice.current.orientation == .unknown { - mainStackView.axis = .vertical - mainStackView.distribution = .fillProportionally - - } else { - mainStackView.axis = .horizontal - mainStackView.distribution = .fillEqually - } - } - } - - open override func setup() { - super.setup() - isAccessibilityElement = true - accessibilityTraits = .button - addSubview(mainStackView) - ensureDevice() - mainStackView.topAnchor.constraint(equalTo: topAnchor).isActive = true - mainStackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true - mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true - mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true - - NotificationCenter.default - .publisher(for: UIDevice.orientationDidChangeNotification) - .sink() { [weak self] _ in - UIView.animate(withDuration: 1.0) { - self?.ensureDevice() - } - }.store(in: &subscribers) - } - - open override func shouldUpdateView(viewModel: ModelType) -> Bool { - let update = viewModel.selectedModel?.inputId != model.selectedModel?.inputId - || viewModel.selectors.count != model.selectors.count - || viewModel.hasError != model.hasError - || viewModel.surface != model.surface - || viewModel.disabled != model.disabled - return update - } - - open override func updateView(viewModel: ModelType) { - for selectorModel in viewModel.selectors { - //see if view is there for the model - if let foundSelectorView = findSelectorView(inputId: selectorModel.inputId) { - foundSelectorView.set(with: selectorModel) - } else { - - //create view - let newSelectorView = createModelHandler(selector: selectorModel) - - self.selectorViews.append(newSelectorView) - mainStackView.addArrangedSubview(newSelectorView) - } - } } } public class RadioBoxGroupBase: Control, SelectorGroupSelectedModelHandlerable, Changable where GroupModelType.SelectorModelType == ModelHandlerType.ModelType { - - public func didSelect(_ selectedControl: ModelHandlerType) { - //only changes local model in control, - //this is now disconnected from the parent model - for (index, control) in selectorViews.enumerated() { - //only change the old and new - if control == selectedControl { - let updated = model.selectors[index].copyWith { - $0.selected = true - } - model.selectors[index] = updated - - } else if control.isSelected { - let updated = model.selectors[index].copyWith { - $0.selected = false - } - model.selectors[index] = updated - - } - } - - sendActions(for: .valueChanged) - } - //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- @@ -246,4 +126,8 @@ public class RadioBoxGroupBase, SelectorGroupSelectedModelHandlerable, Changable { - public typealias ModelHandlerType = RadioButton +public class RadioButtonGroup: RadioButtonGroupBase { - public func didSelect(_ selectedControl: ModelHandlerType) { + public override func didSelect(_ selectedControl: ModelHandlerType) { //only changes local model in control, //this is now disconnected from the parent model for (index, control) in selectorViews.enumerated() { @@ -37,7 +36,9 @@ public class RadioButtonGroup: Control, SelectorGr sendActions(for: .valueChanged) } +} +public class RadioButtonGroupBase: Control, SelectorGroupSelectedModelHandlerable, Changable where GroupModelType.SelectorModelType == ModelHandlerType.ModelType { //-------------------------------------------------- // MARK: - Public Properties @@ -129,4 +130,8 @@ public class RadioButtonGroup: Control, SelectorGr } } } + + public func didSelect(_ selectedControl: ModelHandlerType) { + fatalError("Must override didSelect") + } } diff --git a/VDS/Components/RadioButton/RadioButtonGroupModel.swift b/VDS/Components/RadioButton/RadioButtonGroupModel.swift index ce79e2a5..9174b65e 100644 --- a/VDS/Components/RadioButton/RadioButtonGroupModel.swift +++ b/VDS/Components/RadioButton/RadioButtonGroupModel.swift @@ -7,7 +7,7 @@ import Foundation -public protocol RadioButtonGroupModel: SelectorGroupSelectedModelable where SelectorModelType: RadioButtonModel { } +public protocol RadioButtonGroupModel: SelectorGroupSelectedModelable, Errorable where SelectorModelType: RadioButtonModel { } extension RadioButtonGroupModel { public var errorText: String? { return nil }