// // CheckboxGroup.swift // VDS // // Created by Matt Bruce on 8/23/22. // import Foundation import UIKit public class CheckboxGroup: CheckboxGroupBase { public override func didSelect(_ selectedControl: Checkbox) { selectedControl.toggle() if selectedControl.isSelected, hasError{ hasError.toggle() } valueChanged() } } public class CheckboxGroupBase>: SelectorGroupHandlerBase { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- public var hasError: Bool { get { model.hasError } set { var newHasError = newValue let anySelected = selectorViews.filter { $0.isSelected == true }.count > 0 if anySelected && newHasError { newHasError = false } selectorViews.forEach { handler in handler.hasError = newHasError } model.hasError = newHasError } } //-------------------------------------------------- // MARK: - Private Properties //-------------------------------------------------- private var mainStackView: UIStackView = { return UIStackView().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.alignment = .fill $0.distribution = .fillProportionally $0.axis = .vertical $0.spacing = 10 } }() //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- open override func setup() { super.setup() isAccessibilityElement = true accessibilityTraits = .button addSubview(mainStackView) 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 } open override func shouldUpdateView(viewModel: ModelType) -> Bool { let update = 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(id: selectorModel.id) { foundSelectorView.set(with: selectorModel) } else { //create view let newSelectorView = createModelHandler(selector: selectorModel) self.selectorViews.append(newSelectorView) mainStackView.addArrangedSubview(newSelectorView) } } } public var selectedModelHandlers: [ModelHandlerType]? { let selected = selectorViews.filter{ $0.isSelected == true } guard selected.count > 0 else { return nil } return selected } }