diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 4358986e..3af65c10 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -215,12 +215,16 @@ AAB9C10824346F4B00151545 /* RadioSwatches.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAB9C10724346F4B00151545 /* RadioSwatches.swift */; }; AAB9C10A243496DD00151545 /* RadioSwatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAB9C109243496DD00151545 /* RadioSwatch.swift */; }; AAC6F167243332E400F295C1 /* RadioSwatchesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAC6F166243332E400F295C1 /* RadioSwatchesModel.swift */; }; + BB105859248DEFF70069D008 /* UICollectionViewLeftAlignedLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB105858248DEFF60069D008 /* UICollectionViewLeftAlignedLayout.swift */; }; BB1D17E0244EAA30001D2002 /* ListDeviceComplexButtonMediumModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1D17DF244EAA30001D2002 /* ListDeviceComplexButtonMediumModel.swift */; }; BB1D17E2244EAA46001D2002 /* ListDeviceComplexButtonMedium.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1D17E1244EAA46001D2002 /* ListDeviceComplexButtonMedium.swift */; }; BB2BF0EA2452A9BB001D0FC2 /* ListDeviceComplexButtonSmall.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2BF0E92452A9BB001D0FC2 /* ListDeviceComplexButtonSmall.swift */; }; BB2BF0EC2452A9D5001D0FC2 /* ListDeviceComplexButtonSmallModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2BF0EB2452A9D5001D0FC2 /* ListDeviceComplexButtonSmallModel.swift */; }; BB2C968F24330EA7006FF80C /* ListRightVariableTextLinkAllTextAndLinksModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2C968D24330EA7006FF80C /* ListRightVariableTextLinkAllTextAndLinksModel.swift */; }; BB2C969224330F73006FF80C /* ListRightVariableTextLinkAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2C969124330F73006FF80C /* ListRightVariableTextLinkAllTextAndLinks.swift */; }; + BB2FB3BB247E7EBC00DF73CD /* TagCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2FB3BA247E7EBC00DF73CD /* TagCollectionViewCell.swift */; }; + BB2FB3BD247E7EF200DF73CD /* Tags.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2FB3BC247E7EF200DF73CD /* Tags.swift */; }; + BB2FB3BF247E7F0900DF73CD /* TagsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2FB3BE247E7F0900DF73CD /* TagsModel.swift */; }; BB47A586241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB47A585241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift */; }; BB47A588241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB47A587241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift */; }; BB54C5202434D92F0038326C /* ListRightVariableButtonAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB54C51E2434D92F0038326C /* ListRightVariableButtonAllTextAndLinks.swift */; }; @@ -236,6 +240,8 @@ BBAA4F05243D8E3B005AAD5F /* RadioBoxesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBAA4F01243D8E3B005AAD5F /* RadioBoxesModel.swift */; }; BBBBC87C24374A4900B0F079 /* ListThreeColumnBillChangesDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBBBC87A24374A4900B0F079 /* ListThreeColumnBillChangesDivider.swift */; }; BBBBC87D24374A4900B0F079 /* ListThreeColumnBillChangesDividerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBBBC87B24374A4900B0F079 /* ListThreeColumnBillChangesDividerModel.swift */; }; + BBC0C4FD24811DBC0087C44F /* Tag.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC0C4FC24811DBC0087C44F /* Tag.swift */; }; + BBC0C4FF24811DCA0087C44F /* TagModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC0C4FE24811DCA0087C44F /* TagModel.swift */; }; C003506123AA94CD00B6AC29 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = C003506023AA94CD00B6AC29 /* Button.swift */; }; C07065C42395677300FBF997 /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = C07065C32395677300FBF997 /* Link.swift */; }; C695A67F23C9830600BFB94E /* UnOrderedListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */; }; @@ -654,12 +660,16 @@ AAB9C10724346F4B00151545 /* RadioSwatches.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioSwatches.swift; sourceTree = ""; }; AAB9C109243496DD00151545 /* RadioSwatch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioSwatch.swift; sourceTree = ""; }; AAC6F166243332E400F295C1 /* RadioSwatchesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioSwatchesModel.swift; sourceTree = ""; }; + BB105858248DEFF60069D008 /* UICollectionViewLeftAlignedLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UICollectionViewLeftAlignedLayout.swift; sourceTree = ""; }; BB1D17DF244EAA30001D2002 /* ListDeviceComplexButtonMediumModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDeviceComplexButtonMediumModel.swift; sourceTree = ""; }; BB1D17E1244EAA46001D2002 /* ListDeviceComplexButtonMedium.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDeviceComplexButtonMedium.swift; sourceTree = ""; }; BB2BF0E92452A9BB001D0FC2 /* ListDeviceComplexButtonSmall.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDeviceComplexButtonSmall.swift; sourceTree = ""; }; BB2BF0EB2452A9D5001D0FC2 /* ListDeviceComplexButtonSmallModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDeviceComplexButtonSmallModel.swift; sourceTree = ""; }; BB2C968D24330EA7006FF80C /* ListRightVariableTextLinkAllTextAndLinksModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListRightVariableTextLinkAllTextAndLinksModel.swift; sourceTree = ""; }; BB2C969124330F73006FF80C /* ListRightVariableTextLinkAllTextAndLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListRightVariableTextLinkAllTextAndLinks.swift; sourceTree = ""; }; + BB2FB3BA247E7EBC00DF73CD /* TagCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagCollectionViewCell.swift; sourceTree = ""; }; + BB2FB3BC247E7EF200DF73CD /* Tags.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tags.swift; sourceTree = ""; }; + BB2FB3BE247E7F0900DF73CD /* TagsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagsModel.swift; sourceTree = ""; }; BB47A585241615EF002BB23C /* ListOneColumnFullWidthTextDividerSubsectionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextDividerSubsectionModel.swift; sourceTree = ""; }; BB47A587241615FA002BB23C /* ListOneColumnFullWidthTextDividerSubsection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextDividerSubsection.swift; sourceTree = ""; }; BB54C51E2434D92F0038326C /* ListRightVariableButtonAllTextAndLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListRightVariableButtonAllTextAndLinks.swift; sourceTree = ""; }; @@ -675,6 +685,8 @@ BBAA4F01243D8E3B005AAD5F /* RadioBoxesModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadioBoxesModel.swift; sourceTree = ""; }; BBBBC87A24374A4900B0F079 /* ListThreeColumnBillChangesDivider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListThreeColumnBillChangesDivider.swift; sourceTree = ""; }; BBBBC87B24374A4900B0F079 /* ListThreeColumnBillChangesDividerModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListThreeColumnBillChangesDividerModel.swift; sourceTree = ""; }; + BBC0C4FC24811DBC0087C44F /* Tag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tag.swift; sourceTree = ""; }; + BBC0C4FE24811DCA0087C44F /* TagModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagModel.swift; sourceTree = ""; }; C003506023AA94CD00B6AC29 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; C07065C32395677300FBF997 /* Link.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = ""; }; C695A67E23C9830600BFB94E /* UnOrderedListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnOrderedListModel.swift; sourceTree = ""; }; @@ -1549,8 +1561,8 @@ D29DF10D21E67A70003B2FB9 /* Atoms */ = { isa = PBXGroup; children = ( + D2BEFEF5248A954C00FAB3A9 /* FormFields */, D264FAA8243FE17A00D98315 /* Selectors */, - D29DF22B21E6A0FA003B2FB9 /* TextFields */, D29DF17D21E69E26003B2FB9 /* Views */, D29DF16821E69E1F003B2FB9 /* Buttons */, ); @@ -1862,6 +1874,7 @@ 0AE14F63238315D2005417F8 /* TextField.swift */, D20923582450ECE00044AD09 /* TableView.swift */, D2755D7A23689C7500485468 /* TableViewCell.swift */, + BB105858248DEFF60069D008 /* UICollectionViewLeftAlignedLayout.swift */, D21B7F70243BAC1600051ABF /* CollectionViewCell.swift */, D264FAA92440F97600D98315 /* CollectionView.swift */, 0A5D59C323AD488600EFD9E9 /* Protocols */, @@ -1871,6 +1884,27 @@ path = BaseClasses; sourceTree = ""; }; + D2BEFEF5248A954C00FAB3A9 /* FormFields */ = { + isa = PBXGroup; + children = ( + D2BEFEF6248A957A00FAB3A9 /* Tags */, + D29DF22B21E6A0FA003B2FB9 /* TextFields */, + ); + path = FormFields; + sourceTree = ""; + }; + D2BEFEF6248A957A00FAB3A9 /* Tags */ = { + isa = PBXGroup; + children = ( + BBC0C4FE24811DCA0087C44F /* TagModel.swift */, + BBC0C4FC24811DBC0087C44F /* Tag.swift */, + BB2FB3BE247E7F0900DF73CD /* TagsModel.swift */, + BB2FB3BC247E7EF200DF73CD /* Tags.swift */, + BB2FB3BA247E7EBC00DF73CD /* TagCollectionViewCell.swift */, + ); + path = Tags; + sourceTree = ""; + }; D2C78CD324252F4E00B69FDE /* Atomic */ = { isa = PBXGroup; children = ( @@ -2040,6 +2074,7 @@ 94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */, DBC4391922442197001AB423 /* DashLine.swift in Sources */, D264FAAA2440F97600D98315 /* CollectionView.swift in Sources */, + BBC0C4FF24811DCA0087C44F /* TagModel.swift in Sources */, 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */, D2FB151D23A40F1500C20E10 /* MoleculeStackItem.swift in Sources */, D28BA7452481652D00B75CB8 /* TabBarProtocol.swift in Sources */, @@ -2142,6 +2177,7 @@ D2755D7B23689C7500485468 /* TableViewCell.swift in Sources */, 0A25209624645AFD000FA9F6 /* TextViewEntryField.swift in Sources */, 014AA72623C501E2006F3E93 /* ContainerModelProtocol.swift in Sources */, + BB2FB3BF247E7F0900DF73CD /* TagsModel.swift in Sources */, AA11A42123F15D7000D7962F /* ListRightVariablePaymentsModel.swift in Sources */, 011D9626240EBB16000E3791 /* RadioButtonLabelModel.swift in Sources */, 8DDD6C1D244D90B8006A2232 /* ListThreeColumnDataUsage.swift in Sources */, @@ -2240,6 +2276,7 @@ 011B58F223A2AE2C0085F53C /* DropDownListItemModel.swift in Sources */, D2509ED12472ED9B001BFB9D /* NavigationItemModelProtocol.swift in Sources */, 8D448E5524050A46006211BB /* ListOneColumnFullWidthTextAllTextAndLinksModel.swift in Sources */, + BBC0C4FD24811DBC0087C44F /* Tag.swift in Sources */, 94C2D9842386F3F80006CF46 /* LabelAttributeModel.swift in Sources */, 944589212385D6E900DE9FD4 /* DashLineModel.swift in Sources */, D2E2A99623D8CF85000B42E6 /* HeadlineBodyLinkToggleModel.swift in Sources */, @@ -2279,6 +2316,7 @@ D253BB9E2458751F002DE544 /* BGImageMoleculeModel.swift in Sources */, 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */, 8D24041123E7FB9E009E23BE /* ListLeftVariableIconWithRightCaret.swift in Sources */, + BB2FB3BD247E7EF200DF73CD /* Tags.swift in Sources */, BBAA4F03243D8E3B005AAD5F /* RadioBoxes.swift in Sources */, D2E1FAE12268E81D00AEFD8C /* MoleculeListTemplate.swift in Sources */, 525019E72406853600EED91C /* ListFourColumnDataUsageDivider.swift in Sources */, @@ -2299,6 +2337,7 @@ D2092355244FA0FD0044AD09 /* ThreeLayerTemplateModelProtocol.swift in Sources */, 0AE14F64238315D2005417F8 /* TextField.swift in Sources */, 0AB764D124460F6300E7FE72 /* UIDatePicker+Extension.swift in Sources */, + BB105859248DEFF70069D008 /* UICollectionViewLeftAlignedLayout.swift in Sources */, D253BB9C245874F8002DE544 /* BGImageMolecule.swift in Sources */, D2C78CD224228BBD00B69FDE /* ActionOpenPanelModel.swift in Sources */, AA617AB02453010A00910B8F /* ListDeviceComplexLinkSmall.swift in Sources */, @@ -2324,6 +2363,7 @@ 0A21DB83235DFBC500C160A2 /* MdnEntryField.swift in Sources */, 0AE98BB723FF18E9004C5109 /* ArrowModel.swift in Sources */, D28A837D23CCA86A00DFE4FC /* TabsListItemModel.swift in Sources */, + BB2FB3BB247E7EBC00DF73CD /* TagCollectionViewCell.swift in Sources */, 012A88C6238DA34000FE3DA1 /* ModuleMoleculeModel.swift in Sources */, 94C2D9A123872BCC0006CF46 /* LabelAttributeUnderlineModel.swift in Sources */, D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/Tags/Tag.swift b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/Tag.swift new file mode 100644 index 00000000..c962f8c9 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/Tag.swift @@ -0,0 +1,41 @@ +// +// Tag.swift +// MVMCoreUI +// +// Created by Dhamodaram Nandi on 29/05/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +@objcMembers open class Tag: View { + + public let label = Label.createLabelRegularBodySmall(true) + + // MARK: - MVMCoreViewProtocol + open override func setupView() { + super.setupView() + layer.borderColor = UIColor.mvmCoolGray6.cgColor + layer.borderWidth = 1 + label.numberOfLines = 1 + addSubview(label) + NSLayoutConstraint.constraintPinSubview(label, pinTop: true, topConstant: 13, pinBottom: true, bottomConstant: 13, pinLeft: true, leftConstant: 15, pinRight: true, rightConstant: 15) + } + + // MARK: - MoleculeViewProtocol + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + guard let model = model as? TagModel else { return } + label.set(with: model.label, delegateObject, additionalData) + } + + @objc override open func updateView(_ size: CGFloat) { + super.updateView(size) + label.updateView(size) + } + + open override func reset() { + super.reset() + label.reset() + label.styleRegularBodySmall(true) + } +} diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagCollectionViewCell.swift b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagCollectionViewCell.swift new file mode 100644 index 00000000..2b1406d5 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagCollectionViewCell.swift @@ -0,0 +1,29 @@ +// +// TagCollectionViewCell.swift +// MVMCoreUI +// +// Created by Dhamodaram Nandi on 27/05/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +open class TagCollectionViewCell: CollectionViewCell { + public let tagLabel = Tag() + + open override func reset() { + super.reset() + backgroundColor = .clear + } + + open override func setupView() { + super.setupView() + addMolecule(tagLabel) + MVMCoreUIUtility.setMarginsFor(contentView, leading: 0, top: 0, trailing: 0, bottom: 0) + } + + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + guard let model = model as? TagModel else { return } + tagLabel.set(with: model, delegateObject, additionalData) + } +} diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagModel.swift new file mode 100644 index 00000000..e0247e71 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagModel.swift @@ -0,0 +1,37 @@ +// +// TagModel.swift +// MVMCoreUI +// +// Created by Dhamodaram Nandi on 29/05/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +@objcMembers public class TagModel: MoleculeModelProtocol { + public static var identifier: String = "tag" + public var label: LabelModel + public var action: ActionModelProtocol? + public var backgroundColor: Color? + + private enum CodingKeys: String, CodingKey { + case moleculeName + case label + case action + case backgroundColor + } + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + label = try typeContainer.decode(LabelModel.self, forKey: .label) + action = try typeContainer.decodeModelIfPresent(codingKey: .action) + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(moleculeName, forKey: .moleculeName) + try container.encode(label, forKey: .label) + try container.encodeModelIfPresent(action, forKey: .action) + } +} diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/Tags/Tags.swift b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/Tags.swift new file mode 100644 index 00000000..4b1fa4f9 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/Tags.swift @@ -0,0 +1,105 @@ +// +// Tags.swift +// MVMCoreUI +// +// Created by Dhamodaram Nandi on 27/05/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +open class Tags: View, MFButtonProtocol { + public var collectionView: CollectionView! + public var collectionViewHeight: NSLayoutConstraint! + private var tagsListModel: TagsModel? { + return model as? TagsModel + } + + private var delegateObject: MVMCoreUIDelegateObject? + + /// The models for the molecules. + public var tags: [TagModel]? + + open override func layoutSubviews() { + super.layoutSubviews() + // Accounts for any collection size changes + DispatchQueue.main.async { + self.collectionView.collectionViewLayout.invalidateLayout() + self.collectionViewHeight.constant = self.collectionView.contentSize.height + self.delegateObject?.moleculeDelegate?.moleculeLayoutUpdated(self) + } + } + + // MARK: - MVMCoreViewProtocol + open override func setupView() { + super.setupView() + collectionView = createCollectionView() + addSubview(collectionView) + NSLayoutConstraint.constraintPinSubview(toSuperview: collectionView) + collectionViewHeight = collectionView.heightAnchor.constraint(equalToConstant: 300) + collectionViewHeight?.isActive = true + } + + // MARK: - MoleculeViewProtocol + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + self.delegateObject = delegateObject + guard let tagsListModel = model as? TagsModel else { return } + tags = tagsListModel.tags + registerCells() + collectionView.reloadData() + } + + @objc override open func updateView(_ size: CGFloat) { + super.updateView(size) + collectionView.updateView(size) + } + + // MARK: - Creation + /// Creates the layout for the collection. + open func createCollectionViewLayout() -> UICollectionViewLayout { + let layout = UICollectionViewLeftAlignedLayout() + layout.estimatedItemSize = CGSize(width: 140, height: 40) + layout.minimumLineSpacing = 24.0 + layout.minimumInteritemSpacing = 12.0 + return layout + } + + /// Creates the collection view. + open func createCollectionView() -> CollectionView { + let collection = CollectionView(frame: .zero, collectionViewLayout: createCollectionViewLayout()) + collection.dataSource = self + collection.delegate = self + return collection + } + + /// Registers the cells with the collection view + open func registerCells() { + collectionView.register(TagCollectionViewCell.self, forCellWithReuseIdentifier: "TagCollectionViewCell") + } +} + +extension Tags: UICollectionViewDataSource { + open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return tags?.count ?? 0 + } + + open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let molecule = tags?[indexPath.row], + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TagCollectionViewCell", for: indexPath) as? TagCollectionViewCell else { + fatalError() + } + cell.reset() + cell.set(with: molecule, delegateObject, nil) + cell.layoutIfNeeded() + return cell + } +} + +extension Tags: UICollectionViewDelegate { + open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let tagModel = tags?[indexPath.row], + let tagAction = tagModel.action else { return } + Button.performButtonAction(with: tagAction, button: self, delegateObject: delegateObject, additionalData: nil) + } +} diff --git a/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagsModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagsModel.swift new file mode 100644 index 00000000..009f8fa1 --- /dev/null +++ b/MVMCoreUI/Atomic/Atoms/FormFields/Tags/TagsModel.swift @@ -0,0 +1,34 @@ +// +// TagsModel.swift +// MVMCoreUI +// +// Created by Dhamodaram Nandi on 27/05/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +@objcMembers public class TagsModel: MoleculeModelProtocol { + public static var identifier: String = "tags" + public var backgroundColor: Color? + public var tags: [TagModel] + + private enum CodingKeys: String, CodingKey { + case moleculeName + case backgroundColor + case tags + } + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + tags = try typeContainer.decode([TagModel].self, forKey: .tags) + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(moleculeName, forKey: .moleculeName) + try container.encode(tags, forKey: .tags) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + } +} diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/BaseDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/BaseDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DateDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/DateDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DateDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/DateDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DateDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitBox.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitBox.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/DigitBox.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitBox.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/DigitEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/DigitEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/EntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/EntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/EntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/ItemDropdownEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/ItemDropdownEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/ItemDropdownEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/ItemDropdownEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/ItemDropdownEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/MdnEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/MdnEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/TextEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/TextEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryField.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryField.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryField.swift diff --git a/MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryFieldModel.swift b/MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryFieldModel.swift similarity index 100% rename from MVMCoreUI/Atomic/Atoms/TextFields/TextViewEntryFieldModel.swift rename to MVMCoreUI/Atomic/Atoms/FormFields/TextFields/TextViewEntryFieldModel.swift diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift index 785d6ae6..1118ca33 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioBox.swift @@ -9,8 +9,8 @@ import Foundation open class RadioBox: Control { - public let label = Label.createLabelRegularBodySmall(true) - public let subTextLabel = Label.createLabelRegularMicro(true) + public let label = Label(fontStyle: .RegularBodySmall) + public let subTextLabel = Label(fontStyle: .RegularMicro) public var isOutOfStock = false public var accentColor = UIColor.mvmRed diff --git a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift index d7413e07..d3ac7d0b 100644 --- a/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift +++ b/MVMCoreUI/Atomic/Atoms/Selectors/RadioSwatch.swift @@ -13,7 +13,7 @@ open class RadioSwatch: Control { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - public let bottomText = Label.createLabelRegularMicro(true) + public let bottomText = Label(fontStyle: .RegularMicro) private var circleLayer: CAShapeLayer? private var selectedLayer: CALayer? diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift index 6bff6e6b..48b6cddf 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicator.swift @@ -206,6 +206,7 @@ open class CarouselIndicator: Control, CarouselPageControlProtocol { isEnabled = model.enabled formatAccessibilityValue(index: currentIndex + 1, total: numberOfPages) + isHidden = model.hidesForSinglePage && numberOfPages <= 1 } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift index 359fe98a..8bf3fa19 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/CarouselIndicatorModel.swift @@ -33,7 +33,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro public var disabledIndicatorColor: Color = Color(uiColor: .mvmCoolGray3) public var indicatorColor: Color = Color(uiColor: .mvmBlack) public var indicatorColor_inverted: Color = Color(uiColor: .mvmWhite) - public var position: Float? + public var position: CGFloat? /// Allows sendActions() to trigger even if index is already at min/max index. public var alwaysSendAction = false @@ -79,7 +79,7 @@ open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelPro self.inverted = inverted } - if let position = try typeContainer.decodeIfPresent(Float.self, forKey: .position) { + if let position = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .position) { self.position = position } diff --git a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift index 04ea2fcd..afbe30d4 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CarouselIndicator/NumericIndicatorView.swift @@ -16,7 +16,7 @@ open class NumericIndicatorView: CarouselIndicator { /// Text to display the current count of total pages for viewing. open var pageCount: Label = { - let label = Label.createLabelRegularBodySmall(true) + let label = Label(fontStyle: .RegularBodySmall) label.isAccessibilityElement = false label.setContentCompressionResistancePriority(.required, for: .vertical) label.textAlignment = .center diff --git a/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift b/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift index 9d203ea9..281c306d 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/CheckboxLabel.swift @@ -13,7 +13,7 @@ //-------------------------------------------------- public let checkbox = Checkbox() - public let label = Label.createLabelRegularBodySmall(true) + public let label = Label(fontStyle: .RegularBodySmall) //-------------------------------------------------- // MARK: - Properties diff --git a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift index d47a374f..73de7760 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Label/Label.swift @@ -13,7 +13,6 @@ public typealias ActionBlock = () -> () @objcMembers open class Label: UILabel, MVMCoreViewProtocol, MoleculeViewProtocol, MVMCoreUIViewConstrainingProtocol, MFButtonProtocol { - //------------------------------------------------------ // MARK: - Properties //------------------------------------------------------ @@ -97,7 +96,7 @@ public typealias ActionBlock = () -> () accessibilityCustomActions = [] accessibilityTraits = .staticText - let tapGesture = UITapGestureRecognizer(target: self, action: #selector(textLinkTapped(_:))) + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(textLinkTapped)) tapGesture.numberOfTapsRequired = 1 addGestureRecognizer(tapGesture) } @@ -117,6 +116,15 @@ public typealias ActionBlock = () -> () setupView() } + public init(fontStyle: Styler.Font, _ scale: Bool = true) { + super.init(frame: .zero) + setupView() + + font = fontStyle.getFont(false) + textColor = fontStyle.color() + setScale(scale) + } + @objc convenience public init(standardFontSize size: CGFloat) { self.init() standardFontSize = size @@ -139,91 +147,9 @@ public typealias ActionBlock = () -> () } //------------------------------------------------------ - // MARK: - Factory Functions + // MARK: - 2.0 Factory Functions //------------------------------------------------------ - /// Title 2XLarge - @objc public static func createLabelTitle2XLarge(_ scale: Bool) -> Label { - let label = Label.label() - label.styleTitle2XLarge(scale) - return label - } - - /// TitleXLarge - @objc public static func createLabelTitleXLarge(_ scale: Bool) -> Label { - let label = Label.label() - label.styleTitleXLarge(scale) - return label - } - - /// BoldTitleLarge - @objc public static func createLabelBoldTitleLarge(_ scale: Bool) -> Label { - let label = Label.label() - label.styleBoldTitleLarge(scale) - return label - } - - /// RegularTitleLarge - @objc public static func createLabelRegularTitleLarge(_ scale: Bool) -> Label { - let label = Label.label() - label.styleRegularTitleLarge(scale) - return label - } - - /// BoldTitleMedium - @objc public static func createLabelBoldTitleMedium(_ scale: Bool) -> Label { - let label = Label.label() - label.styleBoldTitleMedium(scale) - return label - } - - /// RegularTitleMedium - @objc public static func createLabelRegularTitleMedium(_ scale: Bool) -> Label { - let label = Label.label() - label.styleRegularTitleMedium(scale) - return label - } - - /// BoldBodyLarge - @objc public static func createLabelBoldBodyLarge(_ scale: Bool) -> Label { - let label = Label.label() - label.styleBoldBodyLarge(scale) - return label - } - - /// RegularBodyLarge - @objc public static func createLabelRegularBodyLarge(_ scale: Bool) -> Label { - let label = Label.label() - label.styleRegularBodyLarge(scale) - return label - } - - /// BoldBodySmall - @objc public static func createLabelBoldBodySmall(_ scale: Bool) -> Label { - let label = Label.label() - label.styleBoldBodySmall(scale) - return label - } - - /// RegularBodySmall - @objc public static func createLabelRegularBodySmall(_ scale: Bool) -> Label { - let label = Label.label() - label.styleRegularBodySmall(scale) - return label - } - /// BoldMicro - @objc public static func createLabelBoldMicro(_ scale: Bool) -> Label { - let label = Label.label() - label.styleBoldMicro(scale) - return label - } - /// RegularMicro - @objc public static func createLabelRegularMicro(_ scale: Bool) -> Label { - let label = Label.label() - label.styleRegularMicro(scale) - return label - } - //2.0 fonts init methods /// H1 -> HeadlineLarge @objc public static func commonLabelH1(_ scale: Bool) -> Label { @@ -569,71 +495,19 @@ public typealias ActionBlock = () -> () } //------------------------------------------------------ - // MARK: - Methods + // MARK: - 3.0 Styling Method //------------------------------------------------------ - //mva 3.0 font - @objc public func styleTitle2XLarge(_ scale: Bool) { - MFStyler.styleLabelTitle2XLarge(self, genericScaling: false) + public func setFontStyle(_ fontStyle: Styler.Font, _ scale: Bool = true) { + font = fontStyle.getFont(false) + textColor = .mvmBlack setScale(scale) } - - @objc public func styleTitleXLarge(_ scale: Bool) { - MFStyler.styleLabelTitleXLarge(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleBoldTitleLarge(_ scale: Bool) { - MFStyler.styleLabelBoldTitleLarge(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleRegularTitleLarge(_ scale: Bool) { - MFStyler.styleLabelRegularTitleLarge(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleBoldTitleMedium(_ scale: Bool) { - MFStyler.styleLabelBoldTitleMedium(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleRegularTitleMedium(_ scale: Bool) { - MFStyler.styleLabelRegularTitleMedium(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleBoldBodyLarge(_ scale: Bool) { - MFStyler.styleLabelBoldBodyLarge(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleRegularBodyLarge(_ scale: Bool) { - MFStyler.styleLabelRegularBodyLarge(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleBoldBodySmall(_ scale: Bool) { - MFStyler.styleLabelBoldBodySmall(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleRegularBodySmall(_ scale: Bool) { - MFStyler.styleLabelRegularBodySmall(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleBoldMicro(_ scale: Bool) { - MFStyler.styleLabelBoldMicro(self, genericScaling: false) - setScale(scale) - } - - @objc public func styleRegularMicro(_ scale: Bool) { - MFStyler.styleLabelRegularMicro(self, genericScaling: false) - setScale(scale) - } - - //2.0 fonts + + //------------------------------------------------------ + // MARK: - 2.0 Styling Methods + //------------------------------------------------------ + @objc public func styleH1(_ scale: Bool) { MFStyler.styleLabelH1(self, genericScaling: false) setScale(scale) diff --git a/MVMCoreUI/Atomic/Atoms/Views/LeftRightLabelView.swift b/MVMCoreUI/Atomic/Atoms/Views/LeftRightLabelView.swift index a7d85f86..3981152a 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/LeftRightLabelView.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/LeftRightLabelView.swift @@ -14,8 +14,8 @@ import Foundation // MARK: - Outlets //------------------------------------------------------ - let leftTextLabel = Label.createLabelBoldBodySmall(true) - let rightTextLabel = Label.createLabelBoldBodySmall(true) + let leftTextLabel = Label(fontStyle: .BoldBodySmall) + let rightTextLabel = Label(fontStyle: .BoldBodySmall) //------------------------------------------------------ // MARK: - Constraints diff --git a/MVMCoreUI/Atomic/MoleculeObjectMapping.swift b/MVMCoreUI/Atomic/MoleculeObjectMapping.swift index 05075afa..98b1e6a3 100644 --- a/MVMCoreUI/Atomic/MoleculeObjectMapping.swift +++ b/MVMCoreUI/Atomic/MoleculeObjectMapping.swift @@ -34,6 +34,18 @@ import Foundation return type.init(model: model, delegateObject, additionalData) } + /// Convenience function for legacy classes + public func getMoleculeModelForJSON(_ json: [String: Any]) throws -> MoleculeModelProtocol? { + guard let moleculeName = json.optionalStringForKey(KeyMoleculeName), + let type = ModelRegistry.getType(for: moleculeName, with: MoleculeModelProtocol.self) else { + throw ModelRegistry.Error.decoderErrorModelNotMapped + } + guard let model = try type.decode(jsonDict: json) as? MoleculeModelProtocol else { + throw ModelRegistry.Error.decoderError + } + return model + } + /// Call to register all of the CoreUI molecules. public static func registerObjects() { // Stacks @@ -73,6 +85,10 @@ import Foundation MoleculeObjectMapping.shared()?.register(viewClass: RadioBoxes.self, viewModelClass: RadioBoxesModel.self) MoleculeObjectMapping.shared()?.register(viewClass: Checkbox.self, viewModelClass: CheckboxModel.self) MoleculeObjectMapping.shared()?.register(viewClass: RadioSwatches.self, viewModelClass: RadioSwatchesModel.self) + MoleculeObjectMapping.shared()?.register(viewClass: Tags.self, viewModelClass: TagsModel.self) + MoleculeObjectMapping.shared()?.register(viewClass: Tag.self, viewModelClass: TagModel.self) + + // Other Atoms MoleculeObjectMapping.shared()?.register(viewClass: ProgressBar.self, viewModelClass: ProgressBarModel.self) diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonMedium.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonMedium.swift index 92ae4bad..983cfc59 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonMedium.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonMedium.swift @@ -15,11 +15,11 @@ import Foundation //-------------------------------------------------- public var verticalStack: Stack - public let eyebrow = Label.createLabelRegularMicro(true) - public let headline = Label.createLabelBoldTitleMedium(true) - public let body = Label.createLabelRegularBodySmall(true) - public let body2 = Label.createLabelRegularBodySmall(true) - public let button = PillButton() + public let eyebrow = Label(fontStyle: .RegularMicro) + public let headline = Label(fontStyle: .BoldTitleMedium) + public let body = Label(fontStyle: .RegularBodySmall) + public let body2 = Label(fontStyle: .RegularBodySmall) + public let button = PillButton(frame: .zero) public let rightImageView = LoadImageView() public var stack: Stack @@ -84,10 +84,10 @@ import Foundation } public func setDefault() { - eyebrow.styleRegularMicro(true) - headline.styleBoldTitleMedium(true) - body.styleRegularBodySmall(true) - body2.styleRegularBodySmall(true) + eyebrow.setFontStyle(.RegularMicro) + headline.setFontStyle(.BoldTitleMedium) + body.setFontStyle(.RegularBodySmall) + body2.setFontStyle(.RegularBodySmall) eyebrow.textColor = .mvmCoolGray6 } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonSmall.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonSmall.swift index 6a64f932..f0ee4619 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonSmall.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexButtonSmall.swift @@ -15,11 +15,11 @@ import Foundation //-------------------------------------------------- public var verticalStack: Stack - public let eyebrow = Label.createLabelRegularMicro(true) - public let headline = Label.createLabelBoldTitleMedium(true) - public let body = Label.createLabelRegularBodySmall(true) - public let body2 = Label.createLabelRegularBodySmall(true) - public let button = PillButton() + public let eyebrow = Label(fontStyle: .RegularMicro) + public let headline = Label(fontStyle: .BoldTitleMedium) + public let body = Label(fontStyle: .RegularBodySmall) + public let body2 = Label(fontStyle: .RegularBodySmall) + public let button = PillButton(frame: .zero) public let rightImageView = LoadImageView() public var stack: Stack @@ -84,10 +84,10 @@ import Foundation } public func setDefault() { - eyebrow.styleRegularMicro(true) - headline.styleBoldTitleMedium(true) - body.styleRegularBodySmall(true) - body2.styleRegularBodySmall(true) + eyebrow.setFontStyle(.RegularMicro) + headline.setFontStyle(.BoldTitleMedium) + body.setFontStyle(.RegularBodySmall) + body2.setFontStyle(.RegularBodySmall) eyebrow.textColor = .mvmCoolGray6 } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkMedium.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkMedium.swift index ed8af1ba..b5da04e2 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkMedium.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkMedium.swift @@ -13,11 +13,10 @@ import Foundation //----------------------------------------------------- // MARK: - Outlets //----------------------------------------------------- - - public let eyebrow = Label.createLabelRegularMicro(true) - public let headline = Label.createLabelBoldTitleMedium(true) - public let body = Label.createLabelRegularBodySmall(true) - public let body2 = Label.createLabelRegularBodySmall(true) + public let eyebrow = Label(fontStyle: .RegularMicro) + public let headline = Label(fontStyle: .BoldTitleMedium) + public let body = Label(fontStyle: .RegularBodySmall) + public let body2 = Label(fontStyle: .RegularBodySmall) public let twoLinkView = TwoLinkView() public let rightImage = LoadImageView() let verticalStack: Stack @@ -83,10 +82,10 @@ import Foundation open override func reset() { super.reset() - eyebrow.styleRegularMicro(true) - headline.styleBoldTitleMedium(true) - body.styleRegularBodySmall(true) - body2.styleRegularBodySmall(true) + eyebrow.setFontStyle(.RegularMicro) + headline.setFontStyle(.BoldTitleMedium) + body.setFontStyle(.RegularBodySmall) + body2.setFontStyle(.RegularBodySmall) eyebrow.textColor = .mvmCoolGray6 } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkSmall.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkSmall.swift index 0e2881ce..4fc92e6e 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkSmall.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/Device/ListDeviceComplexLinkSmall.swift @@ -13,11 +13,10 @@ import Foundation //----------------------------------------------------- // MARK: - Outlets //----------------------------------------------------- - - public let eyebrow = Label.createLabelRegularMicro(true) - public let headline = Label.createLabelBoldTitleMedium(true) - public let body = Label.createLabelRegularBodySmall(true) - public let body2 = Label.createLabelRegularBodySmall(true) + public let eyebrow = Label(fontStyle: .RegularMicro) + public let headline = Label(fontStyle: .BoldTitleMedium) + public let body = Label(fontStyle: .RegularBodySmall) + public let body2 = Label(fontStyle: .RegularBodySmall) public let twoLinkView = TwoLinkView() public let rightImage = LoadImageView() let verticalStack: Stack @@ -81,10 +80,10 @@ import Foundation open override func reset() { super.reset() - eyebrow.styleRegularMicro(true) - headline.styleBoldTitleMedium(true) - body.styleRegularBodySmall(true) - body2.styleRegularBodySmall(true) + eyebrow.setFontStyle(.RegularMicro) + headline.setFontStyle(.BoldTitleMedium) + body.setFontStyle(.RegularBodySmall) + body2.setFontStyle(.RegularBodySmall) eyebrow.textColor = .mvmCoolGray6 } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/FourColumn/ListFourColumnDataUsageListItem.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/FourColumn/ListFourColumnDataUsageListItem.swift index 9520052e..4ae4c4d2 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/FourColumn/ListFourColumnDataUsageListItem.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/FourColumn/ListFourColumnDataUsageListItem.swift @@ -15,11 +15,11 @@ import Foundation //----------------------------------------------------- var stack: Stack - let label1 = Label.createLabelRegularBodySmall(true) - let label2 = Label.createLabelRegularBodySmall(true) - let label3 = Label.createLabelRegularBodySmall(true) - let label4 = Label.createLabelRegularBodySmall(true) - let arrow = Arrow() + let label1 = Label(fontStyle: .RegularBodySmall) + let label2 = Label(fontStyle: .RegularBodySmall) + let label3 = Label(fontStyle: .RegularBodySmall) + let label4 = Label(fontStyle: .RegularBodySmall) + let arrow = Arrow(frame: .zero) let arrowAndLabel2Stack: Stack //----------------------------------------------------- @@ -81,10 +81,10 @@ import Foundation open override func reset() { super.reset() - label1.styleRegularBodySmall(true) - label2.styleRegularBodySmall(true) - label3.styleRegularBodySmall(true) - label4.styleRegularBodySmall(true) + label1.setFontStyle(.RegularBodySmall) + label2.setFontStyle(.RegularBodySmall) + label3.setFontStyle(.RegularBodySmall) + label4.setFontStyle(.RegularBodySmall) } //----------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaret.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaret.swift index 16175687..297ef31b 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaret.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaret.swift @@ -15,8 +15,8 @@ import UIKit //-------------------------------------------------- let leftImage = LoadImageView(pinnedEdges: .all) - let leftLabel = Label.createLabelRegularBodySmall(true) - let rightLabel = Label.createLabelRegularBodySmall(true) + let leftLabel = Label(fontStyle: .RegularBodySmall) + let rightLabel = Label(fontStyle: .RegularBodySmall) var stack: Stack //-------------------------------------------------- @@ -73,8 +73,8 @@ import UIKit open override func reset() { super.reset() - leftLabel.styleRegularBodySmall(true) - rightLabel.styleRegularBodySmall(true) + leftLabel.setFontStyle(.RegularBodySmall) + rightLabel.setFontStyle(.RegularBodySmall) } func updateAccessibilityLabel() { diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaretBodyText.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaretBodyText.swift index 3da18711..0617b5e8 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaretBodyText.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableIconWithRightCaretBodyText.swift @@ -16,7 +16,7 @@ import Foundation public let leftImage = LoadImageView() public let headlineBody = HeadlineBody() - public let rightLabel = Label.createLabelRegularBodySmall(true) + public let rightLabel = Label(fontStyle: .RegularBodySmall) public let rightLabelStackItem: StackItem public var stack: Stack @@ -85,7 +85,7 @@ import Foundation open override func reset() { super.reset() - rightLabel.styleRegularBodySmall(true) + rightLabel.setFontStyle(.RegularBodySmall) } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableNumberedListAllTextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableNumberedListAllTextAndLinks.swift index 1a01b113..5924b3d7 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableNumberedListAllTextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableNumberedListAllTextAndLinks.swift @@ -12,15 +12,9 @@ import Foundation @objcMembers open class ListLeftVariableNumberedListAllTextAndLinks: TableViewCell { //-------------------------------------------------- // MARK: - Outlets - //-------------------------------------------------- - - public let leftLabel = Label.createLabelTitle2XLarge(true) - public let eyebrowHeadlineBodyLink = EyebrowHeadlineBodyLink() - - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - + //----------------------------------------------------- + public let leftLabel = Label(fontStyle: .Title2XLarge) + public let eyebrowHeadlineBodyLink = EyebrowHeadlineBodyLink(frame: .zero) public var stack: Stack //-------------------------------------------------- @@ -69,7 +63,7 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleTitle2XLarge(true) + leftLabel.setFontStyle(.Title2XLarge) } open override func layoutSubviews() { diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableRadioButtonAndPaymentMethod.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableRadioButtonAndPaymentMethod.swift index 451c60c7..523c6d4e 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableRadioButtonAndPaymentMethod.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/LeftVariable/ListLeftVariableRadioButtonAndPaymentMethod.swift @@ -48,7 +48,7 @@ import UIKit addMolecule(stack) stack.restack() eyebrowHeadlineBodyLink.body.textColor = .mvmOrangeAA - eyebrowHeadlineBodyLink.headline.styleBoldBodySmall(true) + eyebrowHeadlineBodyLink.headline.setFontStyle(.BoldBodySmall) accessibilityTraits = radioButton.accessibilityTraits accessibilityHint = radioButton.accessibilityHint @@ -63,7 +63,7 @@ import UIKit open override func reset() { super.reset() eyebrowHeadlineBodyLink.body.textColor = .mvmOrangeAA - eyebrowHeadlineBodyLink.headline.styleBoldBodySmall(true) + eyebrowHeadlineBodyLink.headline.setFontStyle(.BoldBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift index f3e2b74a..7ce0c406 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/OneColumn/ListOneColumnFullWidthTextAllTextAndLinks.swift @@ -15,10 +15,10 @@ import Foundation //----------------------------------------------------- var stack: Stack - let eyebrow = Label.createLabelRegularMicro(true) - let headline = Label.createLabelBoldTitleMedium(true) - let subHeadline = Label.createLabelBoldBodySmall(true) - let body = Label.createLabelRegularBodySmall(true) + let eyebrow = Label(fontStyle: .RegularMicro) + let headline = Label(fontStyle: .BoldTitleMedium) + let subHeadline = Label(fontStyle: .BoldBodySmall) + let body = Label(fontStyle: .RegularBodySmall) let link = Link() //----------------------------------------------------- @@ -62,10 +62,10 @@ import Foundation open override func reset() { super.reset() - eyebrow.styleRegularMicro(true) - headline.styleBoldTitleMedium(true) - subHeadline.styleBoldBodySmall(true) - body.styleRegularBodySmall(true) + eyebrow.setFontStyle(.RegularMicro) + headline.setFontStyle(.BoldTitleMedium) + subHeadline.setFontStyle(.BoldBodySmall) + body.setFontStyle(.RegularBodySmall) } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRVWheel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRVWheel.swift index e9ad4ebd..f410c635 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRVWheel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRVWheel.swift @@ -10,18 +10,9 @@ import Foundation @objcMembers open class ListRVWheel: TableViewCell { - //-------------------------------------------------- - // MARK: - Outlets - //-------------------------------------------------- - - let wheel = Wheel() - let leftLabel = Label.createLabelBoldBodySmall(true) - let rightLabel = Label.createLabelRegularBodySmall(true) - - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - + let wheel = Wheel(frame: .zero) + let leftLabel = Label(fontStyle: .BoldBodySmall) + let rightLabel = Label(fontStyle: .RegularBodySmall) var stack: Stack //----------------------------------------------------- @@ -71,8 +62,8 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleBoldBodySmall(true) - rightLabel.styleRegularBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.RegularBodySmall) } public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePayments.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePayments.swift index 832fe761..5bb62b90 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePayments.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePayments.swift @@ -12,9 +12,8 @@ import Foundation @objcMembers open class ListRightVariablePayments: TableViewCell { //----------------------------------------------------- // MARK: - Outlets - //----------------------------------------------------- - - let leftLabel = Label.createLabelBoldBodySmall(true) + //------------------------------------------------------- + let leftLabel = Label(fontStyle: .BoldBodySmall) let rightImage = LoadImageView(pinnedEdges: .all) var stack: Stack @@ -65,7 +64,7 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleBoldBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeAllTextAndLinks.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeAllTextAndLinks.swift index 5f715f5f..afbdd2b5 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeAllTextAndLinks.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeAllTextAndLinks.swift @@ -16,7 +16,7 @@ import Foundation public let eyebrowHeadlineBodyLink = EyebrowHeadlineBodyLink() public let arrow = Arrow() - public let rightLabel = Label.createLabelRegularBodySmall(true) + public let rightLabel = Label(fontStyle: .RegularBodySmall) private let stack: Stack private let arrowStackItem: StackItem private let rightLabelStackItem: StackItem diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeBodyText.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeBodyText.swift index 6c272b96..ad18092b 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeBodyText.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariablePriceChangeBodyText.swift @@ -13,15 +13,10 @@ import Foundation //----------------------------------------------------- // MARK: - Outlets //----------------------------------------------------- - + private let stack: Stack public let headlineBody = HeadlineBody() public let arrow = Arrow() - public let rightLabel = Label.createLabelRegularBodySmall(true) - - //----------------------------------------------------- - // MARK: - Properties - //----------------------------------------------------- - + public let rightLabel = Label(fontStyle: .RegularBodySmall) let arrowAndRightLabelStack: Stack private let stack: Stack diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableTotalData.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableTotalData.swift index 7e795566..99a1885d 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableTotalData.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableTotalData.swift @@ -13,9 +13,9 @@ import Foundation //----------------------------------------------------- // MARK: - Outlets //----------------------------------------------------- - - public let leftLabel = Label.createLabelBoldBodySmall(true) - public let rightLabel = Label.createLabelRegularBodySmall(true) + public var stack: Stack + public let leftLabel = Label(fontStyle: .BoldBodySmall) + public let rightLabel = Label(fontStyle: .RegularBodySmall) public let bar = Line() //----------------------------------------------------- @@ -76,9 +76,8 @@ import Foundation open override func reset() { super.reset() - - leftLabel.styleBoldBodySmall(true) - rightLabel.styleRegularBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.RegularBodySmall) bar.setStyle(.heavy) } diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnDataUsage.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnDataUsage.swift index fc16bd4b..00a09527 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnDataUsage.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnDataUsage.swift @@ -12,11 +12,10 @@ import Foundation @objcMembers open class ListThreeColumnDataUsage: TableViewCell { //----------------------------------------------------- // MARK: - Outlets - //----------------------------------------------------- - - public let leftLabel = Label.createLabelRegularBodySmall(true) - public let centerLabel = Label.createLabelRegularBodySmall(true) - public let rightLabel = Label.createLabelRegularBodySmall(true) + //------------------------------------------------------- + public let leftLabel = Label(fontStyle: .RegularBodySmall) + public let centerLabel = Label(fontStyle: .RegularBodySmall) + public let rightLabel = Label(fontStyle: .RegularBodySmall) var stack: Stack //------------------------------------------------------ @@ -68,9 +67,9 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleRegularBodySmall(true) - centerLabel.styleRegularBodySmall(true) - rightLabel.styleRegularBodySmall(true) + leftLabel.setFontStyle(.RegularBodySmall) + centerLabel.setFontStyle(.RegularBodySmall) + rightLabel.setFontStyle(.RegularBodySmall) } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnInternationalData.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnInternationalData.swift index 359bae7d..20e7378a 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnInternationalData.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/ThreeColumn/ListThreeColumnInternationalData.swift @@ -16,10 +16,10 @@ import Foundation //----------------------------------------------------- open var stack: Stack - public let leftLabel = Label.createLabelRegularBodySmall(true) - public let centerLabel = Label.createLabelRegularBodySmall(true) - public let rightLabel = Label.createLabelRegularBodySmall(true) - public let arrow = Arrow() + public let leftLabel = Label(fontStyle: .RegularBodySmall) + public let centerLabel = Label(fontStyle: .RegularBodySmall) + public let rightLabel = Label(fontStyle: .RegularBodySmall) + public let arrow = Arrow(frame: .zero) public let arrowAndLabel2Stack: Stack //----------------------------------------------------- @@ -77,9 +77,9 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleRegularBodySmall(true) - centerLabel.styleRegularBodySmall(true) - rightLabel.styleRegularBodySmall(true) + leftLabel.setFontStyle(.RegularBodySmall) + centerLabel.setFontStyle(.RegularBodySmall) + rightLabel.setFontStyle(.RegularBodySmall) } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift index 535c180f..3d563002 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnCompareChanges.swift @@ -83,14 +83,14 @@ import Foundation open override func reset() { super.reset() - leftHeadlineBodyLink.headline1.styleBoldBodySmall(true) - leftHeadlineBodyLink.headline2.styleBoldBodySmall(true) - leftHeadlineBodyLink.headline3.styleBoldBodySmall(true) - leftHeadlineBodyLink.body.styleRegularBodySmall(true) - rightHeadlineBodyLink.headline1.styleBoldBodySmall(true) - rightHeadlineBodyLink.headline2.styleBoldBodySmall(true) - rightHeadlineBodyLink.headline3.styleBoldBodySmall(true) - rightHeadlineBodyLink.body.styleRegularBodySmall(true) + leftHeadline1.setFontStyle(.BoldBodySmall) + leftHeadline2.setFontStyle(.BoldBodySmall) + leftHeadline3.setFontStyle(.BoldBodySmall) + leftBody.setFontStyle(.RegularBodySmall) + rightHeadline1.setFontStyle(.BoldBodySmall) + rightHeadline2.setFontStyle(.BoldBodySmall) + rightHeadline3.setFontStyle(.BoldBodySmall) + rightBody.setFontStyle(.RegularBodySmall) } public override class func estimatedHeight(with molecule: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift index 37e0ebf2..16328584 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDescription.swift @@ -12,12 +12,11 @@ import Foundation @objcMembers open class ListTwoColumnPriceDescription: TableViewCell { //----------------------------------------------------- // MARK: - Outlets - //----------------------------------------------------- - - public let leftHeadline = Label.createLabelBoldBodySmall(true) - public let leftBody = Label.createLabelRegularBodySmall(true) - public let rightLabel = Label.createLabelRegularBodySmall(true) - public let rightSubLabel = Label.createLabelRegularBodySmall(true) + //------------------------------------------------------- + public let leftHeadline = Label(fontStyle: .BoldBodySmall) + public let leftBody = Label(fontStyle: .RegularBodySmall) + public let rightLabel = Label(fontStyle: .RegularBodySmall) + public let rightSubLabel = Label(fontStyle: .RegularBodySmall) public let view = MVMCoreUICommonViewsUtility.commonView() public let leftVerticalStack: UIStackView @@ -97,10 +96,10 @@ import Foundation super.reset() leftVerticalStack.reset() rightVerticalStack.reset() - leftHeadline.styleBoldBodySmall(true) - leftBody.styleRegularBodySmall(true) - rightLabel.styleRegularBodySmall(true) - rightSubLabel.styleRegularBodySmall(true) + leftHeadline.setFontStyle(.BoldBodySmall) + leftBody.setFontStyle(.RegularBodySmall) + rightLabel.setFontStyle(.RegularBodySmall) + rightSubLabel.setFontStyle(.RegularBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift index 29ee94ba..e725bb64 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/TwoColumn/ListTwoColumnPriceDetails.swift @@ -14,8 +14,8 @@ import UIKit // MARK: - Properties //-------------------------------------------------- - let leftLabel = Label.createLabelRegularBodySmall(true) - let rightLabel = Label.createLabelRegularBodySmall(true) + let leftLabel = Label(fontStyle: .RegularBodySmall) + let rightLabel = Label(fontStyle: .RegularBodySmall) let view = MVMCoreUICommonViewsUtility.commonView() //-------------------------------------------------- @@ -59,8 +59,8 @@ import UIKit super.reset() leftLabel.reset() rightLabel.reset() - leftLabel.styleRegularBodySmall(true) - rightLabel.styleRegularBodySmall(true) + leftLabel.setFontStyle(.RegularBodySmall) + rightLabel.setFontStyle(.RegularBodySmall) } open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/ListProgressBarData.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/ListProgressBarData.swift index dfcbd87c..636d481f 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/ListProgressBarData.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/ListProgressBarData.swift @@ -13,10 +13,9 @@ import UIKit //----------------------------------------------------- // MARK: - Outlets //----------------------------------------------------- - let progressBar = MultiProgress() - let leftLabel = Label.createLabelBoldBodySmall(true) - let rightLabel = Label.createLabelBoldBodySmall(true) + let leftLabel = Label(fontStyle: .BoldBodySmall) + let rightLabel = Label(fontStyle: .BoldBodySmall) let view = MVMCoreUICommonViewsUtility.commonView() //----------------------------------------------------- @@ -52,8 +51,8 @@ import UIKit progressBar.reset() leftLabel.reset() rightLabel.reset() - leftLabel.styleBoldBodySmall(true) - rightLabel.styleBoldBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.BoldBodySmall) } //----------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/FourColumn/ListFourColumnDataUsageDivider.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/FourColumn/ListFourColumnDataUsageDivider.swift index d8ab112c..96c72865 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/FourColumn/ListFourColumnDataUsageDivider.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/FourColumn/ListFourColumnDataUsageDivider.swift @@ -14,10 +14,11 @@ import Foundation // MARK: - Properties //-------------------------------------------------- - let label1 = Label.createLabelBoldBodySmall(true) - let label2 = Label.createLabelBoldBodySmall(true) - let label3 = Label.createLabelBoldBodySmall(true) - let label4 = Label.createLabelBoldBodySmall(true) + // MARK: - MFViewProtocol + let label1 = Label(fontStyle: .BoldBodySmall) + let label2 = Label(fontStyle: .BoldBodySmall) + let label3 = Label(fontStyle: .BoldBodySmall) + let label4 = Label(fontStyle: .BoldBodySmall) var stack: Stack //-------------------------------------------------- @@ -71,10 +72,10 @@ import Foundation open override func reset() { super.reset() - label1.styleBoldBodySmall(true) - label2.styleBoldBodySmall(true) - label3.styleBoldBodySmall(true) - label4.styleBoldBodySmall(true) + label1.setFontStyle(.BoldBodySmall) + label2.setFontStyle(.BoldBodySmall) + label3.setFontStyle(.BoldBodySmall) + label4.setFontStyle(.BoldBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnFullWidthTextDividerSubsection.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnFullWidthTextDividerSubsection.swift index 88ad013f..3ed2065e 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnFullWidthTextDividerSubsection.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnFullWidthTextDividerSubsection.swift @@ -15,8 +15,8 @@ import Foundation //----------------------------------------------------- public var stack: Stack - public let headline = Label.createLabelBoldBodySmall(true) - public let body = Label.createLabelRegularBodySmall(true) + public let headline = Label(fontStyle: .BoldBodySmall) + public let body = Label(fontStyle: .RegularBodySmall) //-------------------------------------------------- // MARK: - Initializers @@ -65,8 +65,8 @@ import Foundation open override func reset() { super.reset() - headline.styleBoldBodySmall(true) - body.styleRegularBodySmall(true) + headline.setFontStyle(.BoldBodySmall) + body.setFontStyle(.RegularBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerShort.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerShort.swift index 204f85a2..02d320a9 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerShort.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerShort.swift @@ -15,8 +15,8 @@ import Foundation //----------------------------------------------------- public var stack: Stack - public let headline = Label.createLabelBoldTitleMedium(true) - public let body = Label.createLabelRegularBodySmall(true) + public let headline = Label(fontStyle: .BoldTitleMedium) + public let body = Label(fontStyle: .RegularBodySmall) //-------------------------------------------------- // MARK: - Initializers @@ -65,8 +65,8 @@ import Foundation open override func reset() { super.reset() - headline.styleBoldTitleMedium(true) - body.styleRegularBodySmall(true) + headline.setFontStyle(.BoldTitleMedium) + body.setFontStyle(.RegularBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerTall.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerTall.swift index 44462f86..704057db 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerTall.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/OneColumn/ListOneColumnTextWithWhitespaceDividerTall.swift @@ -15,8 +15,8 @@ import Foundation //----------------------------------------------------- public var stack: Stack - public let headline = Label.createLabelBoldTitleMedium(true) - public let body = Label.createLabelRegularBodySmall(true) + public let headline = Label(fontStyle: .BoldTitleMedium) + public let body = Label(fontStyle: .RegularBodySmall) //-------------------------------------------------- // MARK: - Initializers @@ -64,8 +64,8 @@ import Foundation open override func reset() { super.reset() - headline.styleBoldTitleMedium(true) - body.styleRegularBodySmall(true) + headline.setFontStyle(.BoldTitleMedium) + body.setFontStyle(.RegularBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnBillChangesDivider.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnBillChangesDivider.swift index 1ef40129..c4a42835 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnBillChangesDivider.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnBillChangesDivider.swift @@ -14,9 +14,9 @@ import Foundation // MARK: - Outlets //----------------------------------------------------- - public let leftLabel = Label.createLabelBoldBodySmall(true) - public let centerLabel = Label.createLabelBoldBodySmall(true) - public let rightLabel = Label.createLabelBoldBodySmall(true) + public let leftLabel = Label(fontStyle: .BoldBodySmall) + public let centerLabel = Label(fontStyle: .BoldBodySmall) + public let rightLabel = Label(fontStyle: .BoldBodySmall) var stack: Stack //----------------------------------------------------- @@ -68,9 +68,9 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleBoldBodySmall(true) - centerLabel.styleBoldBodySmall(true) - rightLabel.styleBoldBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + centerLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.BoldBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnDataUsageDivider.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnDataUsageDivider.swift index 6f7881fd..7fe35b92 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnDataUsageDivider.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnDataUsageDivider.swift @@ -12,11 +12,10 @@ import Foundation @objcMembers open class ListThreeColumnDataUsageDivider: TableViewCell { //----------------------------------------------------- // MARK: - Outlets - //----------------------------------------------------- - - public let leftLabel = Label.createLabelBoldBodySmall(true) - public let centerLabel = Label.createLabelBoldBodySmall(true) - public let rightLabel = Label.createLabelBoldBodySmall(true) + //------------------------------------------------------- + public let leftLabel = Label(fontStyle: .BoldBodySmall) + public let centerLabel = Label(fontStyle: .BoldBodySmall) + public let rightLabel = Label(fontStyle: .BoldBodySmall) var stack: Stack //------------------------------------------------------ @@ -68,9 +67,9 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleBoldBodySmall(true) - centerLabel.styleBoldBodySmall(true) - rightLabel.styleBoldBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + centerLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.BoldBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnInternationalDataDivider.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnInternationalDataDivider.swift index 06f447a8..1d842266 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnInternationalDataDivider.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnInternationalDataDivider.swift @@ -13,10 +13,9 @@ import Foundation //----------------------------------------------------- // MARK: - Outlets //----------------------------------------------------- - - let leftLabel = Label.createLabelBoldBodySmall(true) - let centerLabel = Label.createLabelBoldBodySmall(true) - let rightLabel = Label.createLabelBoldBodySmall(true) + let leftLabel = Label(fontStyle: .BoldBodySmall) + let centerLabel = Label(fontStyle: .BoldBodySmall) + let rightLabel = Label(fontStyle: .BoldBodySmall) var stack: Stack //------------------------------------------------------ @@ -67,9 +66,9 @@ import Foundation override open func reset() { super.reset() - leftLabel.styleBoldBodySmall(true) - centerLabel.styleBoldBodySmall(true) - rightLabel.styleBoldBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + centerLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.BoldBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnSpeedTestDivider.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnSpeedTestDivider.swift index d2355878..91a86643 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnSpeedTestDivider.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/ThreeColumn/ListThreeColumnSpeedTestDivider.swift @@ -13,10 +13,9 @@ import Foundation //------------------------------------------------------- // MARK: - Outlets //------------------------------------------------------- - - let leftLabel = Label.createLabelBoldBodySmall(true) - let centerLabel = Label.createLabelBoldBodySmall(true) - let rightLabel = Label.createLabelBoldBodySmall(true) + let leftLabel = Label(fontStyle: .BoldBodySmall) + let centerLabel = Label(fontStyle: .BoldBodySmall) + let rightLabel = Label(fontStyle: .BoldBodySmall) var stack: Stack //------------------------------------------------------- @@ -68,9 +67,9 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleBoldBodySmall(true) - centerLabel.styleBoldBodySmall(true) - rightLabel.styleBoldBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + centerLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.BoldBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/TwoColumn/ListTwoColumnSubsectionDivider.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/TwoColumn/ListTwoColumnSubsectionDivider.swift index 4a3abce1..b3972ae6 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/TwoColumn/ListTwoColumnSubsectionDivider.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/SectionDividers/TwoColumn/ListTwoColumnSubsectionDivider.swift @@ -13,9 +13,8 @@ import Foundation //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- - - let leftLabel = Label.createLabelBoldBodySmall(true) - let rightLabel = Label.createLabelBoldBodySmall(true) + let leftLabel = Label(fontStyle: .BoldBodySmall) + let rightLabel = Label(fontStyle: .BoldBodySmall) var stack: Stack //-------------------------------------------------- @@ -65,8 +64,8 @@ import Foundation open override func reset() { super.reset() - leftLabel.styleBoldBodySmall(true) - rightLabel.styleBoldBodySmall(true) + leftLabel.setFontStyle(.BoldBodySmall) + rightLabel.setFontStyle(.BoldBodySmall) } //---------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/Doughnut/ColorViewWithLabel.swift b/MVMCoreUI/Atomic/Molecules/Doughnut/ColorViewWithLabel.swift index f8dd4b5c..b9b3a4a4 100644 --- a/MVMCoreUI/Atomic/Molecules/Doughnut/ColorViewWithLabel.swift +++ b/MVMCoreUI/Atomic/Molecules/Doughnut/ColorViewWithLabel.swift @@ -14,7 +14,7 @@ open class ColorViewWithLabel: View { // MARK: - Properties //-------------------------------------------------- - public var label = Label.createLabelRegularBodySmall(true) + public var label = Label(fontStyle: .RegularBodySmall, true) public var colorView = View() private var sizeObject = MFStyler.sizeObjectGeneric(forCurrentDevice: 8)! diff --git a/MVMCoreUI/Atomic/Molecules/Doughnut/DoughnutChart.swift b/MVMCoreUI/Atomic/Molecules/Doughnut/DoughnutChart.swift index f735587d..db57f977 100644 --- a/MVMCoreUI/Atomic/Molecules/Doughnut/DoughnutChart.swift +++ b/MVMCoreUI/Atomic/Molecules/Doughnut/DoughnutChart.swift @@ -15,8 +15,8 @@ open class DoughnutChart: View { //-------------------------------------------------- public var doughnutLayer = CALayer() - public var titleLabel = Label.createLabelBoldTitleLarge(true) - public var subTitleLabel = Label.createLabelRegularMicro(true) + public var titleLabel = Label(fontStyle: .BoldTitleLarge) + public var subTitleLabel = Label(fontStyle: .RegularMicro) public var labelContainer = MVMCoreUICommonViewsUtility.commonView() public static let heightConstant: CGFloat = 136 private var sizeObject = MFStyler.sizeObjectGeneric(forCurrentDevice: heightConstant)! diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/ImageHeadlineBody.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/ImageHeadlineBody.swift index ff770da3..6f2e1960 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/ImageHeadlineBody.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/ImageHeadlineBody.swift @@ -18,7 +18,7 @@ import UIKit open override func setupView() { super.setupView() - headlineBody.headlineLabel.styleBoldBodySmall(true) + headlineBody.headlineLabel.setFontStyle(.BoldBodySmall) headlineBody.spaceBetweenLabelsConstant = 0 imageView.addSizeConstraintsForAspectRatio = true @@ -43,7 +43,7 @@ import UIKit open override func reset() { super.reset() headlineBody.reset() - headlineBody.headlineLabel.styleBoldBodySmall(true) + headlineBody.headlineLabel.setFontStyle(.BoldBodySmall) headlineBody.spaceBetweenLabelsConstant = 0 imageView.reset() } diff --git a/MVMCoreUI/Atomic/Molecules/Items/MoleculeCollectionItemModel.swift b/MVMCoreUI/Atomic/Molecules/Items/MoleculeCollectionItemModel.swift index 4f203813..645d16b1 100644 --- a/MVMCoreUI/Atomic/Molecules/Items/MoleculeCollectionItemModel.swift +++ b/MVMCoreUI/Atomic/Molecules/Items/MoleculeCollectionItemModel.swift @@ -13,6 +13,12 @@ import Foundation open override class var identifier: String { return "collectionItem" } + + public var action: ActionModelProtocol? + + private enum CodingKeys: String, CodingKey { + case action + } /// Defaults to set public override func setDefaults() { @@ -35,10 +41,14 @@ import Foundation } required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + action = try typeContainer.decodeModelIfPresent(codingKey: .action) try super.init(from: decoder) } public override func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeModelIfPresent(action, forKey: .action) try super.encode(to: encoder) } } diff --git a/MVMCoreUI/Atomic/Molecules/LeftRightViews/CornerLabels.swift b/MVMCoreUI/Atomic/Molecules/LeftRightViews/CornerLabels.swift index 5751fbc2..be3ac62e 100644 --- a/MVMCoreUI/Atomic/Molecules/LeftRightViews/CornerLabels.swift +++ b/MVMCoreUI/Atomic/Molecules/LeftRightViews/CornerLabels.swift @@ -10,10 +10,10 @@ import UIKit @objcMembers public class CornerLabels: View { var middleView: UIView? - let topLeftLabel = Label.createLabelBoldBodySmall(true) - let topRightLabel = Label.createLabelBoldBodySmall(true) - let bottomLeftLabel = Label.createLabelRegularMicro(true) - let bottomRightLabel = Label.createLabelRegularMicro(true) + let topLeftLabel = Label(fontStyle: .BoldBodySmall) + let topRightLabel = Label(fontStyle: .BoldBodySmall) + let bottomLeftLabel = Label(fontStyle: .RegularMicro) + let bottomRightLabel = Label(fontStyle: .RegularMicro) let topLabelsView = MVMCoreUICommonViewsUtility.commonView() let bottomLabelsView = MVMCoreUICommonViewsUtility.commonView() @@ -151,10 +151,10 @@ import UIKit } func styleDefault() { - topLeftLabel.styleBoldBodySmall(true) - topRightLabel.styleBoldBodySmall(true) - bottomLeftLabel.styleRegularMicro(true) - bottomRightLabel.styleRegularMicro(true) + topLeftLabel.setFontStyle(.BoldBodySmall) + topRightLabel.setFontStyle(.BoldBodySmall) + bottomLeftLabel.setFontStyle(.RegularMicro) + bottomRightLabel.setFontStyle(.RegularMicro) } public class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { diff --git a/MVMCoreUI/Atomic/Molecules/LeftRightViews/ToggleMolecules/LabelToggle.swift b/MVMCoreUI/Atomic/Molecules/LeftRightViews/ToggleMolecules/LabelToggle.swift index 3ff3a41f..5611984f 100644 --- a/MVMCoreUI/Atomic/Molecules/LeftRightViews/ToggleMolecules/LabelToggle.swift +++ b/MVMCoreUI/Atomic/Molecules/LeftRightViews/ToggleMolecules/LabelToggle.swift @@ -14,7 +14,7 @@ import UIKit // MARK: - Properties //-------------------------------------------------- - public let label = Label.createLabelBoldBodySmall(true) + public let label = Label(fontStyle: .BoldBodySmall) public let toggle = Toggle() //-------------------------------------------------- @@ -58,6 +58,6 @@ import UIKit super.reset() label.reset() toggle.reset() - label.styleBoldBodySmall(true) + label.setFontStyle(.BoldBodySmall) } } diff --git a/MVMCoreUI/Atomic/Molecules/NavigationBar/NavigationItemModel.swift b/MVMCoreUI/Atomic/Molecules/NavigationBar/NavigationItemModel.swift index 05aec0a3..bf926878 100644 --- a/MVMCoreUI/Atomic/Molecules/NavigationBar/NavigationItemModel.swift +++ b/MVMCoreUI/Atomic/Molecules/NavigationBar/NavigationItemModel.swift @@ -18,6 +18,7 @@ public class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProt public var backgroundColor: Color? public var tintColor: Color public var line: LineModel? + public var alwaysShowBackButton = false public var backButton: (NavigationButtonModelProtocol & MoleculeModelProtocol)? = NavigationImageButtonModel(with: "back", action: ActionBackModel()) public var additionalLeftButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]? public var additionalRightButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]? @@ -30,11 +31,13 @@ public class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProt } private enum CodingKeys: String, CodingKey { + case moleculeName case title case hidden case backgroundColor case tintColor case line + case alwaysShowBackButton case backButton case showLeftPanelButton case showRightPanelButton @@ -49,6 +52,7 @@ public class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProt backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) ?? Color(uiColor: .white) tintColor = try typeContainer.decodeIfPresent(Color.self, forKey: .tintColor) ?? Color(uiColor: .black) line = try typeContainer.decodeIfPresent(LineModel.self, forKey: .line) + alwaysShowBackButton = try typeContainer.decodeIfPresent(Bool.self, forKey: .alwaysShowBackButton) ?? false if let backButton: (NavigationButtonModelProtocol & MoleculeModelProtocol) = try typeContainer.decodeModelIfPresent(codingKey: .backButton) { self.backButton = backButton } @@ -58,11 +62,13 @@ public class NavigationItemModel: NavigationItemModelProtocol, MoleculeModelProt open func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(title, forKey: .title) try container.encode(hidden, forKey: .hidden) - try container.encode(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encode(tintColor, forKey: .tintColor) try container.encodeIfPresent(line, forKey: .line) + try container.encode(alwaysShowBackButton, forKey: .alwaysShowBackButton) try container.encodeModelIfPresent(backButton, forKey: .backButton) try container.encodeModelsIfPresent(additionalLeftButtons, forKey: .additionalLeftButtons) try container.encodeModelsIfPresent(additionalRightButtons, forKey: .additionalRightButtons) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBodyLink.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBodyLink.swift index 9ad26015..7d176ba2 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBodyLink.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBodyLink.swift @@ -14,9 +14,9 @@ import UIKit //-------------------------------------------------- public let stack = Stack(frame: .zero) - public let eyebrow = Label.createLabelRegularMicro(true) - public let headline = Label.createLabelBoldBodySmall(true) - public let body = Label.createLabelRegularBodySmall(true) + public let eyebrow = Label(fontStyle: .RegularMicro) + public let headline = Label(fontStyle: .BoldBodySmall) + public let body = Label(fontStyle: .RegularBodySmall, true) public let link = Link() var castModel: EyebrowHeadlineBodyLinkModel? { @@ -48,9 +48,9 @@ import UIKit open override func reset() { super.reset() stack.reset() - eyebrow.styleRegularMicro(true) - headline.styleBoldBodySmall(true) - body.styleRegularBodySmall(true) + eyebrow.setFontStyle(.RegularMicro) + headline.setFontStyle(.BoldBodySmall) + body.setFontStyle(.RegularBodySmall) } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/HeadlineBody.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/HeadlineBody.swift index 4e9b97dd..93b6fa68 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/HeadlineBody.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/HeadlineBody.swift @@ -10,8 +10,8 @@ import UIKit open class HeadlineBody: View { - let headlineLabel = Label.createLabelBoldTitleLarge(true) - let messageLabel = Label.createLabelRegularBodySmall(true) + let headlineLabel = Label(fontStyle: .BoldTitleLarge) + let messageLabel = Label(fontStyle: .RegularBodySmall) var spaceBetweenLabelsConstant = PaddingOne var spaceBetweenLabels: NSLayoutConstraint? var leftConstraintTitle: NSLayoutConstraint? @@ -39,26 +39,26 @@ open class HeadlineBody: View { } func styleLandingPageHeader() { - headlineLabel.styleTitle2XLarge(true) - messageLabel.styleRegularBodySmall(true) + headlineLabel.setFontStyle(.Title2XLarge) + messageLabel.setFontStyle(.RegularBodySmall) spaceBetweenLabelsConstant = PaddingTwo } func stylePageHeader() { - headlineLabel.styleBoldTitleLarge(true) - messageLabel.styleRegularBodySmall(true) + headlineLabel.setFontStyle(.BoldTitleLarge) + messageLabel.setFontStyle(.RegularBodySmall) spaceBetweenLabelsConstant = PaddingOne } func styleListItem() { - headlineLabel.styleBoldBodySmall(true) - messageLabel.styleRegularBodySmall(true) + headlineLabel.setFontStyle(.BoldBodySmall) + messageLabel.setFontStyle(.RegularBodySmall) spaceBetweenLabelsConstant = 0 } func styleListItemDivider() { - headlineLabel.styleBoldTitleMedium(true) - messageLabel.styleRegularBodySmall(true) + headlineLabel.setFontStyle(.BoldTitleMedium) + messageLabel.setFontStyle(.RegularBodySmall) spaceBetweenLabelsConstant = 0 } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Lists/StringAndMoleculeStack/StringAndMoleculeView.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Lists/StringAndMoleculeStack/StringAndMoleculeView.swift index 30a82134..3c97e988 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Lists/StringAndMoleculeStack/StringAndMoleculeView.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Lists/StringAndMoleculeStack/StringAndMoleculeView.swift @@ -9,7 +9,7 @@ import Foundation open class StringAndMoleculeView: View { - var label = Label.createLabelRegularBodySmall(true) + var label = Label(fontStyle: .RegularBodySmall) var molecule: MoleculeViewProtocol var leftWidthConstraint: NSLayoutConstraint? diff --git a/MVMCoreUI/Atomic/Organisms/Carousel.swift b/MVMCoreUI/Atomic/Organisms/Carousel.swift index 9fa72b5d..abc0e74b 100644 --- a/MVMCoreUI/Atomic/Organisms/Carousel.swift +++ b/MVMCoreUI/Atomic/Organisms/Carousel.swift @@ -19,8 +19,14 @@ public protocol CarouselPageControlProtocol { open class Carousel: View { - public let collectionView = CollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) - + public let collectionView: CollectionView = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.minimumInteritemSpacing = 0 + layout.minimumLineSpacing = 0 + return CollectionView(frame: .zero, collectionViewLayout: layout) + }() + /// The current index of the collection view. Includes dummy cells when looping. public var currentIndex = 0 @@ -36,13 +42,13 @@ open class Carousel: View { open var numberOfPages = 0 /// The models for the molecules. - var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol]? + public var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol]? /// The horizontal alignment of the cell in the collection view. Only noticeable if the itemWidthPercent is less than 100%. public var itemAlignment = UICollectionView.ScrollPosition.left /// From 0-1. The item width as a percent of the carousel width. - public var itemWidthPercent: Float = 1 + public var itemWidthPercent: CGFloat = 1 /// The height of the carousel. Default is 300. public var collectionViewHeight: NSLayoutConstraint? @@ -51,7 +57,7 @@ open class Carousel: View { public var pagingView: (UIView & CarouselPageControlProtocol)? /// If the carousel should loop after scrolling past the first and final cells. - var loop = false + public var loop = false private var dragging = false @@ -81,6 +87,8 @@ open class Carousel: View { showPeaking(false) // Go to current cell. layoutIfNeeded is needed otherwise cellForItem returns nil for peaking logic. The dispatch is a sad way to ensure the collection view is ready to be scrolled. + guard let model = model as? CarouselModel, + (model.paging == true || model.loop == true) else { return } DispatchQueue.main.async { self.collectionView.scrollToItem(at: IndexPath(row: self.currentIndex, section: 0), at: self.itemAlignment, animated: false) self.collectionView.layoutIfNeeded() @@ -98,15 +106,23 @@ open class Carousel: View { collectionView.delegate = self addSubview(collectionView) bottomPin = NSLayoutConstraint.constraintPinSubview(toSuperview: collectionView)?[ConstraintBot] as? NSLayoutConstraint - collectionViewHeight = collectionView.heightAnchor.constraint(equalToConstant: 300) - collectionViewHeight?.isActive = false + collectionViewHeight?.isActive = true } open override func updateView(_ size: CGFloat) { super.updateView(size) self.size = size + // Set insets for the carousel. + var inset = UIEdgeInsets.zero + let carouselModel = model as? CarouselModel + if carouselModel?.useHorizontalMargins ?? false { + inset.left = carouselModel?.leftPadding ?? Padding.Component.horizontalPaddingForSize(size) + inset.right = carouselModel?.rightPadding ?? Padding.Component.horizontalPaddingForSize(size) + } + (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.sectionInset = inset + // Update cells and re-layout. for cell in collectionView.visibleCells { (cell as? MVMCoreViewProtocol)?.updateView(size) @@ -128,19 +144,19 @@ open class Carousel: View { collectionView.layer.borderColor = backgroundColor?.cgColor collectionView.layer.borderWidth = (carouselModel.border ?? false) ? 1 : 0 backgroundColor = .white - - registerCells(with: carouselModel, delegateObject: delegateObject) - setupLayout(with: carouselModel) - prepareMolecules(with: carouselModel) - itemWidthPercent = (carouselModel.itemWidthPercent ?? 100) / 100 + (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing = carouselModel.spacing ?? 0 + + itemWidthPercent = carouselModel.itemWidthPercent / 100.0 if let alignment = carouselModel.itemAlignment { itemAlignment = alignment } if let height = carouselModel.height { - collectionViewHeight?.constant = CGFloat(height) - collectionViewHeight?.isActive = true + collectionViewHeight?.constant = height } + + registerCells(with: carouselModel, delegateObject: delegateObject) + prepareMolecules(with: carouselModel) setupPagingMolecule(carouselModel.pagingMolecule, delegateObject: delegateObject) @@ -153,16 +169,6 @@ open class Carousel: View { // MARK: - JSON Setters //-------------------------------------------------- - /// Updates the layout being used - func setupLayout(with carouselModel: CarouselModel?) { - - let layout = UICollectionViewFlowLayout() - layout.scrollDirection = .horizontal - layout.minimumLineSpacing = CGFloat(carouselModel?.spacing ?? 1) - layout.minimumInteritemSpacing = 0 - collectionView.collectionViewLayout = layout - } - func prepareMolecules(with carouselModel: CarouselModel?) { guard let newMolecules = carouselModel?.molecules else { numberOfPages = 0 @@ -187,11 +193,12 @@ open class Carousel: View { /// Sets up the paging molecule open func setupPagingMolecule(_ molecule: (CarouselPagingModelProtocol & MoleculeModelProtocol)?, delegateObject: MVMCoreUIDelegateObject?) { var pagingView: (UIView & CarouselPageControlProtocol)? = nil - if let molecule = molecule { + if let molecule = molecule, + (!molecule.hidesForSinglePage || numberOfPages > 1) { pagingView = MoleculeObjectMapping.shared()?.createMolecule(molecule, delegateObject: delegateObject) as? (UIView & CarouselPageControlProtocol) } - addPaging(view: pagingView, position: (CGFloat(molecule?.position ?? 20))) + addPaging(view: pagingView, position: molecule?.position ?? 20) } /// Registers the cells with the collection view @@ -294,7 +301,7 @@ open class Carousel: View { extension Carousel: UICollectionViewDelegateFlowLayout { open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) + let itemWidth = collectionView.bounds.width * itemWidthPercent return CGSize(width: itemWidth, height: collectionView.bounds.height) } @@ -324,8 +331,15 @@ extension Carousel: UICollectionViewDataSource { } } +extension Carousel: UICollectionViewDelegate { + open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + (collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol)?.didSelectCell(at: indexPath, delegateObject: delegateObject, additionalData: nil) + } +} + extension Carousel: UIScrollViewDelegate { + /// Go to the cell at the specified index. func goTo(_ index: Int, animated: Bool) { showPeaking(false) @@ -339,51 +353,33 @@ extension Carousel: UIScrollViewDelegate { } } - func handleUserOnBufferCell() { - guard loop else { return } - - let lastPageIndex = numberOfPages + 1 - let goToIndex = { (index: Int) in - self.goTo(index, animated: false) - self.collectionView.layoutIfNeeded() - self.pagingView?.currentIndex = self.pageIndex - } - - if currentIndex < 2 { - // If on a "buffer" last row (which is the first index), go to the real last row secretly. layoutIfNeeded is needed otherwise cellForItem returns nil for peaking. - goToIndex(lastPageIndex) - } else if currentIndex > lastPageIndex { - // If on the "buffer" first row (which is the index after the real last row), go to the real first row secretly. - goToIndex(2) - } - } - - func checkForDraggingOutOfBounds(_ scrollView: UIScrollView) { - - guard loop, dragging else { return } - - // Checks if the user is not paging but attempting to drag endlessly and goes out of bounds. Caps the index. - if let separatorWidth = (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing { - let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) - let index = scrollView.contentOffset.x / (itemWidth + separatorWidth) - let lastCellIndex = collectionView(collectionView, numberOfItemsInSection: 0) - 1 - - if index < 1 { - currentIndex = 0 - updateModelIndex() - } else if index > CGFloat(lastCellIndex - 1) { - currentIndex = lastCellIndex - updateModelIndex() + /// Adjusts the current contentOffset if we are going onto buffer cells while looping to help with the endless scrolling appearance. + func adjustOffsetForLooping(_ scrollView: UIScrollView) { + let translatedPoint = scrollView.panGestureRecognizer.translation(in: scrollView.superview).x + if translatedPoint > 0 { + // Moving left, see if we are moving passed the first left buffer card and adjust + if let threshold = collectionView.layoutAttributesForItem(at: IndexPath(item: 1, section: 0))?.frame.minX, + scrollView.contentOffset.x < threshold, + let newOffset = collectionView.layoutAttributesForItem(at: IndexPath(item: numberOfPages + 1, section: 0))?.frame.minX { + scrollView.contentOffset.x = newOffset + } + } else if translatedPoint < 0 { + // Moving right, see if we are moving passed the first right buffer card and adjust + if let threshold = collectionView.layoutAttributesForItem(at: IndexPath(item: numberOfPages + 2, section: 0))?.frame.maxX, + scrollView.contentOffset.x + scrollView.bounds.width > threshold, + let newEndOffset = collectionView.layoutAttributesForItem(at: IndexPath(item: 2, section: 0))?.frame.maxX { + scrollView.contentOffset.x = newEndOffset - scrollView.bounds.width } } - - handleUserOnBufferCell() } open func scrollViewDidScroll(_ scrollView: UIScrollView) { - - // Check if the user is dragging the card even further past the next card. - //checkForDraggingOutOfBounds(scrollView) + + // Adjust for looping + if let model = model as? CarouselModel, + model.loop == true { + adjustOffsetForLooping(scrollView) + } // Let the pager know our progress if needed. pagingView?.scrollViewDidScroll(collectionView) @@ -391,6 +387,7 @@ extension Carousel: UIScrollViewDelegate { public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + // Disable peaking when dragging. dragging = true showPeaking(false) } @@ -398,32 +395,63 @@ extension Carousel: UIScrollViewDelegate { public func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { dragging = false - targetContentOffset.pointee = scrollView.contentOffset - // This is for setting up smooth custom paging. (Since UICollectionView only handles paging based on collection view size and not cell size). - guard let separatorWidth = (collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing else { return } + // This is for setting up smooth custom paging. (Since UICollectionView only handles paging based on collection view size and not cell size). Math requires that we are using UICollectionViewFlowLayout. + guard (model as? CarouselModel)?.paging == true, + let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return } - // We switch cards if we pass the velocity threshold or position threshold (currently 50%). - let itemWidth = collectionView.bounds.width * CGFloat(itemWidthPercent) - var cellToSwipeTo = Int(scrollView.contentOffset.x / (itemWidth + separatorWidth) + 0.5) - let lastCellIndex = collectionView(collectionView, numberOfItemsInSection: 0) - 1 - let velocityThreshold: CGFloat = 1.1 + let separatorWidth = layout.minimumLineSpacing + let itemWidth = collectionView.bounds.width * itemWidthPercent + let width = itemWidth + separatorWidth - if velocity.x > velocityThreshold { - cellToSwipeTo = currentIndex + 1 - - } else if velocity.x < -velocityThreshold { - cellToSwipeTo = currentIndex - 1 + // Adjusts the offset for the contentInset. Adds imaginary half separator to the left of the first card, which is necessary for determining the percent of a given card we are currently at. + let adjustedOffset = scrollView.contentOffset.x - layout.sectionInset.left + (separatorWidth / 2) + + // Calculates the offset per card depending on the alignment. + var offsetByCard: CGFloat + switch itemAlignment { + case .right: + offsetByCard = ((adjustedOffset + scrollView.bounds.width) / width) - 1 + case .centeredHorizontally: + offsetByCard = ((adjustedOffset + (scrollView.bounds.width / 2)) / width) - 0.5 + default: + offsetByCard = adjustedOffset / width } + // Adjust card for velocity impact. + let velocityThreshold: CGFloat = 1.1 + var cellToSwipeTo: Int + if velocity.x > velocityThreshold { + cellToSwipeTo = Int(ceil(offsetByCard)) + } else if velocity.x < -velocityThreshold { + cellToSwipeTo = Int(floor(offsetByCard)) + } else { + cellToSwipeTo = Int(round(offsetByCard)) + } + + // If we are swiping to a buffer cell, change to real cell before beginning animation so we don't go out of bounds. + if cellToSwipeTo < 2 { + let newOffset = scrollView.contentOffset.x + (width * CGFloat(numberOfPages)) + scrollView.contentOffset.x = newOffset + targetContentOffset.pointee.x = newOffset + cellToSwipeTo = cellToSwipeTo + numberOfPages + } else if cellToSwipeTo > numberOfPages + 1 { + let newOffset = scrollView.contentOffset.x - (width * CGFloat(numberOfPages)) + scrollView.contentOffset.x = newOffset + targetContentOffset.pointee.x = newOffset + cellToSwipeTo = cellToSwipeTo - numberOfPages + } else { + targetContentOffset.pointee = scrollView.contentOffset + } + // Cap the index. + let lastCellIndex = collectionView(collectionView, numberOfItemsInSection: 0) - 1 goTo(min(max(cellToSwipeTo, 0), lastCellIndex), animated: true) } // To give the illusion of endless scrolling. Since we are always calling scrollToItem we can assume finished paging in here. public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { // Cycle to other end if on buffer cell. - handleUserOnBufferCell() pagingView?.currentIndex = pageIndex showPeaking(true) } diff --git a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift index 5ff753aa..20915799 100644 --- a/MVMCoreUI/Atomic/Organisms/CarouselModel.swift +++ b/MVMCoreUI/Atomic/Organisms/CarouselModel.swift @@ -21,14 +21,18 @@ import UIKit public var backgroundColor: Color? public var molecules: [MoleculeModelProtocol & CarouselItemModelProtocol] public var index: Int = 0 - public var spacing: Float? + public var spacing: CGFloat? public var border: Bool? public var loop: Bool? - public var height: Float? - public var itemWidthPercent: Float? + public var height: CGFloat? + @Percent public var itemWidthPercent = 100 public var itemAlignment: UICollectionView.ScrollPosition? public var pagingMolecule: (CarouselPagingModelProtocol & MoleculeModelProtocol)? - + public var paging: Bool = true + public var useHorizontalMargins: Bool? + public var leftPadding: CGFloat? + public var rightPadding: CGFloat? + public init(molecules: [MoleculeModelProtocol & CarouselItemModelProtocol]) { self.molecules = molecules } @@ -49,6 +53,10 @@ import UIKit case itemWidthPercent case itemAlignment case pagingMolecule + case paging + case useHorizontalMargins + case leftPadding + case rightPadding } //-------------------------------------------------- @@ -60,13 +68,21 @@ import UIKit molecules = try typeContainer.decodeModels(codingKey: .molecules) index = try typeContainer.decodeIfPresent(Int.self, forKey: .index) ?? 0 backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - spacing = try typeContainer.decodeIfPresent(Float.self, forKey: .spacing) + spacing = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .spacing) border = try typeContainer.decodeIfPresent(Bool.self, forKey: .border) loop = try typeContainer.decodeIfPresent(Bool.self, forKey: .loop) - height = try typeContainer.decodeIfPresent(Float.self, forKey: .height) - itemWidthPercent = try typeContainer.decodeIfPresent(Float.self, forKey: .itemWidthPercent) + height = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .height) + if let itemWidthPercent = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .itemWidthPercent) { + self.itemWidthPercent = itemWidthPercent + } itemAlignment = try typeContainer.decodeIfPresent(UICollectionView.ScrollPosition.self, forKey: .itemAlignment) pagingMolecule = try typeContainer.decodeModelIfPresent(codingKey: .pagingMolecule) + if let paging = try typeContainer.decodeIfPresent(Bool.self, forKey: .paging) { + self.paging = paging + } + useHorizontalMargins = try typeContainer.decodeIfPresent(Bool.self, forKey: .useHorizontalMargins) + leftPadding = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .leftPadding) + rightPadding = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .rightPadding) } public func encode(to encoder: Encoder) throws { @@ -74,12 +90,16 @@ import UIKit try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeModels(molecules, forKey: .molecules) - try container.encode(spacing, forKey: .spacing) - try container.encode(border, forKey: .border) - try container.encode(loop, forKey: .loop) - try container.encode(height, forKey: .height) + try container.encodeIfPresent(spacing, forKey: .spacing) + try container.encodeIfPresent(border, forKey: .border) + try container.encodeIfPresent(loop, forKey: .loop) + try container.encodeIfPresent(height, forKey: .height) try container.encode(itemWidthPercent, forKey: .itemWidthPercent) - try container.encode(itemAlignment, forKey: .itemAlignment) + try container.encodeIfPresent(itemAlignment, forKey: .itemAlignment) try container.encodeModelIfPresent(pagingMolecule, forKey: .pagingMolecule) + try container.encode(paging, forKey: .paging) + try container.encodeIfPresent(useHorizontalMargins, forKey: .useHorizontalMargins) + try container.encodeIfPresent(leftPadding, forKey: .leftPadding) + try container.encodeIfPresent(rightPadding, forKey: .rightPadding) } } diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift index 72138290..3bd03b3b 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/CarouselPagingModelProtocol.swift @@ -10,5 +10,6 @@ import Foundation public protocol CarouselPagingModelProtocol { - var position: Float? { get } + var position: CGFloat? { get } + var hidesForSinglePage: Bool { get } } diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/NavigationItemModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/NavigationItemModelProtocol.swift index e4017428..30db2aa6 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/NavigationItemModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/NavigationItemModelProtocol.swift @@ -14,6 +14,7 @@ public protocol NavigationItemModelProtocol { var backgroundColor: Color? { get set } var tintColor: Color { get set } var line: LineModel? { get set } + var alwaysShowBackButton: Bool { get set } var backButton: (NavigationButtonModelProtocol & MoleculeModelProtocol)? { get set } var additionalLeftButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]? { get set } var additionalRightButtons: [(NavigationButtonModelProtocol & MoleculeModelProtocol)]? { get set } diff --git a/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift b/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift index be4273df..b65e96f1 100644 --- a/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/CollectionTemplate.swift @@ -131,7 +131,7 @@ import Foundation return cell } - public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + public override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { (collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol)?.didSelectCell(at: indexPath, delegateObject: delegateObjectIVar, additionalData: nil) } diff --git a/MVMCoreUI/BaseClasses/CollectionViewCell.swift b/MVMCoreUI/BaseClasses/CollectionViewCell.swift index aa74d229..5f464f2d 100644 --- a/MVMCoreUI/BaseClasses/CollectionViewCell.swift +++ b/MVMCoreUI/BaseClasses/CollectionViewCell.swift @@ -10,7 +10,7 @@ import Foundation /// A base collection view cell with basic mvm functionality. -open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCoreViewProtocol, CollectionTemplateItemProtocol { +open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCoreViewProtocol, CollectionTemplateItemProtocol, MFButtonProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -25,10 +25,6 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo private var initialSetupPerformed = false - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - // MARK: - Inits public override init(frame: CGRect) { super.init(frame: .zero) @@ -47,10 +43,6 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo } } - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - // MARK: - MVMCoreViewProtocol open func setupView() { isAccessibilityElement = false @@ -68,16 +60,6 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo (molecule as? MVMCoreViewProtocol)?.updateView(size) } - open func reset() { - molecule?.reset() - backgroundColor = .mvmWhite - width = nil - } - - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - // MARK: - MoleculeViewProtocol open func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { guard let model = model as? CollectionItemModelProtocol else { return } @@ -94,6 +76,12 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo } } + open func reset() { + molecule?.reset() + backgroundColor = .mvmWhite + width = nil + } + /// Convenience function. Adds a molecule to the view. open func addMolecule(_ molecule: MoleculeViewProtocol) { contentView.addSubview(molecule) @@ -109,6 +97,12 @@ open class CollectionViewCell: UICollectionViewCell, MoleculeViewProtocol, MVMCo self.width = width } + // MARK: - Override + open func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + guard let action = model?.action else { return } + Button.performButtonAction(with: action, button: self, delegateObject: delegateObject, additionalData: additionalData) + } + // Column logic, set width. override open func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { let autoLayoutAttributes = super.preferredLayoutAttributesFitting(layoutAttributes) diff --git a/MVMCoreUI/BaseClasses/Protocols/CollectionItemModelProtocol.swift b/MVMCoreUI/BaseClasses/Protocols/CollectionItemModelProtocol.swift index 9361ab1e..faed7548 100644 --- a/MVMCoreUI/BaseClasses/Protocols/CollectionItemModelProtocol.swift +++ b/MVMCoreUI/BaseClasses/Protocols/CollectionItemModelProtocol.swift @@ -9,5 +9,13 @@ import Foundation public protocol CollectionItemModelProtocol { - + var action: ActionModelProtocol? { get set } +} + +// Not a strict requirement. +public extension CollectionItemModelProtocol { + var action: ActionModelProtocol? { + get { return nil } + set { } + } } diff --git a/MVMCoreUI/BaseClasses/TableViewCell.swift b/MVMCoreUI/BaseClasses/TableViewCell.swift index 254a09f0..caaeec85 100644 --- a/MVMCoreUI/BaseClasses/TableViewCell.swift +++ b/MVMCoreUI/BaseClasses/TableViewCell.swift @@ -8,7 +8,7 @@ import UIKit -@objcMembers open class TableViewCell: UITableViewCell, MoleculeViewProtocol, MoleculeListCellProtocol, MVMCoreViewProtocol { +@objcMembers open class TableViewCell: UITableViewCell, MoleculeViewProtocol, MoleculeListCellProtocol, MVMCoreViewProtocol, MFButtonProtocol { open var molecule: MoleculeViewProtocol? open var listItemModel: ListItemModelProtocol? @@ -267,10 +267,8 @@ import UIKit } public func didSelectCell(at index: IndexPath, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - //TODO: Use object when handleAction is rewrote to handle action model - if let actionMap = self.listItemModel?.action?.toJSON() { - MVMCoreActionHandler.shared()?.handleAction(with: actionMap, additionalData: additionalData, delegateObject: delegateObject) - } + guard let action = listItemModel?.action else { return } + Button.performButtonAction(with: action, button: self, delegateObject: delegateObject, additionalData: additionalData) } public func willDisplay() { diff --git a/MVMCoreUI/BaseClasses/UICollectionViewLeftAlignedLayout.swift b/MVMCoreUI/BaseClasses/UICollectionViewLeftAlignedLayout.swift new file mode 100644 index 00000000..717bbc55 --- /dev/null +++ b/MVMCoreUI/BaseClasses/UICollectionViewLeftAlignedLayout.swift @@ -0,0 +1,27 @@ +// +// UICollectionViewLeftAlignedLayout.swift +// MVMCoreUI +// +// Created by Dhamodaram Nandi on 05/06/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// +// Left aligns items and makes the minimumInteritemSpacing absolute. + +import Foundation + +class UICollectionViewLeftAlignedLayout: UICollectionViewFlowLayout { + override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { + guard let attributes = super.layoutAttributesForElements(in: rect) else { return nil } + var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]() + for attribute in attributes { + if let previousFrame = newAttributesForElementsInRect.last, + MVMCoreGetterUtility.cgfequal(previousFrame.frame.minY, attribute.frame.minY) { + attribute.frame.origin.x = previousFrame.frame.maxX + minimumInteritemSpacing + } else { + attribute.frame.origin.x = 0 + } + newAttributesForElementsInRect.append(attribute) + } + return newAttributesForElementsInRect + } +} diff --git a/MVMCoreUI/BaseControllers/ThreeLayerCollectionViewController.swift b/MVMCoreUI/BaseControllers/ThreeLayerCollectionViewController.swift index 88d8157a..4011f4f8 100644 --- a/MVMCoreUI/BaseControllers/ThreeLayerCollectionViewController.swift +++ b/MVMCoreUI/BaseControllers/ThreeLayerCollectionViewController.swift @@ -233,4 +233,8 @@ import Foundation } fatalError() } + + open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + (collectionView.cellForItem(at: indexPath) as? CollectionTemplateItemProtocol)?.didSelectCell(at: indexPath, delegateObject: delegateObjectIVar, additionalData: nil) + } } diff --git a/MVMCoreUI/Categories/UIColor+Extension.swift b/MVMCoreUI/Categories/UIColor+Extension.swift index 27816af2..7c82788c 100644 --- a/MVMCoreUI/Categories/UIColor+Extension.swift +++ b/MVMCoreUI/Categories/UIColor+Extension.swift @@ -282,7 +282,9 @@ extension UIColor { guard let components = color.cgColor.components else { return nil } - if color.cgColor.numberOfComponents >= 3 { + let numberOfComponents = color.cgColor.numberOfComponents + if numberOfComponents >= 3 { + // RGB color space let r = Int(CGFloat(components[0]) * 255) let g = Int(CGFloat(components[1]) * 255) let b = Int(CGFloat(components[2]) * 255) @@ -294,6 +296,16 @@ extension UIColor { } return String(format: "%02X%02X%02X", r, g, b) + } else if numberOfComponents == 2 { + // Monochromatic color space + let value = Int(CGFloat(components[0]) * 255) + + // If alpha of color is less than 1.0 then alpha hex is relevant. + if components[1] < 1.0 { + let alpha = Int(CGFloat(components[1]) * 255) + return String(format: "%02X%02X%02X%02X", value, value, value, alpha) + } + return String(format: "%02X%02X%02X", value, value, value) } return nil diff --git a/MVMCoreUI/Containers/NavigationController.swift b/MVMCoreUI/Containers/NavigationController.swift index 6f3bf06f..0d4d0a56 100644 --- a/MVMCoreUI/Containers/NavigationController.swift +++ b/MVMCoreUI/Containers/NavigationController.swift @@ -48,7 +48,7 @@ import UIKit let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject var leftItems: [UIBarButtonItem] = [] if let backButtonModel = navigationItemModel.backButton, - navigationController.viewControllers.count > 1 { + navigationController.viewControllers.count > 1 || navigationItemModel.alwaysShowBackButton { leftItems.append(backButtonModel.createNavigationItemButton(delegateObject: delegate, additionalData: nil)) } if let leftItemModels = navigationItemModel.additionalLeftButtons { @@ -90,4 +90,12 @@ import UIKit // Sets up the navigation buttons. setNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController) } + + /// Convenience setter for legacy files + public static func set(navigationController: UINavigationController, navigationJSON: [String: Any], viewController: UIViewController) throws { + guard let barModel = try MoleculeObjectMapping.shared()?.getMoleculeModelForJSON(navigationJSON) as? (MoleculeModelProtocol & NavigationItemModelProtocol) else { + throw ModelRegistry.Error.decoderOther(message: "Model not a bar model") + } + set(navigationController: navigationController, navigationItemModel: barModel, viewController: viewController) + } }