Merge branch 'develop' into feature/carousel_form_changes

This commit is contained in:
Lekshmi S 2021-02-26 21:26:37 +05:30
commit 6ed16cb35d
9 changed files with 95 additions and 59 deletions

View File

@ -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)

View File

@ -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

View File

@ -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,12 +31,17 @@ import Foundation
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 {
guard let delimiters = delimiters 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.
@ -64,6 +69,18 @@ import Foundation
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
//--------------------------------------------------
@ -83,7 +100,12 @@ import Foundation
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
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) {
for (component, index) in indexes.enumerated() {
@ -99,6 +121,6 @@ import Foundation
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(components, forKey: .components)
try container.encode(selectedIndexesArray, forKey: .selectedIndexes)
try container.encodeIfPresent(delimiters, forKey: .delimiters)
try container.encodeIfPresent(delimiterArray, forKey: .delimiters)
}
}

View File

@ -60,10 +60,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 +71,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 +86,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 +95,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,10 +118,9 @@ 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)
}
}

View File

@ -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()
}

View File

@ -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) {

View File

@ -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<StackModel>.createStack(with: [(view: eyebrowHeadlineBodyLink, model: StackItemModel(horizontalAlignment: .leading, verticalAlignment: .fill)), (view: rightLabel, model: StackItemModel(horizontalAlignment:.fill, verticalAlignment: .leading))], axis: .horizontal)
stack = Stack<StackModel>.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)
}
@ -37,6 +37,8 @@
open override func setupView() {
super.setupView()
rightLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 900), for: .horizontal)
rightLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 900), for: .horizontal)
rightLabel.numberOfLines = 1
addMolecule(stack)
stack.restack()
}

View File

@ -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
}
}
}

View File

@ -209,7 +209,14 @@ open class Styler {
}
open class func sizeFontGeneric(forCurrentDevice size: CGFloat) -> CGFloat {
return sizeObjectGeneric(forCurrentDevice: size)?.getValueBasedOnApplicationWidth() ?? size
sizeObjectGeneric(forCurrentDevice: size)?.getValueBasedOnApplicationWidth() ?? size
}
/// 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 - (Padding.Component.horizontalPaddingForSize(size) * 2)
}
//--------------------------------------------------