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 toolTipModel: Tooltip.TooltipModel? = tooltipModel
var isSecureTextEntry = false
var rules = [AnyRule<String>]()
var placeholderText: String?
if self.isRequired {
let rule = RequiredRule()
if let errorText {
rule.errorMessage = errorText
}
rules.append(.init(rule))
}
switch fieldType {
case .text:
break
@ -329,7 +320,12 @@ open class InputField: EntryFieldBase {
case .date:
minWidth = 114.0
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:
minWidth = 88.0
@ -372,8 +368,26 @@ open class InputField: EntryFieldBase {
//tooltip
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.
open override func updateAccessibility() {
super.updateAccessibility()
@ -433,6 +447,22 @@ open class InputField: EntryFieldBase {
//--------------------------------------------------
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
//---------------------------------------------------
private func formatUSNumber(_ number: String) -> String {
@ -466,12 +496,11 @@ open class InputField: EntryFieldBase {
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 length = string.count
let newCursorLocation = start + length
let rawNumberCount = rawNumber.count
// Adjust the cursor position to skip over formatting characters
var formattedCharacterCount = 0
@ -518,10 +547,24 @@ extension InputField: UITextFieldDelegate {
switch fieldType {
case .date:
// Allow only numbers and limit the length of text.
let allowedCharacters = CharacterSet.decimalDigits
let characterSet = CharacterSet(charactersIn: string)
return allowedCharacters.isSuperset(of: characterSet) && ((textField.text?.count ?? 0) + string.count - range.length) <= dateFormat.maxLength
guard let oldText = textField.text,
let textRange = Range(range, in: oldText),
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:
// Allow only numbers
let allowedCharacters = CharacterSet.decimalDigits
@ -548,7 +591,7 @@ extension InputField: UITextFieldDelegate {
textField.text = formattedNumber
// Calculate the new cursor position
if let newPosition = getNewCursorPosition(textField: textField,
if let newPosition = getTelCursorPosition(textField: textField,
range: range,
replacementString: string,
rawNumber: rawNumber,
@ -596,7 +639,7 @@ extension InputField {
case mmyy
case mmddyy
case mmddyyyy
public var placeholderText: String {
switch self {
case .mmyy: "MM/YY"
@ -604,7 +647,7 @@ extension InputField {
case .mmddyyyy: "MM/DD/YYYY"
}
}
public var formatString: String {
switch self {
case .mmyy: "MM/yy"
@ -612,7 +655,7 @@ extension InputField {
case .mmddyyyy: "MM/dd/yyyy"
}
}
public var maxLength: Int {
switch self {
case .mmyy: 5
@ -620,6 +663,13 @@ extension InputField {
case .mmddyyyy: 10
}
}
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
class CharacterCountRule: Rule {
class CharacterCountRule: Rule, Withable {
enum CompareType {
case equals, greaterThanEquals, lessThan, lessThanEquals
}
var maxLength: Int?
var errorMessage: String = "You have exceeded the character limit."
var compareType: CompareType = .lessThanEquals
func isValid(value: String?) -> Bool {
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
}
}
}