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/41] 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/41] 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/41] 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/41] 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/41] 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/41] 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/41] 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/41] 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/41] 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/41] 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/41] 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/41] 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 05:21:45 -0500 Subject: [PATCH 13/41] Fix for CXTDT-155147 --- .../ListRightVariableRightCaretAlltextAndLinks.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift index 3b6a5b76..d7954f96 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift @@ -22,7 +22,7 @@ public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { // Fill for left vertical alignment because bottom constraint was breaking with leading. CXTDT-145456 - stack = Stack.createStack(with: [(view: eyebrowHeadlineBodyLink, model: StackItemModel(horizontalAlignment: .leading, verticalAlignment: .fill)), (view: rightLabel, model: StackItemModel(horizontalAlignment:.fill, verticalAlignment: .leading))], axis: .horizontal) + stack = Stack.createStack(with: [(view: eyebrowHeadlineBodyLink, model: StackItemModel(horizontalAlignment: .leading, verticalAlignment: .top)), (view: rightLabel, model: StackItemModel(horizontalAlignment: .trailing, verticalAlignment: .top))], axis: .horizontal) super.init(style: style, reuseIdentifier: reuseIdentifier) } @@ -37,6 +37,7 @@ open override func setupView() { super.setupView() rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal) + rightLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 900), for: .horizontal) addMolecule(stack) stack.restack() } From 069db3c913188f44092933e7883894038bea2cf7 Mon Sep 17 00:00:00 2001 From: "Nandi, Dhamodaram" Date: Mon, 15 Feb 2021 05:31:14 -0500 Subject: [PATCH 14/41] discarded vertical alignment changes --- .../ListRightVariableRightCaretAlltextAndLinks.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift index d7954f96..943a11da 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift @@ -22,7 +22,7 @@ public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { // Fill for left vertical alignment because bottom constraint was breaking with leading. CXTDT-145456 - stack = Stack.createStack(with: [(view: eyebrowHeadlineBodyLink, model: StackItemModel(horizontalAlignment: .leading, verticalAlignment: .top)), (view: rightLabel, model: StackItemModel(horizontalAlignment: .trailing, verticalAlignment: .top))], axis: .horizontal) + stack = Stack.createStack(with: [(view: eyebrowHeadlineBodyLink, model: StackItemModel(horizontalAlignment: .leading, verticalAlignment: .fill)), (view: rightLabel, model: StackItemModel(horizontalAlignment: .trailing, verticalAlignment: .top))], axis: .horizontal) super.init(style: style, reuseIdentifier: reuseIdentifier) } From 2e1e5772d7d9c51e40c2336ad77b51377e6b06ef Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 15 Feb 2021 09:18:20 -0500 Subject: [PATCH 15/41] 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 e91faf857fc98521cfb110d3a1cbb0c1c2e8d798 Mon Sep 17 00:00:00 2001 From: "Nandi, Dhamodaram" Date: Mon, 15 Feb 2021 09:43:43 -0500 Subject: [PATCH 16/41] updated --- .../ListRightVariableRightCaretAlltextAndLinks.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift index 943a11da..12f11b9e 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift @@ -22,7 +22,7 @@ public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { // Fill for left vertical alignment because bottom constraint was breaking with leading. CXTDT-145456 - stack = Stack.createStack(with: [(view: eyebrowHeadlineBodyLink, model: StackItemModel(horizontalAlignment: .leading, verticalAlignment: .fill)), (view: rightLabel, model: StackItemModel(horizontalAlignment: .trailing, verticalAlignment: .top))], axis: .horizontal) + stack = Stack.createStack(with: [(view: eyebrowHeadlineBodyLink, model: StackItemModel(horizontalAlignment: .leading, verticalAlignment: .fill)), (view: rightLabel, model: StackItemModel(horizontalAlignment: .trailing, verticalAlignment: .leading))], axis: .horizontal) super.init(style: style, reuseIdentifier: reuseIdentifier) } From cb981e29a9f3847951ef579be204408f8e56aecc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 15 Feb 2021 10:37:15 -0500 Subject: [PATCH 17/41] 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 18/41] 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 19/41] 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 a1b7e81dfc7805bfb5a68e1996799c8a11860606 Mon Sep 17 00:00:00 2001 From: Lekshmi S Date: Tue, 16 Feb 2021 07:24:36 +0530 Subject: [PATCH 20/41] Added number of lines for rightlabel. --- .../ListRightVariableRightCaretAlltextAndLinks.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift index 12f11b9e..3a342b6a 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableRightCaretAlltextAndLinks.swift @@ -38,6 +38,7 @@ super.setupView() rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal) rightLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 900), for: .horizontal) + rightLabel.numberOfLines = 1 addMolecule(stack) stack.restack() } From bc375347db815cbfc27e4ab404a97297bfdadf7c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 16 Feb 2021 09:46:19 -0500 Subject: [PATCH 21/41] 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 22/41] 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 23/41] 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.. Date: Tue, 16 Feb 2021 23:24:42 +0530 Subject: [PATCH 24/41] Carousel form changes --- .../Atomic/Molecules/Items/CarouselItem.swift | 5 +++ .../Molecules/Items/CarouselItemModel.swift | 4 +++ .../Atomic/Organisms/Carousel/Carousel.swift | 12 +++++++ .../Organisms/Carousel/CarouselModel.swift | 33 +++++++++++++++++-- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift b/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift index a37fe016..235e1f58 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift @@ -8,12 +8,17 @@ import Foundation +@objc public protocol CarouselItemSelected: class { + func itemSelected(fieldValue: String?, index: Int) +} + open class CarouselItem: MoleculeCollectionViewCell, CarouselItemProtocol { open var allowsPeaking = false var peakingLeftArrow = UIImageView(image: MVMCoreUIUtility.imageNamed("peakingRightArrow")?.withRenderingMode(.alwaysTemplate)) var peakingRightArrow = UIImageView(image: MVMCoreUIUtility.imageNamed("peakingRightArrow")?.withRenderingMode(.alwaysTemplate)) var peakingCover = MVMCoreUICommonViewsUtility.commonView() + @objc public weak var carouselDelegate: CarouselItemSelected? open override func addMolecule(_ molecule: MoleculeViewProtocol) { super.addMolecule(molecule) diff --git a/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift b/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift index be67bfca..163909cb 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift @@ -21,6 +21,7 @@ import Foundation public var peakingUI: Bool? public var peakingArrowColor: Color? public var analyticsData: JSONValueDictionary? + public var fieldValue: String? //-------------------------------------------------- // MARK: - Keys @@ -30,6 +31,7 @@ import Foundation case peakingUI case peakingArrowColor case analyticsData + case fieldValue } //-------------------------------------------------- @@ -41,6 +43,7 @@ import Foundation peakingUI = try typeContainer.decodeIfPresent(Bool.self, forKey: .peakingUI) peakingArrowColor = try typeContainer.decodeIfPresent(Color.self, forKey: .peakingArrowColor) analyticsData = try typeContainer.decodeIfPresent(JSONValueDictionary.self, forKey: .analyticsData) + fieldValue = try typeContainer.decodeIfPresent(String.self, forKey: .fieldValue) try super.init(from: decoder) } @@ -50,5 +53,6 @@ import Foundation try container.encodeIfPresent(peakingUI, forKey: .peakingUI) try container.encodeIfPresent(peakingArrowColor, forKey: .peakingArrowColor) try container.encodeIfPresent(analyticsData, forKey: .analyticsData) + try container.encodeIfPresent(fieldValue, forKey: .fieldValue) } } diff --git a/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift index 31222828..d13d8294 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift @@ -167,6 +167,7 @@ open class Carousel: View { registerCells(with: carouselModel, delegateObject: delegateObject) prepareMolecules(with: carouselModel) + FormValidator.setupValidation(for: carouselModel, delegate: delegateObject?.formHolderDelegate) setupPagingMolecule(carouselModel.pagingMolecule, delegateObject: delegateObject) @@ -385,6 +386,7 @@ extension Carousel: UICollectionViewDataSource { protocolCell.set(with: moleculeInfo.molecule, delegateObject, nil) } (cell as? MVMCoreViewProtocol)?.updateView(size ?? collectionView.bounds.width) + (cell as? CarouselItem)?.carouselDelegate = self setAccessiblity(cell, index: indexPath.row) return cell } @@ -624,3 +626,13 @@ class CarouselAccessibilityElement: UIAccessibilityElement { return false } } + +extension Carousel: CarouselItemSelected { + public func itemSelected(fieldValue: String?, index: Int) { + if fieldValue != nil { + (model as? CarouselModel)?.selectedIndex = fieldValue + } else { + (model as? CarouselModel)?.selectedIndex = String(index) + } + } +} diff --git a/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift index ca0a4a10..caa9f844 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift @@ -9,7 +9,8 @@ import UIKit -@objcMembers public class CarouselModel: MoleculeModelProtocol { +@objcMembers public class CarouselModel: MoleculeModelProtocol, FormFieldProtocol { + //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -33,11 +34,30 @@ import UIKit public var leftPadding: CGFloat? public var rightPadding: CGFloat? public var accessibilityText: String? - + public var selectedIndex: String? + public var baseValue: AnyHashable? + public var fieldKey: String? + public var groupName: String = FormValidator.defaultGroupName + public init(molecules: [MoleculeModelProtocol & CarouselItemModelProtocol]) { self.molecules = molecules } + public func formFieldValue() -> AnyHashable? { + var carouselItemFieldValue: AnyHashable? + guard let visibleCarouselItem = molecules[index] as? CarouselItemModel else { + return nil + } + if selectedIndex != nil { + //For selectableCarouselItem + carouselItemFieldValue = selectedIndex + } else { + //For carouselItem + carouselItemFieldValue = (visibleCarouselItem.fieldValue != nil) ? visibleCarouselItem.fieldValue : String(index) + } + return carouselItemFieldValue + } + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- @@ -59,6 +79,8 @@ import UIKit case leftPadding case rightPadding case accessibilityText + case groupName + case fieldKey } //-------------------------------------------------- @@ -86,6 +108,11 @@ import UIKit leftPadding = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .leftPadding) rightPadding = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .rightPadding) accessibilityText = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityText) + fieldKey = try typeContainer.decodeIfPresent(String.self, forKey: .fieldKey) + if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { + self.groupName = groupName + } + baseValue = formFieldValue() } public func encode(to encoder: Encoder) throws { @@ -105,5 +132,7 @@ import UIKit try container.encodeIfPresent(leftPadding, forKey: .leftPadding) try container.encodeIfPresent(rightPadding, forKey: .rightPadding) try container.encodeIfPresent(accessibilityText, forKey: .accessibilityText) + try container.encodeIfPresent(fieldKey, forKey: .fieldKey) + try container.encode(groupName, forKey: .groupName) } } From 6b3bcbea6af60eaea6952f9b6a4b33f85be8bc8a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 16 Feb 2021 17:27:35 -0500 Subject: [PATCH 25/41] asd --- .../MultiItemDropdownEntryFieldModel.swift | 12 +++ .../FormFields/TextFields/EntryField.swift | 76 ++++++++++++++----- 2 files changed, 71 insertions(+), 17 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 fbdde6f3..1dea0b0d 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 @@ -39,6 +39,18 @@ import Foundation return delimiters[index] } + /* + public func delimiter(for index: Int) -> String { + + guard index != components.count - 1 else { return "" } + guard let delimiters = delimiters, + index < delimiters.count + else { return " " } + + return delimiters[index] + } + */ + /// A string of the picker row concatenated by whitespace or delimiters if provided. public var selectedRowText: String { diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift index 3996c7fc..b9b60847 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift @@ -52,6 +52,8 @@ import UIKit /// Validate on each entry in the textField. Default: true public var validateEachCharacter: Bool = true +// private var observation: NSKeyValueObservation? = nil + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -60,10 +62,10 @@ import UIKit public var isEnabled: Bool { get { entryFieldContainer.isEnabled } set (enabled) { - self.titleLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 - self.feedbackLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 - self.entryFieldContainer.isEnabled = enabled - self.entryFieldModel?.enabled = enabled + titleLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 + feedbackLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3 + entryFieldContainer.isEnabled = enabled + entryFieldModel?.enabled = enabled } } @@ -71,10 +73,10 @@ import UIKit public var showError: Bool { get { entryFieldContainer.showError } set (error) { - self.feedback = error ? errorMessage : entryFieldModel?.feedback - self.feedbackLabel.textColor = error ? entryFieldModel?.errorTextColor?.uiColor ?? .mvmBlack : .mvmBlack - self.entryFieldContainer.showError = error - self.entryFieldModel?.showError = error + feedback = error ? errorMessage : entryFieldModel?.feedback + feedbackLabel.textColor = error ? entryFieldModel?.errorTextColor?.uiColor ?? .mvmBlack : .mvmBlack + entryFieldContainer.showError = error + entryFieldModel?.showError = error } } @@ -86,8 +88,8 @@ import UIKit public var isLocked: Bool { get { entryFieldContainer.isLocked } set (locked) { - self.entryFieldContainer.isLocked = locked - self.entryFieldModel?.locked = locked + entryFieldContainer.isLocked = locked + entryFieldModel?.locked = locked } } @@ -95,17 +97,17 @@ import UIKit public var isSelected: Bool { get { entryFieldContainer.isSelected } set (selected) { - self.entryFieldContainer.isSelected = selected - self.entryFieldModel?.selected = selected + entryFieldContainer.isSelected = selected + entryFieldModel?.selected = selected } } /// Sets the text of titleLabel public var title: String? { get { titleLabel.text } - set (newText) { - titleLabel.text = newText - setAccessibilityString(newText) + set { + titleLabel.text = newValue + setAccessibilityString(newValue) } } @@ -118,8 +120,8 @@ import UIKit /// Sets feedback text in the textField. public var feedback: String? { get { feedbackLabel.text } - set (newFeedback) { - feedbackLabel.text = newFeedback + set { + feedbackLabel.text = newValue feedbackLabel.accessibilityElementsHidden = feedbackLabel.text?.isEmpty ?? true entryFieldContainer.refreshUI(updateMoleculeLayout: true) } @@ -217,6 +219,46 @@ import UIKit layoutMarginsGuide.bottomAnchor.constraint(equalTo: feedbackLabel.bottomAnchor).isActive = true } + /* + isAccessibilityElement = false + setContentCompressionResistancePriority(.required, for: .vertical) + accessibilityElements = [titleLabel, feedbackLabel] + backgroundColor = .mvmWhite + +// observation = observe(\.feedbackLabel.text, options: [.new]) { [weak self] _, _ in +// self?.entryFieldContainer.refreshUI(updateMoleculeLayout: true) +// } + + addSubview(titleLabel) + addSubview(entryFieldContainer) + addSubview(feedbackLabel) + + + titleLabelLeading = titleLabel.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor) + titleLabelTrailing = layoutMarginsGuide.trailingAnchor.constraint(equalTo: titleLabel.trailingAnchor) + titleContainerDistance = entryFieldContainer.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: Padding.One) + entryFieldContainerLeading = entryFieldContainer.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor) + feedbackContainerDistance = feedbackLabel.topAnchor.constraint(equalTo: entryFieldContainer.bottomAnchor, constant: Padding.Two) + entryFieldContainerTrailing = layoutMarginsGuide.trailingAnchor.constraint(equalTo: entryFieldContainer.trailingAnchor) + feedbackLabelLeading = feedbackLabel.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor) + feedbackLabelTrailing = layoutMarginsGuide.trailingAnchor.constraint(equalTo: feedbackLabel.trailingAnchor) + + NSLayoutConstraint.activate([ + titleLabel.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor), + titleLabelLeading!, + titleLabelLeading!, + titleContainerDistance!, + entryFieldContainerLeading!, + entryFieldContainerTrailing!, + feedbackContainerDistance!, + feedbackLabelLeading!, + feedbackLabelTrailing!, + layoutMarginsGuide.bottomAnchor.constraint(equalTo: feedbackLabel.bottomAnchor) + ]) + + entryFieldContainer.setContentCompressionResistancePriority(.required, for: .vertical) + setupFieldContainerContent(entryFieldContainer) + */ @objc open override func layoutSubviews() { super.layoutSubviews() From d0326a9b3031744dd355442d7f23f9e9230a89bd Mon Sep 17 00:00:00 2001 From: "Khan, Arshad" Date: Wed, 17 Feb 2021 17:57:19 +0530 Subject: [PATCH 26/41] infinite loop crash fix in setting up bottom progress bar --- .../SplitViewController/MVMCoreUISplitViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index 7377701b..86cc08eb 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -824,14 +824,14 @@ CGFloat const PanelAnimationDuration = 0.2; [MVMCoreDispatchUtility performBlockOnMainThread:^{ if (self.bottomProgressBarHeightConstraint.constant != PaddingOne) { self.bottomProgressBarHeightConstraint.constant = PaddingOne; - [self.bottomProgressBar.superview layoutIfNeeded]; + [self.bottomProgressBar updateConstraintsIfNeeded]; } if (progress > 0.05) { self.bottomProgressBar.progress = progress; } else { self.bottomProgressBarHeightConstraint.constant = 0; - [self.bottomProgressBar.superview layoutIfNeeded]; + [self.bottomProgressBar updateConstraintsIfNeeded]; } }]; } From 84adccd18745ee3b031b43ed67f0898097fefacd Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 17 Feb 2021 10:09:06 -0500 Subject: [PATCH 27/41] updates --- .../MultiItemDropdownEntryField.swift | 12 ++--- .../MultiItemDropdownEntryFieldModel.swift | 46 +++++++++++-------- .../FormFields/TextFields/EntryField.swift | 43 ----------------- 3 files changed, 34 insertions(+), 67 deletions(-) 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 2c509bb3..8bed3996 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 @@ -71,6 +71,10 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { } } + func pickerHasComponent(_ index: Int) -> Bool { + !pickerComponents.isEmpty && !pickerComponents[index].isEmpty + } + //-------------------------------------------------- // MARK: - TextField Observation //-------------------------------------------------- @@ -122,18 +126,14 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField { @objc public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { - guard !pickerComponents.isEmpty, - !pickerComponents[component].isEmpty - else { return nil } + guard pickerHasComponent(component) 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 - else { return } + guard pickerHasComponent(component) else { return } let oldText = text ?? "" 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 1dea0b0d..bc7899d7 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,7 +18,7 @@ import Foundation public var components: [[String]] = [[]] public var selectedIndexes: [Int: Int] = [:] - public var delimiters: [String]? + public var delimiters: [Int: String] = [:] //-------------------------------------------------- // MARK: - Validation @@ -31,26 +31,19 @@ import Foundation return selectedRowText } + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + /// - parameter index: The index of the delimiter. + /// - returns: The delimiter for a given idenx. Defaults to whitespace for valid index if no delimiters is provided. If invalid index, emoty string. public func delimiter(for index: Int) -> String { - - guard let delimiters = delimiters else { return " " } + guard index != components.count - 1 else { return "" } - return delimiters[index] + return delimiters[index] ?? " " } - /* - public func delimiter(for index: Int) -> String { - - guard index != components.count - 1 else { return "" } - guard let delimiters = delimiters, - index < delimiters.count - else { return " " } - - return delimiters[index] - } - */ - /// A string of the picker row concatenated by whitespace or delimiters if provided. public var selectedRowText: String { @@ -76,6 +69,18 @@ import Foundation return indexArray } + public var delimiterArray: [String] { + + var array: [String] = [] + + for i in 0.. Date: Wed, 17 Feb 2021 17:13:57 -0500 Subject: [PATCH 28/41] moved by request --- .../TextFields/TextEntryField.swift | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift index 91d64e90..6ff196c7 100644 --- a/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift +++ b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift @@ -97,23 +97,7 @@ import UIKit get { textField.text } set { textEntryFieldModel?.text = newValue - - guard let regex = textEntryFieldModel?.displayFormat, - let mask = textEntryFieldModel?.displayMask, - let newText = newValue - else { - textField.text = newValue - return - } - - let range = NSRange(newText.startIndex..., in: newText) - - if let regex = try? NSRegularExpression(pattern: regex) { - let maskedText = regex.stringByReplacingMatches(in: newText, - range: range, - withTemplate: mask) - textField.text = maskedText - } + textField.text = newValue } } @@ -279,9 +263,28 @@ import UIKit self.isValid = isValid } + regexTextFieldOutputIfAvailable() + shouldShowError(!isValid) } + func regexTextFieldOutputIfAvailable() { + + if let regex = textEntryFieldModel?.displayFormat, + let mask = textEntryFieldModel?.displayMask, + let finalText = text { + + let range = NSRange(finalText.startIndex..., in: finalText) + + if let regex = try? NSRegularExpression(pattern: regex) { + let maskedText = regex.stringByReplacingMatches(in: finalText, + range: range, + withTemplate: mask) + textField.text = maskedText + } + } + } + @objc public func dismissFieldInput(_ sender: Any?) { resignFirstResponder() } From d9af965aa893e8c51694023f7f97921a891faa89 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 18 Feb 2021 09:20:23 -0500 Subject: [PATCH 29/41] default --- .../Item Dropdown/MultiItemDropdownEntryFieldModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bc7899d7..248a86e1 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 @@ -41,7 +41,7 @@ import Foundation guard index != components.count - 1 else { return "" } - return delimiters[index] ?? " " + return delimiters[index, default: " "] } /// A string of the picker row concatenated by whitespace or delimiters if provided. From cd721967556ff68885ff8640976159464dfffb0d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 18 Feb 2021 10:15:25 -0500 Subject: [PATCH 30/41] spelling fix --- .../Item Dropdown/MultiItemDropdownEntryFieldModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 248a86e1..8799f6aa 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 @@ -36,7 +36,7 @@ import Foundation //-------------------------------------------------- /// - parameter index: The index of the delimiter. - /// - returns: The delimiter for a given idenx. Defaults to whitespace for valid index if no delimiters is provided. If invalid index, emoty string. + /// - returns: The delimiter for a given index. Defaults to whitespace for valid index if no delimiters is provided. If invalid index, empty string. public func delimiter(for index: Int) -> String { guard index != components.count - 1 else { return "" } From 76031200fa024ab3440967a35a39b455d869bf7a Mon Sep 17 00:00:00 2001 From: "Khan, Arshad" Date: Thu, 18 Feb 2021 23:45:26 +0530 Subject: [PATCH 31/41] reverting code which was added for infinite loop crash only in ipads and force crash --- .../SplitViewController/MVMCoreUISplitViewController.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m index 86cc08eb..7377701b 100644 --- a/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m +++ b/MVMCoreUI/Containers/SplitViewController/MVMCoreUISplitViewController.m @@ -824,14 +824,14 @@ CGFloat const PanelAnimationDuration = 0.2; [MVMCoreDispatchUtility performBlockOnMainThread:^{ if (self.bottomProgressBarHeightConstraint.constant != PaddingOne) { self.bottomProgressBarHeightConstraint.constant = PaddingOne; - [self.bottomProgressBar updateConstraintsIfNeeded]; + [self.bottomProgressBar.superview layoutIfNeeded]; } if (progress > 0.05) { self.bottomProgressBar.progress = progress; } else { self.bottomProgressBarHeightConstraint.constant = 0; - [self.bottomProgressBar updateConstraintsIfNeeded]; + [self.bottomProgressBar.superview layoutIfNeeded]; } }]; } From 028341aa41f4f99e0bfce6a2e89b9099dca9fe07 Mon Sep 17 00:00:00 2001 From: Krishna Kishore Bandaru Date: Tue, 23 Feb 2021 17:16:54 +0530 Subject: [PATCH 32/41] changed access specifier public to open for Button model and static property to class property --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 52ade755..641d995c 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -11,12 +11,14 @@ import UIKit public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) -public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol, EnableableModelProtocol { +open class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol, EnableableModelProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - - public static var identifier: String = "button" + //Making static property as class property so that subclasses can override getter function of the property + open class var identifier: String { + "button" + } public var backgroundColor: Color? public var accessibilityIdentifier: String? public var title: String @@ -247,7 +249,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW } } - public func encode(to encoder: Encoder) throws { + open func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) From 8a861077dd824a3af4a6c162ceefa56ac4f8d991 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 23 Feb 2021 14:56:23 -0500 Subject: [PATCH 33/41] styler additon. label width value --- .../Atomic/Atoms/Views/Label/Label.swift | 4 +++- MVMCoreUI/Styles/Styler.swift | 24 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift index 7e902d435..8838966c 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift @@ -594,7 +594,6 @@ public typealias ActionBlock = () -> () attributedText = attributedString } - @objc public func updateView(_ size: CGFloat) { scaleSize = size as NSNumber @@ -624,6 +623,9 @@ public typealias ActionBlock = () -> () } else if !MVMCoreGetterUtility.fequal(a: Float(standardFontSize), b: 0.0), let sizeObject = sizeObject ?? MFStyler.sizeObjectGeneric(forCurrentDevice: standardFontSize) { font = font.updateSize(sizeObject.getValueBased(onSize: size)) } + + // Provide the label additional size information to help calculate its intrinsic content. + preferredMaxLayoutWidth = Styler.maxAvailableLayoutWidth(size: size) } @objc public func setFont(_ font: UIFont, scale: Bool) { diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index c0dd6792..b2614f04 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -209,7 +209,29 @@ open class Styler { } open class func sizeFontGeneric(forCurrentDevice size: CGFloat) -> CGFloat { - return sizeObjectGeneric(forCurrentDevice: size)?.getValueBasedOnApplicationWidth() ?? size + sizeObjectGeneric(forCurrentDevice: size)?.getValueBasedOnApplicationWidth() ?? size + } + + open class func defaultHorizontalPadding(for size: CGFloat) -> CGFloat { + sizeObject(withScalingStandardSize: CGFloat(Padding.Component.horizontalPaddingForApplicationWidth)).getValueBased(onSize: size) + } + + open class func defaultVerticalPadding(for size: CGFloat) -> CGFloat { + sizeObject(withScalingStandardSize: CGFloat(Padding.Component.verticalPaddingForApplicationWidth)).getValueBased(onSize: size) + } + + open class func sizeObject(withScalingStandardSize standardSize: CGFloat) -> MFSizeObject { + let object = MFSizeObject() + object.standardSize = standardSize + object.scaleStandardSize = true + return object + } + + /// Provide additional size information to help calculate its intrinsic height. + /// - Returns: The available spacing that can be used for intrinsic content width. + open class func maxAvailableLayoutWidth(size: CGFloat) -> CGFloat { + // The 2 is the product of both sides of padding. + size - (defaultHorizontalPadding(for: size) * 2) } //-------------------------------------------------- From cd94f99f6076eb3ae816e4a78e55dfe35f3df458 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 23 Feb 2021 15:33:03 -0500 Subject: [PATCH 34/41] error check. --- MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift index 8838966c..3d57d0aa 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift @@ -836,7 +836,10 @@ extension Label { fileprivate func setActionAttributes(range: NSRange) { - guard let attributedText = attributedText else { return } + guard let attributedText = attributedText, + range.length > 0, + range.length <= attributedText.length + else { return } let mutableAttributedString = NSMutableAttributedString(attributedString: attributedText) addActionAttributes(range: range, string: mutableAttributedString) From f20895627f6c8649a309b8df1595fc1c65149d7a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 23 Feb 2021 15:34:28 -0500 Subject: [PATCH 35/41] undo --- MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift index 8838966c..7e902d435 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift @@ -594,6 +594,7 @@ public typealias ActionBlock = () -> () attributedText = attributedString } + @objc public func updateView(_ size: CGFloat) { scaleSize = size as NSNumber @@ -623,9 +624,6 @@ public typealias ActionBlock = () -> () } else if !MVMCoreGetterUtility.fequal(a: Float(standardFontSize), b: 0.0), let sizeObject = sizeObject ?? MFStyler.sizeObjectGeneric(forCurrentDevice: standardFontSize) { font = font.updateSize(sizeObject.getValueBased(onSize: size)) } - - // Provide the label additional size information to help calculate its intrinsic content. - preferredMaxLayoutWidth = Styler.maxAvailableLayoutWidth(size: size) } @objc public func setFont(_ font: UIFont, scale: Bool) { From 55217c21c3e29321f91982ccdfeed3ea0c3ee072 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 24 Feb 2021 10:14:05 -0500 Subject: [PATCH 36/41] undo --- MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift index 91521b9b..511fb4dc 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift @@ -624,6 +624,9 @@ public typealias ActionBlock = () -> () } else if !MVMCoreGetterUtility.fequal(a: Float(standardFontSize), b: 0.0), let sizeObject = sizeObject ?? MFStyler.sizeObjectGeneric(forCurrentDevice: standardFontSize) { font = font.updateSize(sizeObject.getValueBased(onSize: size)) } + + // Provide the label additional size information to help calculate its intrinsic content. + preferredMaxLayoutWidth = Styler.maxAvailableLayoutWidth(size: size) } @objc public func setFont(_ font: UIFont, scale: Bool) { @@ -834,10 +837,7 @@ extension Label { fileprivate func setActionAttributes(range: NSRange) { - guard let attributedText = attributedText, - range.length > 0, - range.length <= attributedText.length - else { return } + guard let attributedText = attributedText else { return } let mutableAttributedString = NSMutableAttributedString(attributedString: attributedText) addActionAttributes(range: range, string: mutableAttributedString) From 10a91bd1ed38e052f8e59e52d0386f391e161c1d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 24 Feb 2021 11:19:31 -0500 Subject: [PATCH 37/41] revised --- MVMCoreUI/Styles/Padding.swift | 10 ++++------ MVMCoreUI/Styles/Styler.swift | 17 +---------------- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/MVMCoreUI/Styles/Padding.swift b/MVMCoreUI/Styles/Padding.swift index 0dd9ff6e..480896a0 100644 --- a/MVMCoreUI/Styles/Padding.swift +++ b/MVMCoreUI/Styles/Padding.swift @@ -6,8 +6,6 @@ // Copyright © 2020 Verizon Wireless. All rights reserved. // -import Foundation - /// Padding is a multiple based on the number 4. public struct Padding { @@ -30,19 +28,19 @@ public struct Padding { public static let VerticalMarginSpacing: CGFloat = 24 public static var horizontalPaddingForApplicationWidth: CGFloat { - return MFSizeObject(scalingStandardSize: HorizontalMarginSpacing)?.getValueBasedOnApplicationWidth() ?? HorizontalMarginSpacing + MFSizeObject(scalingStandardSize: HorizontalMarginSpacing)?.getValueBasedOnApplicationWidth() ?? HorizontalMarginSpacing } public static var verticalPaddingForApplicationWidth: CGFloat { - return MFSizeObject(scalingStandardSize: VerticalMarginSpacing)?.getValueBasedOnApplicationWidth() ?? VerticalMarginSpacing + MFSizeObject(scalingStandardSize: VerticalMarginSpacing)?.getValueBasedOnApplicationWidth() ?? VerticalMarginSpacing } public static func horizontalPaddingForSize(_ size: CGFloat) -> CGFloat { - return MFSizeObject(scalingStandardSize: HorizontalMarginSpacing)?.getValueBased(onSize: size) ?? HorizontalMarginSpacing + MFSizeObject(scalingStandardSize: HorizontalMarginSpacing)?.getValueBased(onSize: size) ?? HorizontalMarginSpacing } public static func verticalPaddingForSize(_ size: CGFloat) -> CGFloat { - return MFSizeObject(scalingStandardSize: VerticalMarginSpacing)?.getValueBased(onSize: size) ?? VerticalMarginSpacing + MFSizeObject(scalingStandardSize: VerticalMarginSpacing)?.getValueBased(onSize: size) ?? VerticalMarginSpacing } } } diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index b2614f04..77402295 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -212,26 +212,11 @@ open class Styler { sizeObjectGeneric(forCurrentDevice: size)?.getValueBasedOnApplicationWidth() ?? size } - open class func defaultHorizontalPadding(for size: CGFloat) -> CGFloat { - sizeObject(withScalingStandardSize: CGFloat(Padding.Component.horizontalPaddingForApplicationWidth)).getValueBased(onSize: size) - } - - open class func defaultVerticalPadding(for size: CGFloat) -> CGFloat { - sizeObject(withScalingStandardSize: CGFloat(Padding.Component.verticalPaddingForApplicationWidth)).getValueBased(onSize: size) - } - - open class func sizeObject(withScalingStandardSize standardSize: CGFloat) -> MFSizeObject { - let object = MFSizeObject() - object.standardSize = standardSize - object.scaleStandardSize = true - return object - } - /// Provide additional size information to help calculate its intrinsic height. /// - Returns: The available spacing that can be used for intrinsic content width. open class func maxAvailableLayoutWidth(size: CGFloat) -> CGFloat { // The 2 is the product of both sides of padding. - size - (defaultHorizontalPadding(for: size) * 2) + size - (Padding.Component.horizontalPaddingForSize(size) * 2) } //-------------------------------------------------- From 1c2cd9ff6487669b9cede0a84cef93cf12905338 Mon Sep 17 00:00:00 2001 From: Lekshmi S Date: Fri, 26 Feb 2021 21:30:10 +0530 Subject: [PATCH 38/41] Code changes after review comment. --- .../Atomic/Molecules/Items/CarouselItem.swift | 5 ----- .../Atomic/Organisms/Carousel/Carousel.swift | 21 ++++++++----------- .../CollectionTemplateItemProtocol.swift | 9 ++++++++ .../BaseClasses/CollectionViewCell.swift | 5 +++++ 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift b/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift index 235e1f58..a37fe016 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/CarouselItem.swift @@ -8,17 +8,12 @@ import Foundation -@objc public protocol CarouselItemSelected: class { - func itemSelected(fieldValue: String?, index: Int) -} - open class CarouselItem: MoleculeCollectionViewCell, CarouselItemProtocol { open var allowsPeaking = false var peakingLeftArrow = UIImageView(image: MVMCoreUIUtility.imageNamed("peakingRightArrow")?.withRenderingMode(.alwaysTemplate)) var peakingRightArrow = UIImageView(image: MVMCoreUIUtility.imageNamed("peakingRightArrow")?.withRenderingMode(.alwaysTemplate)) var peakingCover = MVMCoreUICommonViewsUtility.commonView() - @objc public weak var carouselDelegate: CarouselItemSelected? open override func addMolecule(_ molecule: MoleculeViewProtocol) { super.addMolecule(molecule) diff --git a/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift index d13d8294..b9475938 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift @@ -386,7 +386,6 @@ extension Carousel: UICollectionViewDataSource { protocolCell.set(with: moleculeInfo.molecule, delegateObject, nil) } (cell as? MVMCoreViewProtocol)?.updateView(size ?? collectionView.bounds.width) - (cell as? CarouselItem)?.carouselDelegate = self setAccessiblity(cell, index: indexPath.row) return cell } @@ -394,7 +393,15 @@ extension Carousel: UICollectionViewDataSource { extension Carousel: UICollectionViewDelegate { open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - (collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol)?.didSelectCell(at: indexPath, delegateObject: delegateObject, additionalData: nil) + guard let cell = collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol else { + return + } + cell.didSelectCell(at: indexPath, delegateObject: delegateObject, additionalData: nil) + //Check for selectable carousel item + guard let carouselModel = model as? CarouselModel, let selectedCarouselItem = carouselModel.molecules[indexPath.row] as? CarouselItemModel, cell.shouldSelect(at: indexPath, delegateObject: delegateObject, additionalData: nil) else { + return + } + carouselModel.selectedIndex = selectedCarouselItem.fieldValue ?? String(indexPath.row) } } @@ -626,13 +633,3 @@ class CarouselAccessibilityElement: UIAccessibilityElement { return false } } - -extension Carousel: CarouselItemSelected { - public func itemSelected(fieldValue: String?, index: Int) { - if fieldValue != nil { - (model as? CarouselModel)?.selectedIndex = fieldValue - } else { - (model as? CarouselModel)?.selectedIndex = String(index) - } - } -} diff --git a/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift b/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift index 55db2c6d..98c9754e 100644 --- a/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift +++ b/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift @@ -19,6 +19,10 @@ public protocol CollectionTemplateItemProtocol: UICollectionViewCell { /// Called when the cell will display. func willDisplay() + + /// Handle the selection of cell + func shouldSelect(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) -> Bool + } // Default implementation does nothing @@ -26,4 +30,9 @@ extension CollectionTemplateItemProtocol { public func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {} public func willDisplay() {} + + public func shouldSelect(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) -> Bool { + return false + } + } diff --git a/MVMCoreUI/BaseClasses/CollectionViewCell.swift b/MVMCoreUI/BaseClasses/CollectionViewCell.swift index 4ac48dfc..aff6dffb 100644 --- a/MVMCoreUI/BaseClasses/CollectionViewCell.swift +++ b/MVMCoreUI/BaseClasses/CollectionViewCell.swift @@ -132,4 +132,9 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo autoLayoutAttributes.frame = newFrame return autoLayoutAttributes } + + // Set default to false + open func shouldSelect(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) -> Bool { + return false + } } From 8465208d0b8f663d57490b0d5bf1f19353993d8e Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Mon, 1 Mar 2021 12:41:54 -0500 Subject: [PATCH 39/41] Changes for form validator to work --- .../Molecules/Items/CarouselItemModel.swift | 2 ++ .../Atomic/Organisms/Carousel/Carousel.swift | 28 ++++++++++++++----- .../Organisms/Carousel/CarouselModel.swift | 28 ++++++++++--------- .../CarouselItemModelProtocol.swift | 3 ++ .../CollectionTemplateItemProtocol.swift | 2 -- .../BaseClasses/CollectionViewCell.swift | 15 +++++----- 6 files changed, 48 insertions(+), 30 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift b/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift index 163909cb..19348070 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/CarouselItemModel.swift @@ -23,6 +23,8 @@ import Foundation public var analyticsData: JSONValueDictionary? public var fieldValue: String? + public func formFieldValue() -> AnyHashable? { return fieldValue } + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift index b9475938..a671726c 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel/Carousel.swift @@ -174,6 +174,10 @@ open class Carousel: View { pageIndex = carouselModel.index pagingView?.currentIndex = carouselModel.index collectionView.reloadData() + if let selectedIndex = carouselModel.selectedIndex { + let adjustedIndex = loop ? selectedIndex + 2 : selectedIndex + collectionView.selectItem(at: IndexPath(row: adjustedIndex, section: 0), animated: false, scrollPosition: []) + } } //-------------------------------------------------- @@ -392,16 +396,25 @@ extension Carousel: UICollectionViewDataSource { } extension Carousel: UICollectionViewDelegate { + public func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool { + guard let cell = collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol else { return false } + return cell.shouldSelect(at: indexPath, delegateObject: delegateObject, additionalData: nil) + } + open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - guard let cell = collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol else { - return + // Set the selection in the model + if let model = model as? CarouselModel { + // Adjust for looping + var adjustedIndex = loop ? indexPath.row - 2 : indexPath.row + if adjustedIndex < 0 { + adjustedIndex = adjustedIndex + numberOfPages + } + model.selectedIndex = adjustedIndex } - cell.didSelectCell(at: indexPath, delegateObject: delegateObject, additionalData: nil) - //Check for selectable carousel item - guard let carouselModel = model as? CarouselModel, let selectedCarouselItem = carouselModel.molecules[indexPath.row] as? CarouselItemModel, cell.shouldSelect(at: indexPath, delegateObject: delegateObject, additionalData: nil) else { - return + if let cell = collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol { + cell.didSelectCell(at: indexPath, delegateObject: delegateObject, additionalData: nil) } - carouselModel.selectedIndex = selectedCarouselItem.fieldValue ?? String(indexPath.row) + _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) } } @@ -423,6 +436,7 @@ extension Carousel: UIScrollViewDelegate { if !animated { scrollViewDidEndScrollingAnimation(collectionView) } + _ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate) } /// Adjusts the current contentOffset if we are going onto buffer cells while looping to help with the endless scrolling appearance. diff --git a/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift index caa9f844..96e7e3f0 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift @@ -22,6 +22,7 @@ import UIKit public var backgroundColor: Color? public var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol] public var index: Int = 0 + public var selectedIndex: Int? public var spacing: CGFloat? public var border: Bool? public var loop: Bool? @@ -34,7 +35,6 @@ import UIKit public var leftPadding: CGFloat? public var rightPadding: CGFloat? public var accessibilityText: String? - public var selectedIndex: String? public var baseValue: AnyHashable? public var fieldKey: String? public var groupName: String = FormValidator.defaultGroupName @@ -44,18 +44,12 @@ import UIKit } public func formFieldValue() -> AnyHashable? { - var carouselItemFieldValue: AnyHashable? - guard let visibleCarouselItem = molecules[index] as? CarouselItemModel else { - return nil + let indexForForm = selectedIndex ?? index + let item = molecules[indexForForm] + guard let value = item.formFieldValue() else { + return indexForForm } - if selectedIndex != nil { - //For selectableCarouselItem - carouselItemFieldValue = selectedIndex - } else { - //For carouselItem - carouselItemFieldValue = (visibleCarouselItem.fieldValue != nil) ? visibleCarouselItem.fieldValue : String(index) - } - return carouselItemFieldValue + return value } //-------------------------------------------------- @@ -67,6 +61,7 @@ import UIKit case backgroundColor case molecules case index + case selectedIndex case spacing case border case loop @@ -91,6 +86,7 @@ import UIKit let typeContainer = try decoder.container(keyedBy: CodingKeys.self) molecules = try typeContainer.decodeModels(codingKey: .molecules) index = try typeContainer.decodeIfPresent(Int.self, forKey: .index) ?? 0 + selectedIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .selectedIndex) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) spacing = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .spacing) border = try typeContainer.decodeIfPresent(Bool.self, forKey: .border) @@ -112,7 +108,13 @@ import UIKit if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } - baseValue = formFieldValue() + if let value = formFieldValue() { + baseValue = value + } else if let value = selectedIndex { + baseValue = value + } else { + baseValue = index + } } public func encode(to encoder: Encoder) throws { diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselItemModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselItemModelProtocol.swift index c2ade02d..2ed2ca5a 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselItemModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselItemModelProtocol.swift @@ -11,11 +11,14 @@ import Foundation public protocol CarouselItemModelProtocol: ContainerModelProtocol { var analyticsData: JSONValueDictionary? { get set } + func formFieldValue() -> AnyHashable? } + public extension CarouselItemModelProtocol { var analyticsData: JSONValueDictionary? { get { return nil } set { analyticsData = newValue } } + func formFieldValue() -> AnyHashable? { return nil } } diff --git a/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift b/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift index 98c9754e..4e9ae26d 100644 --- a/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift +++ b/MVMCoreUI/Atomic/Templates/CollectionTemplateItemProtocol.swift @@ -22,7 +22,6 @@ public protocol CollectionTemplateItemProtocol: UICollectionViewCell { /// Handle the selection of cell func shouldSelect(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) -> Bool - } // Default implementation does nothing @@ -34,5 +33,4 @@ extension CollectionTemplateItemProtocol { public func shouldSelect(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) -> Bool { return false } - } diff --git a/MVMCoreUI/BaseClasses/CollectionViewCell.swift b/MVMCoreUI/BaseClasses/CollectionViewCell.swift index aff6dffb..2b4d81d8 100644 --- a/MVMCoreUI/BaseClasses/CollectionViewCell.swift +++ b/MVMCoreUI/BaseClasses/CollectionViewCell.swift @@ -116,11 +116,15 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo // MARK: - Override - open func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { - guard let action = model?.action else { return } - Button.performButtonAction(with: action, button: self, delegateObject: delegateObject, additionalData: additionalData) + open func shouldSelect(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) -> Bool { + if let action = model?.action { + Button.performButtonAction(with: action, button: self, delegateObject: delegateObject, additionalData: additionalData) + } + return true } + open func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {} + // Column logic, set width. override open func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { let autoLayoutAttributes = super.preferredLayoutAttributesFitting(layoutAttributes) @@ -132,9 +136,4 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo autoLayoutAttributes.frame = newFrame return autoLayoutAttributes } - - // Set default to false - open func shouldSelect(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) -> Bool { - return false - } } From 9b9b7750708e13db8569ba3936b8678a1ece1dae Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Mon, 1 Mar 2021 12:58:32 -0500 Subject: [PATCH 40/41] undo testing change --- MVMCoreUI/BaseClasses/CollectionViewCell.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/BaseClasses/CollectionViewCell.swift b/MVMCoreUI/BaseClasses/CollectionViewCell.swift index 2b4d81d8..cfbe4ac7 100644 --- a/MVMCoreUI/BaseClasses/CollectionViewCell.swift +++ b/MVMCoreUI/BaseClasses/CollectionViewCell.swift @@ -120,7 +120,7 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo if let action = model?.action { Button.performButtonAction(with: action, button: self, delegateObject: delegateObject, additionalData: additionalData) } - return true + return false } open func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {} From 7aab88c5ecbb0625070c9bdd6b93cc852ad8a39d Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Mon, 1 Mar 2021 14:42:58 -0500 Subject: [PATCH 41/41] added selectable flag to match how android validates --- .../Organisms/Carousel/CarouselModel.swift | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift index 96e7e3f0..5bf0728c 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel/CarouselModel.swift @@ -22,7 +22,6 @@ import UIKit public var backgroundColor: Color? public var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol] public var index: Int = 0 - public var selectedIndex: Int? public var spacing: CGFloat? public var border: Bool? public var loop: Bool? @@ -39,17 +38,25 @@ import UIKit public var fieldKey: String? public var groupName: String = FormValidator.defaultGroupName + public var selectable = false + public var selectedIndex: Int? + public init(molecules: [MoleculeModelProtocol & CarouselItemModelProtocol]) { self.molecules = molecules } public func formFieldValue() -> AnyHashable? { - let indexForForm = selectedIndex ?? index - let item = molecules[indexForForm] - guard let value = item.formFieldValue() else { - return indexForForm + guard selectable else { + // Use visible item value, else index + if let fieldValue = molecules[index].formFieldValue() { + return fieldValue + } + return index } - return value + // Use selected item value, else index + guard let selectedIndex = selectedIndex else { return nil } + guard let fieldValue = molecules[selectedIndex].formFieldValue() else { return selectedIndex } + return fieldValue } //-------------------------------------------------- @@ -61,7 +68,6 @@ import UIKit case backgroundColor case molecules case index - case selectedIndex case spacing case border case loop @@ -76,6 +82,8 @@ import UIKit case accessibilityText case groupName case fieldKey + case selectable + case selectedIndex } //-------------------------------------------------- @@ -86,6 +94,7 @@ import UIKit let typeContainer = try decoder.container(keyedBy: CodingKeys.self) molecules = try typeContainer.decodeModels(codingKey: .molecules) index = try typeContainer.decodeIfPresent(Int.self, forKey: .index) ?? 0 + selectable = try typeContainer.decodeIfPresent(Bool.self, forKey: .selectable) ?? false selectedIndex = try typeContainer.decodeIfPresent(Int.self, forKey: .selectedIndex) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) spacing = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .spacing) @@ -108,13 +117,7 @@ import UIKit if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } - if let value = formFieldValue() { - baseValue = value - } else if let value = selectedIndex { - baseValue = value - } else { - baseValue = index - } + baseValue = formFieldValue() } public func encode(to encoder: Encoder) throws { @@ -136,5 +139,8 @@ import UIKit try container.encodeIfPresent(accessibilityText, forKey: .accessibilityText) try container.encodeIfPresent(fieldKey, forKey: .fieldKey) try container.encode(groupName, forKey: .groupName) + try container.encode(index, forKey: .index) + try container.encode(selectable, forKey: .selectable) + try container.encode(selectedIndex, forKey: .selectedIndex) } }