Merge branch 'feature/entry_field_updates' into 'develop'
Entry field updates See merge request BPHV_MIPS/mvm_core_ui!672
This commit is contained in:
commit
2bd44b4580
@ -71,6 +71,10 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pickerHasComponent(_ index: Int) -> Bool {
|
||||||
|
!pickerComponents.isEmpty && !pickerComponents[index].isEmpty
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - TextField Observation
|
// MARK: - TextField Observation
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -122,18 +126,14 @@ open class MultiItemDropdownEntryField: BaseItemPickerEntryField {
|
|||||||
|
|
||||||
@objc public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
|
@objc public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
|
||||||
|
|
||||||
guard !pickerComponents.isEmpty,
|
guard pickerHasComponent(component) else { return nil }
|
||||||
!pickerComponents[component].isEmpty
|
|
||||||
else { return nil }
|
|
||||||
|
|
||||||
return pickerComponents[component][row]
|
return pickerComponents[component][row]
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
|
@objc public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
|
||||||
|
|
||||||
guard !pickerComponents.isEmpty,
|
guard pickerHasComponent(component) else { return }
|
||||||
!pickerComponents[component].isEmpty
|
|
||||||
else { return }
|
|
||||||
|
|
||||||
let oldText = text ?? ""
|
let oldText = text ?? ""
|
||||||
dropdownModel?.selectedIndexes[component] = row
|
dropdownModel?.selectedIndexes[component] = row
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import Foundation
|
|||||||
|
|
||||||
public var components: [[String]] = [[]]
|
public var components: [[String]] = [[]]
|
||||||
public var selectedIndexes: [Int: Int] = [:]
|
public var selectedIndexes: [Int: Int] = [:]
|
||||||
public var delimiters: [String]?
|
public var delimiters: [Int: String] = [:]
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Validation
|
// MARK: - Validation
|
||||||
@ -31,12 +31,17 @@ import Foundation
|
|||||||
return selectedRowText
|
return selectedRowText
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Methods
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// - parameter index: The index of the delimiter.
|
||||||
|
/// - 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 {
|
public func delimiter(for index: Int) -> String {
|
||||||
|
|
||||||
guard let delimiters = delimiters else { return " " }
|
|
||||||
guard index != components.count - 1 else { return "" }
|
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.
|
/// A string of the picker row concatenated by whitespace or delimiters if provided.
|
||||||
@ -64,6 +69,18 @@ import Foundation
|
|||||||
return indexArray
|
return indexArray
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public var delimiterArray: [String] {
|
||||||
|
|
||||||
|
var array: [String] = []
|
||||||
|
|
||||||
|
for i in 0..<delimiters.count {
|
||||||
|
guard let delimiterIndex = delimiters[i] else { return [] }
|
||||||
|
array.append(delimiterIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
return array
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Keys
|
// MARK: - Keys
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -83,7 +100,12 @@ import Foundation
|
|||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
|
|
||||||
components = try typeContainer.decode([[String]].self, forKey: .components)
|
components = try typeContainer.decode([[String]].self, forKey: .components)
|
||||||
delimiters = try typeContainer.decodeIfPresent([String].self, forKey: .delimiters)
|
|
||||||
|
if let delimiters = try typeContainer.decodeIfPresent([String].self, forKey: .delimiters) {
|
||||||
|
for (index, delimiter) in delimiters.enumerated() {
|
||||||
|
self.delimiters[index] = delimiter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let indexes = try typeContainer.decodeIfPresent([Int].self, forKey: .selectedIndexes) {
|
if let indexes = try typeContainer.decodeIfPresent([Int].self, forKey: .selectedIndexes) {
|
||||||
for (component, index) in indexes.enumerated() {
|
for (component, index) in indexes.enumerated() {
|
||||||
@ -99,6 +121,6 @@ import Foundation
|
|||||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
try container.encode(components, forKey: .components)
|
try container.encode(components, forKey: .components)
|
||||||
try container.encode(selectedIndexesArray, forKey: .selectedIndexes)
|
try container.encode(selectedIndexesArray, forKey: .selectedIndexes)
|
||||||
try container.encodeIfPresent(delimiters, forKey: .delimiters)
|
try container.encodeIfPresent(delimiterArray, forKey: .delimiters)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -60,10 +60,10 @@ import UIKit
|
|||||||
public var isEnabled: Bool {
|
public var isEnabled: Bool {
|
||||||
get { entryFieldContainer.isEnabled }
|
get { entryFieldContainer.isEnabled }
|
||||||
set (enabled) {
|
set (enabled) {
|
||||||
self.titleLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3
|
titleLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3
|
||||||
self.feedbackLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3
|
feedbackLabel.textColor = enabled ? .mvmBlack : .mvmCoolGray3
|
||||||
self.entryFieldContainer.isEnabled = enabled
|
entryFieldContainer.isEnabled = enabled
|
||||||
self.entryFieldModel?.enabled = enabled
|
entryFieldModel?.enabled = enabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,10 +71,10 @@ import UIKit
|
|||||||
public var showError: Bool {
|
public var showError: Bool {
|
||||||
get { entryFieldContainer.showError }
|
get { entryFieldContainer.showError }
|
||||||
set (error) {
|
set (error) {
|
||||||
self.feedback = error ? errorMessage : entryFieldModel?.feedback
|
feedback = error ? errorMessage : entryFieldModel?.feedback
|
||||||
self.feedbackLabel.textColor = error ? entryFieldModel?.errorTextColor?.uiColor ?? .mvmBlack : .mvmBlack
|
feedbackLabel.textColor = error ? entryFieldModel?.errorTextColor?.uiColor ?? .mvmBlack : .mvmBlack
|
||||||
self.entryFieldContainer.showError = error
|
entryFieldContainer.showError = error
|
||||||
self.entryFieldModel?.showError = error
|
entryFieldModel?.showError = error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,8 +86,8 @@ import UIKit
|
|||||||
public var isLocked: Bool {
|
public var isLocked: Bool {
|
||||||
get { entryFieldContainer.isLocked }
|
get { entryFieldContainer.isLocked }
|
||||||
set (locked) {
|
set (locked) {
|
||||||
self.entryFieldContainer.isLocked = locked
|
entryFieldContainer.isLocked = locked
|
||||||
self.entryFieldModel?.locked = locked
|
entryFieldModel?.locked = locked
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,17 +95,17 @@ import UIKit
|
|||||||
public var isSelected: Bool {
|
public var isSelected: Bool {
|
||||||
get { entryFieldContainer.isSelected }
|
get { entryFieldContainer.isSelected }
|
||||||
set (selected) {
|
set (selected) {
|
||||||
self.entryFieldContainer.isSelected = selected
|
entryFieldContainer.isSelected = selected
|
||||||
self.entryFieldModel?.selected = selected
|
entryFieldModel?.selected = selected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the text of titleLabel
|
/// Sets the text of titleLabel
|
||||||
public var title: String? {
|
public var title: String? {
|
||||||
get { titleLabel.text }
|
get { titleLabel.text }
|
||||||
set (newText) {
|
set {
|
||||||
titleLabel.text = newText
|
titleLabel.text = newValue
|
||||||
setAccessibilityString(newText)
|
setAccessibilityString(newValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,10 +118,9 @@ import UIKit
|
|||||||
/// Sets feedback text in the textField.
|
/// Sets feedback text in the textField.
|
||||||
public var feedback: String? {
|
public var feedback: String? {
|
||||||
get { feedbackLabel.text }
|
get { feedbackLabel.text }
|
||||||
set (newFeedback) {
|
set {
|
||||||
feedbackLabel.text = newFeedback
|
feedbackLabel.text = newValue
|
||||||
feedbackLabel.accessibilityElementsHidden = feedbackLabel.text?.isEmpty ?? true
|
feedbackLabel.accessibilityElementsHidden = feedbackLabel.text?.isEmpty ?? true
|
||||||
entryFieldContainer.refreshUI(updateMoleculeLayout: true)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -97,23 +97,7 @@ import UIKit
|
|||||||
get { textField.text }
|
get { textField.text }
|
||||||
set {
|
set {
|
||||||
textEntryFieldModel?.text = newValue
|
textEntryFieldModel?.text = newValue
|
||||||
|
textField.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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,9 +263,28 @@ import UIKit
|
|||||||
self.isValid = isValid
|
self.isValid = isValid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regexTextFieldOutputIfAvailable()
|
||||||
|
|
||||||
shouldShowError(!isValid)
|
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?) {
|
@objc public func dismissFieldInput(_ sender: Any?) {
|
||||||
resignFirstResponder()
|
resignFirstResponder()
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user