From 096b834aedf885bf9337e027943afbf867cfc13b Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 12 Oct 2022 15:39:31 -0500 Subject: [PATCH] updated with comments Signed-off-by: Matt Bruce --- .../JSONCreator.xcodeproj/project.pbxproj | 2 +- JSONCreator_iOS/JSONCreator/AppDelegate.swift | 1 - JSONCreator_iOS/JSONCreator/TestToggle.swift | 82 +++------------- .../JSONCreator/TestToggleModel.swift | 98 +------------------ .../JSONCreator/TestToggleVM.swift | 5 + 5 files changed, 23 insertions(+), 165 deletions(-) diff --git a/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj b/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj index 3431806..9520240 100644 --- a/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj +++ b/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj @@ -275,9 +275,9 @@ D2B1E3FB22F4A6930065F95C /* Assets.xcassets */, D2B1E3FD22F4A6930065F95C /* LaunchScreen.storyboard */, D2B1E40022F4A6930065F95C /* Info.plist */, + EA1B7BBC2893459E006AF0BC /* DecodableDefaults+VDS.swift */, EA3362332891F5AB0071C351 /* TestToggleModel.swift */, EA3361C0288B37FB0071C351 /* TestToggle.swift */, - EA1B7BBC2893459E006AF0BC /* DecodableDefaults+VDS.swift */, EAF7F0902899825D00B287F5 /* TestLabelToggle.swift */, EAA5EEFF28F74C43003B3210 /* VDSToggleVM.swift */, EAA5EF0128F74CE5003B3210 /* TestToggleVM.swift */, diff --git a/JSONCreator_iOS/JSONCreator/AppDelegate.swift b/JSONCreator_iOS/JSONCreator/AppDelegate.swift index 0fb42b7..13ba488 100644 --- a/JSONCreator_iOS/JSONCreator/AppDelegate.swift +++ b/JSONCreator_iOS/JSONCreator/AppDelegate.swift @@ -132,7 +132,6 @@ extension AppDelegate { ModelRegistry.register(TestModel.self) ModelRegistry.register(handler: TestLabelToggle.self, for: TestLabelToggleModel.self) ModelRegistry.register(handler: TestToggle.self, for: TestToggleModel.self) - ModelRegistry.register(handler: TestToggle2.self, for: TestToggleModel2.self) ModelRegistry.register(handler: TestToggle3.self, for: TestToggleModel3.self) ModelRegistry.register(handler: TextEntryField.self, for: TextEntryField64Model.self) ModelRegistry.register(handler: EmailVerifyField.self, for: EmailVerifyModel.self) diff --git a/JSONCreator_iOS/JSONCreator/TestToggle.swift b/JSONCreator_iOS/JSONCreator/TestToggle.swift index e68a22f..dcf5968 100644 --- a/JSONCreator_iOS/JSONCreator/TestToggle.swift +++ b/JSONCreator_iOS/JSONCreator/TestToggle.swift @@ -11,6 +11,9 @@ import MVMCoreUI import UIKit import VDS +///----------------------------------------------------------------------------- +///MARK: -- VDSMoleculeViewProtocol (Contract between VDS -> Atomic) +///----------------------------------------------------------------------------- public protocol VDSMoleculeViewProtocol: MoleculeViewProtocol, MVMCoreViewProtocol { associatedtype ViewModel: MoleculeModelProtocol var viewModel: ViewModel! { get set } @@ -28,7 +31,11 @@ extension VDSMoleculeViewProtocol { } } +///----------------------------------------------------------------------------- +///MARK: -- TestToggleModel Extension +///----------------------------------------------------------------------------- extension TestToggleModel { + ///Copy properties into a model the then drive the VDS Toggle public func getVDSModel() -> DefaultToggleModel { return DefaultToggleModel().copyWith { $0.disabled = !enabled && readOnly @@ -41,6 +48,14 @@ extension TestToggleModel { } } +///----------------------------------------------------------------------------- +///MARK: -- TestToggle +///----------------------------------------------------------------------------- + +/// Class that will subclass VDS Toggle, however since our Atomic Toggle Model is a class (Due to EnableableProtocol) +/// we have to split up the models, using ours and the DefaultToggleModel (internal to VDS control) +/// - issuses: we have to then sync values from the internal DefaultToggleModel to the Atomic model since this +/// is the model that talks to the validator open class TestToggle: ToggleBase, VDSMoleculeViewProtocol { //-------------------------------------------------- // MARK: - Properties @@ -135,70 +150,3 @@ extension TestToggle: MVMCoreUIViewConstrainingProtocol { public func horizontalAlignment() -> UIStackView.Alignment { .trailing } } - -open class TestToggle2: GenericMolecule, 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 } -} - diff --git a/JSONCreator_iOS/JSONCreator/TestToggleModel.swift b/JSONCreator_iOS/JSONCreator/TestToggleModel.swift index 995e5f6..b686d3e 100644 --- a/JSONCreator_iOS/JSONCreator/TestToggleModel.swift +++ b/JSONCreator_iOS/JSONCreator/TestToggleModel.swift @@ -11,6 +11,8 @@ import MVMCore import MVMCoreUI import VDS + +/// Stripped all UI properties since this is coming from the VDS Toggle itself public class TestToggleModel: MoleculeModelProtocol, FormFieldProtocol { //-------------------------------------------------- // MARK: - Properties @@ -108,99 +110,3 @@ public class TestToggleModel: MoleculeModelProtocol, FormFieldProtocol { 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(groupName, forKey: .groupName) - try container.encode(readOnly, forKey: .readOnly) - } -} diff --git a/JSONCreator_iOS/JSONCreator/TestToggleVM.swift b/JSONCreator_iOS/JSONCreator/TestToggleVM.swift index e90240d..2f31a4a 100644 --- a/JSONCreator_iOS/JSONCreator/TestToggleVM.swift +++ b/JSONCreator_iOS/JSONCreator/TestToggleVM.swift @@ -11,6 +11,9 @@ import MVMCore import MVMCoreUI import VDS + +/// This is a mixed model of Atomic + VDS.ToggleModel that will be used with the Control +/// There is no requirement for syncing since it is 1 model public class TestToggleModel3: MoleculeModelProtocol, FormFieldProtocol, VDS.ToggleModel { //ToggleModel public var id = UUID() @@ -159,6 +162,8 @@ public class TestToggleModel3: MoleculeModelProtocol, FormFieldProtocol, VDS.Tog } } +/// The is a Sample of using the ViewModelHandler which is a an intermediate class between the View and the model +/// Since we are using a viewModel there is more legwork upfront, however you can use classes or structs as the model open class TestToggle3: ToggleViewModelHandlerBase>, VDSVMMoleculeViewProtocol { //--------------------------------------------------