updated rules

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-05-08 15:59:43 -05:00
parent 3134327dd5
commit 978db64823
2 changed files with 88 additions and 22 deletions

View File

@ -280,17 +280,8 @@ open class InputField: EntryFieldBase {
var actionModel: InputField.TextLinkModel? var actionModel: InputField.TextLinkModel?
var toolTipModel: Tooltip.TooltipModel? = tooltipModel var toolTipModel: Tooltip.TooltipModel? = tooltipModel
var isSecureTextEntry = false var isSecureTextEntry = false
var rules = [AnyRule<String>]()
var placeholderText: String? var placeholderText: String?
if self.isRequired {
let rule = RequiredRule()
if let errorText {
rule.errorMessage = errorText
}
rules.append(.init(rule))
}
switch fieldType { switch fieldType {
case .text: case .text:
break break
@ -329,7 +320,12 @@ open class InputField: EntryFieldBase {
case .date: case .date:
minWidth = 114.0 minWidth = 114.0
placeholderText = dateFormat.placeholderText placeholderText = dateFormat.placeholderText
let rule = CharacterCountRule().copyWith {
$0.maxLength = dateFormat.maxLength
$0.compareType = .equals
$0.errorMessage = "Enter a valid date"
}
rules.append(.init(rule))
case .securityCode: case .securityCode:
minWidth = 88.0 minWidth = 88.0
@ -372,6 +368,24 @@ open class InputField: EntryFieldBase {
//tooltip //tooltip
tooltipModel = toolTipModel tooltipModel = toolTipModel
}
override func updateRules() {
super.updateRules()
switch fieldType {
case .date:
let rule = CharacterCountRule().copyWith {
$0.maxLength = dateFormat.maxLength
$0.compareType = .equals
$0.errorMessage = "Enter a valid date"
}
rules.append(.init(rule))
default: break
}
} }
/// Used to update any Accessibility properties. /// Used to update any Accessibility properties.
@ -433,6 +447,22 @@ open class InputField: EntryFieldBase {
//-------------------------------------------------- //--------------------------------------------------
open var dateFormat: DateFormat = .mmddyy { didSet { setNeedsUpdate() } } open var dateFormat: DateFormat = .mmddyy { didSet { setNeedsUpdate() } }
private func formatDate(_ input: String) -> String {
var formattedInput = input.filter { $0.isNumber } // Remove any existing slashes
var formattedString = ""
var currentIndex = formattedInput.startIndex
for index in 0..<formattedInput.count {
if dateFormat.separatorIndices.contains(index) {
formattedString.append("/")
}
formattedString.append(formattedInput[currentIndex])
currentIndex = formattedInput.index(after: currentIndex)
}
return formattedString
}
// MARK: - Telephone // MARK: - Telephone
//--------------------------------------------------- //---------------------------------------------------
private func formatUSNumber(_ number: String) -> String { private func formatUSNumber(_ number: String) -> String {
@ -466,12 +496,11 @@ open class InputField: EntryFieldBase {
return formattedNumber return formattedNumber
} }
private func getNewCursorPosition(textField: UITextField, range: NSRange, replacementString string: String, rawNumber: String, formattedNumber: String) -> UITextPosition? { private func getTelCursorPosition(textField: UITextField, range: NSRange, replacementString string: String, rawNumber: String, formattedNumber: String) -> UITextPosition? {
let start = range.location let start = range.location
let length = string.count let length = string.count
let newCursorLocation = start + length let newCursorLocation = start + length
let rawNumberCount = rawNumber.count
// Adjust the cursor position to skip over formatting characters // Adjust the cursor position to skip over formatting characters
var formattedCharacterCount = 0 var formattedCharacterCount = 0
@ -518,9 +547,23 @@ extension InputField: UITextFieldDelegate {
switch fieldType { switch fieldType {
case .date: case .date:
// Allow only numbers and limit the length of text. // Allow only numbers and limit the length of text.
let allowedCharacters = CharacterSet.decimalDigits guard let oldText = textField.text,
let characterSet = CharacterSet(charactersIn: string) let textRange = Range(range, in: oldText),
return allowedCharacters.isSuperset(of: characterSet) && ((textField.text?.count ?? 0) + string.count - range.length) <= dateFormat.maxLength string.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil else {
return false
}
let newText = oldText.replacingCharacters(in: textRange, with: string)
if newText.count > dateFormat.maxLength {
return false
}
if newText.count <= dateFormat.maxLength {
textField.text = formatDate(newText)
return false
} else {
return true
}
case .number: case .number:
// Allow only numbers // Allow only numbers
@ -548,7 +591,7 @@ extension InputField: UITextFieldDelegate {
textField.text = formattedNumber textField.text = formattedNumber
// Calculate the new cursor position // Calculate the new cursor position
if let newPosition = getNewCursorPosition(textField: textField, if let newPosition = getTelCursorPosition(textField: textField,
range: range, range: range,
replacementString: string, replacementString: string,
rawNumber: rawNumber, rawNumber: rawNumber,
@ -621,5 +664,12 @@ extension InputField {
} }
} }
internal var separatorIndices: [Int] {
switch self {
case .mmyy: [2]
case .mmddyy: [2,4]
case .mmddyyyy: [2,4]
}
}
} }
} }

View File

@ -7,12 +7,28 @@
import Foundation import Foundation
class CharacterCountRule: Rule { class CharacterCountRule: Rule, Withable {
enum CompareType {
case equals, greaterThanEquals, lessThan, lessThanEquals
}
var maxLength: Int? var maxLength: Int?
var errorMessage: String = "You have exceeded the character limit." var errorMessage: String = "You have exceeded the character limit."
var compareType: CompareType = .lessThanEquals
func isValid(value: String?) -> Bool { func isValid(value: String?) -> Bool {
guard let text = value, let maxLength, maxLength > 0 else { return true } guard let text = value, let maxLength, maxLength > 0 else { return true }
return text.count <= maxLength switch compareType {
case .equals:
return text.count == maxLength
case .greaterThanEquals:
return text.count >= maxLength
case .lessThan:
return text.count < maxLength
case .lessThanEquals:
return text.count <= maxLength
}
} }
} }