added entry field colors
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
61493d382d
commit
e2573492fa
@ -8,10 +8,11 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSColorTokens
|
||||||
|
import VDSFormControlsTokens
|
||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -42,7 +43,7 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
$0.translatesAutoresizingMaskIntoConstraints = false
|
$0.translatesAutoresizingMaskIntoConstraints = false
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Configuration Properties
|
// MARK: - Configuration Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -62,25 +63,57 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
$0.enabled.lightColor = VDSColor.elementsSecondaryOnlight
|
$0.enabled.lightColor = VDSColor.elementsSecondaryOnlight
|
||||||
$0.enabled.darkColor = VDSColor.elementsSecondaryOndark
|
$0.enabled.darkColor = VDSColor.elementsSecondaryOndark
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal var backgroundColorConfiguration: EntryFieldColorConfiguration = {
|
||||||
|
return EntryFieldColorConfiguration().with {
|
||||||
|
$0.enabled.lightColor = VDSFormControlsColor.backgroundOnlight
|
||||||
|
$0.enabled.darkColor = VDSFormControlsColor.backgroundOndark
|
||||||
|
$0.disabled.lightColor = VDSFormControlsColor.backgroundOnlight
|
||||||
|
$0.disabled.darkColor = VDSFormControlsColor.backgroundOndark
|
||||||
|
|
||||||
|
//error/success doesn't care enabled/disable
|
||||||
|
$0.error.lightColor = VDSColor.feedbackErrorBackgroundOnlight
|
||||||
|
$0.error.darkColor = VDSColor.feedbackErrorBackgroundOndark
|
||||||
|
$0.success.lightColor = VDSColor.feedbackSuccessBackgroundOnlight
|
||||||
|
$0.success.darkColor = VDSColor.feedbackSuccessBackgroundOndark
|
||||||
|
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
internal var borderColorConfiguration: EntryFieldColorConfiguration = {
|
||||||
|
return EntryFieldColorConfiguration().with {
|
||||||
|
$0.enabled.lightColor = VDSFormControlsColor.borderOnlight
|
||||||
|
$0.enabled.darkColor = VDSFormControlsColor.borderOnlight
|
||||||
|
$0.disabled.lightColor = VDSColor.interactiveDisabledOnlight
|
||||||
|
$0.disabled.darkColor = VDSColor.interactiveDisabledOndark
|
||||||
|
|
||||||
|
//error/success doesn't care enabled/disable
|
||||||
|
$0.error.lightColor = VDSColor.feedbackErrorOnlight
|
||||||
|
$0.error.darkColor = VDSColor.feedbackErrorOndark
|
||||||
|
$0.success.lightColor = VDSColor.feedbackSuccessOnlight
|
||||||
|
$0.success.darkColor = VDSColor.feedbackSuccessOndark
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@Proxy(\.model.labelText)
|
@Proxy(\.model.labelText)
|
||||||
open var labelText: String?
|
open var labelText: String?
|
||||||
|
|
||||||
@Proxy(\.model.helperText)
|
@Proxy(\.model.helperText)
|
||||||
open var helperText: String?
|
open var helperText: String?
|
||||||
|
|
||||||
@Proxy(\.model.showError)
|
@Proxy(\.model.showError)
|
||||||
open var showError: Bool
|
open var showError: Bool
|
||||||
|
|
||||||
@Proxy(\.model.errorText)
|
@Proxy(\.model.errorText)
|
||||||
open var errorText: String?
|
open var errorText: String?
|
||||||
|
|
||||||
@Proxy(\.model.showSuccess)
|
@Proxy(\.model.showSuccess)
|
||||||
open var showSuccess: Bool
|
open var showSuccess: Bool
|
||||||
|
|
||||||
@Proxy(\.model.successText)
|
@Proxy(\.model.successText)
|
||||||
open var successText: String?
|
open var successText: String?
|
||||||
|
|
||||||
@ -92,39 +125,39 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
|
|
||||||
@Proxy(\.model.tooltipContent)
|
@Proxy(\.model.tooltipContent)
|
||||||
open var tooltipContent: String?
|
open var tooltipContent: String?
|
||||||
|
|
||||||
@Proxy(\.model.transparentBackground)
|
@Proxy(\.model.transparentBackground)
|
||||||
open var transparentBackground: Bool
|
open var transparentBackground: Bool
|
||||||
|
|
||||||
@Proxy(\.model.width)
|
@Proxy(\.model.width)
|
||||||
open var width: CGFloat?
|
open var width: CGFloat?
|
||||||
|
|
||||||
@Proxy(\.model.maxLength)
|
@Proxy(\.model.maxLength)
|
||||||
open var maxLength: Int?
|
open var maxLength: Int?
|
||||||
|
|
||||||
@Proxy(\.model.inputId)
|
@Proxy(\.model.inputId)
|
||||||
open var inputId: String?
|
open var inputId: String?
|
||||||
|
|
||||||
@Proxy(\.model.value)
|
@Proxy(\.model.value)
|
||||||
open var value: AnyHashable?
|
open var value: AnyHashable?
|
||||||
|
|
||||||
@Proxy(\.model.defaultVaue)
|
@Proxy(\.model.defaultVaue)
|
||||||
open var defaultValue: AnyHashable?
|
open var defaultValue: AnyHashable?
|
||||||
|
|
||||||
@Proxy(\.model.required)
|
@Proxy(\.model.required)
|
||||||
open var required: Bool
|
open var required: Bool
|
||||||
|
|
||||||
@Proxy(\.model.readOnly)
|
@Proxy(\.model.readOnly)
|
||||||
open var readOnly: Bool
|
open var readOnly: Bool
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Constraints
|
// MARK: - Constraints
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
internal var heightConstraint: NSLayoutConstraint?
|
internal var heightConstraint: NSLayoutConstraint?
|
||||||
internal var widthConstraint: NSLayoutConstraint?
|
internal var widthConstraint: NSLayoutConstraint?
|
||||||
internal var minWidthConstraint: NSLayoutConstraint?
|
internal var minWidthConstraint: NSLayoutConstraint?
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Lifecycle
|
// MARK: - Lifecycle
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -139,7 +172,7 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
accessibilityTraits = .button
|
accessibilityTraits = .button
|
||||||
addSubview(stackView)
|
addSubview(stackView)
|
||||||
|
|
||||||
//create the wrapping view
|
//create the wrapping view
|
||||||
heightConstraint = containerView.heightAnchor.constraint(greaterThanOrEqualToConstant: containerSize.height)
|
heightConstraint = containerView.heightAnchor.constraint(greaterThanOrEqualToConstant: containerSize.height)
|
||||||
heightConstraint?.isActive = true
|
heightConstraint?.isActive = true
|
||||||
@ -148,7 +181,7 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
|
|
||||||
minWidthConstraint = containerView.widthAnchor.constraint(greaterThanOrEqualToConstant: 0)
|
minWidthConstraint = containerView.widthAnchor.constraint(greaterThanOrEqualToConstant: 0)
|
||||||
minWidthConstraint?.isActive = true
|
minWidthConstraint?.isActive = true
|
||||||
|
|
||||||
containerStackView.addArrangedSubview(containerView)
|
containerStackView.addArrangedSubview(containerView)
|
||||||
stackView.addArrangedSubview(titleLabel)
|
stackView.addArrangedSubview(titleLabel)
|
||||||
stackView.addArrangedSubview(containerStackView)
|
stackView.addArrangedSubview(containerStackView)
|
||||||
@ -164,7 +197,7 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
stackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
|
stackView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
|
||||||
stackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
|
stackView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
|
||||||
stackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
|
stackView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
|
||||||
|
|
||||||
titleLabel.textColorConfiguration = primaryColorConfig
|
titleLabel.textColorConfiguration = primaryColorConfig
|
||||||
successLabel.textColorConfiguration = primaryColorConfig
|
successLabel.textColorConfiguration = primaryColorConfig
|
||||||
errorLabel.textColorConfiguration = primaryColorConfig
|
errorLabel.textColorConfiguration = primaryColorConfig
|
||||||
@ -180,11 +213,11 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
// MARK: - State
|
// MARK: - State
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
open override func updateView(viewModel: ModelType) {
|
open override func updateView(viewModel: ModelType) {
|
||||||
|
|
||||||
//update the title model if the required flag is false
|
//update the title model if the required flag is false
|
||||||
var titleLabelModel = viewModel.labelModel
|
var titleLabelModel = viewModel.labelModel
|
||||||
.addOptional(required: viewModel.required, colorConfiguration: secondaryColorConfig)
|
.addOptional(required: viewModel.required, colorConfiguration: secondaryColorConfig)
|
||||||
|
|
||||||
//tooltip action
|
//tooltip action
|
||||||
if let toolTipTitle = viewModel.tooltipTitle, let toolTipContent = viewModel.tooltipContent {
|
if let toolTipTitle = viewModel.tooltipTitle, let toolTipContent = viewModel.tooltipContent {
|
||||||
let toolTipAction = PassthroughSubject<Void, Never>()
|
let toolTipAction = PassthroughSubject<Void, Never>()
|
||||||
@ -195,7 +228,7 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
titleLabel.set(with: titleLabelModel)
|
titleLabel.set(with: titleLabelModel)
|
||||||
|
|
||||||
//show error or success
|
//show error or success
|
||||||
if viewModel.showError, let errorLabelModel = viewModel.errorLabelModel {
|
if viewModel.showError, let errorLabelModel = viewModel.errorLabelModel {
|
||||||
errorLabel.set(with: errorLabelModel)
|
errorLabel.set(with: errorLabelModel)
|
||||||
@ -225,12 +258,36 @@ open class EntryField<ModelType: EntryFieldModel>: Control<ModelType> {
|
|||||||
} else {
|
} else {
|
||||||
helperLabel.isHidden = true
|
helperLabel.isHidden = true
|
||||||
}
|
}
|
||||||
|
|
||||||
setAccessibilityHint(!viewModel.disabled)
|
setAccessibilityHint(!viewModel.disabled)
|
||||||
backgroundColor = viewModel.surface.color
|
backgroundColor = viewModel.surface.color
|
||||||
setNeedsLayout()
|
setNeedsLayout()
|
||||||
layoutIfNeeded()
|
layoutIfNeeded()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Color Class Configurations
|
||||||
|
//--------------------------------------------------
|
||||||
|
internal class EntryFieldColorConfiguration: DisabledSurfaceColorConfiguration<ModelType> {
|
||||||
|
public let error = SurfaceColorConfiguration<ModelType>()
|
||||||
|
public let success = SurfaceColorConfiguration<ModelType>()
|
||||||
|
|
||||||
|
override func getColor(_ viewModel: ModelType) -> UIColor {
|
||||||
|
//only show error is enabled and showError == true
|
||||||
|
let showErrorColor = !viewModel.disabled && viewModel.showError
|
||||||
|
let showSuccessColor = !viewModel.disabled && viewModel.showSuccess
|
||||||
|
|
||||||
|
if showErrorColor {
|
||||||
|
return error.getColor(viewModel)
|
||||||
|
|
||||||
|
} else if showSuccessColor {
|
||||||
|
return success.getColor(viewModel)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return super.getColor(viewModel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension DefaultLabelModel {
|
extension DefaultLabelModel {
|
||||||
|
|||||||
@ -27,8 +27,10 @@ open class TextEntryFieldBase<ModelType:TextEntryFieldModel>: EntryField<ModelTy
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
open override func updateView(viewModel: ModelType) {
|
open override func updateView(viewModel: ModelType) {
|
||||||
super.updateView(viewModel: viewModel)
|
super.updateView(viewModel: viewModel)
|
||||||
containerView.backgroundColor = .red
|
containerView.backgroundColor = backgroundColorConfiguration.getColor(viewModel)
|
||||||
|
containerView.layer.borderColor = borderColorConfiguration.getColor(viewModel).cgColor
|
||||||
|
containerView.layer.borderWidth = 1
|
||||||
|
containerView.layer.cornerRadius = 4
|
||||||
//set the width constraints
|
//set the width constraints
|
||||||
if let width = viewModel.width, width > viewModel.type.width {
|
if let width = viewModel.width, width > viewModel.type.width {
|
||||||
widthConstraint?.constant = width
|
widthConstraint?.constant = width
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user