diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index f4428ef..80fc744 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -32,6 +32,7 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 180636CB2C29B12B00C92D86 /* InputStepperViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 180636CA2C29B12B00C92D86 /* InputStepperViewController.swift */; }; 1808BEBE2BA4479500129230 /* CarouselScrollbarViewConttroller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1808BEBD2BA4479500129230 /* CarouselScrollbarViewConttroller.swift */; }; 1832AC5B2BA1347B008AE476 /* BreadcrumbsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1832AC5A2BA1347B008AE476 /* BreadcrumbsViewController.swift */; }; 184023492C61E9E700A412C8 /* PriceLockupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184023482C61E9E700A412C8 /* PriceLockupViewController.swift */; }; @@ -131,6 +132,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 180636CA2C29B12B00C92D86 /* InputStepperViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputStepperViewController.swift; sourceTree = ""; }; 1808BEBD2BA4479500129230 /* CarouselScrollbarViewConttroller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselScrollbarViewConttroller.swift; sourceTree = ""; }; 1832AC5A2BA1347B008AE476 /* BreadcrumbsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreadcrumbsViewController.swift; sourceTree = ""; }; 184023482C61E9E700A412C8 /* PriceLockupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceLockupViewController.swift; sourceTree = ""; }; @@ -340,6 +342,7 @@ EA1758452BC8893700A5C0D9 /* DatePickerViewController.swift */, 186D13CC2BBA990800986B53 /* DropdownSelectViewController.swift */, EA985C00296CC21C00F2FF2E /* IconViewController.swift */, + 180636CA2C29B12B00C92D86 /* InputStepperViewController.swift */, EAA5EEAC28EB6924003B3210 /* InputFieldViewController.swift */, EAB1D2D328AC409F00DAE764 /* LabelViewController.swift */, 44604AD829CE1CF900E62B51 /* LineViewController.swift */, @@ -537,6 +540,7 @@ EAB2376C29E9E74900AABE9A /* TrailingTooltipLabelViewController.swift in Sources */, EAB1D2C928AAAA1D00DAE764 /* BaseViewController.swift in Sources */, EA1758462BC8893700A5C0D9 /* DatePickerViewController.swift in Sources */, + 180636CB2C29B12B00C92D86 /* InputStepperViewController.swift in Sources */, EAD062AD2A3B86950015965D /* BadgeIndicatorViewController.swift in Sources */, EA5E305C295111050082B959 /* TileletViewController.swift in Sources */, EAD062A32A3913920015965D /* DropShawdowViewController.swift in Sources */, diff --git a/VDSSample/Classes/Helper.swift b/VDSSample/Classes/Helper.swift index 058ebd0..7fefee7 100644 --- a/VDSSample/Classes/Helper.swift +++ b/VDSSample/Classes/Helper.swift @@ -60,7 +60,16 @@ extension Changeable { } } -extension Clickable { +extension Clickable where Self: UIControl { + func onClickActionPublisher(_ text: String, label: UILabel) { + onClick = { _ in + let handler = labelPublisherCompletionHandler() + handler(text, label) + } + } +} + +extension Clickable where Self: UIView { func onClickActionPublisher(_ text: String, label: UILabel) { onClick = { _ in let handler = labelPublisherCompletionHandler() diff --git a/VDSSample/ViewControllers/InputStepperViewController.swift b/VDSSample/ViewControllers/InputStepperViewController.swift new file mode 100644 index 0000000..559125e --- /dev/null +++ b/VDSSample/ViewControllers/InputStepperViewController.swift @@ -0,0 +1,255 @@ +// +// InputStepperViewController.swift +// VDSSample +// +// Created by Kanamarlapudi, Vasavi on 24/06/24. +// + +import Foundation +import UIKit +import VDS +import VDSCoreTokens +import Combine + +class InputStepperViewController: BaseViewController { + + var controlWidthTextField = TextField() + var controlWidthPercentageTextField = TextField() + var defaultValueField = NumericField() + var maxValueTextField = NumericField() + var minValueTextField = NumericField() + var trailingTextField = TextField() + + var widthTextField = NumericField() + var widthPercentageTextField = NumericField() + var disabledSwitch = Toggle() + var readOnlySwitch = Toggle() + var requiredSwitch = Toggle() + var labelTextField = TextField() + var showErrorSwitch = Toggle() + var errorTextField = TextField() + var helperTextField = TextField() + var tooltipTitleTextField = TextField() + var tooltipContentTextField = TextField() + + lazy var helperTextPlacementPickerSelectorView = { + PickerSelectorView(title: "", picker: self.picker, items: InputStepper.HelperTextPlacement.allCases) + }() + + lazy var sizePickerSelectorView = { + PickerSelectorView(title: "", picker: self.picker, items: InputStepper.Size.allCases) + }() + + + override func viewDidLoad() { + super.viewDidLoad() + addContentTopView(view: component) + setupPicker() + setupModel() + } + + override func setupForm(){ + super.setupForm() + + addFormRow(label: "Surface", view: surfacePickerSelectorView) + addFormRow(label: "Control Width", view: controlWidthTextField) + addFormRow(label: "ControlWidth Percentage", view: controlWidthPercentageTextField) + addFormRow(label: "Default Value", view: defaultValueField) + addFormRow(label: "Max Value", view: maxValueTextField) + addFormRow(label: "Min Value", view: minValueTextField) + addFormRow(label: "Trailing Text", view: trailingTextField) + addFormRow(label: "Size", view: sizePickerSelectorView) + + addFormRow(label: "Width Value", view: widthTextField) + addFormRow(label: "Width Percentage", view: widthPercentageTextField) + addFormRow(label: "Disabled", view: disabledSwitch) + addFormRow(label: "Read Only", view: readOnlySwitch) + addFormRow(label: "Required", view: requiredSwitch) + addFormRow(label: "Label Text", view: labelTextField) + addFormRow(label: "Error", view: showErrorSwitch) + addFormRow(label: "Error Text", view: errorTextField) + addFormRow(label: "Helper Text Placement", view: helperTextPlacementPickerSelectorView) + addFormRow(label: "Helper Text", view: helperTextField) + addFormRow(label: "Tooltip Title", view: tooltipTitleTextField) + addFormRow(label: "Tooltip Content", view: tooltipContentTextField) + + controlWidthTextField + .numberPublisher + .sink { [weak self] number in + if let number { + self?.component.controlWidth = .value(number.cgFloatValue) + self?.controlWidthPercentageTextField.text = "" + } else { + self?.component.controlWidth = nil + } + }.store(in: &subscribers) + + controlWidthPercentageTextField + .numberPublisher + .sink { [weak self] number in + if let number { + self?.component.controlWidth = .percentage(number.cgFloatValue) + self?.controlWidthTextField.text = "" + } else { + self?.component.controlWidth = nil + } + }.store(in: &subscribers) + + defaultValueField + .numberPublisher + .sink { [weak self] number in + self?.component.defaultValue = number?.intValue ?? 0 + }.store(in: &subscribers) + + maxValueTextField + .numberPublisher + .sink { [weak self] number in + guard let number else { return } + self?.component.maxValue = number.intValue + }.store(in: &subscribers) + + minValueTextField + .numberPublisher + .sink { [weak self] number in + guard let number else { return } + self?.component.minValue = number.intValue + }.store(in: &subscribers) + + trailingTextField + .textPublisher + .sink { [weak self] text in + self?.component.trailingText = text + }.store(in: &subscribers) + + + requiredSwitch.onChange = { [weak self] sender in + self?.component.isRequired = sender.isOn + } + + showErrorSwitch.onChange = { [weak self] sender in + guard let self else { return } + self.component.showError = sender.isOn + if self.component.showError != sender.isOn { + self.showErrorSwitch.isOn = self.component.showError + } + } + + disabledSwitch.onChange = { [weak self] sender in + self?.component.isEnabled = !sender.isOn + } + + readOnlySwitch.onChange = { [weak self] sender in + self?.component.isReadOnly = sender.isOn + } + + labelTextField + .textPublisher + .sink { [weak self] text in + self?.component.labelText = text + }.store(in: &subscribers) + + helperTextField + .textPublisher + .sink { [weak self] text in + self?.component.helperText = text + }.store(in: &subscribers) + + errorTextField + .textPublisher + .sink { [weak self] text in + self?.component.errorText = text + }.store(in: &subscribers) + + widthTextField + .numberPublisher + .sink { [weak self] number in + if let number { + self?.component.widthPercentage = nil + self?.component.width = number.cgFloatValue + self?.widthPercentageTextField.text = "" + } else { + self?.component.width = nil + } + }.store(in: &subscribers) + + widthPercentageTextField + .numberPublisher + .sink { [weak self] number in + if let number, number.intValue > 10 { + self?.component.width = nil + self?.component.widthPercentage = number.cgFloatValue + self?.widthTextField.text = "" + } else { + self?.component.widthPercentage = nil + } + }.store(in: &subscribers) + + tooltipTitleTextField + .textPublisher + .sink { [weak self] text in + self?.updateTooltip() + }.store(in: &subscribers) + + tooltipContentTextField + .textPublisher + .sink { [weak self] text in + self?.updateTooltip() + }.store(in: &subscribers) + } + + func updateTooltip() { + let title = tooltipTitleTextField.text ?? "" + let content = tooltipContentTextField.text ?? "" + + component.tooltipModel = !title.isEmpty || !content.isEmpty ? .init(title: title, + content: content) : nil + } + + //Picker + func setupPicker(){ + surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.component.surface = item + self?.contentTopView.backgroundColor = item.color + } + + helperTextPlacementPickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.component.helperTextPlacement = item + } + + sizePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.component.size = item + } + } + + func setupModel() { + component.labelText = "Quantity" + component.helperText = "Add up to max lines." + component.errorText = "You must choose a number of lines before advancing to the next step." + component.defaultValue = nil + component.trailingText = "" + component.onChange = { component in + if let text = component.value { + print("inputStepper Change: \(text)") + } else { + print("inputStepper Change: check code") + } + } + + trailingTextField.text = component.trailingText + controlWidthTextField.text = "" + errorTextField.text = component.errorText + helperTextField.text = component.helperText + labelTextField.text = component.labelText + if let defaultVal = component.defaultValue { + defaultValueField.text = String(defaultVal) + } + minValueTextField.text = String(component.minValue) + maxValueTextField.text = String(component.maxValue) + component.size = .large + sizePickerSelectorView.text = "large" + + //setup UI + surfacePickerSelectorView.text = component.surface.rawValue + helperTextPlacementPickerSelectorView.text = component.helperTextPlacement.rawValue + } +} diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index cb3417b..369c354 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -84,6 +84,7 @@ class MenuViewController: UITableViewController, TooltipLaunchable { MenuComponent(title: "DropdownSelect", completed: true, viewController: DropdownSelectViewController.self), MenuComponent(title: "Icon", completed: true, viewController: IconViewController.self), MenuComponent(title: "InputField", completed: true, viewController: InputFieldViewController.self), + MenuComponent(title: "InputStepper", completed: true, viewController: InputStepperViewController.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), diff --git a/VDSSample/ViewControllers/TileContainerViewController.swift b/VDSSample/ViewControllers/TileContainerViewController.swift index b32e7d5..4edbace 100644 --- a/VDSSample/ViewControllers/TileContainerViewController.swift +++ b/VDSSample/ViewControllers/TileContainerViewController.swift @@ -127,8 +127,9 @@ class TileContainerViewController: BaseViewController { topLabel.text = "Do you want to Register?" let topButton = Button() - topButton.setTitle("Register", for: .normal) - + topButton.text = "Register" + topButton.onClick = { c in print("clicked \(c.text!)") } + ///bottom let bottomView = View() bottomView.backgroundColor = .green @@ -137,7 +138,8 @@ class TileContainerViewController: BaseViewController { bottomLabel.text = "Forgot your info?" let bottomButton = Button() - bottomButton.setTitle("Forgot Password", for: .normal) + bottomButton.text = "Forgot Password" + bottomButton.onClick = { c in print("clicked \(c.text!)") } mainView.addSubview(topView) mainView.addSubview(bottomView)