Add an optional ID field to every molecule.

This commit is contained in:
Hedden, Kyle Matthew 2023-09-05 21:02:24 -04:00
parent b1966a87ea
commit 7da47bb77a
67 changed files with 300 additions and 28 deletions

View File

@ -18,6 +18,8 @@ open class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWat
//-------------------------------------------------- //--------------------------------------------------
//Making static property as class property so that subclasses can override getter function of the property //Making static property as class property so that subclasses can override getter function of the property
open class var identifier: String { "button" } open class var identifier: String { "button" }
public var id: String = { return UUID().uuidString }()
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var accessibilityText: String? public var accessibilityText: String?
public var title: String public var title: String
@ -174,6 +176,7 @@ open class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWat
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -201,6 +204,7 @@ open class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWat
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
accessibilityText = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityText) accessibilityText = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityText)
title = try typeContainer.decode(String.self, forKey: .title) title = try typeContainer.decode(String.self, forKey: .title)
@ -263,6 +267,7 @@ open class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWat
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(title, forKey: .title) try container.encode(title, forKey: .title)
try container.encode(enabled, forKey: .enabled) try container.encode(enabled, forKey: .enabled)

View File

@ -16,6 +16,7 @@ public class CaretLinkModel: ButtonModelProtocol, MoleculeModelProtocol, Enablea
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "caretLink" public static var identifier: String = "caretLink"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var title: String public var title: String
@ -41,6 +42,7 @@ public class CaretLinkModel: ButtonModelProtocol, MoleculeModelProtocol, Enablea
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
case title case title
@ -61,6 +63,7 @@ public class CaretLinkModel: ButtonModelProtocol, MoleculeModelProtocol, Enablea
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
title = try typeContainer.decode(String.self, forKey: .title) title = try typeContainer.decode(String.self, forKey: .title)
@ -94,6 +97,7 @@ public class CaretLinkModel: ButtonModelProtocol, MoleculeModelProtocol, Enablea
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(title, forKey: .title) try container.encode(title, forKey: .title)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)

View File

@ -14,8 +14,9 @@ open class ImageButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGro
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "imageButton" public static var identifier: String = "imageButton"
public var backgroundColor: Color? public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color?
public var image: ImageViewModel? public var image: ImageViewModel?
public var accessibilityText: String? public var accessibilityText: String?
@ -34,6 +35,7 @@ open class ImageButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGro
} }
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case image case image
case backgroundColor case backgroundColor

View File

@ -15,6 +15,7 @@ open class LinkModel: ButtonModelProtocol, MoleculeModelProtocol, EnableableMode
//-------------------------------------------------- //--------------------------------------------------
public class var identifier: String { "link" } public class var identifier: String { "link" }
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
@ -48,6 +49,7 @@ open class LinkModel: ButtonModelProtocol, MoleculeModelProtocol, EnableableMode
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -91,6 +93,7 @@ open class LinkModel: ButtonModelProtocol, MoleculeModelProtocol, EnableableMode
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
title = try typeContainer.decode(String.self, forKey: .title) title = try typeContainer.decode(String.self, forKey: .title)
@ -137,6 +140,7 @@ open class LinkModel: ButtonModelProtocol, MoleculeModelProtocol, EnableableMode
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)
try container.encode(id, forKey: .id)
try container.encode(title, forKey: .title) try container.encode(title, forKey: .title)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)

View File

@ -11,11 +11,14 @@ import MVMCore
@objcMembers public class TagModel: MoleculeModelProtocol { @objcMembers public class TagModel: MoleculeModelProtocol {
public static var identifier: String = "tag" public static var identifier: String = "tag"
public var id: String = { return UUID().uuidString }()
public var label: LabelModel public var label: LabelModel
public var action: ActionModelProtocol? public var action: ActionModelProtocol?
public var backgroundColor: Color? public var backgroundColor: Color?
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case label case label
case action case action

View File

@ -11,10 +11,13 @@ import MVMCore
@objcMembers public class TagsModel: MoleculeModelProtocol { @objcMembers public class TagsModel: MoleculeModelProtocol {
public static var identifier: String = "tags" public static var identifier: String = "tags"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var tags: [TagModel] public var tags: [TagModel]
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case tags case tags
@ -30,12 +33,14 @@ import MVMCore
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
tags = try typeContainer.decode([TagModel].self, forKey: .tags) tags = try typeContainer.decode([TagModel].self, forKey: .tags)
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
} }
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(tags, forKey: .tags) try container.encode(tags, forKey: .tags)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)

View File

@ -16,6 +16,7 @@ import Foundation
//-------------------------------------------------- //--------------------------------------------------
public class var identifier: String { "" } public class var identifier: String { "" }
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
@ -63,6 +64,7 @@ import Foundation
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -138,6 +140,7 @@ import Foundation
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
title = try typeContainer.decodeIfPresent(String.self, forKey: .title) title = try typeContainer.decodeIfPresent(String.self, forKey: .title)
@ -166,6 +169,7 @@ import Foundation
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)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier) try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)

View File

@ -20,6 +20,7 @@
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "checkbox" public static var identifier: String = "checkbox"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var selected: Bool = false public var selected: Bool = false
@ -51,6 +52,7 @@
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case accessibilityIdentifier case accessibilityIdentifier
case checked case checked

View File

@ -14,6 +14,8 @@ open class HeartModel: MoleculeModelProtocol, EnableableModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "heart" public static var identifier: String = "heart"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var isActive: Bool = false public var isActive: Bool = false
@ -27,6 +29,7 @@ open class HeartModel: MoleculeModelProtocol, EnableableModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -49,6 +52,8 @@ open class HeartModel: MoleculeModelProtocol, EnableableModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let isActive = try typeContainer.decodeIfPresent(Bool.self, forKey: .isActive) { if let isActive = try typeContainer.decodeIfPresent(Bool.self, forKey: .isActive) {
self.isActive = isActive self.isActive = isActive
} }

View File

@ -13,6 +13,8 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "radioBox" public static var identifier: String = "radioBox"
public var id: String = { return UUID().uuidString }()
public var text: String public var text: String
public var subText: String? public var subText: String?
public var backgroundColor: Color? public var backgroundColor: Color?
@ -30,6 +32,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case text case text
case subText case subText
@ -58,6 +61,8 @@ import MVMCore
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
text = try typeContainer.decode(String.self, forKey: .text) text = try typeContainer.decode(String.self, forKey: .text)
subText = try typeContainer.decodeIfPresent(String.self, forKey: .subText) subText = try typeContainer.decodeIfPresent(String.self, forKey: .subText)
selectedAccentColor = try typeContainer.decodeIfPresent(Color.self, forKey: .selectedAccentColor) selectedAccentColor = try typeContainer.decodeIfPresent(Color.self, forKey: .selectedAccentColor)
@ -81,6 +86,7 @@ import MVMCore
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(text, forKey: .text) try container.encode(text, forKey: .text)
try container.encodeIfPresent(subText, forKey: .subText) try container.encodeIfPresent(subText, forKey: .subText)

View File

@ -13,6 +13,8 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "radioBoxes" public static var identifier: String = "radioBoxes"
public var id: String = { return UUID().uuidString }()
public var boxes: [RadioBoxModel] public var boxes: [RadioBoxModel]
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
@ -49,6 +51,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case enabled case enabled
case readOnly case readOnly

View File

@ -15,6 +15,8 @@ open class RadioButtonModel: MoleculeModelProtocol, FormFieldProtocol {
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "radioButton" public static var identifier: String = "radioButton"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var state: Bool = false public var state: Bool = false
@ -35,6 +37,7 @@ open class RadioButtonModel: MoleculeModelProtocol, FormFieldProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -80,6 +83,8 @@ open class RadioButtonModel: MoleculeModelProtocol, FormFieldProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) {
self.state = state self.state = state
} }

View File

@ -13,6 +13,8 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "radioSwatch" public static var identifier: String = "radioSwatch"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var color: Color = Color(uiColor: .mvmBlue) public var color: Color = Color(uiColor: .mvmBlue)
@ -29,6 +31,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -54,6 +57,7 @@ import MVMCore
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
@ -79,6 +83,7 @@ import MVMCore
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier) try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)

View File

@ -13,6 +13,8 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "radioSwatches" public static var identifier: String = "radioSwatches"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var swatches: [RadioSwatchModel] public var swatches: [RadioSwatchModel]
@ -43,6 +45,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -67,6 +70,7 @@ import MVMCore
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
swatches = try typeContainer.decode([RadioSwatchModel].self, forKey: .swatches) swatches = try typeContainer.decode([RadioSwatchModel].self, forKey: .swatches)
@ -81,6 +85,7 @@ import MVMCore
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier) try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)

View File

@ -13,6 +13,8 @@ public class ToggleModel: MoleculeModelProtocol, FormFieldProtocol {
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "toggle" public static var identifier: String = "toggle"
public var id: String = { return UUID().uuidString }()
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var backgroundColor: Color? public var backgroundColor: Color?
public var selected: Bool = false public var selected: Bool = false
@ -36,6 +38,7 @@ public class ToggleModel: MoleculeModelProtocol, FormFieldProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case state case state
case animated case animated
@ -86,6 +89,8 @@ public class ToggleModel: MoleculeModelProtocol, FormFieldProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) { if let state = try typeContainer.decodeIfPresent(Bool.self, forKey: .state) {
self.selected = state self.selected = state
} }
@ -128,6 +133,7 @@ public class ToggleModel: MoleculeModelProtocol, FormFieldProtocol {
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)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier) try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
try container.encodeModelIfPresent(action, forKey: .action) try container.encodeModelIfPresent(action, forKey: .action)

View File

@ -17,8 +17,9 @@ open class ArrowModel: MoleculeModelProtocol, EnableableModelProtocol {
public static var identifier: String { public static var identifier: String {
return "arrow" return "arrow"
} }
public var moleculeName: String? public var moleculeName: String?
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var disabledColor: Color = Color(uiColor: .mvmCoolGray3) public var disabledColor: Color = Color(uiColor: .mvmCoolGray3)
public var color: Color = Color(uiColor: .mvmBlack) public var color: Color = Color(uiColor: .mvmBlack)
@ -57,6 +58,7 @@ open class ArrowModel: MoleculeModelProtocol, EnableableModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case disabledColor case disabledColor
@ -75,7 +77,7 @@ open class ArrowModel: MoleculeModelProtocol, EnableableModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
if let disabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledColor) { if let disabledColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledColor) {
@ -113,6 +115,7 @@ open class ArrowModel: MoleculeModelProtocol, EnableableModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(disabledColor, forKey: .disabledColor) try container.encode(disabledColor, forKey: .disabledColor)

View File

@ -15,6 +15,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "caretView" public static var identifier: String = "caretView"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var strokeColor: Color = Color(uiColor: .mvmBlack) public var strokeColor: Color = Color(uiColor: .mvmBlack)
public var strokeColor_inverted: Color = Color(uiColor: .mvmWhite) public var strokeColor_inverted: Color = Color(uiColor: .mvmWhite)
@ -28,6 +29,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case strokeColor case strokeColor

View File

@ -18,6 +18,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro
return "" return ""
} }
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var moleculeName: String? public var moleculeName: String?
public var numberOfPages: Int = 0 public var numberOfPages: Int = 0
@ -44,6 +45,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case currentIndex case currentIndex

View File

@ -18,6 +18,8 @@ public enum CheckboxPosition: String, Codable {
@objcMembers open class CheckboxLabelModel: MoleculeModelProtocol { @objcMembers open class CheckboxLabelModel: MoleculeModelProtocol {
open class var identifier: String { "checkboxLabel" } open class var identifier: String { "checkboxLabel" }
public var moleculeName: String = CheckboxLabelModel.identifier public var moleculeName: String = CheckboxLabelModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var checkboxAlignment: CheckboxPosition? public var checkboxAlignment: CheckboxPosition?
public var checkbox: CheckboxModel public var checkbox: CheckboxModel

View File

@ -15,6 +15,8 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "dashLine" public static var identifier: String = "dashLine"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public var dashColor: Color = Color(uiColor: .mvmCoolGray3) public var dashColor: Color = Color(uiColor: .mvmCoolGray3)
@ -35,6 +37,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case accessibilityIdentifier case accessibilityIdentifier
@ -56,6 +59,8 @@ import MVMCore
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let dashColor = try typeContainer.decodeIfPresent(Color.self, forKey: .dashColor) { if let dashColor = try typeContainer.decodeIfPresent(Color.self, forKey: .dashColor) {
self.dashColor = dashColor self.dashColor = dashColor
} }
@ -74,6 +79,7 @@ import MVMCore
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(dashColor, forKey: .dashColor) try container.encode(dashColor, forKey: .dashColor)
try container.encode(isHidden, forKey: .isHidden) try container.encode(isHidden, forKey: .isHidden)

View File

@ -13,6 +13,7 @@
//-------------------------------------------------- //--------------------------------------------------
open class var identifier: String { "image" } open class var identifier: String { "image" }
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var moleculeName: String = ImageViewModel.identifier public var moleculeName: String = ImageViewModel.identifier
@ -45,6 +46,7 @@
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case image case image

View File

@ -7,13 +7,14 @@
// //
@objcMembers open class LabelModel: MoleculeModelProtocol, Identifiable { @objcMembers open class LabelModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
open class var identifier: String { "label" } open class var identifier: String { "label" }
public var id: String public var id: String
public var backgroundColor: Color? public var backgroundColor: Color?
public var text: String public var text: String
public var accessibilityText: String? public var accessibilityText: String?
@ -35,8 +36,8 @@
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case moleculeName
case id case id
case moleculeName
case text case text
case accessibilityText case accessibilityText
case textColor case textColor
@ -110,7 +111,7 @@
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encodeIfPresent(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(id, forKey: .id) try container.encode(id, forKey: .id)
try container.encode(text, forKey: .text) try container.encode(text, forKey: .text)
try container.encodeIfPresent(accessibilityText, forKey: .accessibilityText) try container.encodeIfPresent(accessibilityText, forKey: .accessibilityText)
try container.encodeIfPresent(textColor, forKey: .textColor) try container.encodeIfPresent(textColor, forKey: .textColor)

View File

@ -15,6 +15,8 @@ import UIKit
public static var identifier: String = "leftRightLabelView" public static var identifier: String = "leftRightLabelView"
public var moleculeName: String = LeftRightLabelModel.identifier public var moleculeName: String = LeftRightLabelModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var leftText: LabelModel public var leftText: LabelModel
public var rightText: LabelModel? public var rightText: LabelModel?

View File

@ -53,6 +53,8 @@ import VDSColorTokens
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "line" public static var identifier: String = "line"
public var id: String = { return UUID().uuidString }()
public var type: Style = .secondary public var type: Style = .secondary
public var frequency: Frequency? = .allExceptTop public var frequency: Frequency? = .allExceptTop
@ -120,6 +122,7 @@ import VDSColorTokens
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case type case type
case backgroundColor case backgroundColor
@ -138,6 +141,8 @@ import VDSColorTokens
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let type = try typeContainer.decodeIfPresent(Style.self, forKey: .type) { if let type = try typeContainer.decodeIfPresent(Style.self, forKey: .type) {
self.type = type self.type = type
} }
@ -158,6 +163,7 @@ import VDSColorTokens
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)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(id, forKey: .id)
try container.encode(type, forKey: .type) try container.encode(type, forKey: .type)
try container.encode(inverted, forKey: .inverted) try container.encode(inverted, forKey: .inverted)
try container.encodeIfPresent(frequency, forKey: .frequency) try container.encodeIfPresent(frequency, forKey: .frequency)

View File

@ -13,9 +13,10 @@ open class LoadingSpinnerModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "loadingSpinner"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public static var identifier: String = "loadingSpinner"
public var strokeColor = Color(uiColor: .mvmBlack) public var strokeColor = Color(uiColor: .mvmBlack)
public var lineWidth: CGFloat = 4 public var lineWidth: CGFloat = 4
public var diameter: CGFloat = 40 public var diameter: CGFloat = 40
@ -25,6 +26,7 @@ open class LoadingSpinnerModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case strokeColor case strokeColor
@ -45,6 +47,7 @@ open class LoadingSpinnerModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
if let diameter = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .diameter) { if let diameter = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .diameter) {
@ -62,6 +65,7 @@ open class LoadingSpinnerModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(diameter, forKey: .diameter) try container.encodeIfPresent(diameter, forKey: .diameter)

View File

@ -19,13 +19,17 @@ import Foundation
} }
@objcMembers public class MultiProgressBarModel: MoleculeModelProtocol { @objcMembers public class MultiProgressBarModel: MoleculeModelProtocol {
public static var identifier: String = "multiProgressBar" public static var identifier: String = "multiProgressBar"
public var id: String = { return UUID().uuidString }()
public var progressList: [SingleProgressBarModel] public var progressList: [SingleProgressBarModel]
public var backgroundColor: Color? public var backgroundColor: Color?
public var thickness: CGFloat? public var thickness: CGFloat?
public var roundedCorners: Bool? public var roundedCorners: Bool?
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case progressList case progressList
case thickness case thickness
@ -39,6 +43,7 @@ import Foundation
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
progressList = try typeContainer.decode([SingleProgressBarModel].self, forKey: .progressList) progressList = try typeContainer.decode([SingleProgressBarModel].self, forKey: .progressList)
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
thickness = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .thickness) thickness = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .thickness)
@ -47,6 +52,7 @@ import Foundation
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(progressList, forKey: .progressList) try container.encode(progressList, forKey: .progressList)
try container.encodeIfPresent(thickness, forKey: .thickness) try container.encodeIfPresent(thickness, forKey: .thickness)

View File

@ -10,6 +10,8 @@ import Foundation
@objcMembers public class ProgressBarModel: MoleculeModelProtocol { @objcMembers public class ProgressBarModel: MoleculeModelProtocol {
public static var identifier: String = "progressBar" public static var identifier: String = "progressBar"
public var id: String = { return UUID().uuidString }()
@Percent public var percent: CGFloat @Percent public var percent: CGFloat
public var color: Color = Color(uiColor: .mfCerulean()) public var color: Color = Color(uiColor: .mfCerulean())
public var backgroundColor: Color? = Color(uiColor: .mfLightSilver()) public var backgroundColor: Color? = Color(uiColor: .mfLightSilver())
@ -17,6 +19,7 @@ import Foundation
public var thickness: CGFloat? public var thickness: CGFloat?
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case roundedCorners case roundedCorners
case thickness case thickness
@ -31,6 +34,7 @@ import Foundation
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
percent = try typeContainer.decode(CGFloat.self, forKey: .percent) percent = try typeContainer.decode(CGFloat.self, forKey: .percent)
if let color = try typeContainer.decodeIfPresent(Color.self, forKey: .color) { if let color = try typeContainer.decodeIfPresent(Color.self, forKey: .color) {
self.color = color self.color = color
@ -44,6 +48,7 @@ import Foundation
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(percent, forKey: .percent) try container.encode(percent, forKey: .percent)
try container.encode(color, forKey: .color) try container.encode(color, forKey: .color)

View File

@ -13,6 +13,8 @@ open class StarModel: MoleculeModelProtocol {
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "star" public static var identifier: String = "star"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
@Percent public var percent: CGFloat = 0 @Percent public var percent: CGFloat = 0
public var borderColor: Color? public var borderColor: Color?
@ -23,6 +25,7 @@ open class StarModel: MoleculeModelProtocol {
// MARK: - Keys // MARK: - Keys
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case percent case percent
@ -43,6 +46,7 @@ open class StarModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let percent = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .percent) { if let percent = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .percent) {
self.percent = percent self.percent = percent
} }
@ -56,6 +60,7 @@ open class StarModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(percent, forKey: .percent) try container.encode(percent, forKey: .percent)

View File

@ -13,6 +13,8 @@ import MVMCore
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "stars" public static var identifier: String = "stars"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var starBackgroundColor: Color? public var starBackgroundColor: Color?
public var stars: [StarModel] public var stars: [StarModel]
@ -25,6 +27,7 @@ import MVMCore
// MARK: - Keys // MARK: - Keys
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case starBackgroundColor case starBackgroundColor
@ -48,6 +51,7 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
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)
stars = try typeContainer.decode([StarModel].self, forKey: .stars) stars = try typeContainer.decode([StarModel].self, forKey: .stars)
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
starBackgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .starBackgroundColor) starBackgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .starBackgroundColor)

View File

@ -15,6 +15,7 @@ open class TileletModel: MoleculeModelProtocol {
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "tilelet" public static var identifier: String = "tilelet"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var color: TileContainer.BackgroundColor public var color: TileContainer.BackgroundColor
public var padding: TileContainer.Padding public var padding: TileContainer.Padding

View File

@ -10,6 +10,7 @@ import Foundation
open class VideoModel: MoleculeModelProtocol, PageBehaviorProtocolRequirer { open class VideoModel: MoleculeModelProtocol, PageBehaviorProtocolRequirer {
public static var identifier = "video" public static var identifier = "video"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var video: String public var video: String
public var showControls = false public var showControls = false
@ -43,6 +44,7 @@ open class VideoModel: MoleculeModelProtocol, PageBehaviorProtocolRequirer {
private var resignActiveListener: Any? private var resignActiveListener: Any?
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case video case video
case showControls case showControls

View File

@ -12,6 +12,8 @@ import MVMCore
@objcMembers public class WebViewModel: MoleculeModelProtocol { @objcMembers public class WebViewModel: MoleculeModelProtocol {
public static var identifier: String = "webview" public static var identifier: String = "webview"
public var moleculeName: String = WebViewModel.identifier public var moleculeName: String = WebViewModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var url: URL? public var url: URL?
public var htmlString: String? public var htmlString: String?
@ -23,6 +25,7 @@ import MVMCore
} }
private enum CodingKeys: String, CodingKey{ private enum CodingKeys: String, CodingKey{
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case url case url
@ -39,6 +42,7 @@ import MVMCore
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
url = try typeContainer.decodeIfPresent(URL.self, forKey: .url) url = try typeContainer.decodeIfPresent(URL.self, forKey: .url)
htmlString = try typeContainer.decodeIfPresent(String.self, forKey: .htmlString) htmlString = try typeContainer.decodeIfPresent(String.self, forKey: .htmlString)
@ -51,6 +55,7 @@ import MVMCore
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(url, forKey: .url) try container.encodeIfPresent(url, forKey: .url)

View File

@ -19,6 +19,8 @@ public enum GraphStyle: String, Codable {
public class WheelModel: MoleculeModelProtocol { public class WheelModel: MoleculeModelProtocol {
public static var identifier: String = "wheel" public static var identifier: String = "wheel"
public var id: String = { return UUID().uuidString }()
public var style: GraphStyle = .unlimited { public var style: GraphStyle = .unlimited {
didSet { didSet {
updateStyle() updateStyle()
@ -43,6 +45,7 @@ public class WheelModel: MoleculeModelProtocol {
} }
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case style case style
case size case size
case diameter case diameter
@ -56,6 +59,8 @@ public class WheelModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let style = try typeContainer.decodeIfPresent(GraphStyle.self, forKey: .style) { if let style = try typeContainer.decodeIfPresent(GraphStyle.self, forKey: .style) {
self.style = style self.style = style
} }
@ -84,6 +89,7 @@ public class WheelModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(style, forKey: .style) try container.encode(style, forKey: .style)
try container.encode(size, forKey: .size) try container.encode(size, forKey: .size)

View File

@ -13,6 +13,8 @@ public class LockUpsPlanNamesModel: MoleculeModelProtocol {
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "planNamesLockup" public static var identifier: String = "planNamesLockup"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var headline: LabelModel public var headline: LabelModel
public var subHeadline: LabelModel public var subHeadline: LabelModel
@ -31,6 +33,7 @@ public class LockUpsPlanNamesModel: MoleculeModelProtocol {
// MARK: - Keys // MARK: - Keys
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case headline case headline
@ -43,6 +46,7 @@ public class LockUpsPlanNamesModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
headline = try typeContainer.decode(LabelModel.self, forKey: .headline) headline = try typeContainer.decode(LabelModel.self, forKey: .headline)
subHeadline = try typeContainer.decode(LabelModel.self, forKey: .subHeadline) subHeadline = try typeContainer.decode(LabelModel.self, forKey: .subHeadline)
@ -51,6 +55,7 @@ public class LockUpsPlanNamesModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(headline, forKey: .headline) try container.encode(headline, forKey: .headline)

View File

@ -14,6 +14,8 @@ public class LockupsPlanSMLXLModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "planLockup" public static var identifier: String = "planLockup"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var planLabel : LabelModel public var planLabel : LabelModel
public var headline : LabelModel public var headline : LabelModel
@ -43,6 +45,7 @@ public class LockupsPlanSMLXLModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case planLabel case planLabel
@ -57,6 +60,7 @@ public class LockupsPlanSMLXLModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
planLabel = try typeContainer.decode(LabelModel.self, forKey: .planLabel) planLabel = try typeContainer.decode(LabelModel.self, forKey: .planLabel)
headline = try typeContainer.decode(LabelModel.self, forKey: .headline) headline = try typeContainer.decode(LabelModel.self, forKey: .headline)
@ -67,6 +71,7 @@ public class LockupsPlanSMLXLModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(planLabel, forKey: .planLabel) try container.encode(planLabel, forKey: .planLabel)

View File

@ -16,6 +16,7 @@ public class TitleLockupModel: MoleculeModelProtocol, ParentMoleculeModelProtoco
public static var identifier: String = "titleLockup" public static var identifier: String = "titleLockup"
public var moleculeName: String = TitleLockupModel.identifier public var moleculeName: String = TitleLockupModel.identifier
public var id: String = { return UUID().uuidString }()
public var eyebrow: LabelModel? public var eyebrow: LabelModel?
public var title: LabelModel public var title: LabelModel
@ -130,6 +131,7 @@ public class TitleLockupModel: MoleculeModelProtocol, ParentMoleculeModelProtoco
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case eyebrow case eyebrow
@ -145,6 +147,7 @@ public class TitleLockupModel: MoleculeModelProtocol, ParentMoleculeModelProtoco
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
title = try typeContainer.decodeMolecule(codingKey: .title) title = try typeContainer.decodeMolecule(codingKey: .title)
eyebrow = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .eyebrow) eyebrow = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .eyebrow)
subTitle = try typeContainer.decodeMoleculeIfPresent(codingKey: .subTitle) subTitle = try typeContainer.decodeMoleculeIfPresent(codingKey: .subTitle)
@ -164,6 +167,7 @@ public class TitleLockupModel: MoleculeModelProtocol, ParentMoleculeModelProtoco
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(eyebrow, forKey: .eyebrow) try container.encodeIfPresent(eyebrow, forKey: .eyebrow)
try container.encodeModel(title, forKey: .title) try container.encodeModel(title, forKey: .title)

View File

@ -14,9 +14,11 @@ import Foundation
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public var backgroundColor: Color?
public static var identifier: String = "doughnutChartItem" public static var identifier: String = "doughnutChartItem"
public var moleculeName: String = DoughnutChartItemModel.identifier public var moleculeName: String = DoughnutChartItemModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color?
public var label: LabelModel public var label: LabelModel
@Percent public var percent: CGFloat @Percent public var percent: CGFloat
public var color: Color public var color: Color

View File

@ -14,9 +14,11 @@ import Foundation
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public var backgroundColor: Color?
public static var identifier: String = "doughnutChart" public static var identifier: String = "doughnutChart"
public var moleculeName: String = DoughnutChartModel.identifier public var moleculeName: String = DoughnutChartModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color?
public var title: LabelModel? public var title: LabelModel?
public var subtitle: LabelModel? public var subtitle: LabelModel?
public var sections: [DoughnutChartItemModel] public var sections: [DoughnutChartItemModel]

View File

@ -15,6 +15,8 @@ public class ImageHeadlineBodyModel: MoleculeModelProtocol {
public static var identifier: String = "imageHeadlineBody" public static var identifier: String = "imageHeadlineBody"
public var moleculeName: String = ImageHeadlineBodyModel.identifier public var moleculeName: String = ImageHeadlineBodyModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var image: ImageViewModel public var image: ImageViewModel
public var headlineBody: HeadlineBodyModel public var headlineBody: HeadlineBodyModel

View File

@ -15,6 +15,8 @@ import MVMCore
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "radioButtonLabel" public static var identifier: String = "radioButtonLabel"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var moleculeName: String = RadioButtonLabelModel.identifier public var moleculeName: String = RadioButtonLabelModel.identifier
public var radioButton: RadioButtonModel public var radioButton: RadioButtonModel

View File

@ -11,6 +11,8 @@ import VDSColorTokens
open class TabBarModel: MoleculeModelProtocol { open class TabBarModel: MoleculeModelProtocol {
public static var identifier: String = "tabBar" public static var identifier: String = "tabBar"
public var id: String = { return UUID().uuidString }()
open var tabs: [TabBarItemModel] open var tabs: [TabBarItemModel]
private var _backgroundColor: Color? private var _backgroundColor: Color?
@ -58,6 +60,7 @@ open class TabBarModel: MoleculeModelProtocol {
open var selectedTab: Int = 0 open var selectedTab: Int = 0
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case tabs case tabs
@ -73,6 +76,7 @@ open class TabBarModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
tabs = try typeContainer.decode([TabBarItemModel].self, forKey: .tabs) tabs = try typeContainer.decode([TabBarItemModel].self, forKey: .tabs)
if let color = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) { if let color = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) {
backgroundColor = color backgroundColor = color
@ -93,6 +97,7 @@ open class TabBarModel: MoleculeModelProtocol {
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(tabs, forKey: .tabs) try container.encode(tabs, forKey: .tabs)
try container.encodeIfPresent(_backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(_backgroundColor, forKey: .backgroundColor)

View File

@ -11,6 +11,8 @@ import VDSColorTokens
open class TabsModel: MoleculeModelProtocol { open class TabsModel: MoleculeModelProtocol {
public static var identifier: String = "tabs" public static var identifier: String = "tabs"
public var id: String = { return UUID().uuidString }()
open var tabs: [TabItemModel] open var tabs: [TabItemModel]
open var style: NavigationItemStyle? open var style: NavigationItemStyle?
@ -71,6 +73,7 @@ open class TabsModel: MoleculeModelProtocol {
open var selectedIndex: Int = 0 open var selectedIndex: Int = 0
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case tabs case tabs
case backgroundColor case backgroundColor
@ -87,6 +90,7 @@ open class TabsModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
tabs = try typeContainer.decode([TabItemModel].self, forKey: .tabs) tabs = try typeContainer.decode([TabItemModel].self, forKey: .tabs)
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
_selectedColor = try typeContainer.decodeIfPresent(Color.self, forKey: .selectedColor) _selectedColor = try typeContainer.decodeIfPresent(Color.self, forKey: .selectedColor)
@ -100,6 +104,7 @@ open class TabsModel: MoleculeModelProtocol {
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(tabs, forKey: .tabs) try container.encode(tabs, forKey: .tabs)
try container.encodeIfPresent(_backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(_backgroundColor, forKey: .backgroundColor)

View File

@ -15,6 +15,7 @@ public class TwoButtonViewModel: ParentMoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "twoButtonView" public static var identifier: String = "twoButtonView"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var primaryButton: ButtonModel? public var primaryButton: ButtonModel?
public var secondaryButton: ButtonModel? public var secondaryButton: ButtonModel?

View File

@ -10,11 +10,14 @@ import Foundation
public class TwoLinkViewModel: MoleculeModelProtocol { public class TwoLinkViewModel: MoleculeModelProtocol {
public static var identifier: String = "twoLinkView" public static var identifier: String = "twoLinkView"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var rightLink: LinkModel? public var rightLink: LinkModel?
public var leftLink: LinkModel? public var leftLink: LinkModel?
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case rightLink case rightLink
@ -28,6 +31,7 @@ public class TwoLinkViewModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
rightLink = try typeContainer.decodeIfPresent(LinkModel.self, forKey: .rightLink) rightLink = try typeContainer.decodeIfPresent(LinkModel.self, forKey: .rightLink)
leftLink = try typeContainer.decodeIfPresent(LinkModel.self, forKey: .leftLink) leftLink = try typeContainer.decodeIfPresent(LinkModel.self, forKey: .leftLink)
@ -35,6 +39,7 @@ public class TwoLinkViewModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(rightLink, forKey: .rightLink) try container.encodeIfPresent(rightLink, forKey: .rightLink)

View File

@ -11,6 +11,8 @@ import Foundation
public class ActionDetailWithImageModel: MoleculeModelProtocol { public class ActionDetailWithImageModel: MoleculeModelProtocol {
public static var identifier: String = "actionDetailWithImage" public static var identifier: String = "actionDetailWithImage"
public var moleculeName: String = ActionDetailWithImageModel.identifier public var moleculeName: String = ActionDetailWithImageModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var headlineBodyButton: HeadlineBodyButtonModel public var headlineBodyButton: HeadlineBodyButtonModel
public var image: ImageViewModel public var image: ImageViewModel

View File

@ -11,6 +11,7 @@ import MVMCore
public class CornerLabelsModel: ParentMoleculeModelProtocol { public class CornerLabelsModel: ParentMoleculeModelProtocol {
public static var identifier: String = "cornerLabels" public static var identifier: String = "cornerLabels"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var topLeftLabel: LabelModel? public var topLeftLabel: LabelModel?
public var topRightLabel: LabelModel? public var topRightLabel: LabelModel?

View File

@ -10,6 +10,7 @@ import Foundation
public class HeadlineBodyLinkToggleModel: MoleculeModelProtocol { public class HeadlineBodyLinkToggleModel: MoleculeModelProtocol {
public static var identifier: String = "headlineBodyLinkToggle" public static var identifier: String = "headlineBodyLinkToggle"
public var moleculeName: String = HeadlineBodyLinkToggleModel.identifier public var moleculeName: String = HeadlineBodyLinkToggleModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var headlineBodyLink: HeadlineBodyLinkModel public var headlineBodyLink: HeadlineBodyLinkModel
public var toggle: ToggleModel public var toggle: ToggleModel

View File

@ -12,6 +12,7 @@ import Foundation
open class HeadlineBodyToggleModel: MoleculeModelProtocol { open class HeadlineBodyToggleModel: MoleculeModelProtocol {
public static var identifier: String = "headlineBodyToggle" public static var identifier: String = "headlineBodyToggle"
public var moleculeName: String = HeadlineBodyToggleModel.identifier public var moleculeName: String = HeadlineBodyToggleModel.identifier
public var id: String = { return UUID().uuidString }()
open var backgroundColor: Color? open var backgroundColor: Color?
open var headlineBody: HeadlineBodyModel open var headlineBody: HeadlineBodyModel
open var toggle: ToggleModel open var toggle: ToggleModel

View File

@ -12,6 +12,8 @@ import MVMCore
public class LabelToggleModel: MoleculeModelProtocol { public class LabelToggleModel: MoleculeModelProtocol {
public static var identifier: String = "labelToggle" public static var identifier: String = "labelToggle"
public var moleculeName: String = LabelToggleModel.identifier public var moleculeName: String = LabelToggleModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var label: LabelModel public var label: LabelModel
public var toggle: ToggleModel public var toggle: ToggleModel
@ -22,6 +24,7 @@ public class LabelToggleModel: MoleculeModelProtocol {
} }
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case label case label
@ -30,6 +33,7 @@ public class LabelToggleModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey:.backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey:.backgroundColor)
label = try typeContainer.decode(LabelModel.self, forKey:.label) label = try typeContainer.decode(LabelModel.self, forKey:.label)
toggle = try typeContainer.decode(ToggleModel.self, forKey:.toggle) toggle = try typeContainer.decode(ToggleModel.self, forKey:.toggle)
@ -38,6 +42,7 @@ public class LabelToggleModel: MoleculeModelProtocol {
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)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(label, forKey: .label) try container.encode(label, forKey: .label)
try container.encode(toggle, forKey: .toggle) try container.encode(toggle, forKey: .toggle)

View File

@ -13,9 +13,11 @@ public class NavigationImageButtonModel: NavigationButtonModelProtocol, Molecule
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "navigationImageButton"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var accessibilityIdentifier: String? public var accessibilityIdentifier: String?
public static var identifier: String = "navigationImageButton"
public var image: String public var image: String
public var action: ActionModelProtocol public var action: ActionModelProtocol
public var accessibilityText: String? public var accessibilityText: String?
@ -35,6 +37,7 @@ public class NavigationImageButtonModel: NavigationButtonModelProtocol, Molecule
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case image case image
case action case action
case accessibilityIdentifier case accessibilityIdentifier
@ -60,6 +63,7 @@ public class NavigationImageButtonModel: NavigationButtonModelProtocol, Molecule
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(image, forKey: .image) try container.encode(image, forKey: .image)
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier) try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)

View File

@ -12,8 +12,10 @@ open class NavigationLabelButtonModel: NavigationButtonModelProtocol, MoleculeMo
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
open var backgroundColor: Color?
open class var identifier: String { "navigationLabelButton" } open class var identifier: String { "navigationLabelButton" }
public var id: String = { return UUID().uuidString }()
open var backgroundColor: Color?
open var accessibilityIdentifier: String? open var accessibilityIdentifier: String?
open var title: String open var title: String
open var action: ActionModelProtocol open var action: ActionModelProtocol
@ -32,6 +34,7 @@ open class NavigationLabelButtonModel: NavigationButtonModelProtocol, MoleculeMo
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case accessibilityIdentifier case accessibilityIdentifier
case title case title
@ -44,6 +47,7 @@ open class NavigationLabelButtonModel: NavigationButtonModelProtocol, MoleculeMo
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
title = try typeContainer.decode(String.self, forKey: .title) title = try typeContainer.decode(String.self, forKey: .title)
action = try typeContainer.decodeModel(codingKey: .action) action = try typeContainer.decodeModel(codingKey: .action)
@ -51,6 +55,7 @@ open class NavigationLabelButtonModel: NavigationButtonModelProtocol, MoleculeMo
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier) try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
try container.encode(title, forKey: .title) try container.encode(title, forKey: .title)

View File

@ -19,6 +19,7 @@ open class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProtoc
//-------------------------------------------------- //--------------------------------------------------
open class var identifier: String { "navigationBar" } open class var identifier: String { "navigationBar" }
public var id: String = { return UUID().uuidString }()
private let defaultHidesSystemBackButton = true private let defaultHidesSystemBackButton = true
@ -74,6 +75,7 @@ open class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProtoc
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case title case title
case hidden case hidden
@ -96,6 +98,7 @@ open class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProtoc
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
title = try typeContainer.decodeIfPresent(String.self, forKey: .title) title = try typeContainer.decodeIfPresent(String.self, forKey: .title)
if let hidden = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidden) { if let hidden = try typeContainer.decodeIfPresent(Bool.self, forKey: .hidden) {
self.hidden = hidden self.hidden = hidden
@ -122,6 +125,7 @@ open class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProtoc
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(title, forKey: .title) try container.encodeIfPresent(title, forKey: .title)
try container.encode(hidden, forKey: .hidden) try container.encode(hidden, forKey: .hidden)

View File

@ -9,11 +9,15 @@
import Foundation import Foundation
open class ModuleMoleculeModel: MoleculeModelProtocol { open class ModuleMoleculeModel: MoleculeModelProtocol {
public var backgroundColor: Color?
public static var identifier: String = "moduleMolecule" public static var identifier: String = "moduleMolecule"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color?
public var moduleName: String public var moduleName: String
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moduleName case moduleName
} }
@ -23,11 +27,13 @@ open class ModuleMoleculeModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
moduleName = try typeContainer.decode(String.self, forKey:.moduleName) moduleName = try typeContainer.decode(String.self, forKey:.moduleName)
} }
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)
try container.encode(id, forKey: .id)
try container.encode(moduleName, forKey: .moduleName) try container.encode(moduleName, forKey: .moduleName)
} }
} }

View File

@ -10,12 +10,16 @@ import Foundation
import MVMCore import MVMCore
public class NotificationXButtonModel: ButtonModelProtocol, MoleculeModelProtocol { public class NotificationXButtonModel: ButtonModelProtocol, MoleculeModelProtocol {
public static var identifier: String = "notificationXButton" public static var identifier: String = "notificationXButton"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var color: Color? public var color: Color?
public var action: ActionModelProtocol = ActionNoopModel() public var action: ActionModelProtocol = ActionNoopModel()
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case color case color
case action case action
@ -28,6 +32,7 @@ public class NotificationXButtonModel: ButtonModelProtocol, MoleculeModelProtoco
public required init(from decoder: Decoder) throws { public required init(from decoder: Decoder) throws {
let typeContainer = try decoder.container(keyedBy: CodingKeys.self) let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
color = try typeContainer.decodeIfPresent(Color.self, forKey: .color) color = try typeContainer.decodeIfPresent(Color.self, forKey: .color)
if let action: ActionModelProtocol = try typeContainer.decodeModelIfPresent(codingKey: .action) { if let action: ActionModelProtocol = try typeContainer.decodeModelIfPresent(codingKey: .action) {
self.action = action self.action = action
@ -36,6 +41,7 @@ public class NotificationXButtonModel: ButtonModelProtocol, MoleculeModelProtoco
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(color, forKey: .color) try container.encodeIfPresent(color, forKey: .color)
try container.encodeModel(action, forKey: .action) try container.encodeModel(action, forKey: .action)

View File

@ -13,6 +13,7 @@ public class EyebrowHeadlineBodyLinkModel: MoleculeModelProtocol, ParentMolecule
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "eyebrowHeadlineBodyLink" public static var identifier: String = "eyebrowHeadlineBodyLink"
public var id: String = { return UUID().uuidString }()
public var moleculeName: String = EyebrowHeadlineBodyLinkModel.identifier public var moleculeName: String = EyebrowHeadlineBodyLinkModel.identifier
public var backgroundColor: Color? public var backgroundColor: Color?
public var eyebrow: LabelModel? public var eyebrow: LabelModel?
@ -56,6 +57,7 @@ public class EyebrowHeadlineBodyLinkModel: MoleculeModelProtocol, ParentMolecule
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case eyebrow case eyebrow
@ -70,6 +72,7 @@ public class EyebrowHeadlineBodyLinkModel: MoleculeModelProtocol, ParentMolecule
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
eyebrow = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .eyebrow) eyebrow = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .eyebrow)
headline = try typeContainer.decodeMoleculeIfPresent(codingKey: .headline) headline = try typeContainer.decodeMoleculeIfPresent(codingKey: .headline)
@ -84,6 +87,7 @@ public class EyebrowHeadlineBodyLinkModel: MoleculeModelProtocol, ParentMolecule
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeIfPresent(eyebrow, forKey: .eyebrow) try container.encodeIfPresent(eyebrow, forKey: .eyebrow)

View File

@ -14,6 +14,8 @@ public class HeadlineBodyButtonModel: MoleculeModelProtocol {
public static var identifier: String = "headlineBodyButton" public static var identifier: String = "headlineBodyButton"
public var moleculeName: String = HeadlineBodyButtonModel.identifier public var moleculeName: String = HeadlineBodyButtonModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var headlineBody: HeadlineBodyModel public var headlineBody: HeadlineBodyModel
@ -45,6 +47,7 @@ public class HeadlineBodyButtonModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case headlineBody case headlineBody
@ -58,6 +61,7 @@ public class HeadlineBodyButtonModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
headlineBody = try typeContainer.decode(HeadlineBodyModel.self, forKey: .headlineBody) headlineBody = try typeContainer.decode(HeadlineBodyModel.self, forKey: .headlineBody)
button = try typeContainer.decode(ButtonModel.self, forKey: .button) button = try typeContainer.decode(ButtonModel.self, forKey: .button)
@ -67,6 +71,7 @@ public class HeadlineBodyButtonModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(headlineBody, forKey: .headlineBody) try container.encode(headlineBody, forKey: .headlineBody)

View File

@ -61,6 +61,7 @@ public class HeadlineBodyCaretLinkImageModel: ContainerModel, MoleculeModelProto
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case headlineBody case headlineBody

View File

@ -16,6 +16,8 @@ public class HeadlineBodyLinkModel: MoleculeModelProtocol {
public static var identifier: String = "headlineBodyLink" public static var identifier: String = "headlineBodyLink"
public var moleculeName: String = HeadlineBodyLinkModel.identifier public var moleculeName: String = HeadlineBodyLinkModel.identifier
public var id: String = { return UUID().uuidString }()
public var headlineBody: HeadlineBodyModel public var headlineBody: HeadlineBodyModel
public var link: LinkModel public var link: LinkModel
public var backgroundColor: Color? public var backgroundColor: Color?

View File

@ -14,8 +14,10 @@
public static var identifier: String = "headlineBody" public static var identifier: String = "headlineBody"
public var moleculeName: String = HeadlineBodyModel.identifier public var moleculeName: String = HeadlineBodyModel.identifier
public var id: String = { return UUID().uuidString }()
public var headline: LabelModel? public var headline: LabelModel?
public var body: LabelModel? public var body: LabelModel?
public var another: LabelToggle?
public var style: Style? public var style: Style?
public var backgroundColor: Color? public var backgroundColor: Color?
@ -23,6 +25,15 @@
[headline, body].compactMap { $0 } [headline, body].compactMap { $0 }
} }
public func replaceChildMolecule(with replacementMolecule: MoleculeModelProtocol) -> Bool {
return [
\HeadlineBodyModel.headline,
\HeadlineBodyModel.body,
].contains {
replaceChildMolecule(on: self, keyPath: $0, replacementMolecule: replacementMolecule)
}
}
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Enum // MARK: - Enum
//-------------------------------------------------- //--------------------------------------------------
@ -57,6 +68,7 @@
//----------------------------------------------------- //-----------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case headline case headline
case body case body
@ -66,6 +78,7 @@
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
headline = try typeContainer.decodeMoleculeIfPresent(codingKey: .headline) headline = try typeContainer.decodeMoleculeIfPresent(codingKey: .headline)
body = try typeContainer.decodeMoleculeIfPresent(codingKey: .body) body = try typeContainer.decodeMoleculeIfPresent(codingKey: .body)
style = try typeContainer.decodeIfPresent(Style.self, forKey: .style) style = try typeContainer.decodeIfPresent(Style.self, forKey: .style)
@ -74,6 +87,7 @@
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(headline, forKey: .headline) try container.encodeIfPresent(headline, forKey: .headline)
try container.encodeIfPresent(body, forKey: .body) try container.encodeIfPresent(body, forKey: .body)

View File

@ -13,6 +13,8 @@ public class StringAndMoleculeModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
public static var identifier: String = "stringAndMoleculeModel" public static var identifier: String = "stringAndMoleculeModel"
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var string: String public var string: String
public var molecule: MoleculeModelProtocol public var molecule: MoleculeModelProtocol
@ -33,6 +35,7 @@ public class StringAndMoleculeModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case string case string
@ -46,6 +49,7 @@ public class StringAndMoleculeModel: MoleculeModelProtocol {
public required init(from decoder: Decoder) throws { public required init(from decoder: Decoder) throws {
let typeContainer = try decoder.container(keyedBy: CodingKeys.self) let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
string = try typeContainer.decode(String.self, forKey: .string) string = try typeContainer.decode(String.self, forKey: .string)
molecule = try typeContainer.decodeModel(codingKey: .molecule) molecule = try typeContainer.decodeModel(codingKey: .molecule)
@ -54,6 +58,7 @@ public class StringAndMoleculeModel: MoleculeModelProtocol {
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)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(string, forKey: .string) try container.encode(string, forKey: .string)
try container.encodeModel(molecule, forKey: .molecule) try container.encodeModel(molecule, forKey: .molecule)

View File

@ -16,6 +16,8 @@ public class ThreeHeadlineBodyLinkModel: MoleculeModelProtocol {
public static var identifier: String = "threeHeadlineBodyLink" public static var identifier: String = "threeHeadlineBodyLink"
public var moleculeName: String = ThreeHeadlineBodyLinkModel.identifier public var moleculeName: String = ThreeHeadlineBodyLinkModel.identifier
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var headline1: LabelModel public var headline1: LabelModel
@ -41,6 +43,7 @@ public class ThreeHeadlineBodyLinkModel: MoleculeModelProtocol {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case headline1 case headline1
@ -56,6 +59,7 @@ public class ThreeHeadlineBodyLinkModel: MoleculeModelProtocol {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
headline1 = try typeContainer.decode(LabelModel.self, forKey: .headline1) headline1 = try typeContainer.decode(LabelModel.self, forKey: .headline1)
headline2 = try typeContainer.decode(LabelModel.self, forKey: .headline2) headline2 = try typeContainer.decode(LabelModel.self, forKey: .headline2)
@ -67,6 +71,7 @@ public class ThreeHeadlineBodyLinkModel: MoleculeModelProtocol {
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)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encode(headline1, forKey: .headline1) try container.encode(headline1, forKey: .headline1)
try container.encode(headline2, forKey: .headline2) try container.encode(headline2, forKey: .headline2)

View File

@ -19,6 +19,8 @@ import UIKit
return "carousel" return "carousel"
} }
public var id: String = { return UUID().uuidString }()
public var backgroundColor: Color? public var backgroundColor: Color?
public var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol] public var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol]
public var index: Int = 0 public var index: Int = 0
@ -78,6 +80,7 @@ import UIKit
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case moleculeName case moleculeName
case backgroundColor case backgroundColor
case molecules case molecules
@ -108,6 +111,7 @@ import UIKit
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
molecules = try typeContainer.decodeModels(codingKey: .molecules) molecules = try typeContainer.decodeModels(codingKey: .molecules)
index = try typeContainer.decodeIfPresent(Int.self, forKey: .index) ?? 0 index = try typeContainer.decodeIfPresent(Int.self, forKey: .index) ?? 0
selectable = try typeContainer.decodeIfPresent(Bool.self, forKey: .selectable) ?? false selectable = try typeContainer.decodeIfPresent(Bool.self, forKey: .selectable) ?? false
@ -144,6 +148,7 @@ import UIKit
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)
try container.encode(id, forKey: .id)
try container.encode(moleculeName, forKey: .moleculeName) try container.encode(moleculeName, forKey: .moleculeName)
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
try container.encodeModels(molecules, forKey: .molecules) try container.encodeModels(molecules, forKey: .molecules)

View File

@ -5,10 +5,10 @@ public enum MolecularError: Swift.Error {
case countImbalance(String) case countImbalance(String)
} }
public protocol MoleculeModelProtocol: ModelProtocol, AccessibilityModelProtocol, MoleculeTreeTraversalProtocol, MoleculeMaskingProtocol { public protocol MoleculeModelProtocol: ModelProtocol, AccessibilityModelProtocol, MoleculeTreeTraversalProtocol, MoleculeMaskingProtocol {
var moleculeName: String { get } var moleculeName: String { get }
var backgroundColor: Color? { get set } var backgroundColor: Color? { get set }
var id: String { get }
} }
public extension MoleculeModelProtocol { public extension MoleculeModelProtocol {
@ -20,7 +20,6 @@ public extension MoleculeModelProtocol {
static var categoryCodingKey: String { "moleculeName" } static var categoryCodingKey: String { "moleculeName" }
} }
// Helpers made due to swift not able to reconcile which category. // Helpers made due to swift not able to reconcile which category.
extension KeyedDecodingContainer where Key: CodingKey { extension KeyedDecodingContainer where Key: CodingKey {
/// Decodes to a registered molecule based on the identifier /// Decodes to a registered molecule based on the identifier
@ -53,8 +52,9 @@ public extension MoleculeModelProtocol {
} }
// Base case. No additional children to traverse. // Base case. No additional children to traverse.
func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol)->Void) { func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol, inout Bool)->Void) {
onVisit(depth, self) var stop = false
onVisit(depth, self, &stop)
} }
} }
@ -67,7 +67,7 @@ public extension Array where Element == MoleculeModelProtocol {
} }
} }
func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol)->Void) { func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol, inout Bool) -> Void) {
forEach { (molecule) in forEach { (molecule) in
molecule.depthFirstTraverse(options: options, depth: depth, onVisit: onVisit) molecule.depthFirstTraverse(options: options, depth: depth, onVisit: onVisit)
} }

View File

@ -8,10 +8,11 @@
import Foundation import Foundation
public protocol ParentMoleculeModelProtocol: MoleculeModelProtocol { public protocol ParentMoleculeModelProtocol: MoleculeModelProtocol, AnyObject {
var children: [MoleculeModelProtocol] { get } var children: [MoleculeModelProtocol] { get }
func replaceChildMolecule(with molecule: MoleculeModelProtocol) -> Bool
} }
public extension ParentMoleculeModelProtocol { public extension ParentMoleculeModelProtocol {
@ -35,21 +36,36 @@ public extension ParentMoleculeModelProtocol {
return result return result
} }
func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol)->Void) { func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol, inout Bool)->Void) {
var stop = false
if (options == .parentFirst) { if (options == .parentFirst) {
onVisit(depth, self) onVisit(depth, self, &stop)
guard !stop else { return }
} }
children.forEach { (molecule) in for child in children {
if let additionalParent = molecule as? ParentMoleculeModelProtocol { if let additionalParent = child as? ParentMoleculeModelProtocol {
// Safety net to make sure the ParentMoleculeModelProtocol's method extension is called over the base MoleculeModelProtocol. // Safety net to make sure the ParentMoleculeModelProtocol's method extension is called over the base MoleculeModelProtocol.
additionalParent.depthFirstTraverse(options: options, depth: depth + 1, onVisit: onVisit) additionalParent.depthFirstTraverse(options: options, depth: depth + 1, onVisit: onVisit)
} else { } else {
molecule.depthFirstTraverse(options: options, depth: depth + 1, onVisit: onVisit) child.depthFirstTraverse(options: options, depth: depth + 1, onVisit: onVisit)
} }
guard !stop else { return }
} }
if (options == .childFirst) { if (options == .childFirst) {
onVisit(depth, self) onVisit(depth, self, &stop)
} }
// if options == .leafOnly don't call on self. // if options == .leafOnly don't call on self.
} }
/// Top level test to replace child molecules. Each parent molecule should attempt to replace.
func replaceChildMolecule(with molecule: MoleculeModelProtocol) -> Bool { return false }
/// Helper function for replacing molecules on a path.
func replaceChildMolecule<P: ParentMoleculeModelProtocol, T: MoleculeModelProtocol>(on target: P, keyPath: ReferenceWritableKeyPath<P, T?>, replacementMolecule: MoleculeModelProtocol) -> Bool {
if let currentMolecule = target[keyPath: keyPath], currentMolecule.id == replacementMolecule.id, let newHeadline = replacementMolecule as? T {
target[keyPath: keyPath] = newHeadline
return true
}
return false
}
} }

View File

@ -30,7 +30,7 @@ public extension TemplateModelProtocol {
return rootMolecules.reduceDepthFirstTraverse(options: options, depth: depth, initialResult: initialResult, nextPartialResult: nextPartialResult) return rootMolecules.reduceDepthFirstTraverse(options: options, depth: depth, initialResult: initialResult, nextPartialResult: nextPartialResult)
} }
func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol) -> Void) { func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol, inout Bool) -> Void) {
return rootMolecules.depthFirstTraverse(options: options, depth: depth, onVisit: onVisit) return rootMolecules.depthFirstTraverse(options: options, depth: depth, onVisit: onVisit)
} }
} }

View File

@ -19,7 +19,7 @@ public protocol MoleculeTreeTraversalProtocol {
func reduceDepthFirstTraverse<Result>(options: TreeTraversalOptions, depth: Int, initialResult: Result, nextPartialResult: (Result, MoleculeModelProtocol, Int)->Result) -> Result func reduceDepthFirstTraverse<Result>(options: TreeTraversalOptions, depth: Int, initialResult: Result, nextPartialResult: (Result, MoleculeModelProtocol, Int)->Result) -> Result
func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol)->Void) func depthFirstTraverse(options: TreeTraversalOptions, depth: Int, onVisit: (Int, MoleculeModelProtocol, inout Bool)->Void)
//func breadthFirstTraverse() //func breadthFirstTraverse()
} }
@ -37,7 +37,7 @@ public extension MoleculeTreeTraversalProtocol {
} }
func printMolecules(options: TreeTraversalOptions = .parentFirst) { func printMolecules(options: TreeTraversalOptions = .parentFirst) {
depthFirstTraverse(options: options, depth: 1) { (depth, molecule) in depthFirstTraverse(options: options, depth: 1) { depth, molecule, stop in
print("\(String(repeating: ">>", count: depth)) \"\(molecule.moleculeName)\" [\(molecule)]") print("\(String(repeating: ">>", count: depth)) \"\(molecule.moleculeName)\" [\(molecule)]")
} }
} }
@ -50,4 +50,11 @@ public extension MoleculeTreeTraversalProtocol {
return accumulator return accumulator
} }
} }
func replaceMolecule(with replacementMolecule: MoleculeModelProtocol) {
depthFirstTraverse(options: .parentFirst, depth: 0) { depth, molecule, stop in
guard let parentMolecule = molecule as? ParentMoleculeModelProtocol else { return }
stop = parentMolecule.replaceChildMolecule(with: replacementMolecule)
}
}
} }

View File

@ -13,6 +13,8 @@ open class ContainerModel: ContainerModelProtocol, Codable {
// MARK: - Properties // MARK: - Properties
//-------------------------------------------------- //--------------------------------------------------
public var id: String = { return UUID().uuidString }()
public var horizontalAlignment: UIStackView.Alignment? public var horizontalAlignment: UIStackView.Alignment?
public var useHorizontalMargins: Bool? public var useHorizontalMargins: Bool?
public var leftPadding: CGFloat? public var leftPadding: CGFloat?
@ -30,6 +32,7 @@ open class ContainerModel: ContainerModelProtocol, Codable {
//-------------------------------------------------- //--------------------------------------------------
private enum CodingKeys: String, CodingKey { private enum CodingKeys: String, CodingKey {
case id
case horizontalAlignment case horizontalAlignment
case useHorizontalMargins case useHorizontalMargins
case leftPadding case leftPadding
@ -74,6 +77,9 @@ open class ContainerModel: ContainerModelProtocol, Codable {
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)
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
if let verticalAlignmentString = try typeContainer.decodeIfPresent(String.self, forKey: .verticalAlignment) { if let verticalAlignmentString = try typeContainer.decodeIfPresent(String.self, forKey: .verticalAlignment) {
verticalAlignment = ContainerHelper.getAlignment(for: verticalAlignmentString) verticalAlignment = ContainerHelper.getAlignment(for: verticalAlignmentString)
} }
@ -92,6 +98,7 @@ open class ContainerModel: ContainerModelProtocol, Codable {
open func encode(to encoder: Encoder) throws { open func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id)
try container.encodeIfPresent(ContainerHelper.getAlignmentString(for: verticalAlignment), forKey: .verticalAlignment) try container.encodeIfPresent(ContainerHelper.getAlignmentString(for: verticalAlignment), forKey: .verticalAlignment)
try container.encodeIfPresent(ContainerHelper.getAlignmentString(for: horizontalAlignment), forKey: .horizontalAlignment) try container.encodeIfPresent(ContainerHelper.getAlignmentString(for: horizontalAlignment), forKey: .horizontalAlignment)
try container.encodeIfPresent(useHorizontalMargins, forKey: .useHorizontalMargins) try container.encodeIfPresent(useHorizontalMargins, forKey: .useHorizontalMargins)