// // 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) { for (index, control) in selectorViews.enumerated() { //only change the old and new if control == selectedControl { let updated = model.selectors[index].copyWith { $0.selected.toggle() } model.selectors[index] = updated } } sendActions(for: .valueChanged) } } public class CheckboxGroupBase: SelectorGroupHandlerBase where GroupModelType.SelectorModelType == ModelHandlerType.ModelType { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- public var hasError: Bool { get { model.hasError } set { let selectors = model.selectors.compactMap { existing in return existing.copyWith { $0.hasError = newValue } } model.hasError = newValue model.selectors = selectors } } //-------------------------------------------------- // 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(inputId: selectorModel.inputId) { foundSelectorView.set(with: selectorModel) } else { //create view let newSelectorView = createModelHandler(selector: selectorModel) self.selectorViews.append(newSelectorView) mainStackView.addArrangedSubview(newSelectorView) } } } } public class SelectorGroupHandlerBase: Control, SelectorGroupModelHandlerable, Changable where GroupModelType.SelectorModelType == ModelHandlerType.ModelType { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- public var selectorViews: [ModelHandlerType] = [] public var onChange: Blocks.ActionBlock? //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- override public var disabled: Bool { didSet { updateSelectors() } } override public var surface: Surface { didSet { updateSelectors() } } public func findSelectorView(inputId: String?) -> ModelHandlerType? { return selectorViews.first(where: { existingSelectorView in return existingSelectorView.model.inputId == inputId }) } public func updateSelectors(){ let selectors = model.selectors.compactMap { existing in return existing.copyWith { $0.disabled = disabled $0.surface = surface } } model.selectors = selectors } 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 } } public func replace(viewModel: ModelHandlerType.ModelType){ if let index = model.selectors.firstIndex(where: { element in return element.inputId == viewModel.inputId }) { model.selectors[index] = viewModel } } public func didSelect(_ selectedControl: ModelHandlerType) { fatalError("Must override didSelect") } }