From 088595305c668e9f7378bf605e0490a1d05308c6 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 6 Jul 2020 15:40:14 -0400 Subject: [PATCH] latest order tracker --- MVMCoreUI.xcodeproj/project.pbxproj | 22 +++- .../Order Tracker/OrderTracker.swift | 107 ++++++++++++++++++ .../OrderTrackerModel.swift | 14 +-- .../Order Tracker/Step.swift | 77 +++++++++++++ .../Order Tracker/StepModel.swift | 85 ++++++++++++++ .../OrderTracker.swift | 47 -------- MVMCoreUI/BaseClasses/ImageView.swift | 16 +-- .../Contents.json | 23 ++++ .../icon_tracker_complete.imageset/Green.png | Bin 0 -> 741 bytes .../Green@2x.png | Bin 0 -> 1606 bytes .../Green@3x.png | Bin 0 -> 2450 bytes .../Contents.json | 23 ++++ .../Group.png | Bin 0 -> 645 bytes .../Group@2x.png | Bin 0 -> 1420 bytes .../Group@3x.png | Bin 0 -> 2202 bytes .../Contents.json | 23 ++++ .../icon_tracker_invalid.imageset/Group 2.png | Bin 0 -> 749 bytes .../Group 2@2x.png | Bin 0 -> 1374 bytes .../Group 2@3x.png | Bin 0 -> 2102 bytes 19 files changed, 366 insertions(+), 71 deletions(-) create mode 100644 MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift rename MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/{ => Order Tracker}/OrderTrackerModel.swift (81%) create mode 100644 MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift create mode 100644 MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift delete mode 100644 MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Contents.json create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@2x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green@3x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@2x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@3x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Contents.json create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@2x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@3x.png 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 0000000000000000000000000000000000000000..a60d67def1f80d4c26003597a1df68beaafb06b9 GIT binary patch literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~SUciiCgA^*{2P|V?VDk5LaSX8# z?44|w5#lJ&_W!Q6ipDm#rljQev3#6aNy)+iCcZ4(fiBEkQ8!fIA33nMn@wj8-(3683bd|{2=+2Th(-?RAt?ydEFPd)Raw{PE_`MxaeA7ho_%xwaOyLaZj zKX4!`lV?I0hxeM`adW<^O+p`yn~8{)hZ=8Y|>C=qr}VRc_|nq9bI< zWVpDh-1UD7?@rt623t3YEr^WRS|a9|&3DY^;Jtm4cVhoZ${4?Xv+{37-Z8GdJlXmQ ztM(oF&DW!!<>l)rtg(LIIhOZZI=Q!-yyf~-#xeQp`)fZpy7~0#zY;xi;M4Z>4bOO^ zKFx{d|9tda`O1$a=H31BZZS4*@4VUPaas1sy~8(5#j2M}{pD8YIO|`v#4u~}R{2>M zqa}7qT#_k_E#4k$r+K2rC1n5PDz0Y}XC#U)=9*+x^fo{K_|n8Pe6n71e=2j&x^O+9 z{9e(fb!%k;F4TT(3Xxr^HvPh%y%U&rH%cg5_D(&r?SJB7PNM^hK5ze8bdoW>OTDJ| zOw+PywSgbRMU8z9?{8CnH0AC-)61NTHooS&G3op(j|;s%S&TGn~k5N-7m+940mp8nvTq_cnd8hhUdDppxPk~CSwq|{tx2%rs z#qN_6&gB%jhj#BNR(47ao^V?-`1jVIHyV3v+h1hQ&5M-qm*bK9x_KE`@`~W?^Xqmd zZFajQvTwznI|&lG+Gpnf4u91VaPyVvfoUtNn`4WQ>eWYbu1oyOeLDY@T-YTE5l|BI MboFyt=akR{00vJtPyhe` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b84552a2d3c3602bb3d09cbbcd855c3eb12490ad GIT binary patch literal 1606 zcmV-M2D$l(P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91CZGcV1ONa40RR91CIA2c0EF@&TL1tBut`KgR9Fe+Sbb zWYLDY{iCQ<2yNFKwhZUAVGu3?T}A%{foUKnmd(3~v5!(gL+}r&6pBcu{oz7weJmG& zMf)PKMaXEBPB3K}somY~+wXbKIlJeao!xtPcl)ac?mh3v^YJ^+`@YZnJcsCiLC0ze z>BzEKxp-I3T1k7=5;F06GNzWul#`+P&~+a%T86F?@hJKu_?bLo z8v*EIn6k8EZ&fU(IPb?xu2Np+uc)|iBW*u_Jt#XhFabre?;uc$UkqN_0{6ckR50zn zY>U>&n*i6WvdlkGzEw?c^xg34vb>#%wk)4`Nw*u|c)O`gf8}9HKk~k$HL5WZ1Z25df0-dJ% zT^Jc~PU~KG)(^}Mo(r)L#`W~MT)BK6Syt>*$9ocR&rThaTcjnjPTGE88qsAKaVp!8 zAmUR|Yvgs@9DTHJ`CK1Mbnpu}!wI-%v&yemYHy7wwoNaCgBOjKu)Fh^|qc2bfu7Gwa5QYM@_4}J}N{^13M6DNCxx+dX5XruqDX63c+qN;~Nnot`l(G<4J-yV;>4U;Ha%>~Fvw=zGY3N?Hq^V1Y&GyO?x;fg5dv06EtbZsQP@=&& zz?dCiu|NL-S|@o!J{3j@+6|7SI9Uf%g3A_^0&{Jfxb3k`eUfASp?EaO3qe+P&uakx zxz0=lZYH2avE^(hcrLleTsKPQ8AdOjyF+Dj>Zb%ZQ&3{lt{Zf(d6#VjQx9XZA`F*~ z3Akf5^>k_M6!_|#WtFJ{4W80s#Hp!5g3PBRKyKvI73MjK=t46A zwZFO)!F7e|F{UdCOiC<004N+JM^8mTaKbwiP$D0@B{hZM8KY9GCkagJKDLVsDIC&~ z7u-xiNpfmfFK@iz8Ny*q0<(b}(1%nrQaGd|7hKkR$}!Luk>oU@E0%BGkx};97UXS_ zUS%TOTTT6|aet*PPJKG2+d1%P5#73d0f%V;L_4T?ut8M#JtiQe7*#@vrPYkx`_KOW zx^q-PX>w{gDLtWV4bs9<9qSe>n^i+MXm2hO^B z{T_2ir9zfsRLCSg!1BJ}PUY;`TCoedTT~zOd(<>=$g4XXn3U~OAxkl8Xf`DhA5u%@ z+hq2H^LsU>Ys;Q$sr(pv2h@aew*sbq`s7Bya>OQ^v%!fvCP9L zv4&l?jGuC_W_3PCpF07*qoM6N<$ Eg51^RkpKVy literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..469169c480cba061b162dc1a5be8291e01deaf8e GIT binary patch literal 2450 zcmV;D32pX?P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91IiLdo1ONa40RR91IRF3v0Jo8fpa1{}{7FPXRA>e5T6t^~RT%%i>6Qvo zL`20aF(IIkXxOe8R8WLQ6K_n4i5lY-&xELnv6NN_-L@XY`$A2KLI3cGf>AsIEx{_v z(W;0Chr|QHs#FUel~^YhMG^~#w`KZMDTg`l7WF-94n_^)Xi|k zd*OyhW*BY{+_4=m;A>)IJL>$7`g>s|SlO(EdydAl@pw5C@HZ9D4oTY&^Ox|8xm4Hr zX4>cd6y^`IDLNBMEe5!;f&Q7lgYwJB;N^5?b^jobOjHdcPJhB^?WkbW$5=p zR2dbh#?($_#&tBeV_V=^hJyS+#-nr4-$Q{(gm^76)lz-unhfKGFK(M2p$~hmfVJaz znJ4-hGIir6&ZdUWmA>)}ncP5H?rA;+a5wt;W7-1mgDZ8s?kg`u=9QWuv~~OK7;_%} zj_|tVKFr#8Qhmo0URnB7c#zGfA3=!&Z{VAmrgde)at(CW$Ol5Zq}Dj6oo|qn?`cLo7 zG_-$V&Qxp4n8g4%%YDrBEk(+!Y3{}k-Lk<-wC--Fna6fwM!pC`RwRd=LNku}k=k~5 zrc)!kC1sLP>QT3`05o_Crt)9hvQi}C(bF*O8t67OIeag1*-Wb6*q*9R{~+yU;yrX^ zTU=Z;Qho;2uHT&6QAzSmRkO)7Uv|f4#*2@{sDAwqZW$7p-BrHBKh?Vc=*(y))~A}1 zxTvnNo^IW>8Ez^V&Pf(yw`Cp&w|z~o=6$?+sib8mqc8L_iw^cAld4m?e0|4!EG5g` zM@%);GHJ4#Mebeos{uqx)i~NInQs z4!n-YX`&FDZKuCnf16^*(EbCf0q|t2sch-CZmY}KO@x-hn#z6Nrz|XfkP@=6PxN*@ zIWCn-#DZp`4Z|aBk`$(OSjHZ6vVq@wI)6ghdavBt6{T2GVlujQG1$w- zKmm&K_jG)P|GQiqCQVEMDPhB;NK9rhr4RreeVH}g)k!HJ5f^nt8KGk+PLsTU3klFt zLT&eSQ73pHC9>_DHlzldh^mDUrI?zc4YVjWIz;VYm4XAr5K1C~j_?Q%q=fEuVcw@_ z)21zeRnH;1wvhfdTXP2Ltb_T?qG=UM7BVB`>7>9Gt9!Z?=fC%~G69j&<$SyF#%f27@AkAeI7_*muwEg z)>$Ik+2pRZduZ6unK=P1IzTARrl-5&KRl2YAQpDX775*lk^X=-NBz{nU;q@I6??j~ z+K~d%qR(t-!cBygOh6N~iX5PW25^C3($;(aIu+z57nhJP!cByg{(v@Bom#X>CRM+d zx6XhmM|j1?7k-dJfVu*9NywL6Bok0&%H*WIU7RKgF^i_tEzx(WTg;rG%E$+Pkizil zlaH`Vxk@^q5_fS#j!VS?XpO<1&Pr{dIiK|SLE02H7~Z4^eJ1Qut|CBnQE*lmBU&D4Ra>3PPvq*8S!KT5N!#m`S&4`eAcZ@si|&AcdnR zP}r`39~Am5AMt=LDXxn`xyIO7{C~5i<_fA`yHoPP=+~=XCa8K$4>q}%BpZyR?%%tq zb=SvQ2jP>ecK%JRyO-0-UAW~@M455)GwA))-7IF!}5#d9G06iE**75{D56?@^;E1G`8x6Xu=|M^j zxn&`j5FC+kpb(%3lgLqTf7eo+Ivh8}biz*{*!8`xW@eC5OKw@{QE6d#<5d^y9h5ZP zRJ9NmoaO1jpHao=1zz4xd5d)F6DQvotw!=4tUva8DI6v733h*!yDuC_XJnzUEru5asKXFD&%*pl$U;u^)`1u2!Q^o%Ow&wt3J+2r zNg{M|s}l4Xe#IR@DDenfyg=}mVI|yPMqCv69mszJV4EZ+BOwdDn}MeP1xZFy?OfA+ QTmS$707*qoM6N<$f{A{O00000 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4fbc5f963d27eabd6f1e815af0895a2dd5b34d87 GIT binary patch literal 645 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b0c82261763af20750176264fa00798f65343593 GIT binary patch literal 749 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~m(&Q)G+$o^ zEg+kNfw4W4fd!-lh^2s-fq{7eBLg##W(0{XV1mnvEMP{kK?*nB{qUE8fhpY6#WBP} zaBAqrJYh$H+TAlwunIj_xVb=Kfr`C@Yt#y+mZmoT1>A)WOk7SJth`(TolWr#OiV%? zw*mqkU3m|M=>^q@FW^{EQJMcS_S*5es$o)h-_4%6-FUZgHJj*R%NbwT`jVuBYZs^* zb01leth=lG{ILU5cg|9J(fO>f@4o7*D1(Y*8MBnyYq0KKQ*iUt#2TZuQDZ`Q6(kjiS2qCkb#rzc>Bq(phT_eMHx;-+V!1 z&Uap`hr4ptMTIh7IW@(#=h$o4HCefp3k;V=rYh`-J1l-uL%MWg)Mb_Hg=caf+iL$y zxN7<8o69n3UFFd48~U#M%BruCn(Mal*2*&x64@n@K}+R-9D5XW>fD=yx_N&Mx|h7z zk^I3U=*ZS-{Hd)r+?8xhk_TU(HQP7MviH!7?@e<*X>lL>zG;T^@tf26ghTkgr?SrG zFnfOCVfn577R{gU=4P~>7gxV|DAT#wW|G@h&$e?0hKFVdQ&MBb@0RIFxHvj+t literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b42ad2b0805906ed95509da9f379eede988b43f5 GIT binary patch literal 1374 zcmV-k1)=(hP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91D4+uX1ONa40RR91C;$Ke0D9(TtN;K6$Vo&&R9FekSWReLRTTd2OGzrF zW)h)b1gltasfDyI#0uS%xNxBxP5fE9lSD-qQV9(%ES7|>>cWLTscuwoVeLjrs|(vg z=t_c$t8e1J9+2jO){_Z-k1z?VdmaYDT?m74GT%f~KXqDgcDDJ)) z;VJ4rjvDTX0|pTDrxY+3V$31Jb$(swso|?#Q~2H5O8%817@tH>^(tPj)i6xOgR!U- zNEC`GdohY|x^f@h53k^60W}jT1Q3rSs#Y;VD@_n-Z=$(Oi=FKX_&V;wFI_dv?Y@&% zWBTg`238{sgjGDS8skY0;|OJUsVxLtqjir~Dwq!Aw0)D*l;FafxHn$G=L8r`0A{E( zQR&4Q0{qjYe{1FdcUG4$L@OTU0QXyEz~#`5XZqj8Z@25?wgeYO@ffZ41ypGD$ z(<{B4g`aYiLmcc1bzkbA#Al8AXh=|&<0!usxhUWS-T6k5`O*j=ug>Q65{}nmyk;b0 z9ByREO$3uUcS&v)IlA=qJdmxZr_0|HNg8CHbMnB(IT>X^G^%7l?2%h#xorD(l+8Pu zLNti5#UYDR_o1zXf`hgoIOn$7tyy3%8-}pf7U7_A@J8mTi?s=Fz`7oW4 zYg$|y!@gTFev;shfCqag@pDt9i~#5T2p7#KBHDL99`emRwV+N2BNs5Ett6w{mSVDf z&4`1zIA}_c6LmzDA;K|^qNRP#J8dNwCOtPHT^*&~hY{4l&kgec9ll)Ijc>fM-MLOD zaUjuy;v{?{s9On5CcB;Gq%CxOZ3lV7CI@jzZc53Lj&VqUI`~@!Uar}RVCva&+5S=v z38%F=nB3!ZD=FKd%ij@jqfy!GismVYgp(2E?6ixfu1rNc+9>zOD*pDmY}xCI=FY)6 z)mhN*b45GL%I&)g|N3{f>~%%+ltb2nwmgdVkRxX&0#~4|!U7l3oNm^uldW#ef>?_e zbQ4~eC|~00`%%C0n(G=F4i>{0K?`swqig!QXbYtnv)rm?ThL5ZoP%@PVJ(cpbap6) z;P<&yx?~~h!l{xfo5T|i+M%zj(FvX>!C?zRI zJYEs{osMVuVN^uR%dKfXvjgdHzn48Td2;(%1*-~eqI(SxZgrU zZ)j64Od97AU0B7%Ve2flIEoh->VG65bmQTz3NsxnFSjss1y^XCy>#h|eN*_@Wm6Zc zLeCL&?qvyD+&Z4zc3gTJaxRR>u!Ko$% zc4TId>Rjyg9UZu*Bs=8kqt3-nPPx66@HxWW&HM5d3l0Cr7No62eW)*YEBCd-dG9jf z(a^ZPH4<9BAX+Jvg4FCWD07*qoM6N<$f_HCx6aWAK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ffba745cb17779e8ccea41960617b6a05fe8eed3 GIT binary patch literal 2102 zcmV-62+8+}P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91JOBUy0E^%0TmS$Eph-kQRA>d|n@wyLRTRh1yjDsH zl)l=9iA4EGlmr(bZg3@pxFa-fPzjqZT^K6z6^fPs;Y%oSVdAD6g0eD@?hFA|utME5 z+8Bf=CMICtD^yB>zVUy~%(?Hpc^{qj&3mseon+oUbLZZ3&hOqkGk4~mN3_5;uO7Tl z_R)%GFX&C*rxiZYGV-wV=F?+1@YwU{{-RbIU2>Z4*V><&0B3j8+c}Tk2i#^ry$gt? zF+nEK7&qb6^^{LPcAlr7V%CdYEHU7Tz4Qutu@{iL0J%1{2bBtX^cx(!fZiWkdWQa~ zR5b3ns)5J$(`)pM_5-vRpo>cx#*lr8{88+GU?1n9Eaifsy&Upt>^$VVB|rM((Nj1& zM2qND*D3lldU`g;a|ZSYXz|!M9rS#GZHpLv1jsAcueP<)wYb+NU+YsZXbZr%V&4v( z9ab-#o$@_EFQ*gU06n$m;>vRZ&i2teIiD_}SJzlWQ1%P8(CKuJE_;JCY0u48_WP(k zlcFA)rhTxp-qwemJE<1h(Rr3`+x$54tbxb+=tDR#gkjmP2B72~Et%_ zw3q3lkD>7x6t8reJ(`5w-mXEqIGZ|3XXQJqHnxUX-e~Jk@{a# zTlOw}0{e&IOImHf{&6();kXSQ3mDhyl1!E^!dQ{v{@bLsj;Q{ppK7Lf`Mpm|mvwLVGT5ZTE8b+(S8yr)ddf3m&R8C+~=^jris&^%?A(f+RcF&)wUXlq= zFze$MY~z=jsMZ2te#JwjhQ2=%zriGIA%p|wZ%_(`R=QH{`>g6}M9RK1gW9%i4j7M&Em{DDud3Xvsb#Qi z0?f}xfNfGZ{w$+%v!)RS$0op&`{`AH$){Ab%)_|fpk~_`(9KQzx2p$P@?1u80y8j6 zsBtNOFJoDN`6Ib8HEQHqh`$=8BSx-;=vb6dhqTa#7Wq?Z%{H{Ua{}`3H8T__b}YDT z^F54bRj~9C6dJFk6EJ*N^;=o<5>6e9GD;8Qy2=CVNAiR%tGbpJ`m2$kCMq}PcjLOD|w_Gw%dB36-UEFaxuM=O%RaD8T4$ zp7Pz)io9g0a?&Z=N}s12yo=qW4TSm%7z~>La~WLJ*VQ&!W~<80npy_S)~Y}pQ!!0+ zf{#&nJFm|s{Z0(M9v$JfHQSfuC*9NR`&h7`E{2#*ExI0-020JhgeN*=Fho|VrDLm_VCQVilhQgr0yb2JdGQQX5QA#qSxa^%9SKw>JeBpIzd zUygaXG>rQYSoGqZu8w?kfc3K^Ft4kkS9f4sNURm0*J1tjBG!#dmbVJ)EwfMJn+CbS zXZF3++A#Z87J!4k&{Dk$0O)O4BtNdl^Ce}U*f;fueXbO+R`MFw%AAhvmVmHBnulwe zgIW%u1#_C$h*WwufX&BuAZDxUJoQ)dXGUPO9!J9cfID`NDgrczE$wVnR6rQwa52)e zm$7pA!A#TCvP0Uy`4aSn;4jUS;f4FI^wa{h5hY>Y^`~I0k!-s>Hm<`rGhGqT2ht)9dk_#t5T%kE#Fn#s3=*(JeenukmLY`=z3kow?-2ek{#JIoILG885i=`Yhyz g|50nM98FvAe}yyU^6t{O@Bjb+07*qoM6N<$f(*s>SO5S3 literal 0 HcmV?d00001