From 3eb19646c881a85fca6ad6093f450fba8349ac78 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Tue, 23 Aug 2022 10:30:55 -0500 Subject: [PATCH] Added checkbox group Signed-off-by: Matt Bruce --- VDS.xcodeproj/project.pbxproj | 8 +++++ VDS/Components/Checkbox/CheckboxGroup.swift | 27 +++++++++++++++++ .../Checkbox/CheckboxGroupModel.swift | 30 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 VDS/Components/Checkbox/CheckboxGroup.swift create mode 100644 VDS/Components/Checkbox/CheckboxGroupModel.swift diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index 8cbd6c30..82246022 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -39,6 +39,8 @@ EA3C3B4C2894823E000CA526 /* AnyProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3C3B4B2894823E000CA526 /* AnyProxy.swift */; }; EA89200228AECF2A006B9984 /* UIButton+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200128AECF2A006B9984 /* UIButton+Publisher.swift */; }; EA89200428AECF4B006B9984 /* UITextField+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */; }; + EA89200628B526D6006B9984 /* CheckboxGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200528B526D6006B9984 /* CheckboxGroup.swift */; }; + EA89200828B526E0006B9984 /* CheckboxGroupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200728B526E0006B9984 /* CheckboxGroupModel.swift */; }; EAB1D29428A3ECF700DAE764 /* SelectorGroupBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAF7F13028A17FAB00B287F5 /* SelectorGroupBase.swift */; }; EAB1D29A28A5611D00DAE764 /* SelectorGroupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D29928A5611D00DAE764 /* SelectorGroupModel.swift */; }; EAB1D29C28A5618900DAE764 /* RadioButtonGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB1D29B28A5618900DAE764 /* RadioButtonGroup.swift */; }; @@ -124,6 +126,8 @@ EA3C3B4B2894823E000CA526 /* AnyProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyProxy.swift; sourceTree = ""; }; EA89200128AECF2A006B9984 /* UIButton+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Publisher.swift"; sourceTree = ""; }; EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Publisher.swift"; sourceTree = ""; }; + EA89200528B526D6006B9984 /* CheckboxGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxGroup.swift; sourceTree = ""; }; + EA89200728B526E0006B9984 /* CheckboxGroupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxGroupModel.swift; sourceTree = ""; }; EAB1D29928A5611D00DAE764 /* SelectorGroupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectorGroupModel.swift; sourceTree = ""; }; EAB1D29B28A5618900DAE764 /* RadioButtonGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroup.swift; sourceTree = ""; }; EAB1D29D28A5619500DAE764 /* RadioButtonGroupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioButtonGroupModel.swift; sourceTree = ""; }; @@ -392,6 +396,8 @@ children = ( EAF7F0932899861000B287F5 /* Checkbox.swift */, EAF7F0942899861000B287F5 /* CheckboxModel.swift */, + EA89200528B526D6006B9984 /* CheckboxGroup.swift */, + EA89200728B526E0006B9984 /* CheckboxGroupModel.swift */, ); path = Checkbox; sourceTree = ""; @@ -572,6 +578,7 @@ EAF7F0B1289B177F00B287F5 /* LabelAttributeColor.swift in Sources */, EAB1D2EA28AE84AA00DAE764 /* UIControlPublisher.swift in Sources */, EAF7F13328A2A16500B287F5 /* LabelAttributeAttachment.swift in Sources */, + EA89200628B526D6006B9984 /* CheckboxGroup.swift in Sources */, EAF7F0B9289C139800B287F5 /* ColorConfiguration.swift in Sources */, EA3361BD288B2C760071C351 /* TypeAlias.swift in Sources */, EAB1D2CF28ABEF2B00DAE764 /* Typography.swift in Sources */, @@ -592,6 +599,7 @@ EAB1D2E628AE842000DAE764 /* Publisher+Bind.swift in Sources */, EAB1D2C728A6E76300DAE764 /* ModelHandlerPublisher.swift in Sources */, EA3361AA288B25E40071C351 /* Disabling.swift in Sources */, + EA89200828B526E0006B9984 /* CheckboxGroupModel.swift in Sources */, EA3361B6288B2A410071C351 /* Control.swift in Sources */, EAB1D2A328A5994800DAE764 /* Debuggable.swift in Sources */, EAF7F0B7289C12A600B287F5 /* UITapGestureRecognizer.swift in Sources */, diff --git a/VDS/Components/Checkbox/CheckboxGroup.swift b/VDS/Components/Checkbox/CheckboxGroup.swift new file mode 100644 index 00000000..c1b7740c --- /dev/null +++ b/VDS/Components/Checkbox/CheckboxGroup.swift @@ -0,0 +1,27 @@ +// +// CheckboxGroup.swift +// VDS +// +// Created by Matt Bruce on 8/23/22. +// + +import Foundation + +public class CheckboxGroup: CheckboxGroupBase {} + +public class CheckboxGroupBase>: SelectorGroupBase { + + public var hasError: Bool { + get { model.hasError } + set { + var newHasError = newValue + let selectors = model.selectors.compactMap { existing in + return existing.copyWith { + $0.hasError = newHasError + } + } + model.hasError = newHasError + model.selectors = selectors + } + } +} diff --git a/VDS/Components/Checkbox/CheckboxGroupModel.swift b/VDS/Components/Checkbox/CheckboxGroupModel.swift new file mode 100644 index 00000000..cf703b7e --- /dev/null +++ b/VDS/Components/Checkbox/CheckboxGroupModel.swift @@ -0,0 +1,30 @@ +// +// CheckboxGroupModel.swift +// VDS +// +// Created by Matt Bruce on 8/23/22. +// + +import Foundation + +public protocol CheckboxGroupModel: SelectorGroupModel {} + +extension CheckboxGroupModel { + public var errorText: String? { return nil } +} + +public struct DefaultCheckboxGroupModel: CheckboxGroupModel { + public typealias SelectorType = DefaultCheckboxModel + public var id: UUID = UUID() + public var inputId: String? + public var value: AnyHashable? + public var surface: Surface = .light + public var disabled: Bool = false + public var selectors: [SelectorType] + public var hasError: Bool = false + public var errorText: String? + public init() { selectors = [] } + public init(selectors: [SelectorType]){ + self.selectors = selectors + } +}