diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 7d22f29c..b6dd6768 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -108,6 +108,9 @@ 0AB764D324460FA400E7FE72 /* UIPickerView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D224460FA400E7FE72 /* UIPickerView+Extension.swift */; }; 0ABD136D237CAD1E0081388D /* DateDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */; }; 0ABD1371237DB0450081388D /* ItemDropdownEntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */; }; + 0AC16CEB24B3A1080085EF34 /* Step.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC16CEA24B3A1080085EF34 /* Step.swift */; }; + 0AC16CED24B3A11C0085EF34 /* StepModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AC16CEC24B3A11C0085EF34 /* StepModel.swift */; }; + 0AC16CEE24B3A39C0085EF34 /* ImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7918F423F5E7EA00772FF4 /* ImageView.swift */; }; 0AE14F64238315D2005417F8 /* TextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE14F63238315D2005417F8 /* TextField.swift */; }; 0AE98BAF23FEF956004C5109 /* ExternalLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BAE23FEF956004C5109 /* ExternalLink.swift */; }; 0AE98BB323FF0934004C5109 /* ExternalLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB223FF0934004C5109 /* ExternalLinkModel.swift */; }; @@ -568,6 +571,8 @@ 0AB764D224460FA400E7FE72 /* UIPickerView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIPickerView+Extension.swift"; sourceTree = ""; }; 0ABD136C237CAD1E0081388D /* DateDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryField.swift; sourceTree = ""; }; 0ABD1370237DB0450081388D /* ItemDropdownEntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryField.swift; sourceTree = ""; }; + 0AC16CEA24B3A1080085EF34 /* Step.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Step.swift; sourceTree = ""; }; + 0AC16CEC24B3A11C0085EF34 /* StepModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepModel.swift; sourceTree = ""; }; 0AE14F63238315D2005417F8 /* TextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextField.swift; sourceTree = ""; }; 0AE98BAE23FEF956004C5109 /* ExternalLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLink.swift; sourceTree = ""; }; 0AE98BB223FF0934004C5109 /* ExternalLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalLinkModel.swift; sourceTree = ""; }; @@ -1031,6 +1036,17 @@ path = Views; sourceTree = ""; }; + 0AC16CE924B3A0ED0085EF34 /* Order Tracker */ = { + isa = PBXGroup; + children = ( + 0A0B147A24ACFDAD00BADD56 /* OrderTrackerModel.swift */, + 0A0B147824ACFD8200BADD56 /* OrderTracker.swift */, + 0AC16CEC24B3A11C0085EF34 /* StepModel.swift */, + 0AC16CEA24B3A1080085EF34 /* Step.swift */, + ); + path = "Order Tracker"; + sourceTree = ""; + }; 0AE98BAD23FEF92B004C5109 /* Link */ = { isa = PBXGroup; children = ( @@ -1261,8 +1277,7 @@ EA5124FE2436018E0051A3A4 /* BGImageHeadlineBodyButtonModel.swift */, 0A775F2724893937009EFB58 /* ThreeHeadlineBodyLinkModel.swift */, 0A775F2524893916009EFB58 /* ThreeHeadlineBodyLink.swift */, - 0A0B147A24ACFDAD00BADD56 /* OrderTrackerModel.swift */, - 0A0B147824ACFD8200BADD56 /* OrderTracker.swift */, + 0AC16CE924B3A0ED0085EF34 /* Order Tracker */, ); path = VerticalCombinationViews; sourceTree = ""; @@ -2353,6 +2368,7 @@ 32F8804624765C6E00C2ACB3 /* ListLeftVariableNumberedListAllTextAndLinksModel.swift in Sources */, 011D958524042432000E3791 /* RulesProtocol.swift in Sources */, AA9972502475309F00FC7472 /* ListLeftVariableIconAllTextLinksModel.swift in Sources */, + 0AC16CED24B3A11C0085EF34 /* StepModel.swift in Sources */, AA69AAF62445BF5700AF3D3B /* ListLeftVariableCheckboxBodyText.swift in Sources */, D264FAA3243E632F00D98315 /* ProgrammaticCollectionViewController.swift in Sources */, D29DF27A21E7A533003B2FB9 /* MVMCoreUISession.m in Sources */, @@ -2371,9 +2387,11 @@ 011D95A5240455DC000E3791 /* FormGroupRule.swift in Sources */, D2A6390522CBCE160052ED1F /* MoleculeCollectionViewCell.swift in Sources */, D2A6390122CBB1820052ED1F /* Carousel.swift in Sources */, + 0AC16CEB24B3A1080085EF34 /* Step.swift in Sources */, C7F8012123E8303200396FBD /* ListRVWheel.swift in Sources */, BB2C968F24330EA7006FF80C /* ListRightVariableTextLinkAllTextAndLinksModel.swift in Sources */, D2FB151B23A2B65B00C20E10 /* MoleculeContainer.swift in Sources */, + 0AC16CEE24B3A39C0085EF34 /* ImageView.swift in Sources */, 279B1569242BBC2F00921D6C /* ActionModelAdapter.swift in Sources */, BB6C6AC0242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTallModel.swift in Sources */, 8DEFA95E243DAC2F000D27E5 /* ListThreeColumnDataUsageDivider.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift new file mode 100644 index 00000000..c93fbf5e --- /dev/null +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -0,0 +1,107 @@ +// +// OrderTracker.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 7/1/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class OrderTracker: View { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + var steps = [Step]() + + //-------------------------------------------------- + // MARK: - Life Cycle + //-------------------------------------------------- + + open override func setupView() { + super.setupView() + } + + open override func reset() { + super.reset() + removeSteps() + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + func constrain(stepModels: [StepModel]?) { + + guard let stepModels = stepModels else { return } + + var previousStep: Step? + + for (i, stepModel) in stepModels.enumerated() { + + let step = Step() + step.set(with: stepModel, nil, nil) + addSubview(step) + + step.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + trailingAnchor.constraint(equalTo: step.trailingAnchor).isActive = true + + if i == 0 { + step.topAnchor.constraint(equalTo: topAnchor).isActive = true + + } else if let previousStep = previousStep{ + step.topAnchor.constraint(equalTo: previousStep.bottomAnchor).isActive = true + } + + if i == steps.count - 1 { + bottomAnchor.constraint(equalTo: step.bottomAnchor).isActive = true + } + + previousStep = step + } + } + + func removeSteps() { + + steps.forEach { $0.removeFromSuperview() } + steps = [] + } + + //-------------------------------------------------- + // MARK: - Draw + //-------------------------------------------------- + + open override func draw(_ rect: CGRect) { + + guard let context = UIGraphicsGetCurrentContext() else { return } + + context.setLineWidth(1) + context.move(to: steps.first!.imageCenterPoint) + + for step in steps.dropLast() { + + context.setStrokeColor((step.state?.color() ?? .mvmCoolGray3).cgColor) + context.addLine(to: convert(step.imageCenterPoint, from: step)) + } + + context.strokePath() + } + + //------------------------------------------------------ + // MARK: - MoleculeViewProtocol + //------------------------------------------------------ + + public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + return 320 + } + + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? OrderTrackerModel else { return } + + constrain(stepModels: model.steps) + } +} diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTrackerModel.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTrackerModel.swift similarity index 81% rename from MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTrackerModel.swift rename to MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTrackerModel.swift index a4ba1f60..14582f81 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTrackerModel.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTrackerModel.swift @@ -17,13 +17,7 @@ open class OrderTrackerModel: MoleculeModelProtocol { public var backgroundColor: Color? public static var identifier: String = "orderTracker" - public var state: State? - - public enum State: String, Codable { - case complete - case incomplete - case invalid - } + public var steps: [StepModel]? //-------------------------------------------------- // MARK: - Keys @@ -32,7 +26,7 @@ open class OrderTrackerModel: MoleculeModelProtocol { private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor - case state + case steps } //-------------------------------------------------- @@ -42,13 +36,13 @@ open class OrderTrackerModel: MoleculeModelProtocol { required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) - state = try typeContainer.decodeIfPresent(State.self, forKey: .state) + steps = try typeContainer.decodeIfPresent([StepModel].self, forKey: .steps) } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeIfPresent(state, forKey: .state) + try container.encodeIfPresent(steps, forKey: .steps) } } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift new file mode 100644 index 00000000..6d111bfb --- /dev/null +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -0,0 +1,77 @@ +// +// Step.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 7/6/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class Step: View { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public var headline = Label(fontStyle: .BoldMicro) + public var bodyTop = Label(fontStyle: .RegularMicro) + public var bodyBottom = Label(fontStyle: .RegularMicro) + public var stateImage = ImageView() + + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + public var stepModel: StepModel? { + return model as? StepModel + } + + public var state: StepModel.State? { + return stepModel?.state + } + + public var imageCenterPoint: CGPoint { + return stateImage.center + } + + //-------------------------------------------------- + // MARK: - Life Cycle + //-------------------------------------------------- + + open override func setupView() { + super.setupView() + + stateImage.topAnchor.constraint(equalTo: topAnchor).isActive = true + stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + + } + + public override func reset() { + super.reset() + + headline.text = "" + bodyTop.text = "" + bodyBottom.text = "" + stateImage.image = nil + } + + //------------------------------------------------------ + // MARK: - MoleculeViewProtocol + //------------------------------------------------------ + + public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + return 320 + } + + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + super.set(with: model, delegateObject, additionalData) + + guard let model = model as? StepModel else { return } + + headline.text = model.headline + bodyTop.text = model.bodyTop + bodyBottom.text = model.bodyBottom + stateImage.image = model.state?.image() + } +} diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift new file mode 100644 index 00000000..7c2d719b --- /dev/null +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift @@ -0,0 +1,85 @@ +// +// StepModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 7/6/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class StepModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public var backgroundColor: Color? + + public static var identifier: String = "step" + public var state: State? + public var headline: String = "" + public var bodyTop: String? + public var bodyBottom: String? + + public enum State: String, Codable { + case complete + case incomplete + case invalid + + func image() -> UIImage? { + + switch self { + case .complete: + return UIImage(named: "icon_tracker_complete") + + case .incomplete: + return UIImage(named: "icon_tracker_incomplete") + + case .invalid: + return UIImage(named: "icon_tracker_invalid") + } + } + + func color() -> UIColor { + + switch self { + case .complete: + return .mvmGreen + + case .incomplete: + return .mvmOrangeAA + + case .invalid: + return .mvmCoolGray3 + } + } + } + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case moleculeName + case backgroundColor + case state + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + state = try typeContainer.decodeIfPresent(State.self, forKey: .state) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(moleculeName, forKey: .moleculeName) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(state, forKey: .state) + } +} diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift deleted file mode 100644 index c3443e06..00000000 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// OrderTracker.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 7/1/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import UIKit - - -open class OrderTracker: View { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - //-------------------------------------------------- - // MARK: - Life Cycle - //-------------------------------------------------- - - open override func setupView() { - super.setupView() - } - - //-------------------------------------------------- - // MARK: - Draw - //-------------------------------------------------- - - open override func draw(_ rect: CGRect) { - - } - - //------------------------------------------------------ - // MARK: - MoleculeViewProtocol - //------------------------------------------------------ - - public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { - return 320 - } - - public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { - super.set(with: model, delegateObject, additionalData) - - guard let model = model as? OrderTrackerModel else { return } - - } -} diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift index aa004d27..079f67cf 100644 --- a/MVMCoreUI/BaseClasses/ImageView.swift +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -8,7 +8,7 @@ import UIKit -open class ImageView: UIImageView, ModelMoleculeViewProtocol { +open class ImageView: UIImageView, MoleculeViewProtocol { //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -52,12 +52,12 @@ open class ImageView: UIImageView, ModelMoleculeViewProtocol { } //-------------------------------------------------- - // MARK: - ModelMoleculeViewProtocol + // MARK: - MoleculeViewProtocol //-------------------------------------------------- - public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) { + public func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { self.model = model - if let backgroundColor = model?.backgroundColor { + if let backgroundColor = model.backgroundColor { self.backgroundColor = backgroundColor.uiColor } } @@ -73,10 +73,6 @@ open class ImageView: UIImageView, ModelMoleculeViewProtocol { open class func requiredModules(_ molecule: MoleculeModelProtocol?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> [String]? { return nil } -} - -// MARK:- MVMCoreViewProtocol -extension ImageView: MVMCoreViewProtocol { open func updateView(_ size: CGFloat) { } @@ -86,10 +82,6 @@ extension ImageView: MVMCoreViewProtocol { insetsLayoutMarginsFromSafeArea = false MVMCoreUIUtility.setMarginsFor(self, leading: 0, top: 0, trailing: 0, bottom: 0) } -} - -// MARK:- MVMCoreUIMoleculeViewProtocol -extension ImageView: MVMCoreUIMoleculeViewProtocol { open func reset() { backgroundColor = .clear diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Contents.json b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Contents.json new file mode 100644 index 00000000..23859fda --- /dev/null +++ b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Green.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Green@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Green@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green.png new file mode 100644 index 00000000..a60d67de Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@2x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@2x.png new file mode 100644 index 00000000..b84552a2 Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@2x.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@3x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@3x.png new file mode 100644 index 00000000..469169c4 Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@3x.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json new file mode 100644 index 00000000..df61089a --- /dev/null +++ b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Group.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Group@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Group@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group.png new file mode 100644 index 00000000..4fbc5f96 Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@2x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@2x.png new file mode 100644 index 00000000..6a0b37ac Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@2x.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@3x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@3x.png new file mode 100644 index 00000000..92c3c27c Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@3x.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Contents.json b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Contents.json new file mode 100644 index 00000000..45fd403b --- /dev/null +++ b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Group 2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Group 2@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Group 2@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2.png new file mode 100644 index 00000000..b0c82261 Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@2x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@2x.png new file mode 100644 index 00000000..b42ad2b0 Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@2x.png differ diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@3x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@3x.png new file mode 100644 index 00000000..ffba745c Binary files /dev/null and b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@3x.png differ