From d0787538280108696879c1fd87214ec168483d5e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 9 Feb 2021 16:27:36 -0500 Subject: [PATCH] new mole --- MVMCoreUI.xcodeproj/project.pbxproj | 16 +- .../TextFields/BaseDropdownEntryField.swift | 1 + .../TextFields/ItemDropdownEntryField.swift | 2 +- .../ItemDropdownEntryFieldModel.swift | 12 +- .../MultiItemDropdownEndryField.swift | 210 ------------------ .../MultiItemDropdownEndryFieldModel.swift | 116 ---------- .../MultiItemDropdownEntryField.swift | 187 ++++++++++++++++ .../MultiItemDropdownEntryFieldModel.swift | 93 ++++++++ .../TextFields/TextEntryField.swift | 5 + .../TextFields/TextEntryFieldModel.swift | 11 + MVMCoreUI/Atomic/MoleculeObjectMapping.swift | 1 + 11 files changed, 315 insertions(+), 339 deletions(-) delete mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryField.swift delete mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryFieldModel.swift create mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryField.swift create mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryFieldModel.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 6c7795a7..71d5cfb4 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -114,8 +114,8 @@ 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; 0AD93A9F24C0AA5100E56A97 /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7918F423F5E7EA00772FF4 /* ImageView.swift */; }; 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; - 0AE277E925D2ED4B0048A38D /* MultiItemDropdownEndryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEndryField.swift */; }; - 0AE277EC25D2EE310048A38D /* MultiItemDropdownEndryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE277EB25D2EE310048A38D /* MultiItemDropdownEndryFieldModel.swift */; }; + 0AE277E925D2ED4B0048A38D /* MultiItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEntryField.swift */; }; + 0AE277EC25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE277EB25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift */; }; 0AE98BAF23FEF956004C5109 /* ExternalLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BAE23FEF956004C5109 /* ExternalLink.swift */; }; 0AE98BB323FF0934004C5109 /* ExternalLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB223FF0934004C5109 /* ExternalLinkModel.swift */; }; 0AE98BB523FF18D2004C5109 /* Arrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB423FF18D2004C5109 /* Arrow.swift */; }; @@ -661,8 +661,8 @@ 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; - 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEndryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiItemDropdownEndryField.swift; sourceTree = ""; }; - 0AE277EB25D2EE310048A38D /* MultiItemDropdownEndryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiItemDropdownEndryFieldModel.swift; sourceTree = ""; }; + 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiItemDropdownEntryField.swift; sourceTree = ""; }; + 0AE277EB25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0AE98BAE23FEF956004C5109 /* ExternalLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLink.swift; sourceTree = ""; }; 0AE98BB223FF0934004C5109 /* ExternalLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLinkModel.swift; sourceTree = ""; }; 0AE98BB423FF18D2004C5109 /* Arrow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Arrow.swift; sourceTree = ""; }; @@ -2051,8 +2051,8 @@ 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, 0A25209724645B76000FA9F6 /* TextViewEntryFieldModel.swift */, 0A25209524645AFD000FA9F6 /* TextViewEntryField.swift */, - 0AE277EB25D2EE310048A38D /* MultiItemDropdownEndryFieldModel.swift */, - 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEndryField.swift */, + 0AE277EB25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift */, + 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEntryField.swift */, ); path = TextFields; sourceTree = ""; @@ -2458,7 +2458,7 @@ D264FAAA2440F97600D98315 /* CollectionView.swift in Sources */, AAC23FAD24D92A0D009208DF /* ListThreeColumnSpeedTestModel.swift in Sources */, BBC0C4FF24811DCA0087C44F /* TagModel.swift in Sources */, - 0AE277EC25D2EE310048A38D /* MultiItemDropdownEndryFieldModel.swift in Sources */, + 0AE277EC25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift in Sources */, 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */, 3265B30424BCA749000D154B /* HeadersH1NoButtonsBodyText.swift in Sources */, AAA7CD69250641F90045B959 /* HeartModel.swift in Sources */, @@ -2473,7 +2473,7 @@ D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */, 94382086243238D100B43AF3 /* WebViewModel.swift in Sources */, D28764F9245A327200CB882D /* TwoLinkView.swift in Sources */, - 0AE277E925D2ED4B0048A38D /* MultiItemDropdownEndryField.swift in Sources */, + 0AE277E925D2ED4B0048A38D /* MultiItemDropdownEntryField.swift in Sources */, D27CD40E2322EEAF00C1DC07 /* TabsTableViewCell.swift in Sources */, 0A6682B5243769C700AD3CA1 /* TextView.swift in Sources */, D224799B231965AD003FCCF9 /* AccordionMoleculeTableViewCell.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift index e1c3a8b3..cde3a824 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift @@ -30,6 +30,7 @@ import UIKit public var baseDropdownEntryFieldModel: BaseDropdownEntryFieldModel? { model as? BaseDropdownEntryFieldModel } + var additionalData: [AnyHashable: Any]? //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift index c8d5e4b5..55e6c897 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift @@ -29,7 +29,7 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { public var observeDropdownSelection: ((String)->())? public var itemDropdownEntryFieldModel: ItemDropdownEntryFieldModel? { - return model as? ItemDropdownEntryFieldModel + model as? ItemDropdownEntryFieldModel } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift index 10650e20..98d916da 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift @@ -15,11 +15,15 @@ public var options: [String] = [] public var selectedIndex: Int? - + + //-------------------------------------------------- + // MARK: - Validation + //-------------------------------------------------- + public override func formFieldValue() -> AnyHashable? { guard !options.isEmpty, - let index = selectedIndex - else { return nil } + let index = selectedIndex + else { return nil } return options[index] } @@ -32,7 +36,7 @@ case options case selectedIndex } - + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryField.swift deleted file mode 100644 index 8004326c..00000000 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryField.swift +++ /dev/null @@ -1,210 +0,0 @@ -// -// MultiItemDropdownEndryField.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 2/9/21. -// Copyright © 2021 Verizon Wireless. All rights reserved. -// - -import Foundation - - -class MultiItemDropdownEndryField { - - -} - - -/* - - // - // ItemDropdownEntryField.swift - // MVMCoreUI - // - // Created by Kevin Christiano on 11/14/19. - // Copyright © 2019 Verizon Wireless. All rights reserved. - // - - import UIKit - - public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerViewDelegate & UIPickerViewDataSource) - - - open class ItemDropdownEntryField: BaseDropdownEntryField { - //-------------------------------------------------- - // MARK: - Outlets - //-------------------------------------------------- - - open var pickerView: UIPickerView? - - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - /// Datasource of the picker view. - open var pickerComponents: [[String]] { - dropdownModel?.options ?? [[]] - } - - /// When selecting for first responder, allow initial selected value to appear in empty text field. - public var setInitialValueInTextField = true - - /// Closure passed here will run as picker changes items. - public var observeDropdownChange: ((String, String) -> ())? - - /// Closure passed here will run upon dismissing the selection picker. - public var observeDropdownSelection: ((String) -> ())? - - public var dropdownModel: ItemDropdownEntryFieldModel? { - model as? ItemDropdownEntryFieldModel - } - - /// The number of components available - public var componentCount: Int { - pickerComponents.count - } - - //-------------------------------------------------- - // MARK: - Initializers - //-------------------------------------------------- - - @objc public override init(frame: CGRect) { - super.init(frame: frame) - } - - @objc public convenience init() { - self.init(frame: .zero) - } - - @objc required public init?(coder: NSCoder) { - fatalError("ItemDropdownEntryField init(coder:) has not been implemented") - } - - required public init(model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - super.init(model: model, delegateObject, additionalData) - } - - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - @objc open override func setupFieldContainerContent(_ container: UIView) { - super.setupFieldContainerContent(container) - - pickerView = UIPickerView.addPicker(to: textField, delegate: self, dismissAction: #selector(dismissFieldInput)) - textField.hideBlinkingCaret = true - textField.autocorrectionType = .no - uiTextFieldDelegate = self - } - - @objc public func setPickerDelegates(delegate: UIPickerViewDelegate & UIPickerViewDataSource) { - - pickerView?.delegate = delegate - pickerView?.dataSource = delegate - } - - /// Sets the textField with the first value of the available picker data. - @objc private func setInitialValueFromPicker() { - - guard setInitialValueInTextField, - !pickerComponents.isEmpty, - let rowText = dropdownModel?.selectedRowText - else { return } - - observeDropdownChange?(text ?? "", rowText) - text = rowText - - for component in 0.. Int { componentCount } - - @objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - pickerComponents[component].count - } - - @objc public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { - - guard !pickerComponents.isEmpty, - !pickerComponents[component].isEmpty - else { return nil } - - return pickerComponents[component][row] - } - - @objc public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { - - guard !pickerComponents.isEmpty, - !pickerComponents[component].isEmpty, - let rowText = dropdownModel?.selectedRowText - else { return } - - observeDropdownChange?(text ?? "", rowText) - text = rowText - dropdownModel?.selectedIndicies[component] = row - } - } - - // MARK: - Accessibility - extension ItemDropdownEntryField { - - @objc open override func setAccessibilityString(_ accessibilityString: String?) { - - var accessibilityString = accessibilityString ?? "" - - if let textPickerItem = MVMCoreUIUtility.hardcodedString(withKey: "textfield_picker_item") { - accessibilityString += textPickerItem - } - - textField.accessibilityLabel = "\(accessibilityString) \(textField.isEnabled ? "" : MVMCoreUIUtility.hardcodedString(withKey: "textfield_disabled_state") ?? "")" - } - } - - */ diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryFieldModel.swift deleted file mode 100644 index fb9e62f0..00000000 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryFieldModel.swift +++ /dev/null @@ -1,116 +0,0 @@ -// -// MultiItemDropdownEndryFieldModel.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 2/9/21. -// Copyright © 2021 Verizon Wireless. All rights reserved. -// - -import Foundation - - -class MultiItemDropdownEndryFieldModel { - -} - - -/* - @objcMembers open class ItemDropdownEntryFieldModel: BaseDropdownEntryFieldModel { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public override class var identifier: String { "dropDown" } - - public var options: [[String]] = [[]] - public var selectedIndicies: [Int: Int] = [:] - - @available(*, deprecated, message: "Here for backwards compatibility for when this options was a single array.") - public var selectedIndex: Int? - - //-------------------------------------------------- - // MARK: - Validation - //-------------------------------------------------- - - public override func formFieldValue() -> AnyHashable? { - - guard !options.isEmpty && !selectedIndicies.isEmpty else { return nil } - - return selectedRowText - } - - /// A string of the picker row concatenated by whitespace. - public var selectedRowText: String { - - var text = "" - - for i in 0.. ())? + + /// Closure passed here will run upon dismissing the selection picker. +// public var observeDropdownSelection: ((String) -> ())? + + public var dropdownModel: MultiItemDropdownEntryFieldModel? { + model as? MultiItemDropdownEntryFieldModel + } + + /// The number of components available + public var componentCount: Int { + pickerComponents.count + } + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + + @objc public override init(frame: CGRect) { + super.init(frame: frame) + } + + @objc public convenience init() { + self.init(frame: .zero) + } + + @objc required public init?(coder: NSCoder) { + fatalError("MultiItemDropdownEntryField init(coder:) has not been implemented") + } + + required public init(model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.init(model: model, delegateObject, additionalData) + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + @objc open override func setupFieldContainerContent(_ container: UIView) { + super.setupFieldContainerContent(container) + + pickerView = UIPickerView.addPicker(to: textField, delegate: self, dismissAction: #selector(dismissFieldInput)) + textField.hideBlinkingCaret = true + textField.autocorrectionType = .no + uiTextFieldDelegate = self + } + + @objc public func setPickerDelegates(delegate: UIPickerViewDelegate & UIPickerViewDataSource) { + + pickerView?.delegate = delegate + pickerView?.dataSource = delegate + } + + /// Sets the textField with the first value of the available picker data. + @objc private func setInitialValueFromPicker() { + + guard setInitialValueInTextField, + !pickerComponents.isEmpty, + let rowText = dropdownModel?.selectedRowText + else { return } + +// observeDropdownChange?(text ?? "", rowText) + text = rowText + + for component in 0.. Int { componentCount } + + @objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + pickerComponents[component].count + } + + @objc public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { + + guard !pickerComponents.isEmpty, + !pickerComponents[component].isEmpty + else { return nil } + + return pickerComponents[component][row] + } + + @objc public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + + guard !pickerComponents.isEmpty, + !pickerComponents[component].isEmpty, + let rowText = dropdownModel?.selectedRowText + else { return } + +// observeDropdownChange?(text ?? "", rowText) + text = rowText + dropdownModel?.selectedIndexes[component] = row + } +} + +// MARK: - Accessibility +extension MultiItemDropdownEntryField { + + @objc open override func setAccessibilityString(_ accessibilityString: String?) { + + var accessibilityString = accessibilityString ?? "" + + if let textPickerItem = MVMCoreUIUtility.hardcodedString(withKey: "textfield_picker_item") { + accessibilityString += textPickerItem + } + + textField.accessibilityLabel = "\(accessibilityString) \(textField.isEnabled ? "" : MVMCoreUIUtility.hardcodedString(withKey: "textfield_disabled_state") ?? "")" + } +} diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryFieldModel.swift new file mode 100644 index 00000000..2b8c4dda --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryFieldModel.swift @@ -0,0 +1,93 @@ +// +// MultiItemDropdownEntryFieldModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/9/21. +// Copyright © 2021 Verizon Wireless. All rights reserved. +// + +import Foundation + + +@objcMembers open class MultiItemDropdownEntryFieldModel: BaseDropdownEntryFieldModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public override class var identifier: String { "multiDropdown" } + + public var options: [[String]] = [[]] + public var selectedIndexes: [Int: Int] = [:] + + //-------------------------------------------------- + // MARK: - Validation + //-------------------------------------------------- + + public override func formFieldValue() -> AnyHashable? { + + guard !options.isEmpty && !selectedIndexes.isEmpty else { return nil } + + return selectedRowText + } + + /// A string of the picker row concatenated by whitespace. + public var selectedRowText: String { + + var text = "" + + for i in 0..