refactored for latest vds toggle
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
f649670ed7
commit
b08923e7c0
@ -132,9 +132,9 @@ extension AppDelegate {
|
|||||||
ModelRegistry.register(TestModel.self)
|
ModelRegistry.register(TestModel.self)
|
||||||
ModelRegistry.register(handler: TestLabelToggle.self, for: TestLabelToggleModel.self)
|
ModelRegistry.register(handler: TestLabelToggle.self, for: TestLabelToggleModel.self)
|
||||||
ModelRegistry.register(handler: TestToggle.self, for: TestToggleModel.self)
|
ModelRegistry.register(handler: TestToggle.self, for: TestToggleModel.self)
|
||||||
|
ModelRegistry.register(handler: TestToggle2.self, for: TestToggleModel2.self)
|
||||||
ModelRegistry.register(handler: TextEntryField.self, for: TextEntryField64Model.self)
|
ModelRegistry.register(handler: TextEntryField.self, for: TextEntryField64Model.self)
|
||||||
ModelRegistry.register(handler: EmailVerifyField.self, for: EmailVerifyModel.self)
|
ModelRegistry.register(handler: EmailVerifyField.self, for: EmailVerifyModel.self)
|
||||||
ModelRegistry.register(handler: WifiWidget.self, for: WifiWidgetModel.self)
|
|
||||||
ModelRegistry.register(handler: ToggleWifiActionHandler.self, for: ToggleWifiActionModel.self)
|
ModelRegistry.register(handler: ToggleWifiActionHandler.self, for: ToggleWifiActionModel.self)
|
||||||
|
|
||||||
guard let model = try? TestModel.decode(fileName: "/JSON/Samples/Wifi/TestModel") else { return }
|
guard let model = try? TestModel.decode(fileName: "/JSON/Samples/Wifi/TestModel") else { return }
|
||||||
@ -266,11 +266,9 @@ class ToggleWifiActionModel: ActionModelProtocol {
|
|||||||
class ToggleWifiActionHandler: MVMCoreActionHandlerProtocol {
|
class ToggleWifiActionHandler: MVMCoreActionHandlerProtocol {
|
||||||
required public init() {}
|
required public init() {}
|
||||||
|
|
||||||
func handleAction(_ model: ActionModelProtocol, additionalData: [AnyHashable : Any]?, delegateObject: DelegateObject?) {
|
func execute(with model: ActionModelProtocol, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) async throws {
|
||||||
guard let action = model as? ToggleWifiActionModel else { return }
|
guard let action = model as? ToggleWifiActionModel else { return }
|
||||||
|
|
||||||
print("Wi-Fi Id: \(action.wifiId)")
|
print("Wi-Fi Id: \(action.wifiId)")
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -22,8 +22,14 @@
|
|||||||
{
|
{
|
||||||
"moleculeName": "stackItem",
|
"moleculeName": "stackItem",
|
||||||
"molecule": {
|
"molecule": {
|
||||||
"moleculeName": "testToggle",
|
"moleculeName": "testLabelToggle",
|
||||||
"fieldKey": "isActive"
|
"label": {
|
||||||
|
"text": "isActive"
|
||||||
|
},
|
||||||
|
"toggle": {
|
||||||
|
"moleculeName": "testToggle1",
|
||||||
|
"fieldKey": "isActive"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -22,17 +22,7 @@ import MVMCoreUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class JSONCreatorActionHandler: MVMCoreUIActionHandler {
|
public class JSONCreatorActionHandler: MVMCoreUIActionHandler {
|
||||||
public override func handleOtherActions(_ actionType: String?, actionInformation: [AnyHashable : Any]?, additionalData: [AnyHashable : Any]?, delegateObject: DelegateObject?) -> Bool {
|
|
||||||
if actionType == "print" {
|
|
||||||
if actionInformation?.boolForKey("delay") ?? false {
|
|
||||||
sleep(2)
|
|
||||||
}
|
|
||||||
print(actionInformation?.stringForkey("text") ?? "fail")
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return super.handleOtherActions(actionType, actionInformation: actionInformation, additionalData: additionalData, delegateObject: delegateObject)
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func doStuff() {
|
public static func doStuff() {
|
||||||
MVMCoreObject.sharedInstance()?.actionHandler = JSONCreatorActionHandler()
|
MVMCoreObject.sharedInstance()?.actionHandler = JSONCreatorActionHandler()
|
||||||
ModelRegistry.register(ActionPrintModel.self)
|
ModelRegistry.register(ActionPrintModel.self)
|
||||||
|
|||||||
@ -14,8 +14,6 @@ import MVMCoreUI
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
public let label = Label(fontStyle: .BoldBodySmall)
|
|
||||||
public let toggle = TestToggle()
|
public let toggle = TestToggle()
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -24,42 +22,34 @@ import MVMCoreUI
|
|||||||
|
|
||||||
open override func updateView(_ size: CGFloat) {
|
open override func updateView(_ size: CGFloat) {
|
||||||
super.updateView(size)
|
super.updateView(size)
|
||||||
label.updateView(size)
|
|
||||||
toggle.updateView(size)
|
toggle.updateView(size)
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func setupView() {
|
open override func setupView() {
|
||||||
super.setupView()
|
super.setupView()
|
||||||
|
|
||||||
addSubview(label)
|
|
||||||
addSubview(toggle)
|
addSubview(toggle)
|
||||||
label.setContentHuggingPriority(.required, for: .vertical)
|
toggle.topAnchor.constraint(equalTo: topAnchor).isActive = true
|
||||||
NSLayoutConstraint.pinViews(leftView: label, rightView: toggle, alignTop: false)
|
toggle.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
|
||||||
}
|
toggle.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
|
||||||
|
|
||||||
open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
|
||||||
guard let model = model as? TestLabelToggleModel,
|
|
||||||
let toggleHeight = Toggle.estimatedHeight(with: model.toggle, delegateObject),
|
|
||||||
let labelHeight = Label.estimatedHeight(with: model.label, delegateObject)
|
|
||||||
else { return nil }
|
|
||||||
|
|
||||||
return max(toggleHeight, labelHeight)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
||||||
|
|
||||||
guard let labelToggleModel = model as? TestLabelToggleModel else { return }
|
guard let labelToggleModel = model as? TestLabelToggleModel else { return }
|
||||||
|
|
||||||
label.set(with: labelToggleModel.label, delegateObject, additionalData)
|
|
||||||
toggle.set(with: labelToggleModel.toggle, delegateObject, additionalData)
|
toggle.set(with: labelToggleModel.toggle, delegateObject, additionalData)
|
||||||
|
|
||||||
|
let text = labelToggleModel.label.text
|
||||||
|
toggle.showText = true
|
||||||
|
toggle.onText = text
|
||||||
|
toggle.offText = text
|
||||||
|
toggle.textSize = .small
|
||||||
|
toggle.textWeight = .bold
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - MoleculeViewProtocol
|
// MARK: - MoleculeViewProtocol
|
||||||
open override func reset() {
|
open override func reset() {
|
||||||
super.reset()
|
super.reset()
|
||||||
label.reset()
|
|
||||||
toggle.reset()
|
toggle.reset()
|
||||||
label.setFontStyle(.BoldBodySmall)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,97 +11,120 @@ import MVMCoreUI
|
|||||||
import UIKit
|
import UIKit
|
||||||
import VDS
|
import VDS
|
||||||
|
|
||||||
extension MoleculeViewProtocol {
|
public protocol VDSMoleculeViewProtocol: MoleculeViewProtocol, MVMCoreViewProtocol {
|
||||||
public func onModelChange(model: MoleculeModelProtocol) {
|
associatedtype ViewModel: MoleculeModelProtocol
|
||||||
if let backgroundColor = model.backgroundColor {
|
var viewModel: ViewModel! { get set }
|
||||||
self.backgroundColor = backgroundColor.uiColor
|
var delegateObject: MVMCoreUIDelegateObject? { get set }
|
||||||
}
|
var additionalData: [AnyHashable: Any]? { get set }
|
||||||
|
func viewModelDidUpdate()
|
||||||
if let accessibilityIdentifier = model.accessibilityIdentifier {
|
|
||||||
self.accessibilityIdentifier = accessibilityIdentifier
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ModelHandlerable where Self: MoleculeViewProtocol {
|
extension VDSMoleculeViewProtocol {
|
||||||
public init(model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) {
|
|
||||||
self.init(with: model as! ModelType)
|
|
||||||
self.set(with: model, delegateObject, additionalData)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class TestToggle: ToggleBase<TestToggleModel>, MoleculeViewProtocol, MVMCoreViewProtocol {
|
|
||||||
|
|
||||||
/// The state on the toggle. Default value: false.
|
|
||||||
open override var isOn: Bool {
|
|
||||||
didSet {
|
|
||||||
_ = FormValidator.validate(delegate: delegateObject?.formHolderDelegate)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open override var isEnabled: Bool {
|
|
||||||
didSet {
|
|
||||||
model.enabled = isEnabled && !model.readOnly
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Delegate
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
private var delegateObject: MVMCoreUIDelegateObject?
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Initializers
|
|
||||||
//--------------------------------------------------
|
|
||||||
open override func updateView(viewModel: ModelType) {
|
|
||||||
super.updateView(viewModel: viewModel)
|
|
||||||
onModelChange(model: viewModel)
|
|
||||||
}
|
|
||||||
|
|
||||||
override open func setup() {
|
|
||||||
super.setup()
|
|
||||||
self.setupView()
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK:- MVMCoreViewProtocol
|
|
||||||
public func updateView(_ size: CGFloat) {}
|
|
||||||
public func setupView() {}
|
|
||||||
|
|
||||||
open override func toggle() {
|
|
||||||
super.toggle()
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK:- MoleculeViewProtocol
|
|
||||||
public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
||||||
|
guard let castedModel = model as? ViewModel else { return }
|
||||||
guard let castedModel = model as? ModelType else { return }
|
|
||||||
set(with: castedModel)
|
|
||||||
|
|
||||||
self.delegateObject = delegateObject
|
self.delegateObject = delegateObject
|
||||||
|
viewModel = castedModel
|
||||||
guard let formFieldProtocol = model as? FormFieldProtocol else { return }
|
viewModelDidUpdate()
|
||||||
FormValidator.setupValidation(for: formFieldProtocol, delegate: delegateObject?.formHolderDelegate)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let additionalDataWithSource = additionalData.dictionaryAdding(key: KeySourceModel, value: model)
|
extension TestToggleModel {
|
||||||
if castedModel.action != nil || castedModel.alternateAction != nil {
|
public func getVDSModel() -> DefaultToggleModel {
|
||||||
onChange = { [weak self] in
|
return DefaultToggleModel().copyWith {
|
||||||
guard let self = self else { return }
|
$0.disabled = !enabled && readOnly
|
||||||
if self.isOn {
|
$0.on = selected
|
||||||
if let action = castedModel.action {
|
if let accessibilityText = accessibilityText {
|
||||||
MVMCoreActionHandler.shared()?.asyncHandleAction(with: action, additionalData: additionalDataWithSource, delegateObject: delegateObject)
|
$0.accessibilityLabelEnabled = accessibilityText
|
||||||
}
|
$0.accessibilityLabelDisabled = accessibilityText
|
||||||
} else {
|
|
||||||
if let action = castedModel.alternateAction ?? castedModel.action {
|
|
||||||
MVMCoreActionHandler.shared()?.asyncHandleAction(with: action, additionalData: additionalDataWithSource, delegateObject: delegateObject)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class TestToggle: ToggleBase<DefaultToggleModel>, VDSMoleculeViewProtocol {
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
public var viewModel: TestToggleModel!
|
||||||
|
public var delegateObject: MVMCoreUIDelegateObject?
|
||||||
|
public var additionalData: [AnyHashable: Any]?
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializers
|
||||||
|
//--------------------------------------------------
|
||||||
|
public override func initialSetup() {
|
||||||
|
super.initialSetup()
|
||||||
|
|
||||||
|
publisher(for: .touchUpInside)
|
||||||
|
.sink {[weak self] toggle in
|
||||||
|
guard let self = self else { return }
|
||||||
|
self.toggle()
|
||||||
|
}.store(in: &subscribers)
|
||||||
|
|
||||||
|
publisher(for: .valueChanged)
|
||||||
|
.sink {[weak self] toggle in
|
||||||
|
guard let self = self else { return }
|
||||||
|
self.valueChanged(isOn: toggle.isOn)
|
||||||
|
}.store(in: &subscribers)
|
||||||
|
|
||||||
|
model.accessibilityLabelEnabled = MVMCoreUIUtility.hardcodedString(withKey: "Toggle_buttonlabel")
|
||||||
|
model.accessibilityLabelDisabled = MVMCoreUIUtility.hardcodedString(withKey: "Toggle_buttonlabel")
|
||||||
|
model.accessibilityHintEnabled = MVMCoreUIUtility.hardcodedString(withKey: "AccToggleHint")
|
||||||
|
model.accessibilityHintDisabled = MVMCoreUIUtility.hardcodedString(withKey: "AccDisabled")
|
||||||
|
model.accessibilityValueEnabled = MVMCoreUIUtility.hardcodedString(withKey: "AccOn")
|
||||||
|
model.accessibilityValueDisabled = MVMCoreUIUtility.hardcodedString(withKey: "AccOff")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK:- MVMCoreViewProtocol
|
||||||
|
open func updateView(_ size: CGFloat) {}
|
||||||
|
|
||||||
|
open func viewModelDidUpdate() {
|
||||||
|
guard let viewModel else { return }
|
||||||
|
|
||||||
|
FormValidator.setupValidation(for: viewModel, delegate: delegateObject?.formHolderDelegate)
|
||||||
|
additionalData = additionalData.dictionaryAdding(key: KeySourceModel, value: viewModel)
|
||||||
|
set(with: viewModel.getVDSModel())
|
||||||
|
}
|
||||||
|
|
||||||
|
private func valueChanged(isOn: Bool){
|
||||||
|
guard let viewModel else { return }
|
||||||
|
//sync the value on the viewModel
|
||||||
|
viewModel.selected = isOn
|
||||||
|
|
||||||
|
//tell the form you changed
|
||||||
|
_ = FormValidator.validate(delegate: self.delegateObject?.formHolderDelegate)
|
||||||
|
|
||||||
|
if viewModel.action != nil || viewModel.alternateAction != nil {
|
||||||
|
var action: ActionModelProtocol?
|
||||||
|
if isOn {
|
||||||
|
action = viewModel.action
|
||||||
|
} else {
|
||||||
|
action = viewModel.alternateAction ?? viewModel.action
|
||||||
|
}
|
||||||
|
if let action {
|
||||||
|
MVMCoreUIActionHandler.performActionUnstructured(with: action,
|
||||||
|
sourceModel: viewModel,
|
||||||
|
additionalData: additionalData,
|
||||||
|
delegateObject: delegateObject)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print("toggle value changed to: \(isOn)")
|
||||||
|
print("viewModel server value: \(viewModel.formFieldServerValue()!)")
|
||||||
|
}
|
||||||
|
|
||||||
public static func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
public static func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
||||||
return 24
|
return 44
|
||||||
|
}
|
||||||
|
|
||||||
|
private typealias ActionDefinition = (model: ActionModelProtocol,
|
||||||
|
sourceModel: MoleculeModelProtocol?)
|
||||||
|
|
||||||
|
private func performActionUnstructured(definition: ActionDefinition) {
|
||||||
|
MVMCoreUIActionHandler.performActionUnstructured(with: definition.model,
|
||||||
|
sourceModel: definition.sourceModel,
|
||||||
|
additionalData: additionalData,
|
||||||
|
delegateObject: delegateObject)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,3 +135,70 @@ extension TestToggle: MVMCoreUIViewConstrainingProtocol {
|
|||||||
|
|
||||||
public func horizontalAlignment() -> UIStackView.Alignment { .trailing }
|
public func horizontalAlignment() -> UIStackView.Alignment { .trailing }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open class TestToggle2: GenericMolecule<TestToggleModel2>, MVMCoreUIViewConstrainingProtocol {
|
||||||
|
|
||||||
|
private var toggle = Toggle()
|
||||||
|
|
||||||
|
open override func initialSetup() {
|
||||||
|
super.initialSetup()
|
||||||
|
|
||||||
|
//handle valueChanged
|
||||||
|
toggle.publisher(for: .valueChanged)
|
||||||
|
.sink { [weak self] control in
|
||||||
|
self?.valueDidChange(isOn: control.isOn)
|
||||||
|
}.store(in: &toggle.subscribers)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Proxy(\.toggle.isOn)
|
||||||
|
open var isOn: Bool
|
||||||
|
|
||||||
|
@Proxy(\.toggle.isEnabled)
|
||||||
|
open var isEnabled: Bool
|
||||||
|
|
||||||
|
open override func setupView(){
|
||||||
|
super.setupView()
|
||||||
|
addSubview(toggle)
|
||||||
|
NSLayoutConstraint.constraintPinSubview(toSuperview: toggle)
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func viewModelUpdate(model: TestToggleModel2) {
|
||||||
|
toggle.isEnabled = model.enabled
|
||||||
|
toggle.isOn = model.selected
|
||||||
|
|
||||||
|
isUserInteractionEnabled = model.enabled && !model.readOnly
|
||||||
|
additionalData = additionalData.dictionaryAdding(key: KeySourceModel, value: model)
|
||||||
|
FormValidator.setupValidation(for: model, delegate: delegateObject?.formHolderDelegate)
|
||||||
|
}
|
||||||
|
|
||||||
|
open func valueDidChange(isOn: Bool) {
|
||||||
|
print("Toggle valueDidChange: \(isOn)")
|
||||||
|
|
||||||
|
if model.action != nil || model.alternateAction != nil {
|
||||||
|
var action: ActionModelProtocol?
|
||||||
|
if isOn {
|
||||||
|
action = model.action
|
||||||
|
} else {
|
||||||
|
action = model.alternateAction ?? model.action
|
||||||
|
}
|
||||||
|
if let action {
|
||||||
|
MVMCoreUIActionHandler.performActionUnstructured(with: action,
|
||||||
|
sourceModel: model,
|
||||||
|
additionalData: additionalData,
|
||||||
|
delegateObject: delegateObject)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//MARK - MoleculeViewProtocol
|
||||||
|
public override static func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
||||||
|
return 44
|
||||||
|
}
|
||||||
|
|
||||||
|
//MARK - MVMCoreUIViewConstrainingProtocol
|
||||||
|
public func needsToBeConstrained() -> Bool { true }
|
||||||
|
|
||||||
|
public func horizontalAlignment() -> UIStackView.Alignment { .trailing }
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,186 +11,196 @@ import MVMCore
|
|||||||
import MVMCoreUI
|
import MVMCoreUI
|
||||||
import VDS
|
import VDS
|
||||||
|
|
||||||
//MARK: - Model
|
public class TestToggleModel: MoleculeModelProtocol, FormFieldProtocol {
|
||||||
public class TestToggleModel: MoleculeModelProtocol, FormFieldProtocol, VDS.ToggleModel {
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
public static var identifier: String = "testToggle"
|
public static var identifier: String = "testToggle1"
|
||||||
public var moleculeName: String = TestToggleModel.identifier
|
public var backgroundColor: Color? //not used
|
||||||
|
|
||||||
|
public var selected: Bool = false
|
||||||
|
public var enabled: Bool = true
|
||||||
|
public var readOnly: Bool = false
|
||||||
public var action: ActionModelProtocol?
|
public var action: ActionModelProtocol?
|
||||||
public var alternateAction: ActionModelProtocol?
|
public var alternateAction: ActionModelProtocol?
|
||||||
public var accessibilityIdentifier: String?
|
public var accessibilityText: String?
|
||||||
public var backgroundColor: MVMCoreUI.Color?
|
|
||||||
|
|
||||||
//FormFieldProtocol
|
|
||||||
public var fieldKey: String?
|
public var fieldKey: String?
|
||||||
public var groupName: String = FormValidator.defaultGroupName
|
public var groupName: String = FormValidator.defaultGroupName
|
||||||
public var baseValue: AnyHashable?
|
public var baseValue: AnyHashable?
|
||||||
public var readOnly: Bool = false
|
|
||||||
public var enabled: Bool = true
|
|
||||||
|
|
||||||
//ToggleModelProtocol
|
|
||||||
public var id = UUID()
|
|
||||||
public var showText: Bool = false
|
|
||||||
public var on: Bool = false
|
|
||||||
public var surface: Surface = .light
|
|
||||||
public var inputId: String?
|
|
||||||
public var value: AnyHashable?
|
|
||||||
public var dataAnalyticsTrack: String?
|
|
||||||
public var dataClickStream: String?
|
|
||||||
public var dataTrack: String?
|
|
||||||
public var disabled: Bool = false
|
|
||||||
public var accessibilityHintEnabled: String?
|
|
||||||
public var accessibilityHintDisabled: String?
|
|
||||||
public var accessibilityValueEnabled: String?
|
|
||||||
public var accessibilityValueDisabled: String?
|
|
||||||
public var accessibilityLabelEnabled: String?
|
|
||||||
public var accessibilityLabelDisabled: String?
|
|
||||||
public var typograpicalStyle: VDS.TypographicalStyle = .BodyLarge
|
|
||||||
public var textPosition: TextPosition = .left
|
|
||||||
public var offText: String = "Off"
|
|
||||||
public var onText: String = "On"
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Keys
|
// MARK: - Keys
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
case moleculeName
|
case moleculeName
|
||||||
|
case state
|
||||||
|
case enabled
|
||||||
|
case readOnly
|
||||||
case action
|
case action
|
||||||
case alternateAction
|
|
||||||
case accessibilityIdentifier
|
case accessibilityIdentifier
|
||||||
|
case alternateAction
|
||||||
|
case accessibilityText
|
||||||
case fieldKey
|
case fieldKey
|
||||||
case groupName
|
case groupName
|
||||||
case readOnly
|
|
||||||
case enabled //which to use
|
|
||||||
|
|
||||||
case id
|
|
||||||
case showText
|
|
||||||
case on
|
|
||||||
case surface
|
|
||||||
case inputId
|
|
||||||
case value
|
|
||||||
case dataAnalyticsTrack
|
|
||||||
case dataClickStream
|
|
||||||
case dataTrack
|
|
||||||
case disabled //which to use
|
|
||||||
case typograpicalStyle
|
|
||||||
case textPosition
|
|
||||||
case offText
|
|
||||||
case onText
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Form Valdiation
|
// MARK: - Form Valdiation
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
public func formFieldValue() -> AnyHashable? {
|
public func formFieldValue() -> AnyHashable? {
|
||||||
guard enabled else { return nil }
|
guard enabled else { return nil }
|
||||||
if let value = value {
|
return selected
|
||||||
return value
|
|
||||||
} else {
|
|
||||||
return on
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Server Value
|
// MARK: - Server Value
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
open func formFieldServerValue() -> AnyHashable? {
|
open func formFieldServerValue() -> AnyHashable? {
|
||||||
return formFieldValue()
|
return formFieldValue()
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializer
|
// MARK: - Initializer
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
required public convenience init(){
|
|
||||||
self.init(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
public init(_ state: Bool) {
|
public init(_ state: Bool) {
|
||||||
self.on = state
|
selected = state
|
||||||
baseValue = state
|
baseValue = state
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Codec
|
// MARK: - Codec
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
required public init(from decoder: Decoder) throws {
|
required public init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
|
|
||||||
//molecule
|
if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) {
|
||||||
|
selected = state
|
||||||
|
}
|
||||||
action = try typeContainer.decodeModelIfPresent(codingKey: .action)
|
action = try typeContainer.decodeModelIfPresent(codingKey: .action)
|
||||||
alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction)
|
alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction)
|
||||||
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
|
accessibilityText = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityText)
|
||||||
|
baseValue = selected
|
||||||
//formField
|
|
||||||
fieldKey = try typeContainer.decodeIfPresent(String.self, forKey: .fieldKey)
|
fieldKey = try typeContainer.decodeIfPresent(String.self, forKey: .fieldKey)
|
||||||
|
if let gName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) {
|
||||||
|
groupName = gName
|
||||||
|
}
|
||||||
|
enabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) ?? true
|
||||||
readOnly = try typeContainer.decodeIfPresent(Bool.self, forKey: .readOnly) ?? false
|
readOnly = try typeContainer.decodeIfPresent(Bool.self, forKey: .readOnly) ?? false
|
||||||
if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) {
|
|
||||||
self.groupName = groupName
|
|
||||||
}
|
|
||||||
|
|
||||||
//vds toggle
|
|
||||||
showText = try typeContainer.decodeIfPresent(Bool.self, forKey: .showText) ?? false
|
|
||||||
on = try typeContainer.decodeIfPresent(Bool.self, forKey: .on) ?? false
|
|
||||||
|
|
||||||
surface = try typeContainer.decodeIfPresent(Surface.self, forKey: .surface) ?? .light
|
|
||||||
dataAnalyticsTrack = try typeContainer.decodeIfPresent(String.self, forKey: .dataAnalyticsTrack)
|
|
||||||
dataClickStream = try typeContainer.decodeIfPresent(String.self, forKey: .dataClickStream)
|
|
||||||
dataTrack = try typeContainer.decodeIfPresent(String.self, forKey: .dataTrack)
|
|
||||||
typograpicalStyle = try typeContainer.decodeIfPresent(TypographicalStyle.self, forKey: .typograpicalStyle) ?? .BodyLarge
|
|
||||||
textPosition = try typeContainer.decodeIfPresent(TextPosition.self, forKey: .textPosition) ?? .left
|
|
||||||
offText = try typeContainer.decodeIfPresent(String.self, forKey: .offText) ?? "Off"
|
|
||||||
onText = try typeContainer.decodeIfPresent(String.self, forKey: .onText) ?? "On"
|
|
||||||
|
|
||||||
accessibilityHintEnabled = MVMCoreUIUtility.hardcodedString(withKey: "AccToggleHint")
|
|
||||||
accessibilityHintDisabled = MVMCoreUIUtility.hardcodedString(withKey: "AccDisabled")
|
|
||||||
accessibilityValueEnabled = MVMCoreUIUtility.hardcodedString(withKey: "AccOn")
|
|
||||||
accessibilityValueDisabled = MVMCoreUIUtility.hardcodedString(withKey: "AccOff")
|
|
||||||
accessibilityLabelEnabled = MVMCoreUIUtility.hardcodedString(withKey: "Toggle_buttonlabel")
|
|
||||||
accessibilityLabelDisabled = accessibilityLabelEnabled
|
|
||||||
|
|
||||||
if let _enabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) {
|
|
||||||
enabled = _enabled && !readOnly
|
|
||||||
disabled = !_enabled && readOnly
|
|
||||||
} else if let _disabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .disabled) {
|
|
||||||
enabled = !_disabled && !readOnly
|
|
||||||
disabled = _disabled && readOnly
|
|
||||||
}
|
|
||||||
|
|
||||||
baseValue = on
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public func encode(to encoder: Encoder) throws {
|
public func encode(to encoder: Encoder) throws {
|
||||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
//molecule
|
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
|
||||||
try container.encode(moleculeName, forKey: .moleculeName)
|
|
||||||
try container.encodeModelIfPresent(action, forKey: .action)
|
try container.encodeModelIfPresent(action, forKey: .action)
|
||||||
try container.encodeModelIfPresent(alternateAction, forKey: .alternateAction)
|
try container.encodeModelIfPresent(alternateAction, forKey: .alternateAction)
|
||||||
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
|
try container.encode(moleculeName, forKey: .moleculeName)
|
||||||
//formField
|
try container.encode(selected, forKey: .state)
|
||||||
|
try container.encode(enabled, forKey: .enabled)
|
||||||
|
try container.encodeIfPresent(fieldKey, forKey: .fieldKey)
|
||||||
|
try container.encodeIfPresent(groupName, forKey: .groupName)
|
||||||
|
try container.encode(readOnly, forKey: .readOnly)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class TestToggleModel2: MoleculeModelProtocol, FormFieldProtocol {
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public static var identifier: String = "testToggle2"
|
||||||
|
public var backgroundColor: Color? //not used
|
||||||
|
|
||||||
|
public var selected: Bool = true
|
||||||
|
public var enabled: Bool = true
|
||||||
|
public var readOnly: Bool = false
|
||||||
|
public var action: ActionModelProtocol?
|
||||||
|
public var alternateAction: ActionModelProtocol?
|
||||||
|
public var accessibilityText: String?
|
||||||
|
public var fieldKey: String?
|
||||||
|
public var groupName: String = FormValidator.defaultGroupName
|
||||||
|
public var baseValue: AnyHashable?
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Keys
|
||||||
|
//--------------------------------------------------
|
||||||
|
private enum CodingKeys: String, CodingKey {
|
||||||
|
case moleculeName
|
||||||
|
case state
|
||||||
|
case enabled
|
||||||
|
case readOnly
|
||||||
|
case action
|
||||||
|
case accessibilityIdentifier
|
||||||
|
case alternateAction
|
||||||
|
case accessibilityText
|
||||||
|
case fieldKey
|
||||||
|
case groupName
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Form Valdiation
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public func formFieldValue() -> AnyHashable? {
|
||||||
|
guard enabled else { return nil }
|
||||||
|
return selected
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Server Value
|
||||||
|
//--------------------------------------------------
|
||||||
|
open func formFieldServerValue() -> AnyHashable? {
|
||||||
|
return formFieldValue()
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializer
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
public init(_ state: Bool) {
|
||||||
|
selected = state
|
||||||
|
baseValue = state
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Codec
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
required public init(from decoder: Decoder) throws {
|
||||||
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
|
|
||||||
|
if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) {
|
||||||
|
selected = state
|
||||||
|
}
|
||||||
|
action = try typeContainer.decodeModelIfPresent(codingKey: .action)
|
||||||
|
alternateAction = try typeContainer.decodeModelIfPresent(codingKey: .alternateAction)
|
||||||
|
accessibilityText = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityText)
|
||||||
|
baseValue = selected
|
||||||
|
fieldKey = try typeContainer.decodeIfPresent(String.self, forKey: .fieldKey)
|
||||||
|
if let gName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) {
|
||||||
|
groupName = gName
|
||||||
|
}
|
||||||
|
enabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) ?? true
|
||||||
|
readOnly = try typeContainer.decodeIfPresent(Bool.self, forKey: .readOnly) ?? false
|
||||||
|
}
|
||||||
|
|
||||||
|
public func encode(to encoder: Encoder) throws {
|
||||||
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
|
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
|
||||||
|
try container.encodeModelIfPresent(action, forKey: .action)
|
||||||
|
try container.encodeModelIfPresent(alternateAction, forKey: .alternateAction)
|
||||||
|
try container.encode(moleculeName, forKey: .moleculeName)
|
||||||
|
try container.encode(selected, forKey: .state)
|
||||||
|
try container.encode(enabled, forKey: .enabled)
|
||||||
try container.encodeIfPresent(fieldKey, forKey: .fieldKey)
|
try container.encodeIfPresent(fieldKey, forKey: .fieldKey)
|
||||||
try container.encodeIfPresent(groupName, forKey: .groupName)
|
try container.encodeIfPresent(groupName, forKey: .groupName)
|
||||||
try container.encode(readOnly, forKey: .readOnly)
|
try container.encode(readOnly, forKey: .readOnly)
|
||||||
try container.encode(enabled, forKey: .enabled)
|
|
||||||
//vds toggle
|
|
||||||
try container.encodeIfPresent(id, forKey: .id)
|
|
||||||
try container.encode(showText, forKey: .showText)
|
|
||||||
try container.encode(on, forKey: .on)
|
|
||||||
try container.encodeIfPresent(surface, forKey: .surface)
|
|
||||||
try container.encodeIfPresent(inputId, forKey: .inputId)
|
|
||||||
try container.encode(dataAnalyticsTrack, forKey: .dataAnalyticsTrack)
|
|
||||||
try container.encode(dataClickStream, forKey: .dataClickStream)
|
|
||||||
try container.encode(dataTrack, forKey: .dataTrack)
|
|
||||||
try container.encode(disabled, forKey: .disabled)
|
|
||||||
try container.encodeIfPresent(typograpicalStyle, forKey: .typograpicalStyle)
|
|
||||||
try container.encodeIfPresent(textPosition, forKey: .textPosition)
|
|
||||||
try container.encodeIfPresent(offText, forKey: .offText)
|
|
||||||
try container.encodeIfPresent(onText, forKey: .onText)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user