bullet list molecule added
This commit is contained in:
parent
ccc535360c
commit
e5ca7b5c9e
@ -32,6 +32,7 @@
|
|||||||
943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */; };
|
943784F6236B77BB006A1E82 /* GraphViewAnimationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */; };
|
||||||
9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; };
|
9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; };
|
||||||
948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; };
|
948DB67E2326DCD90011F916 /* MultiProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948DB67D2326DCD90011F916 /* MultiProgress.swift */; };
|
||||||
|
C63D632123BDC3A0008F3B1F /* BulletList.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63D632023BDC3A0008F3B1F /* BulletList.swift */; };
|
||||||
D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; };
|
D20A9A5E2243D3E300ADE781 /* TwoButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */; };
|
||||||
D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; };
|
D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.swift */; };
|
||||||
D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; };
|
D224798A2314445E003FCCF9 /* LabelSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D22479892314445E003FCCF9 /* LabelSwitch.swift */; };
|
||||||
@ -233,6 +234,7 @@
|
|||||||
943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphViewAnimationHandler.swift; sourceTree = "<group>"; };
|
943784F4236B77BB006A1E82 /* GraphViewAnimationHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphViewAnimationHandler.swift; sourceTree = "<group>"; };
|
||||||
9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = "<group>"; };
|
9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MVMAnimationFramework.framework; path = ../SharedFrameworks/MVMAnimationFramework.framework; sourceTree = "<group>"; };
|
||||||
948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = "<group>"; };
|
948DB67D2326DCD90011F916 /* MultiProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiProgress.swift; sourceTree = "<group>"; };
|
||||||
|
C63D632023BDC3A0008F3B1F /* BulletList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BulletList.swift; sourceTree = "<group>"; };
|
||||||
D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = "<group>"; };
|
D20A9A5D2243D3E300ADE781 /* TwoButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoButtonView.swift; sourceTree = "<group>"; };
|
||||||
D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
|
D213347623843825008E41B3 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
|
||||||
D22479892314445E003FCCF9 /* LabelSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelSwitch.swift; sourceTree = "<group>"; };
|
D22479892314445E003FCCF9 /* LabelSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelSwitch.swift; sourceTree = "<group>"; };
|
||||||
@ -633,6 +635,7 @@
|
|||||||
0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */,
|
0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */,
|
||||||
017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */,
|
017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */,
|
||||||
D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */,
|
D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */,
|
||||||
|
C63D632023BDC3A0008F3B1F /* BulletList.swift */,
|
||||||
);
|
);
|
||||||
path = Molecules;
|
path = Molecules;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1177,6 +1180,7 @@
|
|||||||
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */,
|
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */,
|
||||||
D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */,
|
D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */,
|
||||||
D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */,
|
D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */,
|
||||||
|
C63D632123BDC3A0008F3B1F /* BulletList.swift in Sources */,
|
||||||
0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */,
|
0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */,
|
||||||
0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */,
|
0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */,
|
||||||
D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */,
|
D2B18B922361E65A00A9AEDC /* CoreUIObject.swift in Sources */,
|
||||||
|
|||||||
233
MVMCoreUI/Molecules/BulletList.swift
Normal file
233
MVMCoreUI/Molecules/BulletList.swift
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
//
|
||||||
|
// BulletList.swift
|
||||||
|
// MVMCoreUI
|
||||||
|
//
|
||||||
|
// Created by Murugan, Vimal on 02/01/20.
|
||||||
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
open class BulletList: Container {
|
||||||
|
|
||||||
|
var contentView = MVMCoreUICommonViewsUtility.commonView()
|
||||||
|
var reusableViews: [LeftRightLabelView] = []
|
||||||
|
var bulletChar: String?
|
||||||
|
|
||||||
|
/// Restacks the existing items.
|
||||||
|
func restack() {
|
||||||
|
//setWithStackItems(items)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Removes all stack items views from the view.
|
||||||
|
func removeAllItemInViews() {
|
||||||
|
reusableViews.forEach({ $0.removeFromSuperview() })
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The spacing to use between each item in the stack.
|
||||||
|
var verticalSpacing: CGFloat = 8 {
|
||||||
|
didSet {
|
||||||
|
if verticalSpacing != oldValue {
|
||||||
|
restack()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Inits
|
||||||
|
public override init() {
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
public override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
}
|
||||||
|
|
||||||
|
public init(withJSON json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {
|
||||||
|
super.init(frame: CGRect.zero)
|
||||||
|
setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
}
|
||||||
|
|
||||||
|
public required init?(coder aDecoder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Helpers
|
||||||
|
public func pinView(_ view: UIView, toView: UIView, attribute: NSLayoutConstraint.Attribute, relation: NSLayoutConstraint.Relation, priority: UILayoutPriority, constant: CGFloat) {
|
||||||
|
let constraint = NSLayoutConstraint(item: view, attribute: attribute, relatedBy: relation, toItem: toView, attribute: attribute, multiplier: 1.0, constant: constant)
|
||||||
|
constraint.priority = priority
|
||||||
|
constraint.isActive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - MFViewProtocol
|
||||||
|
public override func setupView() {
|
||||||
|
super.setupView()
|
||||||
|
guard contentView.superview == nil else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
MVMCoreUIUtility.setMarginsFor(contentView, leading: 0, top: 0, trailing: 0, bottom: 0)
|
||||||
|
translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
backgroundColor = .clear
|
||||||
|
addSubview(contentView)
|
||||||
|
containerHelper.constrainView(contentView)
|
||||||
|
contentView.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
|
contentView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
||||||
|
}
|
||||||
|
|
||||||
|
public override func updateView(_ size: CGFloat) {
|
||||||
|
super.updateView(size)
|
||||||
|
directionalLayoutMargins.leading = 0
|
||||||
|
directionalLayoutMargins.trailing = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - MVMCoreUIMoleculeViewProtocol
|
||||||
|
public override func reset() {
|
||||||
|
super.reset()
|
||||||
|
backgroundColor = .clear
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
|
||||||
|
// let previousJSON = self.json
|
||||||
|
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
removeAllItemInViews()
|
||||||
|
guard let list = json?.arrayForKey("list") as? [[String: Any]] else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
bulletChar = json?.optionalStringForKey("bulletChar")
|
||||||
|
|
||||||
|
var views = [LeftLabelRightContainer]()
|
||||||
|
// Adds the molecules and sets the json.
|
||||||
|
for (index, map) in list.enumerated() {
|
||||||
|
let view = LeftLabelRightContainer()
|
||||||
|
let moleculeMap = ["left": leftItem(bulletChar ?? String(index + 1)), "right": map]
|
||||||
|
view.setWithJSON(moleculeMap, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
views.append(view)
|
||||||
|
}
|
||||||
|
let lastObj = views.last
|
||||||
|
MVMCoreUIStackableViewController.populateView(contentView, withUIArray: views) { (obj) -> UIEdgeInsets in
|
||||||
|
return UIEdgeInsets(top: 0, left: 0, bottom: lastObj?.isEqual(obj) ?? false ? 0 : 16, right: 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class func name(forReuse molecule: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? {
|
||||||
|
// This will aggregate names of molecules to make an id.
|
||||||
|
guard let molecules = molecule?.optionalArrayForKey("list") else {
|
||||||
|
return "stack<>"
|
||||||
|
}
|
||||||
|
var name = "stack<"
|
||||||
|
for case let item as [AnyHashable: Any] in molecules {
|
||||||
|
if let molecule = item.optionalDictionaryForKey(KeyMolecule), let moleculeName = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: molecule)?.name?(forReuse: molecule, delegateObject: delegateObject) ?? molecule.optionalStringForKey(KeyMoleculeName) {
|
||||||
|
name.append(moleculeName + ",")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
name.append(">")
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
|
||||||
|
public class func requiredModules(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> [String]? {
|
||||||
|
guard let items = json?.optionalArrayForKey("list") else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var modules: [String] = []
|
||||||
|
for case let item as [AnyHashable: AnyHashable] in items {
|
||||||
|
if let molecule = item.optionalDictionaryForKey(KeyMolecule), let modulesForMolecule = MVMCoreUIMoleculeMappingObject.shared()?.getMoleculeClass(withJSON: molecule)?.requiredModules?(molecule, delegateObject: delegateObject, error: error) {
|
||||||
|
modules += modulesForMolecule
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return modules.count > 0 ? modules : nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func leftItem(_ string: String) -> [String: Any] {
|
||||||
|
return ["moleculeName":"label","text":string, "fontStyle":"B2"]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class LeftLabelRightContainer: View {
|
||||||
|
|
||||||
|
var label = Label.commonLabelB2(true)
|
||||||
|
var rightContainer = MVMCoreUICommonViewsUtility.commonView()
|
||||||
|
var leftContainer = MVMCoreUICommonViewsUtility.commonView()
|
||||||
|
var rightMoleculeName: String?
|
||||||
|
var rightMolecule: View?
|
||||||
|
let containerHelper = ContainerHelper()
|
||||||
|
|
||||||
|
var constraintBtwViews: NSLayoutConstraint?
|
||||||
|
var spaceBtwViews: CGFloat = 8 {
|
||||||
|
didSet {
|
||||||
|
if spaceBtwViews != oldValue {
|
||||||
|
constraintBtwViews?.constant = spaceBtwViews
|
||||||
|
layoutIfNeeded()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func setupView() {
|
||||||
|
super.setupView()
|
||||||
|
|
||||||
|
guard rightContainer.superview == nil else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
addSubview(rightContainer)
|
||||||
|
addSubview(leftContainer)
|
||||||
|
leftContainer.addSubview(label)
|
||||||
|
NSLayoutConstraint.constraintPinSubview(toSuperview: label)
|
||||||
|
|
||||||
|
NSLayoutConstraint.constraintPinSubview(leftContainer, pinTop: true, pinBottom: false, pinLeft: true, pinRight: false)
|
||||||
|
bottomAnchor.constraint(greaterThanOrEqualTo: leftContainer.bottomAnchor).isActive = true
|
||||||
|
|
||||||
|
NSLayoutConstraint.constraintPinSubview(rightContainer, pinTop: true, pinBottom: true, pinLeft: false, pinRight: true)
|
||||||
|
constraintBtwViews = rightContainer.leftAnchor.constraint(equalTo: leftContainer.rightAnchor, constant: spaceBtwViews)
|
||||||
|
constraintBtwViews?.priority = .required
|
||||||
|
constraintBtwViews?.isActive = true
|
||||||
|
|
||||||
|
//TODO: Need to get confirmation on this
|
||||||
|
leftContainer.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.05, constant: 0).isActive = true
|
||||||
|
setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
|
setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
||||||
|
rightContainer.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
|
rightContainer.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
||||||
|
|
||||||
|
label.setContentHuggingPriority(.defaultHigh, for: .horizontal)
|
||||||
|
label.setContentHuggingPriority(.defaultHigh, for: .vertical)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override func updateView(_ size: CGFloat) {
|
||||||
|
super.updateView(size)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) {
|
||||||
|
super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
let previousMoleculeName = rightMoleculeName
|
||||||
|
guard let moleculeJSON = json?.optionalDictionaryForKey("right") else {
|
||||||
|
removeSubviewsInRightContainer()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Label.setUILabel(label, withJSON: json?.optionalDictionaryForKey("left"), delegate: delegateObject, additionalData: additionalData)
|
||||||
|
rightMoleculeName = moleculeJSON.optionalStringForKey(KeyMoleculeName)
|
||||||
|
//For reuse purpose check that allready added molecule is same
|
||||||
|
if rightMolecule != nil && previousMoleculeName == rightMoleculeName {
|
||||||
|
rightMolecule?.setWithJSON(json?.optionalDictionaryForKey("right"), delegateObject: delegateObject, additionalData: additionalData)
|
||||||
|
} else {
|
||||||
|
removeSubviewsInRightContainer()
|
||||||
|
if let molecule = MVMCoreUIMoleculeMappingObject.shared()?.createMolecule(forJSON: moleculeJSON, delegateObject: delegateObject, constrainIfNeeded: false) {
|
||||||
|
addView(molecule)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeSubviewsInRightContainer() {
|
||||||
|
rightContainer.subviews.forEach({ $0.removeFromSuperview() })
|
||||||
|
}
|
||||||
|
|
||||||
|
func addView(_ view: UIView) {
|
||||||
|
view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
rightContainer.addSubview(view)
|
||||||
|
containerHelper.constrainView(view)
|
||||||
|
rightMolecule = view as? View
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -66,7 +66,8 @@
|
|||||||
@"tabsListItem": TabsTableViewCell.class,
|
@"tabsListItem": TabsTableViewCell.class,
|
||||||
@"dropDownListItem": DropDownFilterTableViewCell.class,
|
@"dropDownListItem": DropDownFilterTableViewCell.class,
|
||||||
@"headlineBodyButton": HeadlineBodyButton.class,
|
@"headlineBodyButton": HeadlineBodyButton.class,
|
||||||
@"eyebrowHeadlineBodyLink": EyebrowHeadlineBodyLink.class
|
@"eyebrowHeadlineBodyLink": EyebrowHeadlineBodyLink.class,
|
||||||
|
@"bulletList": BulletList.class
|
||||||
} mutableCopy];
|
} mutableCopy];
|
||||||
});
|
});
|
||||||
return mapping;
|
return mapping;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user