From 570facbcea41bee6599cbdacb3c2567a34a63840 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 5 Feb 2021 13:48:40 -0500 Subject: [PATCH 01/19] mild refactoring. --- .../TextFields/BaseDropdownEntryField.swift | 8 +++---- .../TextFields/DateDropdownEntryField.swift | 1 + .../FormFields/TextFields/DigitBox.swift | 4 ++-- .../TextFields/DigitEntryField.swift | 14 ++++++------- .../TextFields/DigitEntryFieldModel.swift | 2 +- .../FormFields/TextFields/EntryField.swift | 20 +++++++++--------- .../TextFields/EntryFieldModel.swift | 6 +++--- .../TextFields/ItemDropdownEntryField.swift | 2 +- .../ItemDropdownEntryFieldModel.swift | 8 +++---- .../FormFields/TextFields/MdnEntryField.swift | 10 ++++----- .../TextFields/TextEntryField.swift | 21 +++++++++---------- .../TextFields/TextEntryFieldModel.swift | 3 ++- .../TextFields/TextViewEntryField.swift | 12 +++++++---- .../TextFields/TextViewEntryFieldModel.swift | 2 +- 14 files changed, 59 insertions(+), 54 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift index b89a56e3..e1c3a8b3 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift @@ -28,7 +28,7 @@ import UIKit }() public var baseDropdownEntryFieldModel: BaseDropdownEntryFieldModel? { - return model as? BaseDropdownEntryFieldModel + model as? BaseDropdownEntryFieldModel } var additionalData: [AnyHashable: Any]? @@ -87,9 +87,9 @@ import UIKit } public override func dismissFieldInput(_ sender: Any?) { - performDropdownAction() - super.dismissFieldInput(sender) - } + performDropdownAction() + super.dismissFieldInput(sender) + } func performDropdownAction() { if let baseDropdownEntryFieldModel = baseDropdownEntryFieldModel, let actionModel = baseDropdownEntryFieldModel.action { diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift index c1ea8080..234809d3 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift @@ -69,6 +69,7 @@ import UIKit datePicker = UIDatePicker.addDatePicker(to: textField) datePicker?.addTarget(self, action: #selector(pickerValueChanged), for: .valueChanged) datePicker?.timeZone = NSTimeZone.system + textField.inputView = datePicker UIToolbar.addDismissToolbar(to: textField, delegate: self, action: #selector(dismissFieldInput)) } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitBox.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitBox.swift index 4d23558f..912b0891 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitBox.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitBox.swift @@ -80,7 +80,7 @@ import UIKit open override func setupView() { super.setupView() - + addSubview(digitField) digitField.delegate = self digitField.didDeleteDelegate = self @@ -140,7 +140,7 @@ import UIKit super.updateView(size) if !MVMCoreGetterUtility.fequal(a: Float(size), b: Float(previousSize)) { - + var width: CGFloat = 0 var height: CGFloat = 0 var pointSize: CGFloat = 13 diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryField.swift index f3cc628e..c70d458e 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryField.swift @@ -75,7 +75,7 @@ import UIKit private var selectedDigitBox: DigitBox? public var digitEntryModel: DigitEntryFieldModel? { - return model as? DigitEntryFieldModel + model as? DigitEntryFieldModel } //-------------------------------------------------- @@ -83,7 +83,7 @@ import UIKit //-------------------------------------------------- public override var isEnabled: Bool { - get { return super.isEnabled } + get { super.isEnabled } set (enabled) { digitBoxes.forEach { $0.isEnabled = enabled } super.isEnabled = enabled @@ -91,7 +91,7 @@ import UIKit } public override var showError: Bool { - get { return super.showError } + get { super.showError } set (error) { digitBoxes.forEach { $0.showError = error } super.showError = error @@ -99,7 +99,7 @@ import UIKit } public override var isLocked: Bool { - get { return super.isLocked } + get { super.isLocked } set (locked) { digitBoxes.forEach { $0.isLocked = locked } super.isLocked = locked @@ -162,7 +162,7 @@ import UIKit /// If you're using a MFViewController, you must set this to it public override weak var uiTextFieldDelegate: UITextFieldDelegate? { - get { return textField.delegate } + get { textField.delegate } set { textField.delegate = self proprietorTextDelegate = newValue @@ -450,11 +450,11 @@ extension DigitEntryField { @objc public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { - return proprietorTextDelegate?.textFieldShouldBeginEditing?(textField) ?? true + proprietorTextDelegate?.textFieldShouldBeginEditing?(textField) ?? true } @objc public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { - return proprietorTextDelegate?.textFieldShouldEndEditing?(textField) ?? true + proprietorTextDelegate?.textFieldShouldEndEditing?(textField) ?? true } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryFieldModel.swift index 8003c1b0..c381637a 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryFieldModel.swift @@ -15,7 +15,7 @@ public override class var identifier: String { "digitTextField" } public var digits: Int = 4 - + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift index ecb89f32..3996c7fc 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift @@ -36,7 +36,7 @@ import UIKit label.setContentCompressionResistancePriority(.required, for: .vertical) return label }() - + //-------------------------------------------------- // MARK: - Delegate //-------------------------------------------------- @@ -58,7 +58,7 @@ import UIKit /// Toggles enabled (original) or disabled UI. public var isEnabled: Bool { - get { return entryFieldContainer.isEnabled } + get { entryFieldContainer.isEnabled } set (enabled) { self.titleLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 self.feedbackLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 @@ -69,7 +69,7 @@ import UIKit /// Toggles error or original UI. public var showError: Bool { - get { return entryFieldContainer.showError } + get { entryFieldContainer.showError } set (error) { self.feedback = error ? errorMessage : entryFieldModel?.feedback self.feedbackLabel.textColor = error ? entryFieldModel?.errorTextColor?.uiColor ?? .mvmBlack : .mvmBlack @@ -84,7 +84,7 @@ import UIKit /// Toggles original or locked UI. public var isLocked: Bool { - get { return entryFieldContainer.isLocked } + get { entryFieldContainer.isLocked } set (locked) { self.entryFieldContainer.isLocked = locked self.entryFieldModel?.locked = locked @@ -93,7 +93,7 @@ import UIKit /// Toggles selected or original (unselected) UI. public var isSelected: Bool { - get { return entryFieldContainer.isSelected } + get { entryFieldContainer.isSelected } set (selected) { self.entryFieldContainer.isSelected = selected self.entryFieldModel?.selected = selected @@ -102,7 +102,7 @@ import UIKit /// Sets the text of titleLabel public var title: String? { - get { return titleLabel.text } + get { titleLabel.text } set (newText) { titleLabel.text = newText setAccessibilityString(newText) @@ -111,13 +111,13 @@ import UIKit /// Override this to conveniently get/set the textfield(s). public var text: String? { - get { return nil } + get { nil } set { fatalError("You MUST override EntryField's 'text' variable in your subclass.") } } /// Sets feedback text in the textField. public var feedback: String? { - get { return feedbackLabel.text } + get { feedbackLabel.text } set (newFeedback) { feedbackLabel.text = newFeedback feedbackLabel.accessibilityElementsHidden = feedbackLabel.text?.isEmpty ?? true @@ -126,7 +126,7 @@ import UIKit } public var entryFieldModel: EntryFieldModel? { - return model as? EntryFieldModel + model as? EntryFieldModel } //-------------------------------------------------- @@ -223,7 +223,7 @@ import UIKit entryFieldContainer.refreshUI() } - /// Intended to add the interactive content (i.e. textField) to the entryFieldContainer. + /// Intended to add the interactive content (i.e. textField) to the entryFieldContainer. @objc open func setupFieldContainerContent(_ container: UIView) { // To Be Overriden } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryFieldModel.swift index 20f88028..2a2e737c 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryFieldModel.swift @@ -46,7 +46,7 @@ import Foundation /// Temporary binding mechanism for the view to update on enable changes. public var updateUI: ActionBlock? - + // TODO: Remove once updateUI is fixed with isSelected public var updateUIDynamicError: ActionBlock? @@ -140,9 +140,9 @@ import Foundation try container.encodeIfPresent(selected, forKey: .selected) try container.encodeIfPresent(errorTextColor, forKey: .errorTextColor) try container.encodeIfPresent(errorMessage, forKey: .errorMessage) - try container.encode(enabled, forKey: .enabled) - try container.encode(hideBorders, forKey: .hideBorders) try container.encodeIfPresent(fieldKey, forKey: .fieldKey) try container.encodeIfPresent(groupName, forKey: .groupName) + try container.encode(enabled, forKey: .enabled) + try container.encode(hideBorders, forKey: .hideBorders) } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift index 9002d701..29f4e1ec 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..7757d466 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift @@ -15,11 +15,11 @@ public var options: [String] = [] public var selectedIndex: Int? - + 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 +32,7 @@ case options case selectedIndex } - + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryField.swift index c1dde689..fe2c483c 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryField.swift @@ -31,7 +31,7 @@ import MVMCore /// If you're using a MFViewController, you must set this to it public override weak var uiTextFieldDelegate: UITextFieldDelegate? { - get { return textField.delegate } + get { textField.delegate } set { textField.delegate = self proprietorTextDelegate = newValue @@ -44,7 +44,7 @@ import MVMCore /// Formats the MDN when setting and removes format of MDN when reading. public var mdn: String? { - get { return MVMCoreUIUtility.removeMdnFormat(text) } + get { MVMCoreUIUtility.removeMdnFormat(text) } set { text = MVMCoreUIUtility.formatMdn(newValue) } } @@ -160,9 +160,9 @@ import MVMCore // Sometimes user add extra 1 in front of mdn in their address book if isNationalMDN, - let unformedMDN = unformattedMDN, - unformedMDN.count == 11, - unformedMDN[(unformedMDN.index(unformedMDN.startIndex, offsetBy: 0))] == "1" { + let unformedMDN = unformattedMDN, + unformedMDN.count == 11, + unformedMDN[(unformedMDN.index(unformedMDN.startIndex, offsetBy: 0))] == "1" { let startIndex = unformedMDN.index(unformedMDN.startIndex, offsetBy: 1) unformattedMDN = String(unformedMDN[startIndex...]) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift index 84a19fb5..1eecfbb8 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift @@ -61,7 +61,7 @@ import UIKit //-------------------------------------------------- public override var isEnabled: Bool { - get { return super.isEnabled } + get { super.isEnabled } set (enabled) { super.isEnabled = enabled @@ -75,7 +75,7 @@ import UIKit } public override var showError: Bool { - get { return super.showError } + get { super.showError } set (error) { if error { @@ -220,9 +220,7 @@ import UIKit @discardableResult @objc override open func resignFirstResponder() -> Bool { - if validateWhenDoneEditing { - validateText() - } + if validateWhenDoneEditing { validateText() } textField.resignFirstResponder() isSelected = false return true @@ -255,7 +253,7 @@ import UIKit showError = false return } - + if let isValid = textEntryFieldModel?.isValid { self.isValid = isValid } @@ -315,6 +313,10 @@ import UIKit case .password, .secure: textField.isSecureTextEntry = true + case .numberSecure: + textField.isSecureTextEntry = true + textField.keyboardType = .numberPad + case .number: textField.keyboardType = .numberPad @@ -324,8 +326,7 @@ import UIKit case .phone: textField.keyboardType = .phonePad - default: - break + default: break } textField.accessibilityIdentifier = model.accessibilityIdentifier @@ -333,9 +334,7 @@ import UIKit observingTextFieldDelegate = delegateObject?.observingTextFieldDelegate setupTextFieldToolbar() - if isSelected { - startEditing() - } + if isSelected { startEditing() } } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift index 5bdc26cc..817a10c5 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift @@ -16,6 +16,7 @@ case password case secure case number + case numberSecure case email case text case phone @@ -74,8 +75,8 @@ var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(placeholder, forKey: .placeholder) try container.encodeIfPresent(textAlignment, forKey: .textAlignment) + try container.encodeIfPresent(type, forKey: .type) try container.encode(enabledTextColor, forKey: .enabledTextColor) try container.encode(disabledTextColor, forKey: .disabledTextColor) - try container.encodeIfPresent(type, forKey: .type) } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryField.swift index b964ee8c..543469c1 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryField.swift @@ -149,17 +149,17 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele @objc open override func setupFieldContainerContent(_ container: UIView) { container.addSubview(textView) - + topConstraint = textView.topAnchor.constraint(equalTo: container.topAnchor, constant: Padding.Three) leadingConstraint = textView.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: Padding.Three) trailingConstraint = container.trailingAnchor.constraint(equalTo: textView.trailingAnchor, constant: Padding.Three) bottomConstraint = container.bottomAnchor.constraint(equalTo: textView.bottomAnchor, constant: Padding.Three) - + topConstraint?.isActive = true leadingConstraint?.isActive = true trailingConstraint?.isActive = true bottomConstraint?.isActive = true - + heightConstraint = textView.heightAnchor.constraint(equalToConstant: 0) accessibilityElements = [titleLabel, textView, feedbackLabel] } @@ -203,7 +203,7 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele /// Executes on UITextView.textDidEndEditingNotification @objc override func endInputing() { super.endInputing() - + // Don't show error till user starts typing. guard text?.count ?? 0 != 0 else { showError = false @@ -253,6 +253,10 @@ class TextViewEntryField: EntryField, UITextViewDelegate, ObservingTextFieldDele case .secure, .password: textView.isSecureTextEntry = true + case .numberSecure: + textView.isSecureTextEntry = true + textView.keyboardType = .numberPad + case .number: textView.keyboardType = .numberPad diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryFieldModel.swift index 00a07a1c..42da3ca2 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryFieldModel.swift @@ -23,7 +23,7 @@ class TextViewEntryFieldModel: TextEntryFieldModel { public var placeholderFontStyle: Styler.Font = Styler.Font.RegularMicro public var editable: Bool = true public var showsPlaceholder: Bool = false - + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- From bef4348d2bc4378eeeabb5a124703dac19880bdd Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 5 Feb 2021 16:21:19 -0500 Subject: [PATCH 02/19] multidimension --- .../Atoms/FormFields/TextFields/ItemDropdownEntryField.swift | 2 +- .../FormFields/TextFields/ItemDropdownEntryFieldModel.swift | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift index 29f4e1ec..70119f06 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift @@ -117,7 +117,7 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { } } -// MARK:- Base Picker Delegate +// MARK:- Picker Delegate extension ItemDropdownEntryField: UIPickerViewDelegate, UIPickerViewDataSource { @objc public func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift index 7757d466..d2ab6bd8 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift @@ -16,6 +16,7 @@ public var options: [String] = [] public var selectedIndex: Int? + public override func formFieldValue() -> AnyHashable? { guard !options.isEmpty, let index = selectedIndex From 68042be1d09d9fec7b242d9c6a344b573ad97bf0 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 8 Feb 2021 15:14:51 -0500 Subject: [PATCH 03/19] latest refactoring of dropdown --- .../TextFields/ItemDropdownEntryField.swift | 91 +++++++++++++------ .../ItemDropdownEntryFieldModel.swift | 65 ++++++++++--- .../TextFields/TextEntryField.swift | 5 + .../TextFields/TextEntryFieldModel.swift | 56 ++++++++++++ .../Items/DropDownFilterTableViewCell.swift | 15 +-- 5 files changed, 187 insertions(+), 45 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift index 70119f06..9e34e9db 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift @@ -12,26 +12,39 @@ public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerVie open class ItemDropdownEntryField: BaseDropdownEntryField { + //-------------------------------------------------- + // MARK: - Outlets + //-------------------------------------------------- + + open var pickerView: UIPickerView? + //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - open var pickerData: [String] = [] - open var pickerView: UIPickerView? + /// 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)->())? + public var observeDropdownChange: ((String, String) -> ())? /// Closure passed here will run upon dismissing the selection picker. - public var observeDropdownSelection: ((String)->())? + public var observeDropdownSelection: ((String) -> ())? - public var itemDropdownEntryFieldModel: ItemDropdownEntryFieldModel? { + public var dropdownModel: ItemDropdownEntryFieldModel? { model as? ItemDropdownEntryFieldModel } + /// The number of components available + public var componentCount: Int { + pickerComponents.count + } + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -44,9 +57,9 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { self.init(frame: .zero) } - @objc public convenience init(pickerData: [String]) { + @objc public convenience init(pickerComponents: [[String]]) { self.init(frame: .zero) - self.pickerData = pickerData + self.dropdownModel?.options = pickerComponents } @objc required public init?(coder: NSCoder) { @@ -76,43 +89,60 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { pickerView?.dataSource = delegate } + /// Sets the textField with the first value of the available picker data. @objc private func setInitialValueFromPicker() { - guard !pickerData.isEmpty else { return } + guard setInitialValueInTextField, + !pickerComponents.isEmpty, + let rowText = dropdownModel?.selectedRowText + else { return } - if setInitialValueInTextField, let pickerIndex = pickerView?.selectedRow(inComponent: 0) { - observeDropdownChange?(text ?? "", pickerData[pickerIndex]) - text = pickerData[pickerIndex] - itemDropdownEntryFieldModel?.selectedIndex = pickerIndex + observeDropdownChange?(text ?? "", rowText) + text = rowText + + for component in 0.. Int { 1 } + @objc public func numberOfComponents(in pickerView: UIPickerView) -> Int { componentCount } @objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - pickerData.count + pickerComponents[component].count } @objc public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { - guard !pickerData.isEmpty else { return nil } - return pickerData[row] + 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 !pickerData.isEmpty else { return } - observeDropdownChange?(text ?? "", pickerData[row]) - text = pickerData[row] - itemDropdownEntryFieldModel?.selectedIndex = row + guard !pickerComponents.isEmpty, + !pickerComponents[component].isEmpty, + let rowText = dropdownModel?.selectedRowText + else { return } + + observeDropdownChange?(text ?? "", rowText) + text = rowText + dropdownModel?.selectedIndicies[component] = row } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift index d2ab6bd8..a147e78a 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift @@ -13,16 +13,46 @@ public override class var identifier: String { "dropDown" } - public var options: [String] = [] + 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, - let index = selectedIndex - else { return nil } - return options[index] + 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.. UIKeyboardType? { + + guard let keyboardType = keyboardOverride else { return nil } + + var typeInt = 0 + + switch keyboardType { + case "asciiCapable": + typeInt = 1 // Displays a keyboard which can enter ASCII characters + + case "numbersAndPunctuation": + typeInt = 2 // Numbers and assorted punctuation. + + case "URL": + typeInt = 3 // A type optimized for URL entry (shows . / .com prominently). + + case "numberPad": + typeInt = 4 // A number pad with locale-appropriate digits (0-9, ۰-۹, ०-९, etc.). Suitable for PIN entry. + + case "phonePad": + typeInt = 5 // A phone pad (1-9, *, 0, #, with letters under the numbers). + + case "namePhonePad": + typeInt = 6 // A type optimized for entering a person's name or phone number. + + case "emailAddress": + typeInt = 7 // A type optimized for multiple email address entry (shows space @ . prominently). + + case "decimalPad": + typeInt = 8 // A number pad with a decimal point. + + case "twitter": + typeInt = 9 // A type optimized for twitter text entry (easy access to @ #) + + case "webSearch": + typeInt = 10 // A default keyboard type with URL-oriented addition (shows space . prominently). + + case "asciiCapableNumberPad": + typeInt = 11 // A number pad (0-9) that will always be ASCII digits. + + default: + typeInt = 0 // Default type for the current input method. + } + + return UIKeyboardType(rawValue: typeInt) + } + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- @@ -43,6 +96,7 @@ case textAlignment case enabledTextColor case disabledTextColor + case keyboardOverride case type } @@ -55,6 +109,7 @@ let typeContainer = try decoder.container(keyedBy: CodingKeys.self) placeholder = try typeContainer.decodeIfPresent(String.self, forKey: .placeholder) + keyboardOverride = try typeContainer.decodeIfPresent(String.self, forKey: .keyboardOverride) type = try typeContainer.decodeIfPresent(EntryType.self, forKey: .type) if let enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) { @@ -76,6 +131,7 @@ try container.encodeIfPresent(placeholder, forKey: .placeholder) try container.encodeIfPresent(textAlignment, forKey: .textAlignment) try container.encodeIfPresent(type, forKey: .type) + try container.encodeIfPresent(keyboardOverride, forKey: .keyboardOverride) try container.encode(enabledTextColor, forKey: .enabledTextColor) try container.encode(disabledTextColor, forKey: .disabledTextColor) } diff --git a/MVMCoreUI/Atomic/Molecules/Items/DropDownFilterTableViewCell.swift b/MVMCoreUI/Atomic/Molecules/Items/DropDownFilterTableViewCell.swift index aa581ba1..ae2f236b 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/DropDownFilterTableViewCell.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/DropDownFilterTableViewCell.swift @@ -12,6 +12,7 @@ import UIKit //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- + let dropDown = ItemDropdownEntryField() var delegateObject: MVMCoreUIDelegateObject? var previousIndex = NSNotFound @@ -22,16 +23,16 @@ import UIKit override public func setupView() { super.setupView() - + addMolecule(dropDown) dropDown.observeDropdownChange = { [weak self] oldValue, newValue in - guard newValue != oldValue, - let self = self, - let index = self.dropDown.pickerData.firstIndex(of: newValue), - let model = self.listItemModel as? DropDownListItemModel - else { return } - + guard oldValue != newValue, + let self = self, + let index = self.dropDown.pickerComponents.first?.firstIndex(of: newValue), + let model = self.listItemModel as? DropDownListItemModel + else { return } + if self.previousIndex != NSNotFound { self.delegateObject?.moleculeDelegate?.removeMolecules(model.molecules[self.previousIndex], animation: .fade) } From 7d97a1536b0bff577022bff27be1de6c5de8e60e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 8 Feb 2021 16:18:29 -0500 Subject: [PATCH 04/19] removed --- .../Atoms/FormFields/TextFields/ItemDropdownEntryField.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift index 9e34e9db..799a8b1f 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift @@ -57,11 +57,6 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { self.init(frame: .zero) } - @objc public convenience init(pickerComponents: [[String]]) { - self.init(frame: .zero) - self.dropdownModel?.options = pickerComponents - } - @objc required public init?(coder: NSCoder) { fatalError("ItemDropdownEntryField init(coder:) has not been implemented") } From 8b49de569d83c4947e2394c85e3184085791335e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 9 Feb 2021 11:30:38 -0500 Subject: [PATCH 05/19] decision to separate out into a separate molecule. --- MVMCoreUI.xcodeproj/project.pbxproj | 8 + .../TextFields/ItemDropdownEntryField.swift | 95 +++----- .../ItemDropdownEntryFieldModel.swift | 66 +----- .../MultiItemDropdownEndryField.swift | 210 ++++++++++++++++++ .../MultiItemDropdownEndryFieldModel.swift | 116 ++++++++++ .../Items/DropDownFilterTableViewCell.swift | 15 +- 6 files changed, 384 insertions(+), 126 deletions(-) create mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryField.swift create mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryFieldModel.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 9f7816ec..6c7795a7 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -114,6 +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 */; }; 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 */; }; @@ -659,6 +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 = ""; }; 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 = ""; }; @@ -2047,6 +2051,8 @@ 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, 0A25209724645B76000FA9F6 /* TextViewEntryFieldModel.swift */, 0A25209524645AFD000FA9F6 /* TextViewEntryField.swift */, + 0AE277EB25D2EE310048A38D /* MultiItemDropdownEndryFieldModel.swift */, + 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEndryField.swift */, ); path = TextFields; sourceTree = ""; @@ -2452,6 +2458,7 @@ D264FAAA2440F97600D98315 /* CollectionView.swift in Sources */, AAC23FAD24D92A0D009208DF /* ListThreeColumnSpeedTestModel.swift in Sources */, BBC0C4FF24811DCA0087C44F /* TagModel.swift in Sources */, + 0AE277EC25D2EE310048A38D /* MultiItemDropdownEndryFieldModel.swift in Sources */, 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */, 3265B30424BCA749000D154B /* HeadersH1NoButtonsBodyText.swift in Sources */, AAA7CD69250641F90045B959 /* HeartModel.swift in Sources */, @@ -2466,6 +2473,7 @@ D2E1FADB2260D3D200AEFD8C /* MVMCoreUIDelegateObject.swift in Sources */, 94382086243238D100B43AF3 /* WebViewModel.swift in Sources */, D28764F9245A327200CB882D /* TwoLinkView.swift in Sources */, + 0AE277E925D2ED4B0048A38D /* MultiItemDropdownEndryField.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/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift index 799a8b1f..c8d5e4b5 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift @@ -12,37 +12,24 @@ public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerVie open class ItemDropdownEntryField: BaseDropdownEntryField { - //-------------------------------------------------- - // MARK: - Outlets - //-------------------------------------------------- - - open var pickerView: UIPickerView? - //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - /// Datasource of the picker view. - open var pickerComponents: [[String]] { - dropdownModel?.options ?? [[]] - } + open var pickerData: [String] = [] + open var pickerView: UIPickerView? /// 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) -> ())? + public var observeDropdownChange: ((String, String)->())? /// Closure passed here will run upon dismissing the selection picker. - public var observeDropdownSelection: ((String) -> ())? + public var observeDropdownSelection: ((String)->())? - public var dropdownModel: ItemDropdownEntryFieldModel? { - model as? ItemDropdownEntryFieldModel - } - - /// The number of components available - public var componentCount: Int { - pickerComponents.count + public var itemDropdownEntryFieldModel: ItemDropdownEntryFieldModel? { + return model as? ItemDropdownEntryFieldModel } //-------------------------------------------------- @@ -57,6 +44,11 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { self.init(frame: .zero) } + @objc public convenience init(pickerData: [String]) { + self.init(frame: .zero) + self.pickerData = pickerData + } + @objc required public init?(coder: NSCoder) { fatalError("ItemDropdownEntryField init(coder:) has not been implemented") } @@ -87,89 +79,66 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { /// 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 } + guard !pickerData.isEmpty else { return } - observeDropdownChange?(text ?? "", rowText) - text = rowText - - for component in 0.. Int { componentCount } + @objc public func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 } @objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - pickerComponents[component].count + pickerData.count } @objc public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { + guard !pickerData.isEmpty else { return nil } - guard !pickerComponents.isEmpty, - !pickerComponents[component].isEmpty - else { return nil } - - return pickerComponents[component][row] + return pickerData[row] } @objc public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + guard !pickerData.isEmpty else { return } - guard !pickerComponents.isEmpty, - !pickerComponents[component].isEmpty, - let rowText = dropdownModel?.selectedRowText - else { return } - - observeDropdownChange?(text ?? "", rowText) - text = rowText - dropdownModel?.selectedIndicies[component] = row + observeDropdownChange?(text ?? "", pickerData[row]) + text = pickerData[row] + itemDropdownEntryFieldModel?.selectedIndex = row } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift index a147e78a..10650e20 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift @@ -13,46 +13,15 @@ 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 options: [String] = [] public var selectedIndex: Int? - - //-------------------------------------------------- - // MARK: - Validation - //-------------------------------------------------- - + public override func formFieldValue() -> AnyHashable? { + guard !options.isEmpty, + let index = selectedIndex + else { return nil } - 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: 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 new file mode 100644 index 00000000..fb9e62f0 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEndryFieldModel.swift @@ -0,0 +1,116 @@ +// +// 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.. Date: Tue, 9 Feb 2021 16:27:36 -0500 Subject: [PATCH 06/19] 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.. Date: Wed, 10 Feb 2021 09:26:11 -0500 Subject: [PATCH 07/19] moved classes --- MVMCoreUI.xcodeproj/project.pbxproj | 24 ++++++++++++------- .../BaseDropdownEntryField.swift | 0 .../BaseDropdownEntryFieldModel.swift | 0 .../DateDropdownEntryField.swift | 0 .../DateDropdownEntryFieldModel.swift | 0 .../ItemDropdownEntryField.swift | 0 .../ItemDropdownEntryFieldModel.swift | 0 .../MultiItemDropdownEntryField.swift | 0 .../MultiItemDropdownEntryFieldModel.swift | 0 9 files changed, 16 insertions(+), 8 deletions(-) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/BaseDropdownEntryField.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/BaseDropdownEntryFieldModel.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/DateDropdownEntryField.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/DateDropdownEntryFieldModel.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/ItemDropdownEntryField.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/ItemDropdownEntryFieldModel.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/MultiItemDropdownEntryField.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/{ => Dropdown Fields}/MultiItemDropdownEntryFieldModel.swift (100%) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 71d5cfb4..fc3d6563 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -1173,6 +1173,21 @@ path = FormUIHelpers; sourceTree = ""; }; + 0A0FEC7125D4246000AF2548 /* Dropdown Fields */ = { + isa = PBXGroup; + children = ( + 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */, + 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */, + 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */, + 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */, + 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */, + 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, + 0AE277EB25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift */, + 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEntryField.swift */, + ); + path = "Dropdown Fields"; + sourceTree = ""; + }; 0A5D59C323AD488600EFD9E9 /* Protocols */ = { isa = PBXGroup; children = ( @@ -2043,16 +2058,9 @@ 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */, 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */, 0A21DB93235E24ED00C160A2 /* DigitEntryField.swift */, - 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */, - 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */, - 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */, - 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */, - 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */, - 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, 0A25209724645B76000FA9F6 /* TextViewEntryFieldModel.swift */, 0A25209524645AFD000FA9F6 /* TextViewEntryField.swift */, - 0AE277EB25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift */, - 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEntryField.swift */, + 0A0FEC7125D4246000AF2548 /* Dropdown Fields */, ); path = TextFields; sourceTree = ""; diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MultiItemDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryFieldModel.swift From ee95db5116eea85eba191eb6d753c52cad5799fc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 10 Feb 2021 13:02:01 -0500 Subject: [PATCH 08/19] moved around --- MVMCoreUI.xcodeproj/project.pbxproj | 38 +++++++++++++++---- .../BaseDropdownEntryField.swift | 4 +- ...del.swift => BaseDropdownFieldModel.swift} | 0 .../DateDropdownEntryField.swift | 2 +- .../DateDropdownEntryFieldModel.swift | 0 .../Item Dropdown/BaseItemPickerField.swift | 15 ++++++++ .../BaseItemPickerFieldModel.swift | 13 +++++++ .../ItemDropdownEntryField.swift | 4 +- .../ItemDropdownEntryFieldModel.swift | 0 .../MultiItemDropdownEntryField.swift | 4 +- .../MultiItemDropdownEntryFieldModel.swift | 14 +++---- 11 files changed, 73 insertions(+), 21 deletions(-) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/{BaseDropdownEntryFieldModel.swift => BaseDropdownFieldModel.swift} (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/{ => Date Dropdown}/DateDropdownEntryField.swift (98%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/{ => Date Dropdown}/DateDropdownEntryFieldModel.swift (100%) create mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift create mode 100644 MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/{ => Item Dropdown}/ItemDropdownEntryField.swift (98%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/{ => Item Dropdown}/ItemDropdownEntryFieldModel.swift (100%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/{ => Item Dropdown}/MultiItemDropdownEntryField.swift (98%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/{ => Item Dropdown}/MultiItemDropdownEntryFieldModel.swift (85%) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index fc3d6563..8ecdd65f 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -62,6 +62,8 @@ 01EB369323609801006832FA /* HeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368C23609801006832FA /* HeaderModel.swift */; }; 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; + 0A0FEC7425D42A5E00AF2548 /* BaseItemPickerField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerField.swift */; }; + 0A0FEC7825D42A8500AF2548 /* BaseItemPickerFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0FEC7725D42A8500AF2548 /* BaseItemPickerFieldModel.swift */; }; 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; @@ -94,7 +96,7 @@ 0A7EF85D23D8A95600B2AAD1 /* TextEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */; }; 0A7EF85F23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */; }; 0A7EF86123D8AC2500B2AAD1 /* DigitEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */; }; - 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; + 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownFieldModel.swift */; }; 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; 0A849EFE246F1775009F277F /* RuleEqualsIgnoreCaseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A849EFD246F1775009F277F /* RuleEqualsIgnoreCaseModel.swift */; }; @@ -607,6 +609,8 @@ 01EB368C23609801006832FA /* HeaderModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderModel.swift; sourceTree = ""; }; 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; + 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseItemPickerField.swift; sourceTree = ""; }; + 0A0FEC7725D42A8500AF2548 /* BaseItemPickerFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseItemPickerFieldModel.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; @@ -640,7 +644,7 @@ 0A7EF85C23D8A95600B2AAD1 /* TextEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEntryFieldModel.swift; sourceTree = ""; }; 0A7EF85E23D8ABC500B2AAD1 /* MdnEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MdnEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86023D8AC2500B2AAD1 /* DigitEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitEntryFieldModel.swift; sourceTree = ""; }; - 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownEntryFieldModel.swift; sourceTree = ""; }; + 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseDropdownFieldModel.swift; sourceTree = ""; }; 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; @@ -1176,16 +1180,34 @@ 0A0FEC7125D4246000AF2548 /* Dropdown Fields */ = { isa = PBXGroup; children = ( - 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */, + 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownFieldModel.swift */, 0A6BF4712360C56C0028F841 /* BaseDropdownEntryField.swift */, - 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */, - 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */, + 0A0FEC8D25D4487F00AF2548 /* Date Dropdown */, + 0A0FEC8A25D4486F00AF2548 /* Item Dropdown */, + ); + path = "Dropdown Fields"; + sourceTree = ""; + }; + 0A0FEC8A25D4486F00AF2548 /* Item Dropdown */ = { + isa = PBXGroup; + children = ( + 0A0FEC7725D42A8500AF2548 /* BaseItemPickerFieldModel.swift */, + 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerField.swift */, 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */, 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, 0AE277EB25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift */, 0AE277E825D2ED4B0048A38D /* MultiItemDropdownEntryField.swift */, ); - path = "Dropdown Fields"; + path = "Item Dropdown"; + sourceTree = ""; + }; + 0A0FEC8D25D4487F00AF2548 /* Date Dropdown */ = { + isa = PBXGroup; + children = ( + 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */, + 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */, + ); + path = "Date Dropdown"; sourceTree = ""; }; 0A5D59C323AD488600EFD9E9 /* Protocols */ = { @@ -2582,6 +2604,7 @@ D2CAC7CB251104E100C75681 /* NotificationXButtonModel.swift in Sources */, 014AA73123C5059B006F3E93 /* ListPageTemplateModel.swift in Sources */, AAC23FAF24D92A1E009208DF /* ListThreeColumnSpeedTest.swift in Sources */, + 0A0FEC7425D42A5E00AF2548 /* BaseItemPickerField.swift in Sources */, D29DF2A221E7AF4E003B2FB9 /* MVMCoreUIUtility.m in Sources */, D29DF12B21E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m in Sources */, D2ED27ED254B0CE700A1C293 /* ActionPopupModel.swift in Sources */, @@ -2697,6 +2720,7 @@ BB55B51D244482C1002001AD /* ListRightVariablePriceChangeBodyText.swift in Sources */, 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */, 323AC96C24C837FF00F8E4C4 /* ListThreeColumnBillChanges.swift in Sources */, + 0A0FEC7825D42A8500AF2548 /* BaseItemPickerFieldModel.swift in Sources */, D28A837923C7D5BC00DFE4FC /* PageModelProtocol.swift in Sources */, D2351C7C24A4D4C3007DF0BC /* ListRightVariableToggleAllTextAndLinks.swift in Sources */, 017BEB7B236763000024EF95 /* LineModel.swift in Sources */, @@ -2879,7 +2903,7 @@ D2D2FCF0252B72AF0033EAAA /* MoleculeSectionFooterModel.swift in Sources */, BB1D17E2244EAA46001D2002 /* ListDeviceComplexButtonMedium.swift in Sources */, D2FA83D42514F80C00564112 /* CollapsableNotification.swift in Sources */, - 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */, + 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownFieldModel.swift in Sources */, 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */, D236E5B5241FEB1000C38625 /* ListTwoColumnPriceDescriptionModel.swift in Sources */, D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift index cde3a824..836eda24 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift @@ -1,5 +1,5 @@ // -// BaseDropdownEntryField.swift +// BaseDropdownField.swift // MVMCoreUI // // Created by Kevin Christiano on 10/23/19. @@ -12,7 +12,7 @@ import UIKit This class is intended to be subclassed. See ItemDropdownEntryField and DateDropdownEntryField. */ -@objcMembers open class BaseDropdownEntryField: TextEntryField { +@objcMembers open class BaseDropdownField: TextEntryField { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryField.swift similarity index 98% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryField.swift index 234809d3..ca898369 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryField.swift @@ -9,7 +9,7 @@ import UIKit -@objcMembers open class DateDropdownEntryField: BaseDropdownEntryField { +@objcMembers open class DateDropdownEntryField: BaseDropdownField { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/DateDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift new file mode 100644 index 00000000..2b21e980 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift @@ -0,0 +1,15 @@ +// +// ItemPickerDropdownField.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/10/21. +// Copyright © 2021 Verizon Wireless. All rights reserved. +// + +import UIKit + +class BaseItemPickerField: BaseDropdownField { + + + +} diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift new file mode 100644 index 00000000..e5912334 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift @@ -0,0 +1,13 @@ +// +// BaseItemPickerFieldModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 2/10/21. +// Copyright © 2021 Verizon Wireless. All rights reserved. +// + +import UIKit + +class BaseItemPickerFieldModel: BaseDropdownEntryFieldModel { + +} diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift similarity index 98% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index 55e6c897..9dbcfe53 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -1,5 +1,5 @@ // -// ItemDropdownEntryField.swift +// ItemDropdownField.swift // MVMCoreUI // // Created by Kevin Christiano on 11/14/19. @@ -11,7 +11,7 @@ import UIKit public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerViewDelegate & UIPickerViewDataSource) -open class ItemDropdownEntryField: BaseDropdownEntryField { +open class ItemDropdownEntryField: BaseDropdownField { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/ItemDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift similarity index 98% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index e84a7a0b..2b4075c0 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -9,7 +9,7 @@ import UIKit -open class MultiItemDropdownEntryField: BaseDropdownEntryField { +open class MultiItemDropdownEntryField: BaseDropdownField { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- @@ -22,7 +22,7 @@ open class MultiItemDropdownEntryField: BaseDropdownEntryField { /// Datasource of the picker view. open var pickerComponents: [[String]] { - dropdownModel?.options ?? [[]] + dropdownModel?.components ?? [[]] } /// When selecting for first responder, allow initial selected value to appear in empty text field. diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift similarity index 85% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift index 2b8c4dda..de087ac9 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/MultiItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift @@ -16,7 +16,7 @@ import Foundation public override class var identifier: String { "multiDropdown" } - public var options: [[String]] = [[]] + public var components: [[String]] = [[]] public var selectedIndexes: [Int: Int] = [:] //-------------------------------------------------- @@ -25,7 +25,7 @@ import Foundation public override func formFieldValue() -> AnyHashable? { - guard !options.isEmpty && !selectedIndexes.isEmpty else { return nil } + guard !components.isEmpty && !selectedIndexes.isEmpty else { return nil } return selectedRowText } @@ -35,9 +35,9 @@ import Foundation var text = "" - for i in 0.. Date: Wed, 10 Feb 2021 14:22:47 -0500 Subject: [PATCH 09/19] save --- .../BaseDropdownEntryField.swift | 2 +- .../Item Dropdown/BaseItemPickerField.swift | 23 +++++++++++++++---- .../BaseItemPickerFieldModel.swift | 7 +++++- .../MultiItemDropdownEntryField.swift | 17 +------------- .../MultiItemDropdownEntryFieldModel.swift | 2 +- .../TextFields/TextEntryField.swift | 2 ++ 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift index 836eda24..cac63413 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift @@ -55,7 +55,7 @@ import UIKit @objc required public init?(coder: NSCoder) { super.init(coder: coder) - fatalError("DropdownEntryField does not support xib.") + fatalError("\(String(describing: Self.self)) does not support xib.") } required public init(model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift index 2b21e980..65163320 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift @@ -8,8 +8,23 @@ import UIKit -class BaseItemPickerField: BaseDropdownField { - - - +open class BaseItemPickerField: BaseDropdownField { + //-------------------------------------------------- + // MARK: - Outlets + //-------------------------------------------------- + + open var pickerView: UIPickerView? + + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + /// 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) -> ())? + + /// When selecting for first responder, allow initial selected value to appear in empty text field. + public var setInitialValueInTextField = true } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift index e5912334..16c3a9a3 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift @@ -8,6 +8,11 @@ import UIKit -class BaseItemPickerFieldModel: BaseDropdownEntryFieldModel { +open class BaseItemPickerFieldModel: BaseDropdownEntryFieldModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public override class var identifier: String { "" } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index 2b4075c0..c51ec19a 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -9,13 +9,7 @@ import UIKit -open class MultiItemDropdownEntryField: BaseDropdownField { - //-------------------------------------------------- - // MARK: - Outlets - //-------------------------------------------------- - - open var pickerView: UIPickerView? - +open class MultiItemDropdownEntryField: BaseItemPickerField { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -25,15 +19,6 @@ open class MultiItemDropdownEntryField: BaseDropdownField { dropdownModel?.components ?? [[]] } - /// 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: MultiItemDropdownEntryFieldModel? { model as? MultiItemDropdownEntryFieldModel } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift index de087ac9..f27ad049 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift @@ -9,7 +9,7 @@ import Foundation -@objcMembers open class MultiItemDropdownEntryFieldModel: BaseDropdownEntryFieldModel { +@objcMembers open class MultiItemDropdownEntryFieldModel: BaseItemPickerFieldModel { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift index 50aa5fbf..4fd2b5ac 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift @@ -96,6 +96,8 @@ import UIKit open override var text: String? { get { textField.text } set { + + NSRegularExpression(pattern: <#T##String#>, options: []) textField.text = newValue textEntryFieldModel?.text = newValue } From 38253cc6132344d2a879fea02bd6a9d509d18a58 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 10 Feb 2021 15:20:42 -0500 Subject: [PATCH 10/19] back --- .../Atomic/Atoms/FormFields/TextFields/TextEntryField.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift index 4fd2b5ac..50aa5fbf 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift @@ -96,8 +96,6 @@ import UIKit open override var text: String? { get { textField.text } set { - - NSRegularExpression(pattern: <#T##String#>, options: []) textField.text = newValue textEntryFieldModel?.text = newValue } From 63cf1c994a5ec09326cf5d5a1441f3d154232b1a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 11 Feb 2021 11:48:40 -0500 Subject: [PATCH 11/19] rename --- MVMCoreUI.xcodeproj/project.pbxproj | 16 ++++++++-------- .../Dropdown Fields/BaseDropdownEntryField.swift | 2 +- .../Dropdown Fields/BaseDropdownFieldModel.swift | 2 +- .../Date Dropdown/DateDropdownEntryField.swift | 2 +- ...ield.swift => BaseItemPickerEntryField.swift} | 4 ++-- ...swift => BaseItemPickerEntryFieldModel.swift} | 4 ++-- .../Item Dropdown/ItemDropdownEntryField.swift | 2 +- .../ItemDropdownEntryFieldModel.swift | 2 +- .../MultiItemDropdownEntryField.swift | 2 +- .../MultiItemDropdownEntryFieldModel.swift | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/{BaseItemPickerField.swift => BaseItemPickerEntryField.swift} (90%) rename MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/{BaseItemPickerFieldModel.swift => BaseItemPickerEntryFieldModel.swift} (75%) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 8ecdd65f..6dcc4688 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -62,8 +62,8 @@ 01EB369323609801006832FA /* HeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368C23609801006832FA /* HeaderModel.swift */; }; 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; - 0A0FEC7425D42A5E00AF2548 /* BaseItemPickerField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerField.swift */; }; - 0A0FEC7825D42A8500AF2548 /* BaseItemPickerFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0FEC7725D42A8500AF2548 /* BaseItemPickerFieldModel.swift */; }; + 0A0FEC7425D42A5E00AF2548 /* BaseItemPickerEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerEntryField.swift */; }; + 0A0FEC7825D42A8500AF2548 /* BaseItemPickerEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0FEC7725D42A8500AF2548 /* BaseItemPickerEntryFieldModel.swift */; }; 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; @@ -609,8 +609,8 @@ 01EB368C23609801006832FA /* HeaderModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderModel.swift; sourceTree = ""; }; 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; - 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseItemPickerField.swift; sourceTree = ""; }; - 0A0FEC7725D42A8500AF2548 /* BaseItemPickerFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseItemPickerFieldModel.swift; sourceTree = ""; }; + 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseItemPickerEntryField.swift; sourceTree = ""; }; + 0A0FEC7725D42A8500AF2548 /* BaseItemPickerEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseItemPickerEntryFieldModel.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; @@ -1191,8 +1191,8 @@ 0A0FEC8A25D4486F00AF2548 /* Item Dropdown */ = { isa = PBXGroup; children = ( - 0A0FEC7725D42A8500AF2548 /* BaseItemPickerFieldModel.swift */, - 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerField.swift */, + 0A0FEC7725D42A8500AF2548 /* BaseItemPickerEntryFieldModel.swift */, + 0A0FEC7325D42A5E00AF2548 /* BaseItemPickerEntryField.swift */, 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */, 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */, 0AE277EB25D2EE310048A38D /* MultiItemDropdownEntryFieldModel.swift */, @@ -2604,7 +2604,7 @@ D2CAC7CB251104E100C75681 /* NotificationXButtonModel.swift in Sources */, 014AA73123C5059B006F3E93 /* ListPageTemplateModel.swift in Sources */, AAC23FAF24D92A1E009208DF /* ListThreeColumnSpeedTest.swift in Sources */, - 0A0FEC7425D42A5E00AF2548 /* BaseItemPickerField.swift in Sources */, + 0A0FEC7425D42A5E00AF2548 /* BaseItemPickerEntryField.swift in Sources */, D29DF2A221E7AF4E003B2FB9 /* MVMCoreUIUtility.m in Sources */, D29DF12B21E6851E003B2FB9 /* MVMCoreUITopAlertExpandableView.m in Sources */, D2ED27ED254B0CE700A1C293 /* ActionPopupModel.swift in Sources */, @@ -2720,7 +2720,7 @@ BB55B51D244482C1002001AD /* ListRightVariablePriceChangeBodyText.swift in Sources */, 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */, 323AC96C24C837FF00F8E4C4 /* ListThreeColumnBillChanges.swift in Sources */, - 0A0FEC7825D42A8500AF2548 /* BaseItemPickerFieldModel.swift in Sources */, + 0A0FEC7825D42A8500AF2548 /* BaseItemPickerEntryFieldModel.swift in Sources */, D28A837923C7D5BC00DFE4FC /* PageModelProtocol.swift in Sources */, D2351C7C24A4D4C3007DF0BC /* ListRightVariableToggleAllTextAndLinks.swift in Sources */, 017BEB7B236763000024EF95 /* LineModel.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift index cac63413..60808590 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift @@ -12,7 +12,7 @@ import UIKit This class is intended to be subclassed. See ItemDropdownEntryField and DateDropdownEntryField. */ -@objcMembers open class BaseDropdownField: TextEntryField { +@objcMembers open class BaseDropdownEntryField: TextEntryField { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownFieldModel.swift index f256544c..39701016 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownFieldModel.swift @@ -27,7 +27,7 @@ } //-------------------------------------------------- - // MARK: - Initializers + // MARK: - Codec //-------------------------------------------------- required public init(from decoder: Decoder) throws { diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryField.swift index ca898369..234809d3 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Date Dropdown/DateDropdownEntryField.swift @@ -9,7 +9,7 @@ import UIKit -@objcMembers open class DateDropdownEntryField: BaseDropdownField { +@objcMembers open class DateDropdownEntryField: BaseDropdownEntryField { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift similarity index 90% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift index 65163320..e3b37b7b 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift @@ -1,5 +1,5 @@ // -// ItemPickerDropdownField.swift +// BaseItemPickerEntryField.swift // MVMCoreUI // // Created by Kevin Christiano on 2/10/21. @@ -8,7 +8,7 @@ import UIKit -open class BaseItemPickerField: BaseDropdownField { +open class BaseItemPickerEntryField: BaseDropdownEntryField { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryFieldModel.swift similarity index 75% rename from MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryFieldModel.swift index 16c3a9a3..a2b3d696 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryFieldModel.swift @@ -1,5 +1,5 @@ // -// BaseItemPickerFieldModel.swift +// BaseItemPickerEntryFieldModel.swift // MVMCoreUI // // Created by Kevin Christiano on 2/10/21. @@ -9,7 +9,7 @@ import UIKit -open class BaseItemPickerFieldModel: BaseDropdownEntryFieldModel { +open class BaseItemPickerEntryFieldModel: BaseDropdownEntryFieldModel { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index 9dbcfe53..2b0a4201 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -11,7 +11,7 @@ import UIKit public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerViewDelegate & UIPickerViewDataSource) -open class ItemDropdownEntryField: BaseDropdownField { +open class ItemDropdownEntryField: BaseDropdownEntryField { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift index 98d916da..06a14380 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift @@ -6,7 +6,7 @@ // Copyright © 2020 Verizon Wireless. All rights reserved. // -@objcMembers open class ItemDropdownEntryFieldModel: BaseDropdownEntryFieldModel { +@objcMembers open class ItemDropdownEntryFieldModel: BaseItemPickerEntryFieldModel { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index c51ec19a..670a23e4 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -9,7 +9,7 @@ import UIKit -open class MultiItemDropdownEntryField: BaseItemPickerField { +open class MultiItemDropdownEntryField: BaseItemPickerEntryField { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift index f27ad049..0d8e7dcb 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift @@ -9,7 +9,7 @@ import Foundation -@objcMembers open class MultiItemDropdownEntryFieldModel: BaseItemPickerFieldModel { +@objcMembers open class MultiItemDropdownEntryFieldModel: BaseItemPickerEntryFieldModel { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- From 3efe4ae81f0b52e1a7cdab237b8ae36f911a369c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 11 Feb 2021 16:09:38 -0500 Subject: [PATCH 12/19] continues development --- .../BaseDropdownEntryField.swift | 2 +- .../BaseItemPickerEntryField.swift | 32 ++++++++++++++- .../ItemDropdownEntryField.swift | 39 +++---------------- .../MultiItemDropdownEntryField.swift | 31 ++++----------- .../MultiItemDropdownEntryFieldModel.swift | 15 +++++-- .../FormUIHelpers/FormFieldProtocol.swift | 3 +- 6 files changed, 59 insertions(+), 63 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift index 60808590..5a7f1702 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/BaseDropdownEntryField.swift @@ -87,7 +87,7 @@ import UIKit dropDownCaretView.setOptional(with: model.caretView, delegateObject, additionalData) } - public override func dismissFieldInput(_ sender: Any?) { + @objc public override func dismissFieldInput(_ sender: Any?) { performDropdownAction() super.dismissFieldInput(sender) } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift index e3b37b7b..2c74abdb 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift @@ -8,7 +8,10 @@ import UIKit -open class BaseItemPickerEntryField: BaseDropdownEntryField { +public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerViewDelegate & UIPickerViewDataSource) + + +open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegate, UIPickerViewDataSource { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- @@ -27,4 +30,31 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField { /// When selecting for first responder, allow initial selected value to appear in empty text field. public var setInitialValueInTextField = true + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + @objc open override func setupFieldContainerContent(_ container: UIView) { + super.setupFieldContainerContent(container) + + pickerView = UIPickerView.addPicker(to: self.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 + } + + //-------------------------------------------------- + // MARK: - Picker Delegate to Override + //-------------------------------------------------- + + public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 0 } + + public func numberOfComponents(in pickerView: UIPickerView) -> Int { 0 } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index 2b0a4201..938e6a20 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -8,25 +8,13 @@ import UIKit -public typealias TextFieldAndPickerDelegate = (UITextFieldDelegate & UIPickerViewDelegate & UIPickerViewDataSource) - -open class ItemDropdownEntryField: BaseDropdownEntryField { +open class ItemDropdownEntryField: BaseItemPickerEntryField { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- open var pickerData: [String] = [] - open var pickerView: UIPickerView? - - /// 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 itemDropdownEntryFieldModel: ItemDropdownEntryFieldModel? { model as? ItemDropdownEntryFieldModel @@ -61,21 +49,6 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { // 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() { @@ -116,14 +89,14 @@ open class ItemDropdownEntryField: BaseDropdownEntryField { self.pickerView(pickerView, didSelectRow: index, inComponent: 0) } } -} -// MARK:- Base Picker Delegate -extension ItemDropdownEntryField: UIPickerViewDelegate, UIPickerViewDataSource { + //-------------------------------------------------- + // MARK: - Picker Delegate + //-------------------------------------------------- - @objc public func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 } + @objc public override func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 } - @objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + @objc public override func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { pickerData.count } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index 670a23e4..860cee6a 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -52,21 +52,6 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { // 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() { @@ -75,7 +60,7 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { let rowText = dropdownModel?.selectedRowText else { return } -// observeDropdownChange?(text ?? "", rowText) + observeDropdownChange?(text ?? "", rowText) text = rowText for component in 0.. Int { componentCount } + @objc public override func numberOfComponents(in pickerView: UIPickerView) -> Int { componentCount } - @objc public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + @objc public override func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { pickerComponents[component].count } @@ -150,7 +135,7 @@ extension MultiItemDropdownEntryField: UIPickerViewDelegate, UIPickerViewDataSou let rowText = dropdownModel?.selectedRowText else { return } -// observeDropdownChange?(text ?? "", rowText) + observeDropdownChange?(text ?? "", rowText) text = rowText dropdownModel?.selectedIndexes[component] = row } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift index 0d8e7dcb..4c4a3eb6 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift @@ -18,6 +18,7 @@ import Foundation public var components: [[String]] = [[]] public var selectedIndexes: [Int: Int] = [:] + public var delimiters: [String]? //-------------------------------------------------- // MARK: - Validation @@ -37,6 +38,12 @@ import Foundation for i in 0.. Date: Mon, 15 Feb 2021 09:18:20 -0500 Subject: [PATCH 13/19] current --- .../BaseItemPickerEntryField.swift | 28 +++++++++++++++++++ .../ItemDropdownEntryField.swift | 16 ----------- .../MultiItemDropdownEntryField.swift | 17 ----------- .../TextFields/TextEntryField.swift | 19 ++++++++++++- .../TextFields/TextEntryFieldModel.swift | 3 +- 5 files changed, 48 insertions(+), 35 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift index 2c74abdb..d4c62591 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift @@ -50,6 +50,18 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegat pickerView?.dataSource = delegate } + //-------------------------------------------------- + // MARK: - Molecular + //-------------------------------------------------- + + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? BaseItemPickerEntryFieldModel else { return } + + setPickerDelegates(delegate: self) + } + //-------------------------------------------------- // MARK: - Picker Delegate to Override //-------------------------------------------------- @@ -58,3 +70,19 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegat public func numberOfComponents(in pickerView: UIPickerView) -> Int { 0 } } + + +// MARK: - Accessibility +extension BaseItemPickerEntryField { + + @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/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index 938e6a20..faecff4c 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -83,7 +83,6 @@ open class ItemDropdownEntryField: BaseItemPickerEntryField { guard let model = model as? ItemDropdownEntryFieldModel else { return } pickerData = model.options - setPickerDelegates(delegate: self) if let pickerView = pickerView, let index = model.selectedIndex { self.pickerView(pickerView, didSelectRow: index, inComponent: 0) @@ -114,18 +113,3 @@ open class ItemDropdownEntryField: BaseItemPickerEntryField { itemDropdownEntryFieldModel?.selectedIndex = 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/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index 860cee6a..55aa6855 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -100,8 +100,6 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { guard let model = model as? MultiItemDropdownEntryFieldModel else { return } - setPickerDelegates(delegate: self) - if let pickerView = pickerView { for (component, index) in model.selectedIndexes { self.pickerView(pickerView, didSelectRow: index, inComponent: component) @@ -140,18 +138,3 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { 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/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift index 50aa5fbf..e961eddd 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift @@ -96,8 +96,25 @@ import UIKit open override var text: String? { get { textField.text } set { - textField.text = newValue textEntryFieldModel?.text = newValue + + if let regex = textEntryFieldModel?.displayFormat, + let mask = textEntryFieldModel?.displayMask, + let newText = newValue { + + let range = NSRange(newText.startIndex..., in: newText) + + if let regex = try? NSRegularExpression(pattern: regex) { + let afterText = regex.stringByReplacingMatches(in: newText, + range: range, + withTemplate: mask + ) + print(afterText) + } + + } else { + textField.text = newValue + } } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift index 141ab048..2eaed585 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift @@ -35,7 +35,8 @@ public var keyboardOverride: String? public var type: EntryType? public var clearTextOnTap: Bool = false - public var displayFormat: String? + public var displayFormat: String? = "(?=\\d{5})\\d" + public var displayMask: String? = "•" //-------------------------------------------------- // MARK: - Methods From cb981e29a9f3847951ef579be204408f8e56aecc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 15 Feb 2021 10:37:15 -0500 Subject: [PATCH 14/19] latest --- .../Item Dropdown/ItemDropdownEntryFieldModel.swift | 5 +---- .../Item Dropdown/MultiItemDropdownEntryField.swift | 8 ++++++-- .../MultiItemDropdownEntryFieldModel.swift | 10 +++++----- .../Atoms/FormFields/TextFields/TextEntryField.swift | 10 ++++------ 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift index 06a14380..bf7416e6 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryFieldModel.swift @@ -49,10 +49,7 @@ if let selectedIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .selectedIndex) { self.selectedIndex = selectedIndex - } - - if let index = selectedIndex { - baseValue = options.indices.contains(index) ? options[index] : nil + baseValue = options.indices.contains(selectedIndex) ? options[selectedIndex] : nil } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index 55aa6855..a2f90ee2 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -60,9 +60,11 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { let rowText = dropdownModel?.selectedRowText else { return } + // Update observing function and update text UI. observeDropdownChange?(text ?? "", rowText) text = rowText + // Set row index value of selected component. for component in 0.. Date: Mon, 15 Feb 2021 14:07:50 -0500 Subject: [PATCH 15/19] multi select --- .../Item Dropdown/ItemDropdownEntryField.swift | 1 + .../Item Dropdown/MultiItemDropdownEntryField.swift | 10 ++++++---- .../FormFields/TextFields/TextEntryFieldModel.swift | 7 +++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index faecff4c..a63ea57f 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -85,6 +85,7 @@ open class ItemDropdownEntryField: BaseItemPickerEntryField { pickerData = model.options if let pickerView = pickerView, let index = model.selectedIndex { + self.pickerView?.selectRow(index, inComponent: 0, animated: false) self.pickerView(pickerView, didSelectRow: index, inComponent: 0) } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index a2f90ee2..7a493075 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -106,6 +106,7 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { if let pickerView = pickerView { // Select initial rows if selectedIndexes retains value. for (component, row) in model.selectedIndexes { + self.pickerView?.selectRow(row, inComponent: component, animated: false) self.pickerView(pickerView, didSelectRow: row, inComponent: component) } } @@ -133,12 +134,13 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { @objc public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { guard !pickerComponents.isEmpty, - !pickerComponents[component].isEmpty, - let rowText = dropdownModel?.selectedRowText + !pickerComponents[component].isEmpty else { return } - observeDropdownChange?(text ?? "", rowText) - text = rowText + let oldText = text ?? "" dropdownModel?.selectedIndexes[component] = row + let newText = dropdownModel?.selectedRowText + observeDropdownChange?(oldText, newText ?? "") + text = newText } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift index 2eaed585..ca7543bd 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift @@ -35,8 +35,8 @@ public var keyboardOverride: String? public var type: EntryType? public var clearTextOnTap: Bool = false - public var displayFormat: String? = "(?=\\d{5})\\d" - public var displayMask: String? = "•" + public var displayFormat: String? + public var displayMask: String? //-------------------------------------------------- // MARK: - Methods @@ -103,6 +103,7 @@ case type case clearTextOnTap case displayFormat + case displayMask } //-------------------------------------------------- @@ -116,6 +117,7 @@ placeholder = try typeContainer.decodeIfPresent(String.self, forKey: .placeholder) displayFormat = try typeContainer.decodeIfPresent(String.self, forKey: .displayFormat) keyboardOverride = try typeContainer.decodeIfPresent(String.self, forKey: .keyboardOverride) + displayMask = try typeContainer.decodeIfPresent(String.self, forKey: .displayMask) type = try typeContainer.decodeIfPresent(EntryType.self, forKey: .type) if let clearTextOnTap = try typeContainer.decodeIfPresent(Bool.self, forKey: .clearTextOnTap) { @@ -143,6 +145,7 @@ try container.encodeIfPresent(type, forKey: .type) try container.encodeIfPresent(displayFormat, forKey: .displayFormat) try container.encodeIfPresent(keyboardOverride, forKey: .keyboardOverride) + try container.encodeIfPresent(displayMask, forKey: .displayMask) try container.encode(enabledTextColor, forKey: .enabledTextColor) try container.encode(disabledTextColor, forKey: .disabledTextColor) try container.encode(clearTextOnTap, forKey: .clearTextOnTap) From a9526a12fedb717c401d0f056b433b4cff6aa8ac Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 15 Feb 2021 14:30:39 -0500 Subject: [PATCH 16/19] put back --- .../Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index a63ea57f..0782f8f3 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -1,5 +1,5 @@ // -// ItemDropdownField.swift +// ItemDropdownEntryField.swift // MVMCoreUI // // Created by Kevin Christiano on 11/14/19. From bc375347db815cbfc27e4ab404a97297bfdadf7c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 16 Feb 2021 09:46:19 -0500 Subject: [PATCH 17/19] noself --- .../Item Dropdown/BaseItemPickerEntryField.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift index d4c62591..320c8684 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift @@ -38,7 +38,7 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegat @objc open override func setupFieldContainerContent(_ container: UIView) { super.setupFieldContainerContent(container) - pickerView = UIPickerView.addPicker(to: self.textField, delegate: self, dismissAction: #selector(dismissFieldInput)) + pickerView = UIPickerView.addPicker(to: textField, delegate: self, dismissAction: #selector(dismissFieldInput)) textField.hideBlinkingCaret = true textField.autocorrectionType = .no uiTextFieldDelegate = self From 4f568ecbc8e90f0d08316fe9adeee731e1dd9095 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 16 Feb 2021 10:38:43 -0500 Subject: [PATCH 18/19] change --- .../Item Dropdown/BaseItemPickerEntryField.swift | 9 +++------ .../Item Dropdown/ItemDropdownEntryField.swift | 11 +++++------ .../Item Dropdown/MultiItemDropdownEntryField.swift | 12 +++++------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift index 320c8684..00b5a072 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/BaseItemPickerEntryField.swift @@ -16,7 +16,7 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegat // MARK: - Outlets //-------------------------------------------------- - open var pickerView: UIPickerView? + open lazy var pickerView = UIPickerView.addPicker(to: textField, delegate: self, dismissAction: #selector(dismissFieldInput)) //-------------------------------------------------- // MARK: - Properties @@ -38,7 +38,6 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegat @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 @@ -46,8 +45,8 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegat @objc public func setPickerDelegates(delegate: UIPickerViewDelegate & UIPickerViewDataSource) { - pickerView?.delegate = delegate - pickerView?.dataSource = delegate + pickerView.delegate = delegate + pickerView.dataSource = delegate } //-------------------------------------------------- @@ -57,8 +56,6 @@ open class BaseItemPickerEntryField: BaseDropdownEntryField, UIPickerViewDelegat public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) - guard let model = model as? BaseItemPickerEntryFieldModel else { return } - setPickerDelegates(delegate: self) } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift index 0782f8f3..b3aeb172 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/ItemDropdownEntryField.swift @@ -54,7 +54,8 @@ open class ItemDropdownEntryField: BaseItemPickerEntryField { guard !pickerData.isEmpty else { return } - if setInitialValueInTextField, let pickerIndex = pickerView?.selectedRow(inComponent: 0) { + if setInitialValueInTextField { + let pickerIndex = pickerView.selectedRow(inComponent: 0) observeDropdownChange?(text ?? "", pickerData[pickerIndex]) text = pickerData[pickerIndex] itemDropdownEntryFieldModel?.selectedIndex = pickerIndex @@ -72,9 +73,7 @@ open class ItemDropdownEntryField: BaseItemPickerEntryField { guard !pickerData.isEmpty else { return } - if let pickerIndex = pickerView?.selectedRow(inComponent: 0) { - observeDropdownSelection?(pickerData[pickerIndex]) - } + observeDropdownSelection?(pickerData[pickerView.selectedRow(inComponent: 0)]) } public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { @@ -84,8 +83,8 @@ open class ItemDropdownEntryField: BaseItemPickerEntryField { pickerData = model.options - if let pickerView = pickerView, let index = model.selectedIndex { - self.pickerView?.selectRow(index, inComponent: 0, animated: false) + if let index = model.selectedIndex { + self.pickerView.selectRow(index, inComponent: 0, animated: false) self.pickerView(pickerView, didSelectRow: index, inComponent: 0) } } diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift index 7a493075..2c509bb3 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryField.swift @@ -66,7 +66,7 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { // Set row index value of selected component. for component in 0.. Date: Tue, 16 Feb 2021 12:30:01 -0500 Subject: [PATCH 19/19] latest --- .../MultiItemDropdownEntryFieldModel.swift | 16 ++++++----- .../TextFields/TextEntryField.swift | 27 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift index dc4d2177..fbdde6f3 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/Dropdown Fields/Item Dropdown/MultiItemDropdownEntryFieldModel.swift @@ -31,6 +31,14 @@ import Foundation return selectedRowText } + public func delimiter(for index: Int) -> String { + + guard let delimiters = delimiters else { return " " } + guard index != components.count - 1 else { return "" } + + return delimiters[index] + } + /// A string of the picker row concatenated by whitespace or delimiters if provided. public var selectedRowText: String { @@ -38,13 +46,7 @@ import Foundation for i in 0..