Further cleaning
This commit is contained in:
parent
7fdff34eeb
commit
7a86b0356b
@ -192,6 +192,8 @@
|
||||
C7192E7D23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */; };
|
||||
C7F8012123E8303200396FBD /* ListRVWheel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7F8012023E8303200396FBD /* ListRVWheel.swift */; };
|
||||
C7F8012323E846C300396FBD /* ListRVWheelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7F8012223E846C300396FBD /* ListRVWheelModel.swift */; };
|
||||
D202AFE4242A5F5E00E5BEDF /* NSTextAlignment+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D202AFE3242A5F5E00E5BEDF /* NSTextAlignment+Extension.swift */; };
|
||||
D202AFE6242A6A9C00E5BEDF /* UICollectionViewScrollPosition+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D202AFE5242A6A9C00E5BEDF /* UICollectionViewScrollPosition+Extension.swift */; };
|
||||
D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; };
|
||||
D20FB165241A5D75004AFC3A /* NavigationItemModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20FB164241A5D75004AFC3A /* NavigationItemModelProtocol.swift */; };
|
||||
D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; };
|
||||
@ -573,6 +575,8 @@
|
||||
C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeadLineBodyCaretLinkImage.swift; sourceTree = "<group>"; };
|
||||
C7F8012023E8303200396FBD /* ListRVWheel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListRVWheel.swift; sourceTree = "<group>"; };
|
||||
C7F8012223E846C300396FBD /* ListRVWheelModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRVWheelModel.swift; sourceTree = "<group>"; };
|
||||
D202AFE3242A5F5E00E5BEDF /* NSTextAlignment+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSTextAlignment+Extension.swift"; sourceTree = "<group>"; };
|
||||
D202AFE5242A6A9C00E5BEDF /* UICollectionViewScrollPosition+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionViewScrollPosition+Extension.swift"; sourceTree = "<group>"; };
|
||||
D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = "<group>"; };
|
||||
D20FB164241A5D75004AFC3A /* NavigationItemModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationItemModelProtocol.swift; sourceTree = "<group>"; };
|
||||
D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
|
||||
@ -807,6 +811,7 @@
|
||||
011B58EE23A2AA850085F53C /* ModelProtocols */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */,
|
||||
014AA72323C501E2006F3E93 /* ContainerModelProtocol.swift */,
|
||||
012A88C3238D86E600FE3DA1 /* CarouselItemModelProtocol.swift */,
|
||||
012A88B0238C880100FE3DA1 /* CarouselPagingModelProtocol.swift */,
|
||||
@ -843,14 +848,6 @@
|
||||
path = CustomPrimitives;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
01509D96232803B200EF99AA /* Models */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
011B58EE23A2AA850085F53C /* ModelProtocols */,
|
||||
);
|
||||
path = Models;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
01C74D87224298E2009C25A3 /* FormUIHelpers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -1001,6 +998,17 @@
|
||||
path = RightVariable;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D202AFE2242A5F1400E5BEDF /* Extensions */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D202AFE3242A5F5E00E5BEDF /* NSTextAlignment+Extension.swift */,
|
||||
0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */,
|
||||
D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */,
|
||||
D202AFE5242A6A9C00E5BEDF /* UICollectionViewScrollPosition+Extension.swift */,
|
||||
);
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
D213347423842FE3008E41B3 /* Controllers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -1293,7 +1301,6 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D2C78CD324252F4E00B69FDE /* Atomic */,
|
||||
01509D96232803B200EF99AA /* Models */,
|
||||
012A88EF23985E0100FE3DA1 /* CustomPrimitives */,
|
||||
D2B18B7D236090D500A9AEDC /* BaseClasses */,
|
||||
01C74D87224298E2009C25A3 /* FormUIHelpers */,
|
||||
@ -1459,8 +1466,6 @@
|
||||
D29DF2A721E7B2F9003B2FB9 /* MVMCoreUIConstants.h */,
|
||||
D29DF2A821E7B2F9003B2FB9 /* MVMCoreUIConstants.m */,
|
||||
0A41BA6D2344FCD400D4C0BC /* CATransaction+Extension.swift */,
|
||||
0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */,
|
||||
D21EE53B23AD3AD4003D1A30 /* NSLayoutConstraintAxis+Extension.swift */,
|
||||
);
|
||||
path = Utility;
|
||||
sourceTree = "<group>";
|
||||
@ -1678,7 +1683,6 @@
|
||||
D2B18B7D236090D500A9AEDC /* BaseClasses */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D2E2A9A023E095AB000B42E6 /* ButtonModelProtocol.swift */,
|
||||
C003506023AA94CD00B6AC29 /* Button.swift */,
|
||||
D2B18B7E2360913400A9AEDC /* Control.swift */,
|
||||
D2B18B802360945C00A9AEDC /* View.swift */,
|
||||
@ -1693,6 +1697,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
017BEB7E23676E870024EF95 /* MoleculeObjectMapping.swift */,
|
||||
D202AFE2242A5F1400E5BEDF /* Extensions */,
|
||||
D2C78CD424252F5D00B69FDE /* Protocols */,
|
||||
D29DF10D21E67A70003B2FB9 /* Atoms */,
|
||||
D29DF10E21E67A77003B2FB9 /* Molecules */,
|
||||
@ -1708,6 +1713,7 @@
|
||||
012A88C7238DB02000FE3DA1 /* MoleculeDelegateProtocol.swift */,
|
||||
017BEB47236230DB0024EF95 /* MoleculeViewProtocol.swift */,
|
||||
012A88AC238C418100FE3DA1 /* TemplateProtocol.swift */,
|
||||
011B58EE23A2AA850085F53C /* ModelProtocols */,
|
||||
);
|
||||
path = Protocols;
|
||||
sourceTree = "<group>";
|
||||
@ -1920,6 +1926,7 @@
|
||||
9458C3182406C8FD00930963 /* UIFont+FontWrapping.m in Sources */,
|
||||
522679C123FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift in Sources */,
|
||||
9445890C2385BCE300DE9FD4 /* ProgressBarModel.swift in Sources */,
|
||||
D202AFE4242A5F5E00E5BEDF /* NSTextAlignment+Extension.swift in Sources */,
|
||||
9445891F2385D2E900DE9FD4 /* CaretViewModel.swift in Sources */,
|
||||
01C851D323CF9E740021F976 /* LabelToggleModel.swift in Sources */,
|
||||
D29DF2C521E7BF57003B2FB9 /* MFTabBarSwipeAnimator.m in Sources */,
|
||||
@ -1958,6 +1965,7 @@
|
||||
52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */,
|
||||
525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */,
|
||||
D2E2A99A23D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift in Sources */,
|
||||
D202AFE6242A6A9C00E5BEDF /* UICollectionViewScrollPosition+Extension.swift in Sources */,
|
||||
8D084AD22410BF7600951227 /* ListOneColumnFullWidthTextBodyText.swift in Sources */,
|
||||
94C0150C2421564A005811A9 /* ActionCollapseNotificationModel.swift in Sources */,
|
||||
014AA73123C5059B006F3E93 /* ListPageTemplateModel.swift in Sources */,
|
||||
|
||||
@ -291,15 +291,12 @@ import UIKit
|
||||
placeholder = model.placeholder
|
||||
|
||||
switch model.type {
|
||||
case "password":
|
||||
case .password:
|
||||
textField.isSecureTextEntry = true
|
||||
|
||||
case "number":
|
||||
case .number:
|
||||
textField.keyboardType = .numberPad
|
||||
|
||||
case "email":
|
||||
case .email:
|
||||
textField.keyboardType = .emailAddress
|
||||
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
@ -8,6 +8,13 @@
|
||||
|
||||
|
||||
@objcMembers public class TextEntryFieldModel: EntryFieldModel {
|
||||
|
||||
public enum EntryType: String, Codable {
|
||||
case password
|
||||
case number
|
||||
case email
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Properties
|
||||
//--------------------------------------------------
|
||||
@ -19,7 +26,7 @@
|
||||
public var placeholder: String?
|
||||
public var enabledTextColor: Color?
|
||||
public var disabledTextColor: Color?
|
||||
public var type: String?
|
||||
public var type: EntryType?
|
||||
public var regex: String?
|
||||
|
||||
//--------------------------------------------------
|
||||
@ -47,7 +54,7 @@
|
||||
placeholder = try typeContainer.decodeIfPresent(String.self, forKey: .placeholder)
|
||||
enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor)
|
||||
disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor)
|
||||
type = try typeContainer.decodeIfPresent(String.self, forKey: .type)
|
||||
type = try typeContainer.decodeIfPresent(EntryType.self, forKey: .type)
|
||||
regex = try typeContainer.decodeIfPresent(String.self, forKey: .regex)
|
||||
}
|
||||
|
||||
|
||||
@ -16,8 +16,8 @@ public enum CheckboxPosition: String, Codable {
|
||||
|
||||
@objcMembers public class CheckboxLabelModel: MoleculeModelProtocol {
|
||||
public static var identifier: String = "checkboxLabel"
|
||||
public var moleculeName: String
|
||||
public var backgroundColor: Color?
|
||||
|
||||
public var checkboxAlignment: CheckboxPosition?
|
||||
public var checkbox: CheckboxModel
|
||||
public var label: LabelModel
|
||||
|
||||
@ -323,14 +323,11 @@ public typealias ActionBlock = () -> ()
|
||||
hero = labelModel.hero
|
||||
Label.setLabel(self, withHTML: labelModel.html)
|
||||
|
||||
let alignment = LabelAlignment(rawValue: labelModel.textAlignment ?? "")
|
||||
switch alignment {
|
||||
switch labelModel.textAlignment {
|
||||
case .center:
|
||||
textAlignment = .center
|
||||
|
||||
case .right:
|
||||
textAlignment = .right
|
||||
|
||||
default:
|
||||
textAlignment = .left
|
||||
}
|
||||
@ -344,8 +341,7 @@ public typealias ActionBlock = () -> ()
|
||||
accessibilityLabel = accessibilityText
|
||||
}
|
||||
|
||||
if let fontStyle = labelModel.fontStyle {
|
||||
MFStyler.styleLabel(self, withStyle: fontStyle)
|
||||
if let fontStyle = labelModel.fontStyle?.rawValue {
|
||||
MFStyler.styleLabel(self, withStyle: fontStyle, genericScaling: false)
|
||||
standardFontSize = font.pointSize
|
||||
} else {
|
||||
@ -378,9 +374,9 @@ public typealias ActionBlock = () -> ()
|
||||
attributedString.addAttribute(.baselineOffset, value: 0, range: range)
|
||||
|
||||
case let colorAtt as LabelAttributeColorModel:
|
||||
if let colorHex = colorAtt.textColor, !colorHex.isEmpty {
|
||||
if let colorHex = colorAtt.textColor {
|
||||
attributedString.removeAttribute(.foregroundColor, range: range)
|
||||
attributedString.addAttribute(.foregroundColor, value: UIColor.mfGet(forHex: colorHex), range: range)
|
||||
attributedString.addAttribute(.foregroundColor, value: colorHex.uiColor, range: range)
|
||||
}
|
||||
|
||||
case let imageAtt as LabelAttributeImageModel:
|
||||
@ -401,7 +397,7 @@ public typealias ActionBlock = () -> ()
|
||||
attributedString.insert(mutableString, at: imageAtt.location)
|
||||
|
||||
case let fontAtt as LabelAttributeFontModel:
|
||||
if let fontStyle = fontAtt.style {
|
||||
if let fontStyle = fontAtt.style?.rawValue {
|
||||
let styles = MFStyler.styleGetAttributedString("0", withStyle: fontStyle)
|
||||
attributedString.removeAttribute(.font, range: range)
|
||||
attributedString.removeAttribute(.foregroundColor, range: range)
|
||||
|
||||
@ -17,7 +17,7 @@ import UIKit
|
||||
return "color"
|
||||
}
|
||||
|
||||
var textColor: String?
|
||||
var textColor: Color?
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Keys
|
||||
@ -33,7 +33,7 @@ import UIKit
|
||||
|
||||
required public init(from decoder: Decoder) throws {
|
||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||
textColor = try typeContainer.decodeIfPresent(String.self, forKey: .textColor)
|
||||
textColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor)
|
||||
try super.init(from: decoder)
|
||||
}
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ import UIKit
|
||||
return "font"
|
||||
}
|
||||
|
||||
var style: String?
|
||||
var style: LabelModel.FontStyle?
|
||||
var name: String?
|
||||
var size: CGFloat?
|
||||
|
||||
@ -38,7 +38,7 @@ import UIKit
|
||||
|
||||
required public init(from decoder: Decoder) throws {
|
||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||
style = try typeContainer.decodeIfPresent(String.self, forKey: .style)
|
||||
style = try typeContainer.decodeIfPresent(LabelModel.FontStyle.self, forKey: .style)
|
||||
name = try typeContainer.decodeIfPresent(String.self, forKey: .name)
|
||||
size = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .size)
|
||||
try super.init(from: decoder)
|
||||
|
||||
@ -10,6 +10,18 @@
|
||||
import Foundation
|
||||
|
||||
@objcMembers public class LabelModel: MoleculeModelProtocol {
|
||||
|
||||
public enum FontStyle: String, Codable {
|
||||
case H1
|
||||
case H2
|
||||
case H3
|
||||
case H32
|
||||
case B1
|
||||
case B2
|
||||
case B3
|
||||
case B20
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
// MARK: - Properties
|
||||
//--------------------------------------------------
|
||||
@ -19,10 +31,10 @@ import Foundation
|
||||
public var text: String
|
||||
public var accessibilityText: String?
|
||||
public var textColor: Color?
|
||||
public var fontStyle: String?
|
||||
public var fontStyle: FontStyle?
|
||||
public var fontName: String?
|
||||
public var fontSize: CGFloat?
|
||||
public var textAlignment: String?
|
||||
public var textAlignment: NSTextAlignment?
|
||||
public var attributes: [LabelAttributeModel]?
|
||||
public var html: String?
|
||||
public var hero: Int?
|
||||
@ -70,10 +82,10 @@ import Foundation
|
||||
accessibilityText = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityText)
|
||||
textColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor)
|
||||
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
|
||||
fontStyle = try typeContainer.decodeIfPresent(String.self, forKey: .fontStyle)
|
||||
fontStyle = try typeContainer.decodeIfPresent(FontStyle.self, forKey: .fontStyle)
|
||||
fontName = try typeContainer.decodeIfPresent(String.self, forKey: .fontName)
|
||||
fontSize = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .fontSize)
|
||||
textAlignment = try typeContainer.decodeIfPresent(String.self, forKey: .textAlignment)
|
||||
textAlignment = try typeContainer.decodeIfPresent(NSTextAlignment.self, forKey: .textAlignment)
|
||||
attributes = try typeContainer.decodeModelsIfPresent(codingKey: .attributes)
|
||||
html = try typeContainer.decodeIfPresent(String.self, forKey: .html)
|
||||
hero = try typeContainer.decodeIfPresent(Int.self, forKey: .hero)
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
//
|
||||
// UICollectionViewScrollPosition+Extension.swift
|
||||
// MVMCoreUI
|
||||
//
|
||||
// Created by Scott Pfeil on 3/24/20.
|
||||
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
enum ScrollPositionError: Error {
|
||||
case notAPosition
|
||||
}
|
||||
|
||||
extension UICollectionView.ScrollPosition: RawRepresentable {
|
||||
|
||||
init?(rawValue: String) {
|
||||
switch rawValue {
|
||||
case "left", "leading":
|
||||
self = .left
|
||||
case "centeredHorizontally", "center":
|
||||
self = .centeredHorizontally
|
||||
case "right", "trailing":
|
||||
self = .right
|
||||
case "top":
|
||||
self = .top
|
||||
case "bottom":
|
||||
self = .bottom
|
||||
case "centeredVertically":
|
||||
self = .centeredVertically
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var rawValueString: String {
|
||||
switch self {
|
||||
case .left:
|
||||
return "left"
|
||||
case .centeredHorizontally:
|
||||
return "centeredHorizontally"
|
||||
case .right:
|
||||
return "right"
|
||||
case .top:
|
||||
return "top"
|
||||
case .bottom:
|
||||
return "bottom"
|
||||
case .centeredVertically:
|
||||
return "centeredVertically"
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension UICollectionView.ScrollPosition: Codable {
|
||||
public init(from decoder: Decoder) throws {
|
||||
let typeContainer = try decoder.singleValueContainer()
|
||||
let string = try typeContainer.decode(String.self)
|
||||
guard let position = UICollectionView.ScrollPosition(rawValue: string) else {
|
||||
throw ScrollPositionError.notAPosition
|
||||
}
|
||||
self = position
|
||||
}
|
||||
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
var container = encoder.singleValueContainer()
|
||||
try container.encode(rawValueString)
|
||||
}
|
||||
}
|
||||
@ -20,7 +20,7 @@ public class ListOneColumnFullWidthTextBodyTextModel: ListItemModel, MoleculeMod
|
||||
// Defaults to set
|
||||
override public func setDefaults() {
|
||||
super.setDefaults()
|
||||
headlineBody.style = "item"
|
||||
headlineBody.style = .item
|
||||
}
|
||||
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
|
||||
@ -26,9 +26,9 @@ public class ListThreeColumnPlanDataDividerModel: ListItemModel, MoleculeModelPr
|
||||
override public func setDefaults() {
|
||||
super.setDefaults()
|
||||
style = "tallDivider"
|
||||
leftHeadlineBody.style = "itemHeader"
|
||||
centerHeadlineBody.style = "itemHeader"
|
||||
rightHeadlineBody.style = "itemHeader"
|
||||
leftHeadlineBody.style = .itemHeader
|
||||
centerHeadlineBody.style = .itemHeader
|
||||
rightHeadlineBody.style = .itemHeader
|
||||
}
|
||||
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
|
||||
@ -11,7 +11,7 @@ import Foundation
|
||||
@objcMembers public class RadioButtonLabelModel: MoleculeModelProtocol {
|
||||
public static var identifier: String = "radioButtonLabel"
|
||||
public var backgroundColor: Color?
|
||||
|
||||
public var moleculeName: String
|
||||
public var radioButton: RadioButtonModel
|
||||
public var label: LabelModel
|
||||
}
|
||||
|
||||
@ -23,15 +23,15 @@ open class HeadlineBody: View {
|
||||
}
|
||||
|
||||
// MARK: - Styling
|
||||
func style(with styleString: String?) {
|
||||
guard let styleString = styleString else { return }
|
||||
|
||||
switch styleString {
|
||||
case "header":
|
||||
func style(with style: HeadlineBodyModel.Style?) {
|
||||
switch style {
|
||||
case .landingHeader:
|
||||
styleLandingPageHeader()
|
||||
case .header:
|
||||
stylePageHeader()
|
||||
case "item":
|
||||
case .item:
|
||||
styleListItem()
|
||||
case "itemHeader":
|
||||
case .itemHeader:
|
||||
styleListItemDivider()
|
||||
default: break
|
||||
}
|
||||
|
||||
@ -62,7 +62,7 @@ public class HeadlineBodyCaretLinkImageModel: ContainerModel, MoleculeModelProto
|
||||
public override func encode(to encoder: Encoder) throws {
|
||||
try super.encode(to: encoder)
|
||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
try container.encode(HeadlineBodyCaretLinkImageModel.identifier, forKey: .moleculeName)
|
||||
try container.encode(moleculeName, forKey: .moleculeName)
|
||||
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
|
||||
try container.encode(headlineBody, forKey: .headlineBody)
|
||||
try container.encode(image, forKey: .image)
|
||||
|
||||
@ -9,11 +9,19 @@
|
||||
import Foundation
|
||||
|
||||
@objcMembers open class HeadlineBodyModel: MoleculeModelProtocol {
|
||||
/// Convenience styles for common situations.
|
||||
public enum Style: String, Codable {
|
||||
case landingHeader
|
||||
case header
|
||||
case itemHeader
|
||||
case item
|
||||
}
|
||||
|
||||
public static var identifier: String = "headlineBody"
|
||||
public var moleculeName: String = HeadlineBodyModel.identifier
|
||||
public var headline: LabelModel?
|
||||
public var body: LabelModel?
|
||||
public var style: String?
|
||||
public var style: Style?
|
||||
public var backgroundColor: Color?
|
||||
|
||||
public init(headline: LabelModel) {
|
||||
|
||||
@ -98,7 +98,9 @@ open class Carousel: View {
|
||||
setupLayout(with: carouselModel)
|
||||
prepareMolecules(with: carouselModel)
|
||||
itemWidthPercent = (carouselModel.itemWidthPercent ?? 100) / 100
|
||||
setAlignment(with: carouselModel.itemAlignment)
|
||||
if let alignment = carouselModel.itemAlignment {
|
||||
itemAlignment = alignment
|
||||
}
|
||||
|
||||
if let height = carouselModel.height {
|
||||
collectionViewHeight?.constant = CGFloat(height)
|
||||
@ -167,19 +169,6 @@ open class Carousel: View {
|
||||
return (className.nameForReuse(with: molecule, delegateObject) ?? molecule.moleculeName, className, molecule)
|
||||
}
|
||||
|
||||
/// Sets the alignment from the string.
|
||||
open func setAlignment(with string: String?) {
|
||||
switch string {
|
||||
case "leading":
|
||||
itemAlignment = .left
|
||||
case "trailing":
|
||||
itemAlignment = .right
|
||||
case "center":
|
||||
itemAlignment = .centeredHorizontally
|
||||
default: break
|
||||
}
|
||||
}
|
||||
|
||||
/// Adds a paging view. Centers it horizontally with the collection view. The position is the vertical distance from the center of the page view to the bottom of the collection view.
|
||||
open func addPaging(view: (UIView & MVMCoreUIPagingProtocol)?, position: CGFloat) {
|
||||
pagingView?.removeFromSuperview()
|
||||
|
||||
@ -18,7 +18,7 @@ import UIKit
|
||||
public var loop: Bool?
|
||||
public var height: Float?
|
||||
public var itemWidthPercent: Float?
|
||||
public var itemAlignment: String?
|
||||
public var itemAlignment: UICollectionView.ScrollPosition?
|
||||
public var pagingMolecule: CarouselPagingModelProtocol?
|
||||
|
||||
public init(molecules: [CarouselItemModel]){
|
||||
@ -47,7 +47,7 @@ import UIKit
|
||||
self.loop = try typeContainer.decode(Bool.self, forKey: .loop)
|
||||
self.height = try typeContainer.decode(Float.self, forKey: .height)
|
||||
self.itemWidthPercent = try typeContainer.decode(Float.self, forKey: .itemWidthPercent)
|
||||
self.itemAlignment = try typeContainer.decode(String.self, forKey: .itemAlignment)
|
||||
self.itemAlignment = try typeContainer.decode(UICollectionView.ScrollPosition.self, forKey: .itemAlignment)
|
||||
self.pagingMolecule = try typeContainer.decodeModelIfPresent(codingKey: .pagingMolecule)
|
||||
}
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@ import Foundation
|
||||
|
||||
public protocol PageModelProtocol {
|
||||
var pageType: String { get set }
|
||||
/// Temporary: for legacy response
|
||||
var screenHeading: String? { get set }
|
||||
var navigationItem: (NavigationItemModelProtocol & MoleculeModelProtocol)? { get set }
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
//
|
||||
// PageModelProtocol.swift
|
||||
// MVMCoreUI
|
||||
//
|
||||
// Created by Scott Pfeil on 1/9/20.
|
||||
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
public protocol PageModelProtocol {
|
||||
var pageType: String { get set }
|
||||
var screenHeading: String? { get set }
|
||||
<<<<<<< HEAD
|
||||
var navigationItem: NavigationItemModelProtocol? { get set }
|
||||
=======
|
||||
var isAtomicTabs: Bool? { get set }
|
||||
var navigationItem: (NavigationItemModelProtocol & MoleculeModelProtocol)? { get set }
|
||||
>>>>>>> 18f86575e604bb7b53b6bdac4fc677951979031f
|
||||
}
|
||||
@ -14,10 +14,10 @@ public protocol MoleculeDelegateProtocol: AnyObject {
|
||||
func getModuleWithName(_ name: String?) -> [AnyHashable : Any]?
|
||||
func getModuleWithName(_ moleculeName: String) -> MoleculeModelProtocol?
|
||||
|
||||
/// Notifies the delegate that the molecule layout update. Should be called when the layout may change due to an async method.
|
||||
/// Notifies the delegate that the molecule layout update. Should be called when the layout may change due to an async method. Mainly used for list or collections.
|
||||
func moleculeLayoutUpdated(_ molecule: MoleculeViewProtocol) //optional
|
||||
|
||||
/// Asks the delegate to add or remove molecules.
|
||||
/// Asks the delegate to add or remove molecules. Mainly used for list or collections.
|
||||
func getIndexPath(for molecule: ListItemModelProtocol & MoleculeModelProtocol) -> IndexPath?
|
||||
func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], indexPath: IndexPath, animation: UITableView.RowAnimation)
|
||||
func removeMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], animation: UITableView.RowAnimation)
|
||||
|
||||
@ -22,10 +22,10 @@ public protocol MoleculeViewProtocol: UIView {
|
||||
/// Resets to default state before set with json is called again.
|
||||
func reset()
|
||||
|
||||
/// Allows the molecule to set its name for reuse. Default could be moleculeName.
|
||||
/// Allows the molecule to set its name for reuse. Default could be moleculeName. Mainly used for list or collections.
|
||||
static func nameForReuse(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> String?
|
||||
|
||||
/// For the molecule list to load more efficiently.
|
||||
/// For the molecule list to load more efficiently. Mainly used for list or collections.
|
||||
static func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat?
|
||||
|
||||
/// Can return the required modules
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
import Foundation
|
||||
|
||||
|
||||
public protocol TemplateProtocol: class {
|
||||
public protocol TemplateProtocol: AnyObject {
|
||||
associatedtype TemplateModel: TemplateModelProtocol
|
||||
var templateModel: TemplateModel? { get set }
|
||||
}
|
||||
@ -20,6 +20,7 @@ public extension TemplateProtocol where Self: ViewController {
|
||||
let data = try JSONSerialization.data(withJSONObject: pageJSON)
|
||||
let decoder = JSONDecoder()
|
||||
let templateModel = try decoder.decode(TemplateModel.self, from: data)
|
||||
print(templateModel.toJSONString() ?? "")
|
||||
self.templateModel = templateModel
|
||||
self.pageModel = templateModel as? MVMControllerModelProtocol
|
||||
}
|
||||
|
||||
@ -36,15 +36,10 @@ import Foundation
|
||||
//--------------------------------------------------
|
||||
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
case template
|
||||
case pageType
|
||||
case screenHeading
|
||||
case molecules
|
||||
case header
|
||||
case footer
|
||||
case line
|
||||
case isAtomicTabs
|
||||
case formRules
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
public protocol MoleculeListCellProtocol {
|
||||
public protocol MoleculeListCellProtocol: UITableViewCell {
|
||||
/// Can set the separator according to what the moleculeList commands.
|
||||
func setLines(with model: LineModel?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?, indexPath: IndexPath)
|
||||
|
||||
|
||||
@ -24,9 +24,6 @@ import Foundation
|
||||
}
|
||||
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
case pageType
|
||||
case template
|
||||
case screenHeading
|
||||
case header
|
||||
case footer
|
||||
case stack
|
||||
@ -43,8 +40,6 @@ import Foundation
|
||||
public override func encode(to encoder: Encoder) throws {
|
||||
try super.encode(to: encoder)
|
||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
try container.encode(pageType, forKey: .pageType)
|
||||
try container.encode(template, forKey: .template)
|
||||
try container.encode(moleculeStack, forKey: .stack)
|
||||
try container.encodeModelIfPresent(header, forKey: .header)
|
||||
try container.encodeModelIfPresent(footer, forKey: .footer)
|
||||
|
||||
@ -38,7 +38,7 @@ import Foundation
|
||||
pageType = try typeContainer.decode(String.self, forKey: .pageType)
|
||||
screenHeading = try typeContainer.decodeIfPresent(String.self, forKey: .screenHeading)
|
||||
formRules = try typeContainer.decodeIfPresent([FormGroupRule].self, forKey: .formRules)
|
||||
// navigationItem = try typeContainer.decodeModelIfPresent(codingKey: .navigationItem)
|
||||
navigationItem = try typeContainer.decodeModelIfPresent(codingKey: .navigationItem)
|
||||
}
|
||||
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
@ -47,6 +47,6 @@ import Foundation
|
||||
try container.encode(template, forKey: .template)
|
||||
try container.encodeIfPresent(screenHeading, forKey: .screenHeading)
|
||||
try container.encodeIfPresent(formRules, forKey: .formRules)
|
||||
//try container.encodeModelIfPresent(navigationItem, forKey: .navigationItem)
|
||||
try container.encodeModelIfPresent(navigationItem, forKey: .navigationItem)
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,60 +8,40 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
@objcMembers public class ThreeLayerPageTemplateModel: MVMControllerModelProtocol {
|
||||
|
||||
public var formRules: [FormGroupRule]?
|
||||
public var formValidator: FormValidator?
|
||||
|
||||
public static var identifier: String = "threeLayer"
|
||||
|
||||
public var pageType: String
|
||||
public var screenHeading: String?
|
||||
public var isAtomicTabs: Bool?
|
||||
public var navigationItem: (NavigationItemModelProtocol & MoleculeModelProtocol)?
|
||||
|
||||
@objcMembers public class ThreeLayerPageTemplateModel: TemplateModel {
|
||||
public override class var identifier: String {
|
||||
return "threeLayer"
|
||||
}
|
||||
public var header: MoleculeModelProtocol?
|
||||
public var middle: MoleculeModelProtocol?
|
||||
public var footer: MoleculeModelProtocol?
|
||||
|
||||
public init(pageType: String, header: MoleculeModelProtocol?, middle: MoleculeModelProtocol?, footer: MoleculeModelProtocol?) {
|
||||
self.pageType = pageType
|
||||
super.init(pageType: pageType)
|
||||
self.header = header
|
||||
self.middle = middle
|
||||
self.footer = footer
|
||||
}
|
||||
|
||||
private enum CodingKeys: String, CodingKey {
|
||||
case pageType
|
||||
case template
|
||||
case screenHeading
|
||||
case header
|
||||
case footer
|
||||
case middle
|
||||
case isAtomicTabs
|
||||
case formRules
|
||||
}
|
||||
|
||||
required public init(from decoder: Decoder) throws {
|
||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||
pageType = try typeContainer.decode(String.self, forKey: .pageType)
|
||||
screenHeading = try typeContainer.decodeIfPresent(String.self, forKey: .screenHeading)
|
||||
isAtomicTabs = try typeContainer.decodeIfPresent(Bool.self, forKey: .isAtomicTabs)
|
||||
header = try typeContainer.decodeModelIfPresent(codingKey: .header)
|
||||
middle = try typeContainer.decodeModelIfPresent(codingKey: .middle)
|
||||
footer = try typeContainer.decodeModelIfPresent(codingKey: .footer)
|
||||
formRules = try typeContainer.decodeIfPresent([FormGroupRule].self, forKey: .formRules)
|
||||
try super.init(from: decoder)
|
||||
}
|
||||
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
public override func encode(to encoder: Encoder) throws {
|
||||
try super.encode(to: encoder)
|
||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
try container.encode(pageType, forKey: .pageType)
|
||||
try container.encode(template, forKey: .template)
|
||||
try container.encodeIfPresent(screenHeading, forKey: .screenHeading)
|
||||
try container.encodeIfPresent(isAtomicTabs, forKey: .isAtomicTabs)
|
||||
try container.encodeModelIfPresent(header, forKey: .header)
|
||||
try container.encodeModelIfPresent(header, forKey: .middle)
|
||||
try container.encodeModelIfPresent(footer, forKey: .footer)
|
||||
try container.encodeIfPresent(formRules, forKey: .formRules)
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,7 +12,6 @@ import UIKit
|
||||
//--------------------------------------------------
|
||||
// MARK: - Properties
|
||||
//--------------------------------------------------
|
||||
open var json: [AnyHashable: Any]?
|
||||
open var model: MoleculeModelProtocol?
|
||||
|
||||
private var initialSetupPerformed = false
|
||||
|
||||
@ -9,7 +9,6 @@
|
||||
import UIKit
|
||||
|
||||
@objcMembers open class View: UIView, MoleculeViewProtocol {
|
||||
open var json: [AnyHashable: Any]?
|
||||
open var model: MoleculeModelProtocol?
|
||||
|
||||
private var initialSetupPerformed = false
|
||||
|
||||
Loading…
Reference in New Issue
Block a user