From e0bb0e45dc7f177ec13bff0cb9b2e7dae6230c1c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 12 Feb 2020 11:25:37 -0500 Subject: [PATCH] integrating changes to make fan out instance models into categories due to name conflicts --- .../Atoms/Views/CircleProgressModel.swift | 1 + .../Label/LabelAttributeColorModel.swift | 14 ++++++-- .../Views/Label/LabelAttributeFontModel.swift | 19 +++++++++-- .../Label/LabelAttributeImageModel.swift | 19 ++++++++--- .../Views/Label/LabelAttributeModel.swift | 26 ++++++++++++--- .../MFViewController+Model.swift | 32 ++++++++----------- .../Extensions/MoleculeModelHelper.swift | 4 ++- .../CarouselItemModelProtocol.swift | 5 +-- .../CarouselPagingModelProtocol.swift | 3 +- .../ContainerModelProtocol.swift | 1 + .../DisableableModelProtocol.swift | 1 + .../ModelProtocols/FormModelProtocol.swift | 1 + .../ListItemModelProtocol.swift | 19 +++++++++-- .../MoleculeModelProtocol.swift | 17 ++++++++-- .../ModelProtocols/PageModelProtocol.swift | 18 +++++++++++ .../TemplateModelProtocol.swift | 6 ++-- ...MoleculeMappingObject+ModelExtension.swift | 2 +- .../OtherHandlers/MoleculeObjectMapping.swift | 17 +++++----- .../Templates/ListPageTemplateModel.swift | 17 +++++++++- MVMCoreUI/Templates/TemplateProtocol.swift | 1 + 20 files changed, 169 insertions(+), 54 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CircleProgressModel.swift b/MVMCoreUI/Atoms/Views/CircleProgressModel.swift index feb69083..c4f55bef 100644 --- a/MVMCoreUI/Atoms/Views/CircleProgressModel.swift +++ b/MVMCoreUI/Atoms/Views/CircleProgressModel.swift @@ -17,6 +17,7 @@ public enum GraphStyle: String, Codable { } public class CircleProgressModel: MoleculeModelProtocol { + public static var identifier: String = "circleProgress" public var style: GraphStyle = .unlimited { didSet { diff --git a/MVMCoreUI/Atoms/Views/Label/LabelAttributeColorModel.swift b/MVMCoreUI/Atoms/Views/Label/LabelAttributeColorModel.swift index 26f1fa54..01183614 100644 --- a/MVMCoreUI/Atoms/Views/Label/LabelAttributeColorModel.swift +++ b/MVMCoreUI/Atoms/Views/Label/LabelAttributeColorModel.swift @@ -9,6 +9,9 @@ import UIKit @objcMembers public class LabelAttributeColorModel: LabelAttributeModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- override public class var identifier: String { return "color" @@ -16,14 +19,21 @@ import UIKit var textColor: String? + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case textColor } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - self.textColor = try typeContainer.decodeIfPresent(String.self, forKey: .textColor) + textColor = try typeContainer.decodeIfPresent(String.self, forKey: .textColor) try super.init(from: decoder) } diff --git a/MVMCoreUI/Atoms/Views/Label/LabelAttributeFontModel.swift b/MVMCoreUI/Atoms/Views/Label/LabelAttributeFontModel.swift index 88ae728d..2e9e6e1c 100644 --- a/MVMCoreUI/Atoms/Views/Label/LabelAttributeFontModel.swift +++ b/MVMCoreUI/Atoms/Views/Label/LabelAttributeFontModel.swift @@ -8,7 +8,12 @@ import UIKit + @objcMembers public class LabelAttributeFontModel: LabelAttributeModel { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + override public class var identifier: String { return "font" } @@ -17,17 +22,25 @@ import UIKit var name: String? var size: CGFloat? + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case style case name case size } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - self.style = try typeContainer.decodeIfPresent(String.self, forKey: .style) - self.name = try typeContainer.decodeIfPresent(String.self, forKey: .name) - self.size = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .size) + style = try typeContainer.decodeIfPresent(String.self, forKey: .style) + name = try typeContainer.decodeIfPresent(String.self, forKey: .name) + size = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .size) try super.init(from: decoder) } diff --git a/MVMCoreUI/Atoms/Views/Label/LabelAttributeImageModel.swift b/MVMCoreUI/Atoms/Views/Label/LabelAttributeImageModel.swift index 0095a589..1980353c 100644 --- a/MVMCoreUI/Atoms/Views/Label/LabelAttributeImageModel.swift +++ b/MVMCoreUI/Atoms/Views/Label/LabelAttributeImageModel.swift @@ -9,7 +9,10 @@ import UIKit class LabelAttributeImageModel: LabelAttributeModel { - + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + override public class var identifier: String { return "image" } @@ -18,17 +21,25 @@ class LabelAttributeImageModel: LabelAttributeModel { var name: String? var URL: String? + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case size case name case URL } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - self.size = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .size) - self.name = try typeContainer.decodeIfPresent(String.self, forKey: .name) - self.URL = try typeContainer.decodeIfPresent(String.self, forKey: .URL) + size = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .size) + name = try typeContainer.decodeIfPresent(String.self, forKey: .name) + URL = try typeContainer.decodeIfPresent(String.self, forKey: .URL) try super.init(from: decoder) } diff --git a/MVMCoreUI/Atoms/Views/Label/LabelAttributeModel.swift b/MVMCoreUI/Atoms/Views/Label/LabelAttributeModel.swift index ae2768ab..22bb10d8 100644 --- a/MVMCoreUI/Atoms/Views/Label/LabelAttributeModel.swift +++ b/MVMCoreUI/Atoms/Views/Label/LabelAttributeModel.swift @@ -9,6 +9,17 @@ import Foundation @objcMembers open class LabelAttributeModel: Model { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public static var categoryName: String { + return "\(LabelAttributeModel.self)" + } + + public static var categoryCodingKey: String { + return "type" + } public class var identifier: String { return "" @@ -18,17 +29,25 @@ import Foundation var location: Int var length: Int + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case type case location case length } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - self.type = try typeContainer.decode(String.self, forKey: .type) - self.location = try typeContainer.decode(Int.self, forKey: .location) - self.length = try typeContainer.decode(Int.self, forKey: .length) + type = try typeContainer.decode(String.self, forKey: .type) + location = try typeContainer.decode(Int.self, forKey: .location) + length = try typeContainer.decode(Int.self, forKey: .length) } public func encode(to encoder: Encoder) throws { @@ -37,5 +56,4 @@ import Foundation try container.encode(location, forKey: .location) try container.encode(length, forKey: .length) } - } diff --git a/MVMCoreUI/BaseControllers/MFViewController+Model.swift b/MVMCoreUI/BaseControllers/MFViewController+Model.swift index 6cedf93c..1c58c574 100644 --- a/MVMCoreUI/BaseControllers/MFViewController+Model.swift +++ b/MVMCoreUI/BaseControllers/MFViewController+Model.swift @@ -9,41 +9,35 @@ import Foundation extension MFViewController: MoleculeDelegateProtocol { - public func getModuleWithName(_ name: String?) -> [AnyHashable : Any]? { - guard let name = name else { - return nil - } + + public func getModuleWithName(_ name: String?) -> [AnyHashable: Any]? { + guard let name = name else { return nil } + return loadObject?.modulesJSON?.optionalDictionaryForKey(name) } public func getModuleWithName(_ moduleName: String) -> MoleculeModelProtocol? { guard let moduleJSON = loadObject?.modulesJSON?.optionalDictionaryForKey(moduleName), let moleculeName = moduleJSON.optionalStringForKey("moleculeName"), - let modelType = ModelRegistry.getType(for: moleculeName) as? MoleculeModelProtocol.Type else { - return nil - } + let modelType = ModelRegistry.getType(for: moleculeName, with: MoleculeModelProtocol.self) + else { return nil } + do { - return try modelType.decode(jsonDict: moduleJSON) + return try modelType.decode(jsonDict: moduleJSON) as? MoleculeModelProtocol } catch { MVMCoreUILoggingHandler.logDebugMessage(withDelegate: "error: \(error)") } + return nil } - @objc public func moleculeLayoutUpdated(_ molecule: UIView & MVMCoreUIMoleculeViewProtocol) { - - } + @objc public func moleculeLayoutUpdated(_ molecule: UIView & MVMCoreUIMoleculeViewProtocol) { } - @objc public func addMolecules(_ molecules: [[AnyHashable : Any]], sender: UITableViewCell, animation: UITableView.RowAnimation) { - // Do nothing - } + @objc public func addMolecules(_ molecules: [[AnyHashable: Any]], sender: UITableViewCell, animation: UITableView.RowAnimation) { } - @objc public func removeMolecules(_ molecules: [[AnyHashable : Any]], sender: UITableViewCell, animation: UITableView.RowAnimation) { - // Do nothing - } + @objc public func removeMolecules(_ molecules: [[AnyHashable: Any]], sender: UITableViewCell, animation: UITableView.RowAnimation) { } } public extension MFViewController { - @objc func parsePageJSON() throws { - } + @objc func parsePageJSON() throws { } } diff --git a/MVMCoreUI/Models/Extensions/MoleculeModelHelper.swift b/MVMCoreUI/Models/Extensions/MoleculeModelHelper.swift index 599851bb..87460640 100644 --- a/MVMCoreUI/Models/Extensions/MoleculeModelHelper.swift +++ b/MVMCoreUI/Models/Extensions/MoleculeModelHelper.swift @@ -8,7 +8,9 @@ import Foundation -extension KeyedDecodingContainer where Key : CodingKey { + +extension KeyedDecodingContainer where Key: CodingKey { + private enum TypeCodingKey: String, CodingKey { case moleculeName } diff --git a/MVMCoreUI/Models/ModelProtocols/CarouselItemModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/CarouselItemModelProtocol.swift index 53a6cc10..093c9337 100644 --- a/MVMCoreUI/Models/ModelProtocols/CarouselItemModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/CarouselItemModelProtocol.swift @@ -8,7 +8,8 @@ import Foundation + public protocol CarouselItemModelProtocol: ContainerModelProtocol, MoleculeModelProtocol { - var peakingUI: Bool? {get} - var peakingArrowColor: Color? {get} + var peakingUI: Bool? { get } + var peakingArrowColor: Color? { get } } diff --git a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift index 5f593d3b..94b1277a 100644 --- a/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/CarouselPagingModelProtocol.swift @@ -8,6 +8,7 @@ import Foundation + public protocol CarouselPagingModelProtocol: MoleculeModelProtocol { - var position: Float? {get} + var position: Float? { get } } diff --git a/MVMCoreUI/Models/ModelProtocols/ContainerModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/ContainerModelProtocol.swift index 304a4811..bc230731 100644 --- a/MVMCoreUI/Models/ModelProtocols/ContainerModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/ContainerModelProtocol.swift @@ -8,6 +8,7 @@ import Foundation + public protocol ContainerModelProtocol { var horizontalAlignment: UIStackView.Alignment? { get set } var verticalAlignment: UIStackView.Alignment? { get set } diff --git a/MVMCoreUI/Models/ModelProtocols/DisableableModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/DisableableModelProtocol.swift index 1e49bd8c..db0cfd77 100644 --- a/MVMCoreUI/Models/ModelProtocols/DisableableModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/DisableableModelProtocol.swift @@ -8,6 +8,7 @@ import Foundation + public protocol EnableableModelProtocol { var enabled: Bool { get set } } diff --git a/MVMCoreUI/Models/ModelProtocols/FormModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/FormModelProtocol.swift index aa298716..1224d5a9 100644 --- a/MVMCoreUI/Models/ModelProtocols/FormModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/FormModelProtocol.swift @@ -8,6 +8,7 @@ import Foundation + public protocol FormModelProtocol: Model { var required: Bool? { get } var fieldKey: String? { get } diff --git a/MVMCoreUI/Models/ModelProtocols/ListItemModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/ListItemModelProtocol.swift index c6be0488..cd19a23c 100644 --- a/MVMCoreUI/Models/ModelProtocols/ListItemModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/ListItemModelProtocol.swift @@ -8,6 +8,7 @@ import Foundation + public protocol ListItemModelProtocol: ContainerModelProtocol, MoleculeModelProtocol { var line: LineModel? { get set } var action: ActionModelProtocol? { get set } @@ -16,15 +17,27 @@ public protocol ListItemModelProtocol: ContainerModelProtocol, MoleculeModelProt } // Not a strict requirement. -extension ListItemModelProtocol { +public extension ListItemModelProtocol { - public var action: ActionModelProtocol? { + var action: ActionModelProtocol? { get { return nil } set { } } - public var style: String? { + var style: String? { get { return nil } set { } } + + var moleculeName: String? { + get { return Self.identifier } + } + + var categoryName: String { + return "\(ListItemModelProtocol.self)" + } + +// var categoryCodingKey: String { +// return "style" +// } } diff --git a/MVMCoreUI/Models/ModelProtocols/MoleculeModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/MoleculeModelProtocol.swift index 85a91bcd..9f099331 100644 --- a/MVMCoreUI/Models/ModelProtocols/MoleculeModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/MoleculeModelProtocol.swift @@ -1,12 +1,25 @@ import Foundation + public protocol MoleculeModelProtocol: Model { var moleculeName: String? { get } var backgroundColor: Color? { get set} + + static var categoryName: String { get } + static var categoryCodingKey: String { get } } -extension MoleculeModelProtocol { - public var moleculeName: String? { +public extension MoleculeModelProtocol { + + var moleculeName: String? { get { return Self.identifier } } + + static var categoryName: String { + return "\(MoleculeModelProtocol.self)" + } + + static var categoryCodingKey: String { + return "moleculeName" + } } diff --git a/MVMCoreUI/Models/ModelProtocols/PageModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/PageModelProtocol.swift index 8c6d1557..2ad9b8a2 100644 --- a/MVMCoreUI/Models/ModelProtocols/PageModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/PageModelProtocol.swift @@ -8,8 +8,26 @@ import Foundation + public protocol PageModelProtocol: Model { var pageType: String { get set } var screenHeading: String? { get set } var isAtomicTabs: Bool? { get set } + + static var categoryName: String { get } + static var categoryCodingKey: String { get } +} + +extension PageModelProtocol { + //TODO: Scott implement + + public static var categoryCodingKey: String { + return "moleculeName" + } + + public static var categoryName: String { + return "\(PageModelProtocol.self)" + } +// public static var categoryName: String { return "template" } +// public static var categoryCodingKey: String { return "\(PageModelProtocol.self)" } } diff --git a/MVMCoreUI/Models/ModelProtocols/TemplateModelProtocol.swift b/MVMCoreUI/Models/ModelProtocols/TemplateModelProtocol.swift index 66472da6..90a8ec2a 100644 --- a/MVMCoreUI/Models/ModelProtocols/TemplateModelProtocol.swift +++ b/MVMCoreUI/Models/ModelProtocols/TemplateModelProtocol.swift @@ -8,12 +8,14 @@ import Foundation + public protocol TemplateModelProtocol: PageModelProtocol { var template: String { get } } -extension TemplateModelProtocol { - public var template: String { +public extension TemplateModelProtocol { + + var template: String { get { return Self.identifier } } } diff --git a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift index 4796b2a2..6249e61e 100644 --- a/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift +++ b/MVMCoreUI/OtherHandlers/MVMCoreUIMoleculeMappingObject+ModelExtension.swift @@ -11,7 +11,7 @@ import Foundation public extension MVMCoreUIMoleculeMappingObject { func register(viewClass: V.Type, viewModelClass: M.Type) { - ModelRegistry.register(viewModelClass) + try? ModelRegistry.register(viewModelClass) MVMCoreUIMoleculeMappingObject.shared()?.moleculeMapping.setObject(viewClass, forKey: viewModelClass.identifier as NSString) } diff --git a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift index 8c1a36e3..b139f33b 100644 --- a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift +++ b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift @@ -18,13 +18,13 @@ import Foundation // Label MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: Label.self, viewModelClass: LabelModel.self) - //need to move labelattributemodel to different method - ModelRegistry.register(LabelAttributeFontModel.self) - ModelRegistry.register(LabelAttributeColorModel.self) - //ModelRegistry.register(LabelAttributeImageModel.self) // We need to separate the registry by types due to collisions... - ModelRegistry.register(LabelAttributeUnderlineModel.self) - ModelRegistry.register(LabelAttributeStrikeThroughModel.self) - ModelRegistry.register(LabelAttributeActionModel.self) + // need to move labelattributemodel to different method + try? ModelRegistry.register(LabelAttributeFontModel.self) + try? ModelRegistry.register(LabelAttributeColorModel.self) + try? ModelRegistry.register(LabelAttributeImageModel.self) // We need to separate the registry by types due to collisions... + try? ModelRegistry.register(LabelAttributeUnderlineModel.self) + try? ModelRegistry.register(LabelAttributeStrikeThroughModel.self) + try? ModelRegistry.register(LabelAttributeActionModel.self) // Buttons MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: PillButton.self, viewModelClass: ButtonModel.self) @@ -40,7 +40,6 @@ import Foundation MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: DateDropdownEntryField.self, viewModelClass: DateDropdownEntryFieldModel.self) // Other Atoms - MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: Label.self, viewModelClass: LabelModel.self) MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: ProgressBar.self, viewModelClass: ProgressBarModel.self) MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: MultiProgress.self, viewModelClass: MultiProgressBarModel.self) MVMCoreUIMoleculeMappingObject.shared()?.register(viewClass: CaretView.self, viewModelClass: CaretViewModel.self) @@ -104,6 +103,6 @@ import Foundation MVMCoreUIMoleculeMappingObject.shared()?.moleculeMapping.setObject(MVMCoreUIPageControl.self, forKey: "barsPager" as NSString) // TODO: Need View - ModelRegistry.register(TabsModel.self) + try? ModelRegistry.register(TabsModel.self) } } diff --git a/MVMCoreUI/Templates/ListPageTemplateModel.swift b/MVMCoreUI/Templates/ListPageTemplateModel.swift index fe9c12c5..ff899319 100644 --- a/MVMCoreUI/Templates/ListPageTemplateModel.swift +++ b/MVMCoreUI/Templates/ListPageTemplateModel.swift @@ -9,7 +9,10 @@ import Foundation @objcMembers public class ListPageTemplateModel: TemplateModelProtocol { - + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "list" public var pageType: String @@ -21,12 +24,20 @@ import Foundation public var footer: MoleculeModelProtocol? public var line: LineModel? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(pageType: String, screenHeading: String?, molecules: [ListItemModelProtocol]) { self.pageType = pageType self.screenHeading = screenHeading self.molecules = molecules } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case moleculeName case pageType @@ -38,6 +49,10 @@ import Foundation case isAtomicTabs } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) pageType = try typeContainer.decode(String.self, forKey: .pageType) diff --git a/MVMCoreUI/Templates/TemplateProtocol.swift b/MVMCoreUI/Templates/TemplateProtocol.swift index 0498ec5d..63c66263 100644 --- a/MVMCoreUI/Templates/TemplateProtocol.swift +++ b/MVMCoreUI/Templates/TemplateProtocol.swift @@ -14,6 +14,7 @@ public protocol TemplateProtocol: class { } public extension TemplateProtocol where Self: MFViewController { + func parseTemplateJSON() throws { guard let pageJSON = self.loadObject?.pageJSON else { return } let data = try JSONSerialization.data(withJSONObject: pageJSON)