From 34e92fa2304f467346ea7950fc1c6a543e163ac1 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 17 Apr 2024 14:39:38 -0500 Subject: [PATCH 01/26] CXTDT-544383 - removed 2x and replaced with 3x Signed-off-by: Matt Bruce --- VDSSample/ViewControllers/TileContainerViewController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VDSSample/ViewControllers/TileContainerViewController.swift b/VDSSample/ViewControllers/TileContainerViewController.swift index 3e26150..a2cf029 100644 --- a/VDSSample/ViewControllers/TileContainerViewController.swift +++ b/VDSSample/ViewControllers/TileContainerViewController.swift @@ -437,7 +437,7 @@ extension TileContainerViewController { //Internal helper enum to map padding & pass custom padding values public enum Padding: String, CaseIterable { - case padding2X + case padding3X case padding4X case padding6X case padding8X @@ -446,8 +446,8 @@ extension TileContainerViewController { public var value: TileContainer.Padding? { return switch self { - case .padding2X: - .padding2X + case .padding3X: + .padding3X case .padding4X: .padding4X case .padding6X: From 63b6bbd4c3f23dc8bd7c591b4e489fa923135cd8 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 17 Apr 2024 15:49:44 -0500 Subject: [PATCH 02/26] Signed-off-by: Matt Bruce --- VDSSample/ViewControllers/TileletViewController.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/VDSSample/ViewControllers/TileletViewController.swift b/VDSSample/ViewControllers/TileletViewController.swift index 3543d31..cad5ec9 100644 --- a/VDSSample/ViewControllers/TileletViewController.swift +++ b/VDSSample/ViewControllers/TileletViewController.swift @@ -202,7 +202,6 @@ class TileletViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: .makeWrapper(for: component)) - setupPicker() setupModel() } @@ -357,8 +356,6 @@ class TileletViewController: BaseViewController { showBackgroundImageSwitch.onChange = { [weak self] sender in if let image = self?.backgroundImage, sender.isOn { self?.component.backgroundImage = image - if self?.component.width == nil { - } } else { self?.component.backgroundImage = nil } @@ -383,7 +380,7 @@ class TileletViewController: BaseViewController { func setupModel() { let titleModel = Tilelet.TitleModel(text: "Save $XX on your monthly bill.") let subTitleModel = Tilelet.SubTitleModel(text: "Enroll in Auto Pay & paper-free billing to save on your monthly bill.") - + component.color = .black component.surface = .light component.titleModel = titleModel component.subTitleModel = subTitleModel From e0b0ad250da0bb80c70bd01c96fa898ed7ab505a Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 17 Apr 2024 15:56:01 -0500 Subject: [PATCH 03/26] updated version Signed-off-by: Matt Bruce --- VDSSample.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index 715c43a..5fbd5e1 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -688,7 +688,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 58; + CURRENT_PROJECT_VERSION = 59; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = FCMA4QKS77; GENERATE_INFOPLIST_FILE = YES; @@ -723,7 +723,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 58; + CURRENT_PROJECT_VERSION = 59; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = FCMA4QKS77; GENERATE_INFOPLIST_FILE = YES; From fa6bb87cb10c52d890f6bf0fe6988f11ed37cc3f Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 18 Apr 2024 15:02:27 -0500 Subject: [PATCH 04/26] added selected color Signed-off-by: Matt Bruce --- VDSSample.xcodeproj/project.pbxproj | 8 ++- VDSSample/Classes/ColorPickerView.swift | 68 +++++++++++++++++++ .../ButtonIconViewController.swift | 54 ++++++++++++++- 3 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 VDSSample/Classes/ColorPickerView.swift diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index 5fbd5e1..fc9f459 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -61,6 +61,7 @@ EA5E30552950EA6E0082B959 /* TitleLockupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E30542950EA6E0082B959 /* TitleLockupViewController.swift */; }; EA5E305C295111050082B959 /* TileletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E305B295111050082B959 /* TileletViewController.swift */; }; EA5F86CE2A1E863F00BC83E4 /* TabsContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5F86CD2A1E863F00BC83E4 /* TabsContainerViewController.swift */; }; + EA6642972BD1B2E700D81DC4 /* ColorPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA6642962BD1B2E700D81DC4 /* ColorPickerView.swift */; }; EA81410E2A0ED8DC004F60D2 /* ButtonIconViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410D2A0ED8DC004F60D2 /* ButtonIconViewController.swift */; }; EA89201928B56DF5006B9984 /* RadioBoxGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89201828B56DF5006B9984 /* RadioBoxGroupViewController.swift */; }; EA89204628B66CE2006B9984 /* ScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89203F28B66CE2006B9984 /* ScrollViewController.swift */; }; @@ -155,6 +156,7 @@ EA5E30542950EA6E0082B959 /* TitleLockupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleLockupViewController.swift; sourceTree = ""; }; EA5E305B295111050082B959 /* TileletViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileletViewController.swift; sourceTree = ""; }; EA5F86CD2A1E863F00BC83E4 /* TabsContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsContainerViewController.swift; sourceTree = ""; }; + EA6642962BD1B2E700D81DC4 /* ColorPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerView.swift; sourceTree = ""; }; EA81410D2A0ED8DC004F60D2 /* ButtonIconViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonIconViewController.swift; sourceTree = ""; }; EA89201828B56DF5006B9984 /* RadioBoxGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioBoxGroupViewController.swift; sourceTree = ""; }; EA89203F28B66CE2006B9984 /* ScrollViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollViewController.swift; sourceTree = ""; }; @@ -263,9 +265,10 @@ EA89204F28B682F4006B9984 /* Classes */ = { isa = PBXGroup; children = ( - EA89205028B68307006B9984 /* TextField.swift */, - EAD062A42A3B5CDF0015965D /* Slider.swift */, + EA6642962BD1B2E700D81DC4 /* ColorPickerView.swift */, EAB5FEF22928153D00998C17 /* Helper.swift */, + EAD062A42A3B5CDF0015965D /* Slider.swift */, + EA89205028B68307006B9984 /* TextField.swift */, ); path = Classes; sourceTree = ""; @@ -515,6 +518,7 @@ EAD062AD2A3B86950015965D /* BadgeIndicatorViewController.swift in Sources */, EA5E305C295111050082B959 /* TileletViewController.swift in Sources */, EAD062A32A3913920015965D /* DropShawdowViewController.swift in Sources */, + EA6642972BD1B2E700D81DC4 /* ColorPickerView.swift in Sources */, EA0D1C312A673F3500E5C127 /* RadioButtonViewController.swift in Sources */, EAB5FEF32928153D00998C17 /* Helper.swift in Sources */, EA89204728B66CE2006B9984 /* KeyboardFrameChangeListener.swift in Sources */, diff --git a/VDSSample/Classes/ColorPickerView.swift b/VDSSample/Classes/ColorPickerView.swift new file mode 100644 index 0000000..a340698 --- /dev/null +++ b/VDSSample/Classes/ColorPickerView.swift @@ -0,0 +1,68 @@ +// +// ColorPickerView.swift +// VDSSample +// +// Created by Matt Bruce on 4/18/24. +// + +import Foundation +import UIKit +import VDS + +public class ColorPickerView: UIStackView { + public var pickerType: EnumType + public var selectedColor: UIColor? { + didSet { + selectedColorView.backgroundColor = selectedColor + } + } + + var selectedColorView: UIView = { + let view = UIView() + view.translatesAutoresizingMaskIntoConstraints = false + view.widthAnchor.constraint(equalToConstant: 20).isActive = true + view.heightAnchor.constraint(equalToConstant: 20).isActive = true + return view + }() + + var button = Button().with { + $0.size = .small + $0.use = .secondary + $0.text = "Select" + } + + public init(with pickerType: EnumType, onClick: @escaping (ColorPickerView)->Void) { + self.pickerType = pickerType + super.init(frame: .zero) + setup() + button.onClick = { _ in onClick(self) } + } + + required init(coder: NSCoder) { + fatalError() + } + + private func setup() { + distribution = .fillEqually + alignment = .fill + spacing = 10 + + let indicatorWrapper = View() + indicatorWrapper.addSubview(selectedColorView) + indicatorWrapper.height(32) + indicatorWrapper.pinTop() + indicatorWrapper.pinLeading() + indicatorWrapper.pinBottom() + indicatorWrapper.pinTrailingGreaterThanOrEqualTo(anchor: indicatorWrapper.trailingAnchor) + + addArrangedSubview(indicatorWrapper) + let buttonWrapper = View() + buttonWrapper.addSubview(button) + buttonWrapper.height(32) + button.pinTop() + button.pinTrailing() + button.pinBottom() + button.pinLeadingGreaterThanOrEqualTo(anchor: buttonWrapper.leadingAnchor) + addArrangedSubview(buttonWrapper) + } +} diff --git a/VDSSample/ViewControllers/ButtonIconViewController.swift b/VDSSample/ViewControllers/ButtonIconViewController.swift index 5113cfc..8d3b24a 100644 --- a/VDSSample/ViewControllers/ButtonIconViewController.swift +++ b/VDSSample/ViewControllers/ButtonIconViewController.swift @@ -59,7 +59,7 @@ class ButtonIconViewController: BaseViewController { var selectableSwitch = Toggle() var badgeIndicatorSwitch = Toggle() var variantOneSwitch = Toggle() - + lazy var badgeIndicatorExpandDirectionPickerSelectorView = { PickerSelectorView(title: "right", picker: self.picker, @@ -75,6 +75,32 @@ class ButtonIconViewController: BaseViewController { var badgeIndicatorFormStackView = FormSection().with { $0.isHidden = true } + ///ColorPicker + var colorPickerType: ColorPickerType = .light + enum ColorPickerType { + case light, dark + } + + lazy var colorPicker: UIColorPickerViewController = { + let picker = UIColorPickerViewController() + picker.delegate = self + return picker + }() + + lazy var lightColorPicker: ColorPickerView = { + return .init(with: ColorPickerType.light) {[weak self] picker in + self?.colorPickerType = picker.pickerType + self?.selectedColorTapped(picker) + } + }() + + lazy var darkColorPicker: ColorPickerView = { + return .init(with: ColorPickerType.dark) {[weak self] picker in + self?.colorPickerType = picker.pickerType + self?.selectedColorTapped(picker) + } + }() + override func setupForm(){ super.setupForm() addFormRow(label: "Disabled", view: disabledSwitch) @@ -82,6 +108,8 @@ class ButtonIconViewController: BaseViewController { addFormRow(label: "Surface Type", view: surfaceTypePickerSelectorView) addFormRow(label: "Size", view: sizePickerSelectorView) addFormRow(label: "Kind", view: kindPickerSelectorView) + addFormRow(label: "Selected Light", view: lightColorPicker) + addFormRow(label: "Selected Dark", view: darkColorPicker) addFormRow(label: "Floating", view: floating) addFormRow(label: "Hide Border", view: hideBorder) addFormRow(label: "Fit To Icon", view: fitToIcon) @@ -237,3 +265,27 @@ extension ButtonIconViewController: ComponentSampleable { return ComponentSample(component: component, trailingPinningType: .lessThanOrEqual) } } + +extension ButtonIconViewController: UIColorPickerViewControllerDelegate { + + func selectedColorTapped(_ picker: ColorPickerView) { + let selectedColor = picker.selectedColor + if let selectedColor { + colorPicker.selectedColor = selectedColor + } + present(colorPicker, animated: true) + } + + func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) { + dismiss(animated: true) + } + + func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) { + let color = viewController.selectedColor + let selectedColorPickerView = colorPickerType == .dark ? darkColorPicker : lightColorPicker + selectedColorPickerView.selectedColor = color + if let selectedDarkColor = darkColorPicker.selectedColor, let selectedLightColor = lightColorPicker.selectedColor { + component.selectedIconColorConfiguration = .init(selectedLightColor, selectedDarkColor) + } + } +} From 9277898075dbda90d5c90ad48fc98361c12a22e4 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 18 Apr 2024 15:37:18 -0500 Subject: [PATCH 05/26] refactor color picker Signed-off-by: Matt Bruce --- .../TileContainerViewController.swift | 167 +++++------------- 1 file changed, 44 insertions(+), 123 deletions(-) diff --git a/VDSSample/ViewControllers/TileContainerViewController.swift b/VDSSample/ViewControllers/TileContainerViewController.swift index a2cf029..2af2295 100644 --- a/VDSSample/ViewControllers/TileContainerViewController.swift +++ b/VDSSample/ViewControllers/TileContainerViewController.swift @@ -15,9 +15,6 @@ class TileContainerViewController: BaseViewController { lazy var colorPicker: UIColorPickerViewController = { let picker = UIColorPickerViewController() - if case .custom(let hexCode) = component.color { - picker.selectedColor = UIColor(hexString: hexCode) - } picker.delegate = self return picker }() @@ -49,92 +46,6 @@ class TileContainerViewController: BaseViewController { picker: self.picker, items: BackgroundEffect.allCases) }() - - lazy var gradientColorView1: UIStackView = { - let stackView = UIStackView() - let indicatorWrapper = View() - indicatorWrapper.addSubview(gradientColor1View) - indicatorWrapper.height(32) - indicatorWrapper.pinTop() - indicatorWrapper.pinLeading() - indicatorWrapper.pinBottom() - indicatorWrapper.pinTrailingGreaterThanOrEqualTo(anchor: indicatorWrapper.trailingAnchor) - stackView.addArrangedSubview(indicatorWrapper) - stackView.distribution = .fillEqually - stackView.alignment = .fill - var button = Button().with { instance in - instance.size = .small - instance.use = .secondary - instance.text = "Select" - instance.onClick = { [weak self] in - self?.gradientColorTapped($0, view: self?.gradientColor1View) - } - } - button.tag = 1 - let buttonWrapper = View() - buttonWrapper.addSubview(button) - buttonWrapper.height(32) - button.pinTop() - button.pinTrailing() - button.pinBottom() - button.pinLeadingGreaterThanOrEqualTo(anchor: buttonWrapper.leadingAnchor) - stackView.addArrangedSubview(buttonWrapper) - stackView.tag = 1 - stackView.spacing = 10 - return stackView - }() - - lazy var gradientColorView2: UIStackView = { - let stackView = UIStackView() - stackView.distribution = .fillEqually - stackView.alignment = .fill - stackView.spacing = 10 - let indicatorWrapper = View() - indicatorWrapper.addSubview(gradientColor2View) - indicatorWrapper.height(32) - indicatorWrapper.pinTop() - indicatorWrapper.pinLeading() - indicatorWrapper.pinBottom() - indicatorWrapper.pinTrailingGreaterThanOrEqualTo(anchor: indicatorWrapper.trailingAnchor) - stackView.addArrangedSubview(indicatorWrapper) - var button = Button().with { instance in - instance.size = .small - instance.use = .secondary - instance.text = "Select" - instance.onClick = { [weak self] in - self?.gradientColorTapped($0, view: self?.gradientColor2View) - } - } - button.tag = 2 - let buttonWrapper = View() - buttonWrapper.addSubview(button) - buttonWrapper.height(32) - button.pinTop() - button.pinTrailing() - button.pinBottom() - button.pinLeadingGreaterThanOrEqualTo(anchor: buttonWrapper.leadingAnchor) - stackView.addArrangedSubview(buttonWrapper) - stackView.tag = 2 - return stackView - }() - - var gradientColor1View: UIView = { - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - view.widthAnchor.constraint(equalToConstant: 20).isActive = true - view.heightAnchor.constraint(equalToConstant: 20).isActive = true - view.tag = 1 - return view - }() - - var gradientColor2View: UIView = { - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - view.widthAnchor.constraint(equalToConstant: 20).isActive = true - view.heightAnchor.constraint(equalToConstant: 20).isActive = true - view.tag = 2 - return view - }() var gradientColorsFormStackView = FormSection().with { $0.isHidden = true } var backgroundColor: BackgroundColor = .secondary @@ -143,11 +54,7 @@ class TileContainerViewController: BaseViewController { var showBackgroundImageSwitch = Toggle() var showBorderSwitch = Toggle() var showDropShadowSwitch = Toggle() - var selectedGradient1Color: String? - var selectedGradient2Color: String? - var colorPickerType: ColorPickerType = .backgroundColor var backgroundImage = UIImage(named: "backgroundTest")! - var selectedGradientColorView: UIView? var customPaddingRowView: UIView? var anyCancellable: AnyCancellable? @@ -168,6 +75,25 @@ class TileContainerViewController: BaseViewController { $0.placeholder = "Minimum 100px else it will occupy full container" } + var colorPickerType: ColorPickerType = .backgroundColor + enum ColorPickerType { + case backgroundColor, gradientColor1, gradientColor2, contentViewBackgroundColor + } + + lazy var gradientColorView1: ColorPickerView = { + return .init(with: ColorPickerType.gradientColor1) { [weak self] picker in + self?.colorPickerType = picker.pickerType + self?.selectedColorTapped(picker) + } + }() + + lazy var gradientColorView2: ColorPickerView = { + return .init(with: ColorPickerType.gradientColor2) { [weak self] picker in + self?.colorPickerType = picker.pickerType + self?.selectedColorTapped(picker) + } + }() + override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: .makeWrapper(for: component)) @@ -295,12 +221,10 @@ class TileContainerViewController: BaseViewController { if let effect = $0.effect { self.component.backgroundEffect = effect self.gradientColorsFormStackView.isHidden = true - self.selectedGradient1Color = nil - self.selectedGradient1Color = nil - self.gradientColor1View.backgroundColor = .clear - self.gradientColor2View.backgroundColor = .clear + self.gradientColorView1.selectedColor = nil + self.gradientColorView2.selectedColor = nil } else { - self.colorPickerType = .gradientColors + self.colorPickerType = .gradientColor1 self.gradientColorsFormStackView.isHidden = false } } @@ -333,14 +257,6 @@ class TileContainerViewController: BaseViewController { } } - func gradientColorTapped(_ sender: Button, view: UIView?) { - selectedGradientColorView = view - let selectedColor = (sender.tag == 1) ? selectedGradient1Color : selectedGradient2Color - if let selectedColor { - colorPicker.selectedColor = UIColor(hexString: selectedColor) - } - present(colorPicker, animated: true) - } } extension TileContainerViewController: ComponentSampleable { @@ -354,6 +270,14 @@ extension TileContainerViewController: ComponentSampleable { extension TileContainerViewController: UIColorPickerViewControllerDelegate { + func selectedColorTapped(_ picker: ColorPickerView) { + let selectedColor = picker.selectedColor + if let selectedColor { + colorPicker.selectedColor = selectedColor + } + present(colorPicker, animated: true) + } + func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) { dismiss(animated: true) } @@ -365,17 +289,19 @@ extension TileContainerViewController: UIColorPickerViewControllerDelegate { component.containerView.backgroundColor = UIColor(hexString: hexString) case .backgroundColor: component.color = .custom(hexString) - case .gradientColors: - guard let selectedGradientColorView else { return } - if selectedGradientColorView.tag == 1 { - selectedGradient1Color = hexString - } else { - selectedGradient2Color = hexString - } - selectedGradientColorView.backgroundColor = UIColor(hexString: hexString) - if let selectedGradient1Color, let selectedGradient2Color { - component.backgroundEffect = .gradient(selectedGradient1Color, selectedGradient2Color) - } + case .gradientColor1: + gradientColorView1.selectedColor = viewController.selectedColor + updateGradientColors() + case .gradientColor2: + gradientColorView2.selectedColor = viewController.selectedColor + updateGradientColors() + } + } + + func updateGradientColors(){ + if let selectedGradient1Color = gradientColorView1.selectedColor?.hexString, + let selectedGradient2Color = gradientColorView2.selectedColor?.hexString{ + component.backgroundEffect = .gradient(selectedGradient1Color, selectedGradient2Color) } } } @@ -429,12 +355,7 @@ extension TileContainerViewController { } } } - - //Internal helper enum to identiy the configuration - enum ColorPickerType { - case backgroundColor, gradientColors, contentViewBackgroundColor - } - + //Internal helper enum to map padding & pass custom padding values public enum Padding: String, CaseIterable { case padding3X From 21d7ee8e45a2f49e7dc5a1f6cd477d272d3edd62 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 18 Apr 2024 15:52:21 -0500 Subject: [PATCH 06/26] refactored tilelet for color picker Signed-off-by: Matt Bruce --- .../TileletViewController.swift | 176 ++++++------------ 1 file changed, 54 insertions(+), 122 deletions(-) diff --git a/VDSSample/ViewControllers/TileletViewController.swift b/VDSSample/ViewControllers/TileletViewController.swift index cad5ec9..772a189 100644 --- a/VDSSample/ViewControllers/TileletViewController.swift +++ b/VDSSample/ViewControllers/TileletViewController.swift @@ -69,104 +69,34 @@ class TileletViewController: BaseViewController { lazy var colorPicker: UIColorPickerViewController = { let picker = UIColorPickerViewController() - if case .custom(let hexCode) = component.color { - picker.selectedColor = UIColor(hexString: hexCode) - } picker.delegate = self return picker }() + var colorPickerType: ColorPickerType = .backgroundColor + enum ColorPickerType { + case backgroundColor, gradientColor1, gradientColor2, contentViewBackgroundColor + } + + lazy var gradientColorView1: ColorPickerView = { + return .init(with: ColorPickerType.gradientColor1) { [weak self] picker in + self?.colorPickerType = picker.pickerType + self?.selectedColorTapped(picker) + } + }() + + lazy var gradientColorView2: ColorPickerView = { + return .init(with: ColorPickerType.gradientColor2) { [weak self] picker in + self?.colorPickerType = picker.pickerType + self?.selectedColorTapped(picker) + } + }() + lazy var backgroundColorPickerSelectorView = { PickerSelectorView(title: "white", picker: self.picker, items: BackgroundColor.allCases) }() - - lazy var gradientColorView1: UIStackView = { - let stackView = UIStackView() - let indicatorWrapper = View() - indicatorWrapper.addSubview(gradientColor1View) - indicatorWrapper.height(32) - indicatorWrapper.pinTop() - indicatorWrapper.pinLeading() - indicatorWrapper.pinBottom() - indicatorWrapper.pinTrailingGreaterThanOrEqualTo(anchor: indicatorWrapper.trailingAnchor) - stackView.addArrangedSubview(indicatorWrapper) - stackView.distribution = .fillEqually - stackView.alignment = .fill - var button = Button().with { instance in - instance.size = .small - instance.use = .secondary - instance.text = "Select" - instance.onClick = { [weak self] in - self?.gradientColorTapped($0, view: self?.gradientColor1View) - } - } - button.tag = 1 - let buttonWrapper = View() - buttonWrapper.addSubview(button) - buttonWrapper.height(32) - button.pinTop() - button.pinTrailing() - button.pinBottom() - button.pinLeadingGreaterThanOrEqualTo(anchor: buttonWrapper.leadingAnchor) - stackView.addArrangedSubview(buttonWrapper) - stackView.tag = 1 - stackView.spacing = 10 - return stackView - }() - - lazy var gradientColorView2: UIStackView = { - let stackView = UIStackView() - stackView.distribution = .fillEqually - stackView.alignment = .fill - stackView.spacing = 10 - let indicatorWrapper = View() - indicatorWrapper.addSubview(gradientColor2View) - indicatorWrapper.height(32) - indicatorWrapper.pinTop() - indicatorWrapper.pinLeading() - indicatorWrapper.pinBottom() - indicatorWrapper.pinTrailingGreaterThanOrEqualTo(anchor: indicatorWrapper.trailingAnchor) - stackView.addArrangedSubview(indicatorWrapper) - var button = Button().with { instance in - instance.size = .small - instance.use = .secondary - instance.text = "Select" - instance.onClick = { [weak self] in - self?.gradientColorTapped($0, view: self?.gradientColor2View) - } - } - button.tag = 2 - let buttonWrapper = View() - buttonWrapper.addSubview(button) - buttonWrapper.height(32) - button.pinTop() - button.pinTrailing() - button.pinBottom() - button.pinLeadingGreaterThanOrEqualTo(anchor: buttonWrapper.leadingAnchor) - stackView.addArrangedSubview(buttonWrapper) - stackView.tag = 2 - return stackView - }() - - var gradientColor1View: UIView = { - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - view.widthAnchor.constraint(equalToConstant: 20).isActive = true - view.heightAnchor.constraint(equalToConstant: 20).isActive = true - view.tag = 1 - return view - }() - - var gradientColor2View: UIView = { - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - view.widthAnchor.constraint(equalToConstant: 20).isActive = true - view.heightAnchor.constraint(equalToConstant: 20).isActive = true - view.tag = 2 - return view - }() lazy var textAlignmentPickerSelectorView = { PickerSelectorView(title: "left", @@ -189,7 +119,6 @@ class TileletViewController: BaseViewController { var badgeTextField = TextField() var eyebrowIsBold = Toggle().with { $0.isOn = true } var titleIsBold = Toggle().with { $0.isOn = true } - var colorPickerType: ColorPickerType = .backgroundColor var selectedGradient1Color: String? var selectedGradient2Color: String? var selectedGradientColorView: UIView? @@ -486,12 +415,10 @@ class TileletViewController: BaseViewController { if let effect = item.effect { self.component.backgroundEffect = self.getTilelet(effect: effect) self.gradientColorsFormStackView.isHidden = true - self.selectedGradient1Color = nil - self.selectedGradient1Color = nil - self.gradientColor1View.backgroundColor = .clear - self.gradientColor2View.backgroundColor = .clear + self.gradientColorView1.selectedColor = nil + self.gradientColorView2.selectedColor = nil } else { - self.colorPickerType = .gradientColors + self.colorPickerType = .gradientColor1 self.gradientColorsFormStackView.isHidden = false } } @@ -502,19 +429,15 @@ class TileletViewController: BaseViewController { backgroundColorPickerSelectorView.onPickerDidSelect = { [weak self] item in guard let self else { return } - self.component.color = self.getTilelet(backgroundColor: item) + if let color = self.getTilelet(backgroundColor: item) { + self.component.color = color + } else { + self.colorPickerType = .backgroundColor + self.present(self.colorPicker, animated: true) + } } } - func gradientColorTapped(_ sender: Button, view: UIView?) { - selectedGradientColorView = view - let selectedColor = (sender.tag == 1) ? selectedGradient1Color : selectedGradient2Color - if let selectedColor { - colorPicker.selectedColor = UIColor(hexString: selectedColor) - } - present(colorPicker, animated: true) - } - func getTilelet(effect: TileContainer.BackgroundEffect) -> Tilelet.BackgroundEffect { switch effect { case .transparency: @@ -526,7 +449,7 @@ class TileletViewController: BaseViewController { } } - func getTilelet(backgroundColor: BackgroundColor) -> Tilelet.BackgroundColor { + func getTilelet(backgroundColor: BackgroundColor) -> Tilelet.BackgroundColor? { switch backgroundColor { case .primary: .primary @@ -536,6 +459,8 @@ class TileletViewController: BaseViewController { .white case .black: .black + case .custom: + nil } } } @@ -556,11 +481,14 @@ extension TileletViewController: ComponentSampleable { extension TileletViewController: UIColorPickerViewControllerDelegate { - //Internal helper enum to identiy the configuration - enum ColorPickerType { - case backgroundColor, gradientColors, contentViewBackgroundColor + func selectedColorTapped(_ picker: ColorPickerView) { + let selectedColor = picker.selectedColor + if let selectedColor { + colorPicker.selectedColor = selectedColor + } + present(colorPicker, animated: true) } - + func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) { dismiss(animated: true) } @@ -572,17 +500,19 @@ extension TileletViewController: UIColorPickerViewControllerDelegate { component.containerView.backgroundColor = UIColor(hexString: hexString) case .backgroundColor: component.color = .custom(hexString) - case .gradientColors: - guard let selectedGradientColorView else { return } - if selectedGradientColorView.tag == 1 { - selectedGradient1Color = hexString - } else { - selectedGradient2Color = hexString - } - selectedGradientColorView.backgroundColor = UIColor(hexString: hexString) - if let selectedGradient1Color, let selectedGradient2Color { - component.backgroundEffect = .gradient(selectedGradient1Color, selectedGradient2Color) - } + case .gradientColor1: + gradientColorView1.selectedColor = viewController.selectedColor + updateGradientColors() + case .gradientColor2: + gradientColorView2.selectedColor = viewController.selectedColor + updateGradientColors() + } + } + + func updateGradientColors(){ + if let selectedGradient1Color = gradientColorView1.selectedColor?.hexString, + let selectedGradient2Color = gradientColorView2.selectedColor?.hexString{ + component.backgroundEffect = .gradient(selectedGradient1Color, selectedGradient2Color) } } } @@ -591,7 +521,7 @@ extension TileletViewController { enum BackgroundColor: String, CaseIterable { - case primary, secondary, white, black + case primary, secondary, white, black, custom var color: TileContainer.BackgroundColor? { switch self { @@ -603,6 +533,8 @@ extension TileletViewController { .white case .black: .black + case .custom: + nil } } } From 64b823da48e7e27173f2c0b697a5678315539476 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 19 Apr 2024 09:53:12 -0500 Subject: [PATCH 07/26] refactored dropshadow to use real code Signed-off-by: Matt Bruce --- .../DropShawdowViewController.swift | 60 +++++++++++-------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/VDSSample/ViewControllers/DropShawdowViewController.swift b/VDSSample/ViewControllers/DropShawdowViewController.swift index ec8bfa7..c0be652 100644 --- a/VDSSample/ViewControllers/DropShawdowViewController.swift +++ b/VDSSample/ViewControllers/DropShawdowViewController.swift @@ -353,7 +353,6 @@ public class ShadowView: View { public var viewRadiusRange: CGFloat = 8.0 { didSet { setNeedsUpdate() }} - private var shadowLayer1: CALayer = CALayer() public var showShadow: Bool = true { didSet { setNeedsUpdate() }} public var opacityRange: CGFloat = 1.0 { didSet { setNeedsUpdate() }} public var offsetXRange: CGFloat = 2.0 { didSet { setNeedsUpdate() }} @@ -362,7 +361,6 @@ public class ShadowView: View { public var shadowLightColor: UIColor.VDSColor = .backgroundPrimaryDark { didSet { setNeedsUpdate() }} public var shadowDarkColor: UIColor.VDSColor = .backgroundPrimaryLight { didSet { setNeedsUpdate() }} - private var shadowLayer2: CALayer = CALayer() public var showShadow2: Bool = false { didSet { setNeedsUpdate() }} public var opacityRange2: CGFloat = 1.0 { didSet { setNeedsUpdate() }} public var offsetXRange2: CGFloat = 2.0 { didSet { setNeedsUpdate() }} @@ -376,46 +374,60 @@ public class ShadowView: View { width(constant: 100) height(constant: 100) - // Add shadow layers as sublayers of the view's layer - layer.insertSublayer(shadowLayer1, at: 0) - layer.insertSublayer(shadowLayer2, at: 0) } public override func updateView() { super.updateView() let viewColor = SurfaceColorConfiguration(viewLightColor.uiColor, viewDarkColor.uiColor).getColor(surface) backgroundColor = viewColor - shadowLayer1.backgroundColor = viewColor.cgColor - shadowLayer2.backgroundColor = viewColor.cgColor - shadowLayer1.isHidden = !showShadow - shadowLayer2.isHidden = !showShadow2 + setNeedsLayout() layoutIfNeeded() } + public override var backgroundColor: UIColor? { + didSet { + print("backgroundColor: \(backgroundColor?.hexString ?? "None")") + } + } public override func layoutSubviews() { super.layoutSubviews() + + layer.cornerRadius = CGFloat(viewRadiusRange) let dropshadowColor = SurfaceColorConfiguration(shadowLightColor.uiColor, shadowDarkColor.uiColor).getColor(surface) let dropshadowColor2 = SurfaceColorConfiguration(shadowLightColor2.uiColor, shadowDarkColor2.uiColor).getColor(surface) - layer.cornerRadius = CGFloat(viewRadiusRange) - layer.masksToBounds = false + var shadowConfigs = [DropShadowConfiguration]() // Update shadow layers frames to match the view's bounds - shadowLayer1.frame = bounds - shadowLayer2.frame = bounds - - shadowLayer1.cornerRadius = CGFloat(viewRadiusRange) - shadowLayer1.shadowColor = dropshadowColor.cgColor - shadowLayer1.shadowOpacity = Float(opacityRange) - shadowLayer1.shadowOffset = .init(width: CGFloat(offsetXRange), height: CGFloat(offsetYRange)) - shadowLayer1.shadowRadius = CGFloat(radiusRange) + if showShadow { + let shadow1Config = VDS.DropShadowConfiguration().with { + $0.shadowRadiusConfiguration = .init(viewRadiusRange, .zero) + $0.shadowColorConfiguration = SurfaceColorConfiguration(dropshadowColor, dropshadowColor).eraseToAnyColorable() + $0.shadowOpacityConfiguration = .init(opacityRange, .zero) + $0.shadowOffsetConfiguration = .init(.init(width: offsetXRange, height: offsetYRange), .zero) + $0.shadowRadiusConfiguration = .init(radiusRange, .zero) + } + shadowConfigs.append(shadow1Config) + } - shadowLayer2.cornerRadius = CGFloat(viewRadiusRange) - shadowLayer2.shadowColor = dropshadowColor2.cgColor - shadowLayer2.shadowOpacity = Float(opacityRange2) - shadowLayer2.shadowOffset = .init(width: CGFloat(offsetXRange2), height: CGFloat(offsetYRange2)) - shadowLayer2.shadowRadius = CGFloat(radiusRange2) + if showShadow2 { + let shadow2Config = VDS.DropShadowConfiguration().with { + $0.shadowRadiusConfiguration = .init(viewRadiusRange, .zero) + $0.shadowColorConfiguration = SurfaceColorConfiguration(dropshadowColor2, dropshadowColor2).eraseToAnyColorable() + $0.shadowOpacityConfiguration = .init(opacityRange2, .zero) + $0.shadowOffsetConfiguration = .init(.init(width: offsetXRange2, height: offsetYRange2), .zero) + $0.shadowRadiusConfiguration = .init(radiusRange2, .zero) + } + shadowConfigs.append(shadow2Config) + } + + if shadowConfigs.count > 0 { + addDropShadows(shadowConfigs) + } else { + removeDropShadows() + } + } } From cee74d0e324cd86c4d5a5c46c10ee1b16f7863a4 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 24 Apr 2024 17:31:26 -0500 Subject: [PATCH 08/26] updated vcs Signed-off-by: Matt Bruce --- VDSSample/ViewControllers/ButtonIconViewController.swift | 1 + VDSSample/ViewControllers/TileContainerViewController.swift | 2 ++ 2 files changed, 3 insertions(+) diff --git a/VDSSample/ViewControllers/ButtonIconViewController.swift b/VDSSample/ViewControllers/ButtonIconViewController.swift index 8d3b24a..85f175c 100644 --- a/VDSSample/ViewControllers/ButtonIconViewController.swift +++ b/VDSSample/ViewControllers/ButtonIconViewController.swift @@ -181,6 +181,7 @@ class ButtonIconViewController: BaseViewController { let name = Icon.Name.addToFavorite component.iconName = name + component.onChange = { c in print("changed: \(c.isSelected)") } //setup UI surfacePickerSelectorView.text = component.surface.rawValue surfaceTypePickerSelectorView.text = component.surfaceType.rawValue diff --git a/VDSSample/ViewControllers/TileContainerViewController.swift b/VDSSample/ViewControllers/TileContainerViewController.swift index 2af2295..a266f0d 100644 --- a/VDSSample/ViewControllers/TileContainerViewController.swift +++ b/VDSSample/ViewControllers/TileContainerViewController.swift @@ -99,6 +99,8 @@ class TileContainerViewController: BaseViewController { addContentTopView(view: .makeWrapper(for: component)) component.width = 150 component.color = .secondary + component.accessibilityLabel = "Tile Container" + component.addContentView(Label().with { $0.text = "Testing Label" }) setupPicker() setupModel() } From bc923accd3f665c5fbb31b679105e184662eef05 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 25 Apr 2024 15:07:41 -0500 Subject: [PATCH 09/26] refactored Signed-off-by: Matt Bruce --- VDSSample/ViewControllers/TileContainerViewController.swift | 2 +- VDSSample/ViewControllers/TileletViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VDSSample/ViewControllers/TileContainerViewController.swift b/VDSSample/ViewControllers/TileContainerViewController.swift index 2af2295..b605e55 100644 --- a/VDSSample/ViewControllers/TileContainerViewController.swift +++ b/VDSSample/ViewControllers/TileContainerViewController.swift @@ -165,7 +165,7 @@ class TileContainerViewController: BaseViewController { } showDropShadowSwitch.onChange = { [weak self] sender in - self?.component.showDropShadows = sender.isOn + self?.component.showDropShadow = sender.isOn } heightTextField diff --git a/VDSSample/ViewControllers/TileletViewController.swift b/VDSSample/ViewControllers/TileletViewController.swift index 772a189..038487b 100644 --- a/VDSSample/ViewControllers/TileletViewController.swift +++ b/VDSSample/ViewControllers/TileletViewController.swift @@ -291,7 +291,7 @@ class TileletViewController: BaseViewController { } showDropShadowSwitch.onChange = { [weak self] sender in - self?.component.showDropShadows = sender.isOn + self?.component.showDropShadow = sender.isOn } imageFallbackColorPickerSelectorView.onPickerDidSelect = { [weak self] item in From ff6182db753c11779bb7cae79df8f9b34556cba8 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 25 Apr 2024 16:30:55 -0500 Subject: [PATCH 10/26] added samples Signed-off-by: Matt Bruce --- .../BreadcrumbsViewController.swift | 16 ++++++++++++ .../ButtonIconViewController.swift | 3 +++ .../CarouselScrollbarViewConttroller.swift | 9 +++++++ .../DropShawdowViewController.swift | 26 +++++++++++++++++++ .../DropdownSelectViewController.swift | 19 ++++++++++++++ .../PaginationViewController.swift | 8 ++++++ 6 files changed, 81 insertions(+) diff --git a/VDSSample/ViewControllers/BreadcrumbsViewController.swift b/VDSSample/ViewControllers/BreadcrumbsViewController.swift index 1cee787..cecc9a4 100644 --- a/VDSSample/ViewControllers/BreadcrumbsViewController.swift +++ b/VDSSample/ViewControllers/BreadcrumbsViewController.swift @@ -90,3 +90,19 @@ class BreadcrumbsViewController: BaseViewController { } } + +extension BreadcrumbsViewController: ComponentSampleable { + static func makeSample() -> ComponentSample { + let component = Self.makeComponent() + component.breadcrumbModels = [ + .init(text: "Home"), + .init(text: "Support", enabeled: false), + .init(text: "Service & Apps"), + .init(text: "My Verizon"), + .init(text: "Bill"), + .init(text: "Mobile Billing & Payments"), + .init(text: "Billing statement FAQs", selected: true) + ] + return ComponentSample(component: component) + } +} diff --git a/VDSSample/ViewControllers/ButtonIconViewController.swift b/VDSSample/ViewControllers/ButtonIconViewController.swift index 85f175c..d7f17ed 100644 --- a/VDSSample/ViewControllers/ButtonIconViewController.swift +++ b/VDSSample/ViewControllers/ButtonIconViewController.swift @@ -262,6 +262,9 @@ extension ButtonIconViewController: ComponentSampleable { static func makeSample() -> ComponentSample { let component = Self.makeComponent() component.iconName = .addToFavorite + component.selectedIconName = .addedToFavorite + component.selectable = true + component.onChange = { c in print("changed: \(c.isSelected)") } component.size = .large return ComponentSample(component: component, trailingPinningType: .lessThanOrEqual) } diff --git a/VDSSample/ViewControllers/CarouselScrollbarViewConttroller.swift b/VDSSample/ViewControllers/CarouselScrollbarViewConttroller.swift index 99ca1ce..63b0da4 100644 --- a/VDSSample/ViewControllers/CarouselScrollbarViewConttroller.swift +++ b/VDSSample/ViewControllers/CarouselScrollbarViewConttroller.swift @@ -119,3 +119,12 @@ class CarouselScrollbarViewConttroller: BaseViewController { } } } + + +extension CarouselScrollbarViewConttroller: ComponentSampleable { + static func makeSample() -> ComponentSample { + let component = Self.makeComponent() + component.numberOfSlides = 4 + return ComponentSample(component: component) + } +} diff --git a/VDSSample/ViewControllers/DropShawdowViewController.swift b/VDSSample/ViewControllers/DropShawdowViewController.swift index c0be652..17d3733 100644 --- a/VDSSample/ViewControllers/DropShawdowViewController.swift +++ b/VDSSample/ViewControllers/DropShawdowViewController.swift @@ -431,3 +431,29 @@ public class ShadowView: View { } } + +extension ViewProtocol where Self: UIView { + private func createShadowLayer() -> CALayer { + let shadowLayer = CALayer() + shadowLayer.backgroundColor = UIColor.clear.cgColor + shadowLayer.frame = bounds + return shadowLayer + } + + func addCustomShadow(config: DropShadowConfiguration) { + let shadowLayer = createShadowLayer() +// shadowLayer.shadowColor = config.shadowColorConfiguration.getColor(self).cgColor +// shadowLayer.shadowOpacity = config.shadowOpacityConfiguration.value(for: self) +// shadowLayer.shadowOffset = offset +// shadowLayer.shadowRadius = radius + layer.insertSublayer(shadowLayer, at: 0) + } + + func removeAllCustomShadows() { + layer.sublayers?.forEach { sublayer in + if sublayer.shadowOpacity > 0 && sublayer.backgroundColor == UIColor.clear.cgColor { + sublayer.removeFromSuperlayer() + } + } + } +} diff --git a/VDSSample/ViewControllers/DropdownSelectViewController.swift b/VDSSample/ViewControllers/DropdownSelectViewController.swift index 177aa4c..52552c3 100644 --- a/VDSSample/ViewControllers/DropdownSelectViewController.swift +++ b/VDSSample/ViewControllers/DropdownSelectViewController.swift @@ -186,3 +186,22 @@ class DropdownSelectViewController: BaseViewController { content: content) : nil } } + +extension DropdownSelectViewController: ComponentSampleable { + static func makeSample() -> ComponentSample { + let component = Self.makeComponent() + component.labelText = "Street Address" + component.helperText = "For example: 123 Verizon St" + component.errorText = "Enter a valid address." + component.tooltipModel = .init(title: "Check the formatting of your address", content:"House/Building number then street name") + component.options = [ + .init(text: "Alabama"), + .init(text: "Alaska"), + .init(text: "Arizona"), + .init(text: "Arkansas") + ] + return ComponentSample(component: component) + } +} + + diff --git a/VDSSample/ViewControllers/PaginationViewController.swift b/VDSSample/ViewControllers/PaginationViewController.swift index 47a5807..920c4a9 100644 --- a/VDSSample/ViewControllers/PaginationViewController.swift +++ b/VDSSample/ViewControllers/PaginationViewController.swift @@ -46,3 +46,11 @@ final class PaginationViewController: BaseViewController { }.store(in: &subscribers) } } + +extension PaginationViewController: ComponentSampleable { + static func makeSample() -> ComponentSample { + let component = Self.makeComponent() + component.total = 10 + return ComponentSample(component: component) + } +} From 43ec6d0671019bde6e869c97182fc92fa54d4855 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Apr 2024 11:16:36 -0500 Subject: [PATCH 11/26] added check for dismiss first responder Signed-off-by: Matt Bruce --- .../ViewControllers/BaseViewController.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/VDSSample/ViewControllers/BaseViewController.swift b/VDSSample/ViewControllers/BaseViewController.swift index 3c31212..46526d9 100644 --- a/VDSSample/ViewControllers/BaseViewController.swift +++ b/VDSSample/ViewControllers/BaseViewController.swift @@ -261,6 +261,21 @@ public class BaseViewController: UIViewController, Initable , loadCustomRotors() UIAccessibility.post(notification: .screenChanged, argument: component) } + + if component.canBecomeFirstResponder { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) + tapGesture.cancelsTouchesInView = false // This allows the tap to pass through to other views. + view.addGestureRecognizer(tapGesture) + } + } + + @objc func dismissKeyboard(_ sender: UITapGestureRecognizer) { + let location = sender.location(in: self.view) + + // Check if the touch is outside the textView + if !component.frame.contains(location) { + component.resignFirstResponder() + } } func isViewHiddenByKeyboard(view: UIView, keyboardFrame: CGRect) -> Bool { From 05d2e448d3955c906f2c9475474c93d68bed1be4 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Apr 2024 13:07:33 -0500 Subject: [PATCH 12/26] updated version Signed-off-by: Matt Bruce --- VDSSample.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index fc9f459..c6ad2b1 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -692,7 +692,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 59; + CURRENT_PROJECT_VERSION = 60; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = FCMA4QKS77; GENERATE_INFOPLIST_FILE = YES; @@ -727,7 +727,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 59; + CURRENT_PROJECT_VERSION = 60; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = FCMA4QKS77; GENERATE_INFOPLIST_FILE = YES; From 75297a2f77ddf973492db0b7c508ef2cb86e54e5 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Tue, 30 Apr 2024 13:51:05 -0500 Subject: [PATCH 13/26] added password field Signed-off-by: Matt Bruce --- .../InputFieldViewController.swift | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/VDSSample/ViewControllers/InputFieldViewController.swift b/VDSSample/ViewControllers/InputFieldViewController.swift index 61d5350..1820266 100644 --- a/VDSSample/ViewControllers/InputFieldViewController.swift +++ b/VDSSample/ViewControllers/InputFieldViewController.swift @@ -19,6 +19,12 @@ class InputFieldViewController: BaseViewController { items: InputField.HelperTextPlacement.allCases) }() + lazy var inputTypePickerSelectorView = { + PickerSelectorView(title: "", + picker: self.picker, + items: InputField.FieldType.allCases) + }() + var disabledSwitch = Toggle() var requiredSwitch = Toggle() var labelTextField = TextField() @@ -31,6 +37,18 @@ class InputFieldViewController: BaseViewController { var tooltipTitleTextField = TextField() var tooltipContentTextField = TextField() + //FieldType sections + + //password + var hidePasswordButtonTextField = TextField() + var showPasswordButtonTextField = TextField() + lazy var passwordSection = FormSection().with { + $0.title = "Password Settings" + $0.addFormRow(label: "Hide Button", view: hidePasswordButtonTextField) + $0.addFormRow(label: "Show Button", view: showPasswordButtonTextField) + $0.isHidden = true + } + override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: component) @@ -53,6 +71,9 @@ class InputFieldViewController: BaseViewController { addFormRow(label: "Width", view: widthTextField) addFormRow(label: "ToolTip Title", view: tooltipTitleTextField) addFormRow(label: "ToolTip Content", view: tooltipContentTextField) + addFormRow(label: "Field Type", view: inputTypePickerSelectorView) + + append(section: passwordSection) requiredSwitch.onChange = { [weak self] sender in self?.component.required = sender.isOn @@ -114,6 +135,19 @@ class InputFieldViewController: BaseViewController { self?.updateTooltip() }.store(in: &subscribers) + //field types + //password + hidePasswordButtonTextField + .textPublisher + .sink { [weak self] text in + self?.component.hidePasswordButtonText = text + }.store(in: &subscribers) + + showPasswordButtonTextField + .textPublisher + .sink { [weak self] text in + self?.component.showPasswordButtonText = text + }.store(in: &subscribers) } func setupModel() { @@ -137,6 +171,7 @@ class InputFieldViewController: BaseViewController { //setup UI surfacePickerSelectorView.text = component.surface.rawValue helperTextPlacementPickerSelectorView.text = component.helperTextPlacement.rawValue + inputTypePickerSelectorView.text = component.fieldType.rawValue disabledSwitch.isOn = !component.isEnabled requiredSwitch.isOn = component.required labelTextField.text = component.labelText @@ -162,6 +197,11 @@ class InputFieldViewController: BaseViewController { helperTextPlacementPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.helperTextPlacement = item } + + inputTypePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.component.fieldType = item + self?.updateFormSections() + } } func updateTooltip() { @@ -171,6 +211,39 @@ class InputFieldViewController: BaseViewController { component.tooltipModel = !title.isEmpty || !content.isEmpty ? .init(title: title, content: content) : nil } + + func updateFormSections() { + passwordSection.isHidden = true + + switch component.fieldType { + case .text: + break + + case .number: + break + + case .inlineAction: + break + + case .password: + passwordSection.isHidden = false + + case .creditCard: + break + + case .tel: + break + + case .date: + break + + case .securityCode: + break + + @unknown default: + break + } + } } From c6c5cc49b88c3cc9e7c73ab7bb6385f1e066b52f Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 1 May 2024 10:56:52 -0500 Subject: [PATCH 14/26] updated samples Signed-off-by: Matt Bruce --- .../InputFieldViewController.swift | 1 - .../TableViewTestController.swift | 24 +------------------ 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/VDSSample/ViewControllers/InputFieldViewController.swift b/VDSSample/ViewControllers/InputFieldViewController.swift index 1820266..d1e27ec 100644 --- a/VDSSample/ViewControllers/InputFieldViewController.swift +++ b/VDSSample/ViewControllers/InputFieldViewController.swift @@ -153,7 +153,6 @@ class InputFieldViewController: BaseViewController { func setupModel() { component.fieldType = .text component.width = 328 - component.text = "Starting Text" component.labelText = "Street Address" component.helperText = "For example: 123 Verizon St" component.errorText = "Enter a valid address." diff --git a/VDSSample/ViewControllers/TableViewTestController.swift b/VDSSample/ViewControllers/TableViewTestController.swift index b7b1ddd..8de4507 100644 --- a/VDSSample/ViewControllers/TableViewTestController.swift +++ b/VDSSample/ViewControllers/TableViewTestController.swift @@ -172,30 +172,8 @@ public class TableViewTestController: UIViewController, Initable, Surfaceable { } var items: [MenuComponent] { - all - } - - var all: [MenuComponent] { MenuViewController.items - } - - var batch1: [MenuComponent] { - [ - MenuComponent(title: "Badge", completed: true, viewController: BadgeViewController.self), - MenuComponent(title: "Button", completed: true, viewController: ButtonViewController.self), - MenuComponent(title: "ButtonGroup", completed: true, viewController: ButtonGroupViewController.self), - MenuComponent(title: "Icon", completed: true, viewController: IconViewController.self), - MenuComponent(title: "Label", completed: true, viewController: LabelViewController.self), - MenuComponent(title: "Line", completed: true, viewController: LineViewController.self), - MenuComponent(title: "Loader", completed: true, viewController: LoaderViewController.self), - MenuComponent(title: "Tabs", completed: true, viewController: TabsViewController.self), - MenuComponent(title: "TextLink", completed: true, viewController: TextLinkViewController.self), - MenuComponent(title: "TextLinkCaret", completed: true, viewController: TextLinkCaretViewController.self), - MenuComponent(title: "TitleLockup", completed: true, viewController: TitleLockupViewController.self), - MenuComponent(title: "Tooltip", completed: true, viewController: TooltipViewController.self), - MenuComponent(title: "TrailingTooltip", completed: true, viewController: TrailingTooltipLabelViewController.self), - ] - } + } } extension TableViewTestController : UITableViewDelegate, UITableViewDataSource { From 0fe55db7853877a3021e00391aa87bc90a078354 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 3 May 2024 09:56:36 -0500 Subject: [PATCH 15/26] refactored props Signed-off-by: Matt Bruce --- .../DropdownSelectViewController.swift | 6 +++--- .../ViewControllers/InputFieldViewController.swift | 4 ++-- .../ViewControllers/TextAreaViewController.swift | 6 +++--- .../ViewControllers/TileContainerViewController.swift | 11 +++++++++-- VDSSample/ViewControllers/TileletViewController.swift | 9 ++++++++- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/VDSSample/ViewControllers/DropdownSelectViewController.swift b/VDSSample/ViewControllers/DropdownSelectViewController.swift index 52552c3..5d03dbe 100644 --- a/VDSSample/ViewControllers/DropdownSelectViewController.swift +++ b/VDSSample/ViewControllers/DropdownSelectViewController.swift @@ -75,7 +75,7 @@ class DropdownSelectViewController: BaseViewController { } requiredSwitch.onChange = { [weak self] sender in - self?.component.required = sender.isOn + self?.component.isRequired = sender.isOn } optionsSwitch.onChange = { [weak self] sender in @@ -84,7 +84,7 @@ class DropdownSelectViewController: BaseViewController { } readonlySwitch.onChange = { [weak self] sender in - self?.component.readOnly = sender.isOn + self?.component.isReadOnly = sender.isOn } transparentBgSwitch.onChange = { [weak self] sender in @@ -158,7 +158,7 @@ class DropdownSelectViewController: BaseViewController { //setup UI disabledSwitch.isOn = !component.isEnabled - requiredSwitch.isOn = component.required + requiredSwitch.isOn = component.isRequired surfacePickerSelectorView.text = component.surface.rawValue labelTextField.text = component.labelText helperTextField.text = component.helperText diff --git a/VDSSample/ViewControllers/InputFieldViewController.swift b/VDSSample/ViewControllers/InputFieldViewController.swift index d1e27ec..0145f51 100644 --- a/VDSSample/ViewControllers/InputFieldViewController.swift +++ b/VDSSample/ViewControllers/InputFieldViewController.swift @@ -76,7 +76,7 @@ class InputFieldViewController: BaseViewController { append(section: passwordSection) requiredSwitch.onChange = { [weak self] sender in - self?.component.required = sender.isOn + self?.component.isRequired = sender.isOn } showErrorSwitch.onChange = { [weak self] sender in @@ -172,7 +172,7 @@ class InputFieldViewController: BaseViewController { helperTextPlacementPickerSelectorView.text = component.helperTextPlacement.rawValue inputTypePickerSelectorView.text = component.fieldType.rawValue disabledSwitch.isOn = !component.isEnabled - requiredSwitch.isOn = component.required + requiredSwitch.isOn = component.isRequired labelTextField.text = component.labelText helperTextField.text = component.helperText showErrorSwitch.isOn = component.showError diff --git a/VDSSample/ViewControllers/TextAreaViewController.swift b/VDSSample/ViewControllers/TextAreaViewController.swift index 9769795..22dc701 100644 --- a/VDSSample/ViewControllers/TextAreaViewController.swift +++ b/VDSSample/ViewControllers/TextAreaViewController.swift @@ -55,7 +55,7 @@ class TextAreaViewController: BaseViewController