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 */; };
|
||||
9455B19C234F8A0400A574DB /* MVMAnimationFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9455B19B234F8A0400A574DB /* MVMAnimationFramework.framework */; };
|
||||
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 */; };
|
||||
D213347723843825008E41B3 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = D213347623843825008E41B3 /* Line.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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@ -633,6 +635,7 @@
|
||||
0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */,
|
||||
017BEB372360C6AC0024EF95 /* RadioButtonLabel.swift */,
|
||||
D2FB151A23A2B65B00C20E10 /* MoleculeContainer.swift */,
|
||||
C63D632023BDC3A0008F3B1F /* BulletList.swift */,
|
||||
);
|
||||
path = Molecules;
|
||||
sourceTree = "<group>";
|
||||
@ -1177,6 +1180,7 @@
|
||||
0A41BA6E2344FCD400D4C0BC /* CATransaction+Extension.swift in Sources */,
|
||||
D29DF13221E6851E003B2FB9 /* MVMCoreUITopAlertBaseView.m in Sources */,
|
||||
D29DF29C21E7ADB9003B2FB9 /* MFProgrammaticTableViewController.m in Sources */,
|
||||
C63D632123BDC3A0008F3B1F /* BulletList.swift in Sources */,
|
||||
0105618E224BBE7700E1557D /* FormValidator+TextFields.swift in Sources */,
|
||||
0A1214A022C11A18007C7030 /* ActionDetailWithImage.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,
|
||||
@"dropDownListItem": DropDownFilterTableViewCell.class,
|
||||
@"headlineBodyButton": HeadlineBodyButton.class,
|
||||
@"eyebrowHeadlineBodyLink": EyebrowHeadlineBodyLink.class
|
||||
@"eyebrowHeadlineBodyLink": EyebrowHeadlineBodyLink.class,
|
||||
@"bulletList": BulletList.class
|
||||
} mutableCopy];
|
||||
});
|
||||
return mapping;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user