From 083e52bc1919320b69b3a2f6e4a8356965cc1ee2 Mon Sep 17 00:00:00 2001 From: Sumanth Nadigadda Date: Wed, 4 May 2022 01:35:21 +0530 Subject: [PATCH] TitleLockup model changes --- MVMCoreUI.xcodeproj/project.pbxproj | 16 ++-- .../LockUps/TitleLockup.swift} | 78 +++++----------- .../LockUps/TitleLockupModel.swift} | 91 +++++++++++++------ .../OtherHandlers/CoreUIModelMapping.swift | 2 +- 4 files changed, 95 insertions(+), 92 deletions(-) rename MVMCoreUI/Atomic/Molecules/{VerticalCombinationViews/EyebrowHeadlineBody.swift => DesignedComponents/LockUps/TitleLockup.swift} (54%) rename MVMCoreUI/Atomic/Molecules/{VerticalCombinationViews/EyebrowHeadlineBodyModel.swift => DesignedComponents/LockUps/TitleLockupModel.swift} (59%) diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 407051bd..730d98aa 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -145,9 +145,9 @@ 32D2609724C19E2100B56344 /* LockupsPlanSMLXLModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D2609524C19E2100B56344 /* LockupsPlanSMLXLModel.swift */; }; 32F8804624765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */; }; 32F8804824765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */; }; + 444FB7C12821B73200DFE692 /* TitleLockup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 444FB7C02821B73200DFE692 /* TitleLockup.swift */; }; + 444FB7C32821B76B00DFE692 /* TitleLockupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 444FB7C22821B76B00DFE692 /* TitleLockupModel.swift */; }; 4457904E27ECE989002B1E1E /* UIImageRenderingMode+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4457904D27ECE989002B1E1E /* UIImageRenderingMode+Extension.swift */; }; - 4461F77A2800AB2D00BA0222 /* EyebrowHeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4461F7792800AB2D00BA0222 /* EyebrowHeadlineBodyModel.swift */; }; - 4461F77C2800AB6C00BA0222 /* EyebrowHeadlineBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4461F77B2800AB6C00BA0222 /* EyebrowHeadlineBody.swift */; }; 522679C123FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */; }; 522679C223FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522679C023FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift */; }; 52267A0723FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52267A0623FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift */; }; @@ -735,9 +735,9 @@ 32D2609524C19E2100B56344 /* LockupsPlanSMLXLModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LockupsPlanSMLXLModel.swift; sourceTree = ""; }; 32F8804524765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListAllTextAndLinksModel.swift; sourceTree = ""; }; 32F8804724765C8400C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListLeftVariableNumberedListAllTextAndLinks.swift; sourceTree = ""; }; + 444FB7C02821B73200DFE692 /* TitleLockup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleLockup.swift; sourceTree = ""; }; + 444FB7C22821B76B00DFE692 /* TitleLockupModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleLockupModel.swift; sourceTree = ""; }; 4457904D27ECE989002B1E1E /* UIImageRenderingMode+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageRenderingMode+Extension.swift"; sourceTree = ""; }; - 4461F7792800AB2D00BA0222 /* EyebrowHeadlineBodyModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBodyModel.swift; sourceTree = ""; }; - 4461F77B2800AB6C00BA0222 /* EyebrowHeadlineBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EyebrowHeadlineBody.swift; sourceTree = ""; }; 522679BF23FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableCheckboxAllTextAndLinks.swift; sourceTree = ""; }; 522679C023FE886900906CBA /* ListLeftVariableCheckboxAllTextAndLinksModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListLeftVariableCheckboxAllTextAndLinksModel.swift; sourceTree = ""; }; 52267A0623FFE25000906CBA /* ListOneColumnFullWidthTextAllTextAndLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextAllTextAndLinks.swift; sourceTree = ""; }; @@ -1435,6 +1435,8 @@ 525019DC2406430800EED91C /* ListProgressBarData.swift */, AA45AA0A24BF0263007A6EA7 /* LockUpsPlanNamesModel.swift */, AA45AA0C24BF0276007A6EA7 /* LockUpsPlanNames.swift */, + 444FB7C22821B76B00DFE692 /* TitleLockupModel.swift */, + 444FB7C02821B73200DFE692 /* TitleLockup.swift */, ); path = LockUps; sourceTree = ""; @@ -1641,8 +1643,6 @@ EA5124FC243601600051A3A4 /* BGImageHeadlineBodyButton.swift */, 0A775F2524893916009EFB58 /* ThreeHeadlineBodyLink.swift */, 0A775F2724893937009EFB58 /* ThreeHeadlineBodyLinkModel.swift */, - 4461F7792800AB2D00BA0222 /* EyebrowHeadlineBodyModel.swift */, - 4461F77B2800AB6C00BA0222 /* EyebrowHeadlineBody.swift */, ); path = VerticalCombinationViews; sourceTree = ""; @@ -2669,6 +2669,7 @@ 0A7BAD74232A8DC700FB8E22 /* HeadlineBodyButton.swift in Sources */, 3265B30424BCA749000D154B /* HeadersH1NoButtonsBodyText.swift in Sources */, AAA7CD69250641F90045B959 /* HeartModel.swift in Sources */, + 444FB7C12821B73200DFE692 /* TitleLockup.swift in Sources */, D2FB151D23A40F1500C20E10 /* MoleculeStackItem.swift in Sources */, D28BA7452481652D00B75CB8 /* TabBarProtocol.swift in Sources */, AA11A41F23F15D3100D7962F /* ListRightVariablePayments.swift in Sources */, @@ -2737,7 +2738,6 @@ D260106323D0C05000764D80 /* StackItemModel.swift in Sources */, D2E2A99823D8D63C000B42E6 /* ActionDetailWithImageModel.swift in Sources */, D28764AC245898A400CB882D /* ThreeLayerFillMiddleTemplateModel.swift in Sources */, - 4461F77A2800AB2D00BA0222 /* EyebrowHeadlineBodyModel.swift in Sources */, BBBBC87D24374A4900B0F079 /* ListThreeColumnBillChangesDividerModel.swift in Sources */, D2ED2800254B0E0300A1C293 /* MVMCoreAlertHandler+Extension.swift in Sources */, D2ED27EE254B0CE700A1C293 /* ActionAlertModel.swift in Sources */, @@ -2863,6 +2863,7 @@ 525019E52406852100EED91C /* ListFourColumnDataUsageDividerModel.swift in Sources */, 32D2609624C19E2100B56344 /* LockupsPlanSMLXL.swift in Sources */, 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */, + 444FB7C32821B76B00DFE692 /* TitleLockupModel.swift in Sources */, D29C94D5242901C9003813BA /* MVMCoreUICommonViewsUtility+Extension.swift in Sources */, D260105323CEA61600764D80 /* ToggleModel.swift in Sources */, 014AA72523C501E2006F3E93 /* ContainerModel.swift in Sources */, @@ -2930,7 +2931,6 @@ 32F8804624765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift in Sources */, 011D958524042432000E3791 /* RulesProtocol.swift in Sources */, 4457904E27ECE989002B1E1E /* UIImageRenderingMode+Extension.swift in Sources */, - 4461F77C2800AB6C00BA0222 /* EyebrowHeadlineBody.swift in Sources */, D23118B325124E18001C8440 /* Notification.swift in Sources */, AA9972502475309F00FC7472 /* ListLeftVariableIconAllTextLinksModel.swift in Sources */, AA69AAF62445BF5700AF3D3B /* ListLeftVariableCheckboxBodyText.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBody.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/TitleLockup.swift similarity index 54% rename from MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBody.swift rename to MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/TitleLockup.swift index cf58a95f..bc069b27 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBody.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/TitleLockup.swift @@ -1,28 +1,28 @@ // -// EyebrowHeadlineBody.swift +// TitleLockup.swift // MVMCoreUI // -// Created by Nadigadda, Sumanth on 08/04/22. +// Created by Nadigadda, Sumanth on 04/05/22. // Copyright © 2022 Verizon Wireless. All rights reserved. // -@objcMembers open class EyebrowHeadlineBody: View { +@objcMembers open class TitleLockup: View { //-------------------------------------------------- // MARK: - Outlets //-------------------------------------------------- public let eyebrow = Label(fontStyle: .RegularBodySmall) - public let headline = Label(fontStyle: .RegularBodySmall) - public let body = Label(fontStyle: .RegularBodySmall) + public let title = Label(fontStyle: .RegularBodySmall) + public let subTitle = Label(fontStyle: .RegularBodySmall) public lazy var stack: Stack = { return Stack.createStack(with: [(view: eyebrow, model: StackItemModel(horizontalAlignment: .fill)), - (view: headline, model: StackItemModel(horizontalAlignment: .fill)), - (view: body, model: StackItemModel(horizontalAlignment: .fill))], + (view: title, model: StackItemModel(horizontalAlignment: .fill)), + (view: subTitle, model: StackItemModel(horizontalAlignment: .fill))], axis: .vertical) }() - var castModel: EyebrowHeadlineBodyModel? { - get { return model as? EyebrowHeadlineBodyModel } + var castModel: TitleLockupModel? { + get { return model as? TitleLockupModel } } //-------------------------------------------------- @@ -31,7 +31,6 @@ public convenience init() { self.init(frame: .zero) - stack.restack() } //-------------------------------------------------- @@ -47,7 +46,7 @@ open override func updateView(_ size: CGFloat) { super.updateView(size) - stack.stackModel?.spacing = castModel?.style.defaultSpacing() ?? EyebrowHeadlineBodyModel.Style.large.defaultSpacing() + stack.stackModel?.spacing = castModel?.style.defaultSpacing() ?? TitleLockupModel.Style.large.defaultSpacing() stack.updateView(size) } @@ -66,24 +65,11 @@ open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { super.set(with: model, delegateObject, additionalData) - guard let model = model as? EyebrowHeadlineBodyModel else { return } - - setStyle(style: model.style) - - ///Updating the text color - model.eyebrow?.textColor = model.headlineColor - model.headline.textColor = model.headlineColor - model.body?.textColor = model.bodyColor - - if let textAlignment = NSTextAlignment(rawValue: model.alignment.rawValue) { - model.eyebrow?.textAlignment = textAlignment - model.headline.textAlignment = textAlignment - model.body?.textAlignment = textAlignment - } - + guard let model = model as? TitleLockupModel else { return } + stack.updateContainedMolecules(with: [model.eyebrow, - model.headline, - model.body], + model.title, + model.subTitle], delegateObject, additionalData) } @@ -91,29 +77,6 @@ return 65 } - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - public func setStyle(style: EyebrowHeadlineBodyModel.Style? = .large) { - - ///If eyebrow style is not available, will set font style based on the component - ///Eyebrow and body share the same font size - if castModel?.eyebrow?.fontStyle == nil { - castModel?.eyebrow?.fontStyle = style?.defaultBodyFontStyle() - } - - ///If headline style is not available, will set font style based on the component - if castModel?.headline.fontStyle == nil { - castModel?.headline.fontStyle = style?.defaultHeadlineFontStyle() - } - - ///If body style is not available, will set font style based on the component - if castModel?.body?.fontStyle == nil { - castModel?.body?.fontStyle = style?.defaultBodyFontStyle() - } - } - //-------------------------------------------------- // MARK: - Accessibility Helpers //-------------------------------------------------- @@ -127,11 +90,11 @@ message += eyebrowLabel + ", " } - if let headlineLabel = headline.text { + if let headlineLabel = title.text { message += headlineLabel + ", " } - if let bodyLabel = body.text { + if let bodyLabel = subTitle.text { message += bodyLabel } @@ -147,14 +110,15 @@ elements.append(eyebrow) } - if headline.hasText { - elements.append(headline) + if title.hasText { + elements.append(title) } - if body.hasText { - elements.append(body) + if subTitle.hasText { + elements.append(subTitle) } return elements.count > 0 ? elements : nil } } + diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBodyModel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/TitleLockupModel.swift similarity index 59% rename from MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBodyModel.swift rename to MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/TitleLockupModel.swift index dbf8377c..a4351cf4 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/EyebrowHeadlineBodyModel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/LockUps/TitleLockupModel.swift @@ -1,25 +1,25 @@ // -// EyebrowHeadlineBodyModel.swift +// TitleLockupModel.swift // MVMCoreUI // -// Created by Nadigadda, Sumanth on 08/04/22. +// Created by Nadigadda, Sumanth on 04/05/22. // Copyright © 2022 Verizon Wireless. All rights reserved. // import VDSColorTokens -public class EyebrowHeadlineBodyModel: MoleculeModelProtocol, ParentMoleculeModelProtocol { +public class TitleLockupModel: MoleculeModelProtocol, ParentMoleculeModelProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - public static var identifier: String = "eyebrowHeadlineBody" - public var moleculeName: String = EyebrowHeadlineBodyModel.identifier + public static var identifier: String = "titleLockup" + public var moleculeName: String = TitleLockupModel.identifier public var eyebrow: LabelModel? - public var headline: LabelModel - public var body: LabelModel? + public var title: LabelModel + public var subTitle: LabelModel? public var style: Style = .large public var alignment: Alignment = .left @@ -35,27 +35,27 @@ public class EyebrowHeadlineBodyModel: MoleculeModelProtocol, ParentMoleculeMode } } - public var headlineColor: Color? { + public var titleColor: Color? { return inverted ? Color(uiColor: VDSColor.elementsPrimaryOndark) : Color(uiColor: VDSColor.elementsPrimaryOnlight) } - public var bodyColor: Color? { + public var subTitleColor: Color? { return inverted ? Color(uiColor: VDSColor.elementsSecondaryOndark) : Color(uiColor: VDSColor.elementsSecondaryOnlight) } public var children: [MoleculeModelProtocol] { - [eyebrow, headline, body].compactMap { (molecule: MoleculeModelProtocol?) in molecule } + [eyebrow, title, subTitle].compactMap { (molecule: MoleculeModelProtocol?) in molecule } } //-------------------------------------------------- // MARK: - Initializer //-------------------------------------------------- - public init(eyebrow: LabelModel? = nil, headline: LabelModel, body: LabelModel? = nil) throws { + public init(eyebrow: LabelModel? = nil, title: LabelModel, subTitle: LabelModel? = nil) throws { self.eyebrow = eyebrow - self.headline = headline - self.body = body + self.title = title + self.subTitle = subTitle } //-------------------------------------------------- @@ -122,8 +122,8 @@ public class EyebrowHeadlineBodyModel: MoleculeModelProtocol, ParentMoleculeMode case moleculeName case backgroundColor case eyebrow - case headline - case body + case title + case subTitle case inverted case alignment case style @@ -136,32 +136,71 @@ public class EyebrowHeadlineBodyModel: MoleculeModelProtocol, ParentMoleculeMode required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) eyebrow = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .eyebrow) - headline = try typeContainer.decodeMolecule(codingKey: .headline) - body = try typeContainer.decodeMoleculeIfPresent(codingKey: .body) - - if let style = try typeContainer.decodeIfPresent(Style.self, forKey: .style) { - self.style = style + title = try typeContainer.decodeMolecule(codingKey: .title) + subTitle = try typeContainer.decodeMoleculeIfPresent(codingKey: .subTitle) + + if let newStyle = try typeContainer.decodeIfPresent(Style.self, forKey: .style) { + style = newStyle + setStyle(style: newStyle) } - if let alignment = try typeContainer.decodeIfPresent(Alignment.self, forKey: .alignment) { - self.alignment = alignment + if let newAlignment = try typeContainer.decodeIfPresent(Alignment.self, forKey: .alignment) { + alignment = newAlignment } - if let inverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { - self.inverted = inverted + if let invertedStatus = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { + inverted = invertedStatus } backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + updateLabelAttributes() } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(eyebrow, forKey: .eyebrow) - try container.encodeModelIfPresent(headline, forKey: .headline) - try container.encodeIfPresent(body, forKey: .body) + try container.encodeModel(title, forKey: .title) + try container.encodeIfPresent(subTitle, forKey: .subTitle) try container.encodeIfPresent(style, forKey: .style) try container.encode(alignment, forKey: .alignment) try container.encode(inverted, forKey: .inverted) try container.encodeIfPresent(_backgroundColor, forKey: .backgroundColor) } + + //-------------------------------------------------- + // MARK: - Model updates + //-------------------------------------------------- + + private func setStyle(style: Style) { + + ///If eyebrow style is not available, will set font style based on the component + ///Eyebrow and body share the same font size + if eyebrow?.fontStyle == nil { + eyebrow?.fontStyle = style.defaultBodyFontStyle() + } + + ///If title style is not available, will set font style based on the component + if title.fontStyle == nil { + title.fontStyle = style.defaultHeadlineFontStyle() + } + + ///If subtitle style is not available, will set font style based on the component + if subTitle?.fontStyle == nil { + subTitle?.fontStyle = style.defaultBodyFontStyle() + } + } + + private func updateLabelAttributes() { + ///Updating the text color + eyebrow?.textColor = titleColor + title.textColor = titleColor + subTitle?.textColor = subTitleColor + + ///Updating the text alignment for all labels + if let textAlignment = NSTextAlignment(rawValue: alignment.rawValue) { + eyebrow?.textAlignment = textAlignment + title.textAlignment = textAlignment + subTitle?.textAlignment = textAlignment + } + } } diff --git a/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift b/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift index 5527813b..ef051b88 100644 --- a/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift +++ b/MVMCoreUI/OtherHandlers/CoreUIModelMapping.swift @@ -87,7 +87,6 @@ open class CoreUIModelMapping: ModelMapping { ModelRegistry.register(handler: BGImageHeadlineBodyButton.self, for: BGImageHeadlineBodyButtonModel.self) ModelRegistry.register(handler: ThreeHeadlineBodyLink.self, for: ThreeHeadlineBodyLinkModel.self) ModelRegistry.register(handler: ImageButton.self, for: ImageButtonModel.self) - ModelRegistry.register(handler: EyebrowHeadlineBody.self, for: EyebrowHeadlineBodyModel.self) // MARK:- Left Right Molecules ModelRegistry.register(handler: CornerLabels.self, for: CornerLabelsModel.self) @@ -205,6 +204,7 @@ open class CoreUIModelMapping: ModelMapping { // MARK:- LockUps ModelRegistry.register(handler: LockUpsPlanNames.self, for: LockUpsPlanNamesModel.self) ModelRegistry.register(handler: LockupsPlanSMLXL.self, for: LockupsPlanSMLXLModel.self) + ModelRegistry.register(handler: TitleLockup.self, for: TitleLockupModel.self) // MARK: - Top Notifications ModelRegistry.register(handler: NotificationView.self, for: NotificationModel.self)