From f5f91684cdbafa44af713859333bdd2c3b27ad7e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 6 Jul 2020 12:07:52 -0400 Subject: [PATCH 01/17] files --- MVMCoreUI.xcodeproj/project.pbxproj | 12 +++- .../OrderTracker.swift | 47 +++++++++++++++ .../OrderTrackerModel.swift | 54 ++++++++++++++++++ .../success.imageset/Contents.json | 23 ++++++++ .../success.imageset/Standard@1x.png | Bin 0 -> 645 bytes .../success.imageset/Standard@2x.png | Bin 0 -> 1397 bytes .../success.imageset/Standard@3x.png | Bin 0 -> 2312 bytes 7 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift create mode 100644 MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTrackerModel.swift create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Contents.json create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@1x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@2x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@3x.png diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 9ebcf41d..7d22f29c 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -62,6 +62,8 @@ 01EB369323609801006832FA /* HeaderModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368C23609801006832FA /* HeaderModel.swift */; }; 01EB369423609801006832FA /* HeadlineBodyModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01EB368D23609801006832FA /* HeadlineBodyModel.swift */; }; 01F2A03223A4498200D954D8 /* CaretLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */; }; + 0A0B147924ACFD8300BADD56 /* OrderTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0B147824ACFD8200BADD56 /* OrderTracker.swift */; }; + 0A0B147B24ACFDAD00BADD56 /* OrderTrackerModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A0B147A24ACFDAD00BADD56 /* OrderTrackerModel.swift */; }; 0A1214A022C11A18007C7030 /* ActionDetailWithImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */; }; 0A1B4A96233BB18F005B3FB4 /* CheckboxLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7BAFA2232BE63400FB8E22 /* CheckboxLabel.swift */; }; 0A21DB7F235DECC500C160A2 /* EntryField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21DB7E235DECC500C160A2 /* EntryField.swift */; }; @@ -517,6 +519,8 @@ 01EB368C23609801006832FA /* HeaderModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderModel.swift; sourceTree = ""; }; 01EB368D23609801006832FA /* HeadlineBodyModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadlineBodyModel.swift; sourceTree = ""; }; 01F2A03123A4498200D954D8 /* CaretLinkModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaretLinkModel.swift; sourceTree = ""; }; + 0A0B147824ACFD8200BADD56 /* OrderTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderTracker.swift; sourceTree = ""; }; + 0A0B147A24ACFDAD00BADD56 /* OrderTrackerModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderTrackerModel.swift; sourceTree = ""; }; 0A12149F22C11A17007C7030 /* ActionDetailWithImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionDetailWithImage.swift; sourceTree = ""; }; 0A209CD223A7E2810068F8B0 /* UIStackViewAlignment+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackViewAlignment+Extension.swift"; sourceTree = ""; }; 0A21DB7E235DECC500C160A2 /* EntryField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryField.swift; sourceTree = ""; }; @@ -1253,10 +1257,12 @@ C7192E7C23C301750050C2A0 /* HeadLineBodyCaretLinkImage.swift */, D2E2A99923D8D6B4000B42E6 /* HeadlineBodyButtonModel.swift */, 0A7BAD73232A8DC700FB8E22 /* HeadlineBodyButton.swift */, - EA5124FE2436018E0051A3A4 /* BGImageHeadlineBodyButtonModel.swift */, EA5124FC243601600051A3A4 /* BGImageHeadlineBodyButton.swift */, - 0A775F2524893916009EFB58 /* ThreeHeadlineBodyLink.swift */, + EA5124FE2436018E0051A3A4 /* BGImageHeadlineBodyButtonModel.swift */, 0A775F2724893937009EFB58 /* ThreeHeadlineBodyLinkModel.swift */, + 0A775F2524893916009EFB58 /* ThreeHeadlineBodyLink.swift */, + 0A0B147A24ACFDAD00BADD56 /* OrderTrackerModel.swift */, + 0A0B147824ACFD8200BADD56 /* OrderTracker.swift */, ); path = VerticalCombinationViews; sourceTree = ""; @@ -2111,6 +2117,7 @@ 324FB6AA249366F3002552C7 /* ListLeftVariableNumberedListBodyTextModel.swift in Sources */, 5248BFED23F12E350059236A /* ListThreeColumnPlanDataDividerModel.swift in Sources */, AA0A257824766C8A00862F64 /* ListLeftVariableIconWithRightCaretBodyTextModel.swift in Sources */, + 0A0B147924ACFD8300BADD56 /* OrderTracker.swift in Sources */, 0A5D59C223AD2F5700EFD9E9 /* AppleGuidelinesProtocol.swift in Sources */, 8D070BB0241B56530099AC56 /* ListRightVariableTotalDataModel.swift in Sources */, 943784F5236B77BB006A1E82 /* Wheel.swift in Sources */, @@ -2177,6 +2184,7 @@ 9445891F2385D2E900DE9FD4 /* CaretViewModel.swift in Sources */, 01C851D323CF9E740021F976 /* LabelToggleModel.swift in Sources */, 011D95A3240453F8000E3791 /* RuleRegexModel.swift in Sources */, + 0A0B147B24ACFDAD00BADD56 /* OrderTrackerModel.swift in Sources */, D2E2A98323D8B32D000B42E6 /* EyebrowHeadlineBodyLinkModel.swift in Sources */, 012A88AD238C418100FE3DA1 /* TemplateProtocol.swift in Sources */, BB6C6AC1242232DF005F7224 /* ListOneColumnTextWithWhitespaceDividerTall.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift new file mode 100644 index 00000000..c3443e06 --- /dev/null +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTracker.swift @@ -0,0 +1,47 @@ +// +// 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/Atomic/Molecules/VerticalCombinationViews/OrderTrackerModel.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTrackerModel.swift new file mode 100644 index 00000000..a4ba1f60 --- /dev/null +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/OrderTrackerModel.swift @@ -0,0 +1,54 @@ +// +// OrderTrackerModel.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 7/1/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit + + +open class OrderTrackerModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + 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 + } + + //-------------------------------------------------- + // 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/SupportingFiles/Media.xcassets/success.imageset/Contents.json b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Contents.json new file mode 100644 index 00000000..05b81f4a --- /dev/null +++ b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Standard@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Standard@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Standard@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@1x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..5c1f25fa954642fb06cbe4d57421f11d4159d030 GIT binary patch literal 645 zcmV;00($+4P)Px%KS@MER7efQ*FlQZKo|w!^dQ=2a3{!Iz@516wV;QX6LGPs8(g_`Hw$5Q z9zYPmSqOq6=u%MM*Q6w!PP&s$93Q++QuY7urINp@(u-;sP7-!Md>GyfZ`aJB`c(66 zj<3SY@K-nq%Va+ZKZn0t{E};Iw~Lh{_b5C{)>TOOXZSii3-5-v!UE^o^obEGM=p)Q zSS0dkSVrQ>kV}IW&AsMjr0)}W8cqcbTFhy8!uu#A zox`-4&?+O}dFRV?mO@&Uj2VwK4T=Y^zfk@<6ve+nDL7smoaEQsGY!U6? zajTCu4_;!b2cglLgHu6p9nw=&H^U})=;K*Et1r%6OhD80V|4CxXz^gov%07+raa~$ zro4DC=2^X~FPh7s_MsSRN{l>V z@z!)QnLWxw3rN#^>`0ly)&k;v4P7#szX=`3!mHd`G70>bO@gtl>MHceuXS6D-{!-N zu}%9_!%U#n`yo&~e4a43aLi#&qbx$Sd$CB*d00li>Ww_yA-9Z_ChfftP)6R&b8?iBi0Se-TAmn+aN3xWvZFy#G16rV6)A+SUGZgaqzj< fnHHH@|Fr!9&eh7D>A4!B00000NkvXXu0mjfToX9s literal 0 HcmV?d00001 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@2x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f346a5304d59f70a9cc61da0c2090b2b59cbb3cc GIT binary patch literal 1397 zcmV-*1&aEKP)Px)FG)l}RA>d|n?Gw5Q53~jkcfhT2;!eFAPPd%RtPqNegZ#6L>v2<(k2#$G*hLq zOskE`T3MwM3$e3M5kw&*qURU)$=$neW_RDb`Ga0KzS%qP-Fwc?zIk_E#v_B~?1VyJ z7p@5xMmVeXma2)(y6Vz?^25cY&$iC`=-h(*la*@_tL2>U{+ z$g*+7BsMuZw;N*cQYa&9{RiszLD&_BBXEq5bGC2UF}cXux}8(TZJ~@9{&&Kra7VZ# zEC^-BIr`9-F^sK>O>Q`}Vz-s$s}LjfN&ZK|vQXEEK`dg%a>3!2(5T&0^q+z!@Lj$& zVNu9!#3VL3d|tS~DZ3q0#6s{1nR{Epd7)_|2f1SNy^tS{S?si;3!bF#10rR5Tf2DDhgXr0)}xQMeO%PAHKYz$h#1Q*=cS=(aK5G_1%m6lbayAX@uXlZ#+{$q9^c50V6SqnZCZr3DHbhLw`u9LB3Qxy{6;*Y|EoW>Aozx0uQFxXKmErv zL~lFMtYuxk&jF`d432i)<-(z5s-07huY$eO)Wt`qj_j@j+~8 literal 0 HcmV?d00001 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@3x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..51d75aab99db8bba04736e3bd7afdd79bcbf3a25 GIT binary patch literal 2312 zcmV+j3HSDiP)Px-!bwCyRCodHojq?9R}_YgWoQC%VG@#1*g`}u0u6>T2#8Axf;+@taD$u_p|b=v zmVZH-R5XYpqQOXsL{fmj1feL2kq`tWiip5a1Q5yltaF#~>^ZZuv-7$3kzQuzexCEp z-PxIYXU&$Odf8UFGa1t!9gj*oBGT^AYD7=9zasq{(<>dQo~z!XbWY;h z-WZ#arw^oFM=Bp_0zNGrl6v`QQ?P@xv`fm{ zXp^?-gTB)GMGO;CE$xK7N_!o?t+HHFc9s|kebFar}n zIX>V^8lQ=c7%MeK$q!ODhnH1mx>8T=&hZJ~y7^CxWq$hBc{{En9(j|TTvh%VX+)~4 z;Tt~UYf>!4O3bC&e)aZ9N^BNhA3W#+Qk$&`cB*;K|DDCahEf`tvjldMPZ9AyF=$Q!nm)a!;W2Xqnfefqyx9AqO zZTnJt(af;VTRwwgMM8!VtOB>_7Pf8kX6bgdOEi0@XvolkRTOa8hi%KY>fh&5$OzlJ zYuSzew+zSu63ha>u!Sv*hxQqn6j~&+;Z`POP{Aw!j&AqyjW|gO!+tcM*W=!*#O(ub6IlZY?1!P!x%vyu_YZZtN^RS;dDN^GzQ1;~_iUMYVUvvxO zq3?~%-^pm8RS7xZdaRu&WcK+Po;jy_gN%k*9Uy}Yc5%?lT%&i88?)8ean?g-!!Ald zDAH(uNh`8kVA)g!UpnBMo^(IX5l`T$~F@;*XUKl6YIKd6f=`} zufeO&HI#>lelH``Uy?qNEaPG1sPv1KS#X*adyDaXbsR=P*k0??8Rl~tQK7x~wx5w* z*O45MT{GgoPo}kGeuIoYtq9n4hYT{<#RnFQTQ}43jJzIL@`T+4$nbO@Sc-lG&jWT- zASXV8f2Fe!AJH5i;`HQX{lIPtWKhA(VhQ7+87K2JnK@cF*xafCHEQqcppLh2Q6HoG zFtb3zxYUXNUSKy3GAtJ*3v_F0fMphzTjB-oDy;}h0~^PhG?D`+n8i857RD`O0Wn^H zV-_5Xux_y5s8h=y(jH1xJn?no04vL9*tTEpSaMqV%t`MzndPG+5>IfJZLt!SM)|6q z_#Bto$sQ}7gxhvdd)C<~`UM(BCL`49JDyh8ksKhVdVz*HkE&h?O9Q*^kavpTOJl%v zyb{J)SuhGRs%FV7*pgt^9WrQO6#oQr4ATyqQi@ghc1Ou#5-iwFfD8>7S?pkHnss|Z z1INwM`6otUHw7|mEXaws$8%1l>-jTvTLd;QqOfg(!Nvj&OV^kb+5EAPi>D)FS}7Lf zu0Ix{rFp0F=Fi`t^VUYRYt7{Y9)?|QOeIz&>r9>LT6^OZfQ7{fb}&q3=T*vUWb-G= zYd_QW1|#fJ+vbn%eN;T$U6HJT_(17B{pg-HtRrGH6__H^Avo_qodc;c17GxNW_Z!pZAFo>b>GFyL8Ss7o z@v3l=E+lkvOL?QA-~eukjTo(wOd4!*vu$c=^A8Mm!p{8<406VpbLBT0-kJSPd4qJ# zCYGej1uS4vh>fe&N0JAdFN;CA8zBboi;vi00E-V1$dlI})=!^5#-4W?G{xb*M`l zwB_~VrQoNh(Jt-g8?R|LuSas2AL^QV}q7Su?vf6W1Uv{x zU|vdl{q{y%5$X7ZZ}>Pc#z%Wj%JPxU8!|rNOD~ru6>pwR$>jyfda*KZsG&XjqEGrR z-HNl-@{{Sk<88L2p&UWK4T>JSs)M{B*eP%kim> iS0o;jqk5&|TG)S9`Fv1;G6)&~0000 Date: Mon, 6 Jul 2020 15:40:14 -0400 Subject: [PATCH 02/17] 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 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~SUciiCgA^*{2P^|Bd++Ju7-Atf zHQ3hsaDa&KyuUpP9;-dFxc@fr$+8q~`Nt?O{+BWDpR)S%b9#P!O_L{gTv+DGEE^>_ ztLey=Er$B{CeISPedP$de&ze8cP4*+XB#e{#B;q=($|njio+pc_hn0A3wv>wjefsv zm5MU&E^lD3GG8_I)Lo;WTr(HFW?%RC&Jv-{7_-@Ly1`~ zpIjoD{AN>(-uCI9du>-*hK5|-qVu}*iiOE_-shJ$&AUCzY{~rV;U^YwxLkhurBwFt zC(FcWk>re7VT_80n;n$aZPPz}w!$XvaO4!n8(DtSs`;K@KXCkm!={PKo|E?6d7$&^ z#*`&dN;7q~l>R*u+_p;bri;OC_taSrBg`hhymVI2CRM{e^zG|<8E%uKdBN-Y65Y<& z?*GH>@kKOQ$GIsb=Jem07Z*2AoHJ4B{7r)t1GPU>lG>N7c&;j=%aq>U&Z@lT;tOV( z&94I2FLdQN)%>u2UeRHLu0zM%lKYg@?H9RDid#5W;)Xtxs)REx+s4ntjiW*G%{+zd#7+j>8ikIQPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91CZGcV1ONa40RR91CIA2c0EF@&TL1tA_DMuRR9Fe+SkG@8MHJrIwd2^1 z<1{1<1Us>_P9ji`oH(W`$_Z}p7a&niR6^pwnFAaEA@#-;sZwt}pd!J68xlW`QAup# z{HOzVTI|Gb8t;0i-?!P>+KHRk#<35~<;~2_d+*!#X5Y-Wn)ZKao12@XQp#XI-c|H! zB$vxAHKcq8KvtxtB{V5#VQW$dfuUBycuxwkh5mgpI(lz8nS9ududaYG8XLLXP3brv z!24^RIE`I|6|uND^;?s(wORqqHG0EzWn?mf+MJ_DcyWpOMTElo^J{5=v3jv9s$ z)pdP>&m1Ys4co3AA0Ia=hlj6JtJS#D(S-N|>podB%^&@_Hk}KB6^q5O$Cb)=NX^^S z4;Y5^^32Si(P%V<;TY#GYIw04+TK5l0DCy_Cs(1ZlU^KNr}8d_JvN);)l_ z1_K%Zt&PWGDHw{hGj`D&03MYqm11dse;$1e&VP!8!|x`O$;YR4UkHq#gk}8#16L8H zdTM@t2kA0T8|Y<>sO{#rw-b#<1DO?T0bPI7G|fu0Exmc5`b-}qMNpwosJxI)m-_{Z zJ_3P2!c3?7@ETDzR8>lG@m9HwuM9#0SO$nGbl(P_RGX z7Kuh87WP{B@X3?6d|)`=t`i8)z5xUB-HpfNC%zqL#RrBECb)tJvcGb`ozTdLI*AfK zFzhehr!;&W(E;P}-30@IkT;lhf$`>vB6fw7>gwXJ9$*KBHs-n$;sjVKm1L#K2|Lh)G8IfE0^thW*QImSye37f&6_5aLtis|6S* z$&dl?Hd3jPVnIGqi~B7d$Ej@X>`c)Y0`hStlgTO{>NHnlS7KpcePiQ3HsWTgZ6lhb{s z4>sd2D6nz-D){j9nzj*Bi*VhJdt`JKAT_cX5(hjFt2JH9r`+h=Q%oNtMNp7Dt6SQ+ zz_=0y43CW7LLYyU42{IWyQ6nRSfF>rI>nOUeSH@96hM8`f~IM3AuzR;WR$!QPFB<$ z@94Y^^XAD*9^Tx&PhtO5c_8!b<1xdEP8~eQw$<+P>ucWV%3ibV7?@IWc^@bi6mI}z zM=1rMvRlznJXM`i_Fg2r2Br*=Vv)^&xif;~3$qBxEOKu{764=q{X7q3o_zp!W*;eA a?c_5tNJZENve2IZ0000Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91IiLdo1ONa40RR91IRF3v0Jo8fpa1{}1W80eRA>e5T1#kLWfZ=TWRgrK z@6<+`X-Q}Du;8k=5i5o6q$mjOvY?hKE<^=}aawxpV!#n|uDbGm}Xs$t0O6UKq}~|MPtJ{Ezeh-)P$Z&(rY*^!7#Ty{UI8zm&QvZrvUOwPdI!7(%MOzy8;PMRSymizm4Jc zDfC0R2EZsSP+z|s2n1$oYijhWs;U6e>hP;&S=33S@mou!;)&H&{Yfm=5sSrqNY8Bw z14F-uVR0FA_@}(gEfRJNa$tD)42I=(7!>mMVHk$i*w8T7)Y!OGTU&bsc@7|Nnay;x zw~A+aDH?5!E-wc#I`Dr`y}w zeCW8vn_em%-i!jM0l)!In`^pZe9#*XU-hJIs1^-!Vq&5#7LWgk?|DjEs;;h19}5Pj zOw;U?w7rz6RBC=~e7tSV%B(*C@J&y5_q!N9nZz6;idy37!CZiKb#<|>W5*Wv3n1;r zM{PUa)fGkGYNFz!UmA);zRbau^;(oC2Zn~e^$yYI#>Sb$hYvTQrJAhP_U|S6XnNYh z;#8-))b)#f-QC}*caO3qNG>v%6JJXm7vMAUevtCvqen@sz&_W8q;8sLdPAYxxi)PI z(%mM0fft=sltc7rXJ-`}IVcb2+MgU98}nh0b^X-K_=4wM+YlsUQHE+#ko(|%uAu9*rw}Q5Z=?c z(R(YEqYfKaX{+D(epq$ z=RxR$9plgVUKO+C!X zk!+Bl&jb*;3DGM};(k^wn(*ZPERdLocLfm17tt$CF2`c(9tuaVf3rZ602M$kyQJo* zq?fydqf*!o9W$}USb94BdlpDCyt4S9uts*N+(G5qx3aRbO52^sw(np;jb?##C~VvA zmx`p%M6VPHn^jN)sJCc$7DxvOC~N^leh^*{{sOCCsa z^hlp#CJ9jTgVZbGnScD)q|NTr-x~~0QqKd4FObCVij*V)ii%NrFINd0R~|1cI0p=R z(KgMG#nwEK%y9pNaF04CF$qxW<^0Uf&DE*}N7HWh9Y6k$*t?k`uhZ_C%FoeB!lnLy#=Me_5cGqQS`U;!Bm?utl7j7@wF>mpZWVYA6&M zD+(kF@n04=SUO}1DeUpdNiNTs2;bY%0q6j?@;CU?&vH#E=t&mj-$)P^ zormf~_1I_)GQ7Es9Mn5(sq%1>GobKZ?da%O-$Oh`Z3>d*_%{;%%R=gq!hSeC&2aC) zJW3COW!A8di&;qo;;-ipQ^_p)q%kl!cpVYMC8>xTF^vQ$Jl!B^`yn|8IYh;S>=T}P zv!|!$Mxp+T28pj{@?RD>OusLUk>Mo)N`6q%_EK^cbf>-yv*>*2}1vofgYmIj@yt3elo(Ep9*Vrc7Vbpz-kxa4P z^V+g&kkS}AdWXUW!z*dKl`gn`2HW0Pbi3`A45V~S3Y!cs8a|6z)FFtCBDEUEj;{4Gb<1Pr}8+mmPJq<9+ycgxQA>IcNbll~g46iJ_ c?d(?n4@@_Ea3ZRQW&i*H07*qoM6N<$g0Y4Sz5oCK 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 From 0b1c5999304bbdc7028e79464556ecf02ecb3e84 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 7 Jul 2020 09:59:57 -0400 Subject: [PATCH 03/17] save --- .../VerticalCombinationViews/Order Tracker/OrderTracker.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index c93fbf5e..71dd8171 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -35,6 +35,8 @@ open class OrderTracker: View { func constrain(stepModels: [StepModel]?) { + removeSteps() + guard let stepModels = stepModels else { return } var previousStep: Step? @@ -103,5 +105,6 @@ open class OrderTracker: View { guard let model = model as? OrderTrackerModel else { return } constrain(stepModels: model.steps) + setNeedsDisplay() } } From b00e9bcf0351a16e009b22d67627f2066f3f75a1 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 7 Jul 2020 13:24:37 -0400 Subject: [PATCH 04/17] laets state --- .../Order Tracker/OrderTrackerModel.swift | 6 ++--- .../Order Tracker/Step.swift | 19 ++++++++++++++++ MVMCoreUI/BaseClasses/ImageView.swift | 22 +++++++++---------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTrackerModel.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTrackerModel.swift index 14582f81..fee4ce97 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTrackerModel.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTrackerModel.swift @@ -17,7 +17,7 @@ open class OrderTrackerModel: MoleculeModelProtocol { public var backgroundColor: Color? public static var identifier: String = "orderTracker" - public var steps: [StepModel]? + public var steps: [StepModel] //-------------------------------------------------- // MARK: - Keys @@ -36,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) - steps = try typeContainer.decodeIfPresent([StepModel].self, forKey: .steps) + steps = try typeContainer.decode([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(steps, forKey: .steps) + try container.encode(steps, forKey: .steps) } } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 6d111bfb..06a8a94a 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -42,9 +42,28 @@ open class Step: View { open override func setupView() { super.setupView() + addSubview(stateImage) + addSubview(headline) + addSubview(bodyTop) + addSubview(bodyBottom) + stateImage.topAnchor.constraint(equalTo: topAnchor).isActive = true stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + stateImage.heightAnchor.constraint(equalToConstant: 18).isActive = true + stateImage.widthAnchor.constraint(equalToConstant: 18).isActive = true + headline.topAnchor.constraint(equalTo: topAnchor).isActive = true + headline.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true + trailingAnchor.constraint(equalTo: headline.trailingAnchor).isActive = true + + bodyTop.topAnchor.constraint(equalTo: headline.bottomAnchor).isActive = true + bodyTop.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true + trailingAnchor.constraint(equalTo: bodyTop.trailingAnchor).isActive = true + + bodyBottom.topAnchor.constraint(equalTo: bodyTop.bottomAnchor).isActive = true + bodyBottom.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true + trailingAnchor.constraint(equalTo: bodyBottom.trailingAnchor).isActive = true + bottomAnchor.constraint(greaterThanOrEqualTo: bodyBottom.bottomAnchor).isActive = true } public override func reset() { diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift index 079f67cf..66e5aacb 100644 --- a/MVMCoreUI/BaseClasses/ImageView.swift +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -51,6 +51,17 @@ open class ImageView: UIImageView, MoleculeViewProtocol { } } + /// Will be called only once. + open func setupView() { + translatesAutoresizingMaskIntoConstraints = false + insetsLayoutMarginsFromSafeArea = false + MVMCoreUIUtility.setMarginsFor(self, leading: 0, top: 0, trailing: 0, bottom: 0) + } + + open func reset() { + backgroundColor = .clear + } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- @@ -76,16 +87,5 @@ open class ImageView: UIImageView, MoleculeViewProtocol { open func updateView(_ size: CGFloat) { } - /// Will be called only once. - open func setupView() { - translatesAutoresizingMaskIntoConstraints = false - insetsLayoutMarginsFromSafeArea = false - MVMCoreUIUtility.setMarginsFor(self, leading: 0, top: 0, trailing: 0, bottom: 0) - } - - open func reset() { - backgroundColor = .clear - } - open func setAsMolecule() { } } From ad204118afb411caf40ff4c85dd530b2b125696a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 8 Jul 2020 11:39:43 -0400 Subject: [PATCH 05/17] latest state --- MVMCoreUI/Atomic/MoleculeObjectMapping.swift | 34 +++++++++---------- .../Order Tracker/OrderTracker.swift | 10 +++--- .../Order Tracker/Step.swift | 14 ++++++-- .../Order Tracker/StepModel.swift | 28 ++++++++++----- 4 files changed, 53 insertions(+), 33 deletions(-) diff --git a/MVMCoreUI/Atomic/MoleculeObjectMapping.swift b/MVMCoreUI/Atomic/MoleculeObjectMapping.swift index 5a3a3a1f..09ff554f 100644 --- a/MVMCoreUI/Atomic/MoleculeObjectMapping.swift +++ b/MVMCoreUI/Atomic/MoleculeObjectMapping.swift @@ -11,7 +11,7 @@ import Foundation @objcMembers public class MoleculeObjectMapping: NSObject { public var moleculeMapping: [String: MoleculeViewProtocol.Type] = [:] - + /// Returns the mapping object stored in the singleton public static func shared() -> Self? { return MVMCoreActionUtility.initializerClassCheck(CoreUIObject.sharedInstance()?.moleculeMap, classToVerify: self) as? Self @@ -22,12 +22,12 @@ import Foundation try? ModelRegistry.register(viewModelClass) moleculeMapping.updateValue(viewClass, forKey: viewModelClass.identifier) } - + /// Returns the type of molecule view for the given model public func getMoleculeClass(_ model: MoleculeModelProtocol) -> MoleculeViewProtocol.Type? { return moleculeMapping[model.moleculeName] } - + /// Creates a molecule with the given model. public func createMolecule(_ model: MoleculeModelProtocol, delegateObject: MVMCoreUIDelegateObject? = nil, additionalData: [AnyHashable: Any]? = nil) -> MoleculeViewProtocol? { guard let type = moleculeMapping[model.moleculeName] else { return nil } @@ -38,7 +38,7 @@ import Foundation public func getMoleculeModelForJSON(_ json: [String: Any]) throws -> MoleculeModelProtocol? { guard let moleculeName = json.optionalStringForKey(KeyMoleculeName), let type = ModelRegistry.getType(for: moleculeName, with: MoleculeModelProtocol.self) else { - throw ModelRegistry.Error.decoderErrorModelNotMapped() + throw ModelRegistry.Error.decoderErrorModelNotMapped() } guard let model = try type.decode(jsonDict: json) as? MoleculeModelProtocol else { throw ModelRegistry.Error.decoderError @@ -87,9 +87,7 @@ import Foundation MoleculeObjectMapping.shared()?.register(viewClass: RadioSwatches.self, viewModelClass: RadioSwatchesModel.self) MoleculeObjectMapping.shared()?.register(viewClass: Tags.self, viewModelClass: TagsModel.self) MoleculeObjectMapping.shared()?.register(viewClass: Tag.self, viewModelClass: TagModel.self) - - - + // MARK:- Other Atoms MoleculeObjectMapping.shared()?.register(viewClass: ProgressBar.self, viewModelClass: ProgressBarModel.self) MoleculeObjectMapping.shared()?.register(viewClass: MultiProgress.self, viewModelClass: MultiProgressBarModel.self) @@ -119,7 +117,9 @@ import Foundation MoleculeObjectMapping.shared()?.register(viewClass: HeadlineBodyButton.self, viewModelClass: HeadlineBodyButtonModel.self) MoleculeObjectMapping.shared()?.register(viewClass: BGImageHeadlineBodyButton.self, viewModelClass: BGImageHeadlineBodyButtonModel.self) MoleculeObjectMapping.shared()?.register(viewClass: ThreeHeadlineBodyLink.self, viewModelClass: ThreeHeadlineBodyLinkModel.self) - + MoleculeObjectMapping.shared()?.register(viewClass: OrderTracker.self, viewModelClass: OrderTrackerModel.self) + MoleculeObjectMapping.shared()?.register(viewClass: Step.self, viewModelClass: StepModel.self) + // MARK:- Left Right Molecules MoleculeObjectMapping.shared()?.register(viewClass: CornerLabels.self, viewModelClass: CornerLabelsModel.self) MoleculeObjectMapping.shared()?.register(viewClass: LeftRightLabelView.self, viewModelClass: LeftRightLabelModel.self) @@ -127,7 +127,7 @@ import Foundation MoleculeObjectMapping.shared()?.register(viewClass: HeadlineBodyToggle.self, viewModelClass: HeadlineBodyToggleModel.self) MoleculeObjectMapping.shared()?.register(viewClass: HeadlineBodyLinkToggle.self, viewModelClass: HeadlineBodyLinkToggleModel.self) MoleculeObjectMapping.shared()?.register(viewClass: ActionDetailWithImage.self, viewModelClass: ActionDetailWithImageModel.self) - + // MARK:- List items MoleculeObjectMapping.shared()?.register(viewClass: MoleculeTableViewCell.self, viewModelClass: MoleculeListItemModel.self) MoleculeObjectMapping.shared()?.register(viewClass: DropDownFilterTableViewCell.self, viewModelClass: DropDownListItemModel.self) @@ -140,8 +140,8 @@ import Foundation MoleculeObjectMapping.shared()?.register(viewClass: StackItem.self, viewModelClass: StackItemModel.self) MoleculeObjectMapping.shared()?.register(viewClass: MoleculeCollectionViewCell.self, viewModelClass: MoleculeCollectionItemModel.self) MoleculeObjectMapping.shared()?.register(viewClass: CarouselItem.self, viewModelClass: CarouselItemModel.self) - - + + // MARK:- Other Container Molecules MoleculeObjectMapping.shared()?.register(viewClass: MoleculeContainer.self, viewModelClass: MoleculeContainerModel.self) MoleculeObjectMapping.shared()?.register(viewClass: MoleculeHeaderView.self, viewModelClass: MoleculeHeaderModel.self) @@ -149,7 +149,7 @@ import Foundation MoleculeObjectMapping.shared()?.register(viewClass: Scroller.self, viewModelClass: ScrollerModel.self) MoleculeObjectMapping.shared()?.register(viewClass: ModuleMolecule.self, viewModelClass: ModuleMoleculeModel.self) MoleculeObjectMapping.shared()?.register(viewClass: BGImageMolecule.self, viewModelClass: BGImageMoleculeModel.self) - + // MARK:- Other Molecules MoleculeObjectMapping.shared()?.register(viewClass: DoughnutChartView.self, viewModelClass: DoughnutChartModel.self) @@ -157,7 +157,7 @@ import Foundation try? ModelRegistry.register(NavigationItemModel.self) try? ModelRegistry.register(NavigationImageButtonModel.self) try? ModelRegistry.register(NavigationLabelButtonModel.self) - + // MARK:- Other Organisms MoleculeObjectMapping.shared()?.register(viewClass: Carousel.self, viewModelClass: CarouselModel.self) MoleculeObjectMapping.shared()?.register(viewClass: BarsIndicatorView.self, viewModelClass: BarsCarouselIndicatorModel.self) @@ -204,7 +204,7 @@ import Foundation MoleculeObjectMapping.shared()?.register(viewClass: ListThreeColumnSpeedTestDivider.self, viewModelClass: ListThreeColumnSpeedTestDividerModel.self) MoleculeObjectMapping.shared()?.register(viewClass: ListThreeColumnBillChangesDivider.self, viewModelClass: ListThreeColumnBillChangesDividerModel.self) MoleculeObjectMapping.shared()?.register(viewClass: ListThreeColumnDataUsageDivider.self, viewModelClass: ListThreeColumnDataUsageDividerModel.self) - + // MARK:- Designed Headers MoleculeObjectMapping.shared()?.register(viewClass: HeadersH1Button.self, viewModelClass: HeadersH1ButtonModel.self) MoleculeObjectMapping.shared()?.register(viewClass: HeadersH1LandingPageHeader.self, viewModelClass: HeadersH1LandingPageHeaderModel.self) @@ -218,10 +218,10 @@ import Foundation // MARK:- Device Items MoleculeObjectMapping.shared()?.register(viewClass: ListDeviceComplexButtonMedium.self, viewModelClass: ListDeviceComplexButtonMediumModel.self) MoleculeObjectMapping.shared()?.register(viewClass: ListDeviceComplexButtonSmall.self, viewModelClass: ListDeviceComplexButtonSmallModel.self) - + MoleculeObjectMapping.shared()?.register(viewClass: ListDeviceComplexLinkSmall.self, viewModelClass: ListDeviceComplexLinkSmallModel.self) MoleculeObjectMapping.shared()?.register(viewClass: ListDeviceComplexLinkMedium.self, viewModelClass: ListDeviceComplexLinkMediumModel.self) - + // MARK:- Helper models try? ModelRegistry.register(RuleRequiredModel.self) try? ModelRegistry.register(RuleAnyRequiredModel.self) @@ -245,7 +245,7 @@ import Foundation guard let model = model else { return nil } return MoleculeObjectMapping.shared()?.getMoleculeClass(model)?.requiredModules(with: model, delegateObject, error: error) } - + /// Convenience function to add require modules for the given model to the passed in array. public static func addRequiredModules(for model: MoleculeModelProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, moduleList: inout [String]?, errorList: inout [MVMCoreErrorObject]?) { guard let model = model else { return } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 71dd8171..15bd4cfa 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -33,7 +33,7 @@ open class OrderTracker: View { // MARK: - Methods //-------------------------------------------------- - func constrain(stepModels: [StepModel]?) { + func constrain(stepModels: [StepModel]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { removeSteps() @@ -44,7 +44,7 @@ open class OrderTracker: View { for (i, stepModel) in stepModels.enumerated() { let step = Step() - step.set(with: stepModel, nil, nil) + step.set(with: stepModel, delegateObject, additionalData) addSubview(step) step.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true @@ -86,9 +86,8 @@ open class OrderTracker: View { context.setStrokeColor((step.state?.color() ?? .mvmCoolGray3).cgColor) context.addLine(to: convert(step.imageCenterPoint, from: step)) + context.strokePath() } - - context.strokePath() } //------------------------------------------------------ @@ -104,7 +103,8 @@ open class OrderTracker: View { guard let model = model as? OrderTrackerModel else { return } - constrain(stepModels: model.steps) + constrain(stepModels: model.steps, delegateObject: delegateObject, additionalData: additionalData) + setNeedsLayout() setNeedsDisplay() } } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 06a8a94a..de08f4a9 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -51,6 +51,7 @@ open class Step: View { stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true stateImage.heightAnchor.constraint(equalToConstant: 18).isActive = true stateImage.widthAnchor.constraint(equalToConstant: 18).isActive = true + bottomAnchor.constraint(greaterThanOrEqualTo: stateImage.bottomAnchor, constant: Padding.Five).isActive = true headline.topAnchor.constraint(equalTo: topAnchor).isActive = true headline.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true @@ -88,9 +89,16 @@ open class Step: View { guard let model = model as? StepModel else { return } - headline.text = model.headline - bodyTop.text = model.bodyTop - bodyBottom.text = model.bodyBottom + headline.set(with: model.headline, delegateObject, additionalData) + + if let bodyTopModel = model.bodyTop { + bodyTop.set(with: bodyTopModel, delegateObject, additionalData) + } + + if let bodyBottomModel = model.bodyBottom { + bodyBottom.set(with: bodyBottomModel, delegateObject, additionalData) + } + 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 index 7c2d719b..3af0f49d 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift @@ -18,26 +18,30 @@ open class StepModel: MoleculeModelProtocol { public static var identifier: String = "step" public var state: State? - public var headline: String = "" - public var bodyTop: String? - public var bodyBottom: String? + public var headline: LabelModel + public var bodyTop: LabelModel? + public var bodyBottom: LabelModel? + + //-------------------------------------------------- + // MARK: - Enum + //-------------------------------------------------- public enum State: String, Codable { case complete case incomplete case invalid - + func image() -> UIImage? { switch self { case .complete: - return UIImage(named: "icon_tracker_complete") + return MVMCoreUIUtility.imageNamed("icon_tracker_complete") case .incomplete: - return UIImage(named: "icon_tracker_incomplete") + return MVMCoreUIUtility.imageNamed("icon_tracker_incomplete") case .invalid: - return UIImage(named: "icon_tracker_invalid") + return MVMCoreUIUtility.imageNamed("icon_tracker_invalid") } } @@ -64,6 +68,9 @@ open class StepModel: MoleculeModelProtocol { case moleculeName case backgroundColor case state + case headline + case bodyTop + case bodyBottom } //-------------------------------------------------- @@ -74,12 +81,17 @@ open class StepModel: MoleculeModelProtocol { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) state = try typeContainer.decodeIfPresent(State.self, forKey: .state) + headline = try typeContainer.decode(LabelModel.self, forKey: .headline) + bodyTop = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .bodyTop) + bodyBottom = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .bodyBottom) } 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(headline, forKey: .headline) + try container.encodeIfPresent(bodyTop, forKey: .bodyTop) + try container.encodeIfPresent(bodyBottom, forKey: .bodyBottom) } } From 9ebc7ad3a1895552dfb9f10415ba0d647ada7d9f Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 8 Jul 2020 12:04:12 -0400 Subject: [PATCH 06/17] constraining --- .../Order Tracker/OrderTracker.swift | 2 +- .../VerticalCombinationViews/Order Tracker/Step.swift | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 15bd4cfa..1b8e3c11 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -53,7 +53,7 @@ open class OrderTracker: View { if i == 0 { step.topAnchor.constraint(equalTo: topAnchor).isActive = true - } else if let previousStep = previousStep{ + } else if let previousStep = previousStep { step.topAnchor.constraint(equalTo: previousStep.bottomAnchor).isActive = true } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index de08f4a9..5a296f02 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -51,7 +51,7 @@ open class Step: View { stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true stateImage.heightAnchor.constraint(equalToConstant: 18).isActive = true stateImage.widthAnchor.constraint(equalToConstant: 18).isActive = true - bottomAnchor.constraint(greaterThanOrEqualTo: stateImage.bottomAnchor, constant: Padding.Five).isActive = true + bottomAnchor.constraint(greaterThanOrEqualTo: stateImage.bottomAnchor, constant: Padding.Ten).isActive = true headline.topAnchor.constraint(equalTo: topAnchor).isActive = true headline.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true @@ -64,7 +64,9 @@ open class Step: View { bodyBottom.topAnchor.constraint(equalTo: bodyTop.bottomAnchor).isActive = true bodyBottom.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true trailingAnchor.constraint(equalTo: bodyBottom.trailingAnchor).isActive = true - bottomAnchor.constraint(greaterThanOrEqualTo: bodyBottom.bottomAnchor).isActive = true + let bodyBottomConstraint = bottomAnchor.constraint(greaterThanOrEqualTo: bodyBottom.bottomAnchor) + bodyBottomConstraint.priority = .defaultHigh + bodyBottomConstraint.isActive = true } public override func reset() { From fa439855b0c07bcb8252913307cfc8d2c5c87f58 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 8 Jul 2020 13:00:40 -0400 Subject: [PATCH 07/17] drawing line --- .../Order Tracker/OrderTracker.swift | 38 +++++++++++++------ .../Order Tracker/Step.swift | 14 ++++--- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 1b8e3c11..9709d1b9 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -22,11 +22,13 @@ open class OrderTracker: View { open override func setupView() { super.setupView() + isOpaque = false } open override func reset() { super.reset() - removeSteps() + + resetSteps() } //-------------------------------------------------- @@ -35,7 +37,7 @@ open class OrderTracker: View { func constrain(stepModels: [StepModel]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - removeSteps() + resetSteps() guard let stepModels = stepModels else { return } @@ -46,6 +48,7 @@ open class OrderTracker: View { let step = Step() step.set(with: stepModel, delegateObject, additionalData) addSubview(step) + steps.append(step) step.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true trailingAnchor.constraint(equalTo: step.trailingAnchor).isActive = true @@ -57,36 +60,49 @@ open class OrderTracker: View { step.topAnchor.constraint(equalTo: previousStep.bottomAnchor).isActive = true } - if i == steps.count - 1 { + if i == stepModels.count - 1 { bottomAnchor.constraint(equalTo: step.bottomAnchor).isActive = true + step.imageBottomConstraint?.isActive = false } previousStep = step } } - func removeSteps() { + func resetSteps() { - steps.forEach { $0.removeFromSuperview() } + steps.forEach { + $0.reset() + $0.removeFromSuperview() + } steps = [] } //-------------------------------------------------- // MARK: - Draw //-------------------------------------------------- - + open override func draw(_ rect: CGRect) { - - guard let context = UIGraphicsGetCurrentContext() else { return } + + guard let context = UIGraphicsGetCurrentContext(), let firstStep = steps.first else { return } context.setLineWidth(1) - context.move(to: steps.first!.imageCenterPoint) + let firstRect = convert(firstStep.stateImage.frame, from: firstStep.stateImage) + let imageDimension = firstStep.stateImage.bounds.height + let startPoint = CGPoint(x: imageDimension / 2, y: firstRect.size.height - 1) + context.move(to: startPoint) - for step in steps.dropLast() { + for step in steps.dropFirst() { context.setStrokeColor((step.state?.color() ?? .mvmCoolGray3).cgColor) - context.addLine(to: convert(step.imageCenterPoint, from: step)) + let relativeOrigin = convert(step.stateImage.frame, from: step.stateImage) + let point = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y) + + context.addLine(to: point) context.strokePath() + + let nextPoint = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y + imageDimension) + context.move(to: nextPoint) } } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 5a296f02..af11dfa7 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -23,6 +23,12 @@ open class Step: View { // MARK: - Computed Properties //-------------------------------------------------- + public var imageBottomConstraint: NSLayoutConstraint? + + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + public var stepModel: StepModel? { return model as? StepModel } @@ -31,10 +37,6 @@ open class Step: View { return stepModel?.state } - public var imageCenterPoint: CGPoint { - return stateImage.center - } - //-------------------------------------------------- // MARK: - Life Cycle //-------------------------------------------------- @@ -51,7 +53,8 @@ open class Step: View { stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true stateImage.heightAnchor.constraint(equalToConstant: 18).isActive = true stateImage.widthAnchor.constraint(equalToConstant: 18).isActive = true - bottomAnchor.constraint(greaterThanOrEqualTo: stateImage.bottomAnchor, constant: Padding.Ten).isActive = true + imageBottomConstraint = bottomAnchor.constraint(greaterThanOrEqualTo: stateImage.bottomAnchor, constant: Padding.Ten) + imageBottomConstraint?.isActive = true headline.topAnchor.constraint(equalTo: topAnchor).isActive = true headline.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true @@ -76,6 +79,7 @@ open class Step: View { bodyTop.text = "" bodyBottom.text = "" stateImage.image = nil + imageBottomConstraint?.isActive = true } //------------------------------------------------------ From b758c0d5147cd4a87131a2107e67164a5d275f01 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 8 Jul 2020 13:10:19 -0400 Subject: [PATCH 08/17] well functioning --- .../Order Tracker/OrderTracker.swift | 7 +++++-- .../VerticalCombinationViews/Order Tracker/Step.swift | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 9709d1b9..9b5dcb7c 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -92,16 +92,19 @@ open class OrderTracker: View { let startPoint = CGPoint(x: imageDimension / 2, y: firstRect.size.height - 1) context.move(to: startPoint) + var lineColor = (firstStep.state?.color() ?? .mvmCoolGray3).cgColor + for step in steps.dropFirst() { - context.setStrokeColor((step.state?.color() ?? .mvmCoolGray3).cgColor) + context.setStrokeColor(lineColor) let relativeOrigin = convert(step.stateImage.frame, from: step.stateImage) - let point = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y) + let point = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y + 1) context.addLine(to: point) context.strokePath() let nextPoint = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y + imageDimension) + lineColor = (step.state?.color() ?? .mvmCoolGray3).cgColor context.move(to: nextPoint) } } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index af11dfa7..3f6db73b 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -49,6 +49,7 @@ open class Step: View { addSubview(bodyTop) addSubview(bodyBottom) + stateImage.contentMode = .scaleToFill stateImage.topAnchor.constraint(equalTo: topAnchor).isActive = true stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true stateImage.heightAnchor.constraint(equalToConstant: 18).isActive = true From e36c8c3ead17d03bfd568a7d95985c617b1fa17f Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 8 Jul 2020 17:14:52 -0400 Subject: [PATCH 09/17] changes made --- .../Order Tracker/OrderTracker.swift | 4 ++-- .../VerticalCombinationViews/Order Tracker/Step.swift | 5 +++-- .../VerticalCombinationViews/Order Tracker/StepModel.swift | 5 +---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 9b5dcb7c..716a3968 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -89,7 +89,7 @@ open class OrderTracker: View { context.setLineWidth(1) let firstRect = convert(firstStep.stateImage.frame, from: firstStep.stateImage) let imageDimension = firstStep.stateImage.bounds.height - let startPoint = CGPoint(x: imageDimension / 2, y: firstRect.size.height - 1) + let startPoint = CGPoint(x: imageDimension / 2, y: firstRect.size.height - imageDimension / 2) context.move(to: startPoint) var lineColor = (firstStep.state?.color() ?? .mvmCoolGray3).cgColor @@ -98,7 +98,7 @@ open class OrderTracker: View { context.setStrokeColor(lineColor) let relativeOrigin = convert(step.stateImage.frame, from: step.stateImage) - let point = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y + 1) + let point = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y + imageDimension / 2) context.addLine(to: point) context.strokePath() diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 3f6db73b..0304129d 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -49,7 +49,8 @@ open class Step: View { addSubview(bodyTop) addSubview(bodyBottom) - stateImage.contentMode = .scaleToFill + stateImage.contentMode = .scaleAspectFit + stateImage.layer.backgroundColor = UIColor.white.cgColor stateImage.topAnchor.constraint(equalTo: topAnchor).isActive = true stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true stateImage.heightAnchor.constraint(equalToConstant: 18).isActive = true @@ -57,7 +58,7 @@ open class Step: View { imageBottomConstraint = bottomAnchor.constraint(greaterThanOrEqualTo: stateImage.bottomAnchor, constant: Padding.Ten) imageBottomConstraint?.isActive = true - headline.topAnchor.constraint(equalTo: topAnchor).isActive = true + headline.topAnchor.constraint(equalTo: topAnchor, constant: 2).isActive = true headline.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true trailingAnchor.constraint(equalTo: headline.trailingAnchor).isActive = true diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift index 3af0f49d..915e860a 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift @@ -51,10 +51,7 @@ open class StepModel: MoleculeModelProtocol { case .complete: return .mvmGreen - case .incomplete: - return .mvmOrangeAA - - case .invalid: + case .incomplete,.invalid: return .mvmCoolGray3 } } From 20ab3d82bdf4f46d8e310648b1fd3e69de17ae5c Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 10 Jul 2020 11:41:08 -0400 Subject: [PATCH 10/17] updated images with properly centered images --- .../icon_tracker_complete.imageset/Green.png | Bin 741 -> 613 bytes .../Green@2x.png | Bin 1606 -> 1307 bytes .../Green@3x.png | Bin 2450 -> 1984 bytes .../Contents.json | 6 +++--- .../Empty state icon.png | Bin 0 -> 462 bytes .../Empty state icon@2x.png | Bin 0 -> 1072 bytes .../Empty state icon@3x.png | Bin 0 -> 1636 bytes .../Group.png | Bin 645 -> 0 bytes .../Group@2x.png | Bin 1420 -> 0 bytes .../Group@3x.png | Bin 2202 -> 0 bytes .../Alert icon.png | Bin 0 -> 548 bytes .../Alert icon@2x.png | Bin 0 -> 1203 bytes .../Alert icon@3x.png | Bin 0 -> 1900 bytes .../Contents.json | 6 +++--- .../icon_tracker_invalid.imageset/Group 2.png | Bin 749 -> 0 bytes .../Group 2@2x.png | Bin 1374 -> 0 bytes .../Group 2@3x.png | Bin 2102 -> 0 bytes 17 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Empty state icon.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Empty state icon@2x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Empty state icon@3x.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@2x.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Group@3x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon@2x.png create mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon@3x.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@2x.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Group 2@3x.png diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_complete.imageset/Green.png index a60d67def1f80d4c26003597a1df68beaafb06b9..285005cbe3787d362e0d70c86d308c30c3cad3c0 100644 GIT binary patch delta 553 zcmV+^0@nTI1?2=GiBL{Q4GJ0x0000DNk~Le0000I0000I2nGNE09MY9SCJt|e-fYr z00aO40096101^NI005e)vQ+>80nbT9K~y*qt(3nn1VI$Xzq2ls{s6zC&?#ML}#67F)BNEGfAI#DS60ZQlW_`aFlJu6Nwm}X|)yzgh< zy!U1mz8kylIJBOJ#u$$~0+(kfe-xqADKeGIuQC-g947nls!k~Ar#%PdTmb6H`sf~L zf0FAoKX8vWy^M{!hfrS!c`m=M&nV0x;bgIS`w}|E=KWMVYQ9I`G#qCdTji3RTaZLj z#SQmaWbck+!bTe}xymCCtr(KX9OEa~kw}__h{*U-W3)g5JMM(ZNrGWEe>1$nE}+(n zY^7*YQ1c(b;y6%xj{01~oP35G$XkJ?S!1?&%t?hEQ({w{&x&u>5ky@fQ(lieM9Vgj z9I;Qr5_9LJMsP6H89B-#4q0I@>H4|RcGzUstz78^yjAlN>_-UQTePXXfSxJtiCCGb zHSS9Ww&xB5k`tBZb-qLre<LVUdwEhFDEHU{Jl|7T~!@A*bnCG@|9O$(9EwZ^yQMa~$JKjnOgzk!o*X r6uy5>(;psfNc)%HNC=bp7eBTSC*Z~{PhLaJ00000NkvXXu0mjf{R8Zx delta 683 zcmV;c0#yCw1my)GiBL{Q4GJ0x0000DNk~Le0000J0000J2nGNE0CG?^%#k5Te-oes z00aO400961022TJ001CwP^JI?0#8XqK~y*qjgv8GR6!7i|J^$zD7Hp|Vq@=J4hd>v zV-rv`O#};3L<0(1*d_18z`ctG5wsC2K`e|mf{jJM7;+d0da({xflF%_#q-`c|L*NO zpGht^#oOE6neTRH{sDS1nYIuyf4jME@4&!nX$+8Yg^U2^APhud8~R;@#T=s55C6lr z!X6fn;SXLYs2{K|A$A^lvktT@5;+1fqk4Bm|6~ohJ=ZX`vKF9OShaK(Nox+qJi*?+ z8Qfj|85}d~?5X`|ZpI3|3~Mi7s=mbg4va5qN=-o%D6hWG1n;zo3%4}we+u$;2$S{i z*7>nUOpPz<6~w^uw`Z{C4O;S?TMzTa?suv2bT^BSA4Xg}?cD6XNYfqU-ow~67JH`} z{R<}u%};uyF=~^wADYoy7`YhI9C2N9w_QFd$b3Xpzms|j=8>3T6{8B0I&$rAU&p0k z%nlt&o%tgRn$Xu!ciwWcf3B?@P|$txf>a%)CYR9sy^sRCffyq>jg`c<|6#)kGQgtq zxAk(#0cVOQe2vV4rj~tC@D~*`OvAs1BjS|ZzBSVcqOt1^*pkocNYIT;Y5~Mml2M(A zMGxbwaYU%>U;$`wwJYe+$pb3fahSX^f>jDN)ymVb?Rl*fUTNHWfBJWd&Y|V3aYTBx zYVn??eg^2f$&k)$az|B*ymKQ$WmAyb8B_bU`PhMsJ%{LPoo-nePaX^&^|PiULS<8s z)DhdyuDN2fM%oms1cgaNK~z`?%~)NCRaF%J_L)#oWAq_tuGx#(4-_$D z!Z0QbjUxnwR3zj>&{I$SNGhZkpROYbrPk9B=$nE*L{tztmXHoUIO9V>B-KOFogl(7 zN04&P>HGFR`<`>pz30x{d+v}6f9^f|?6dazzO(kvTI(3JD~F$6i}_p6A;LD8=s^xI zv0bue463|V5t(0MFoB*`pX1$&*V}y!ErpY z;T`NeJD>C=t>%P|4zIzj8)s-})T$bD8G+&3P1F4y$k@PEgps^F7~4CCRlPg0`@(G2 zS|cHmnY%Gbmp|qP2V*!ee^rJtQFd@!_fceUXj6qA+waDiAF#T2C`&4+GpcElXDk_W znuMWL#i^xRbd-TGi`1ek{Q+_P{jDipsh9JPGiNUg~CCDwH6&&G7oQj zk>TQ>h7lH1anZ^s2}SE&n}M=hvRE=TJdYi%mxoHWUr{?xK74k0-lK;8w#m>!f?WzS z$yI}WjP>7#zh|y+TfW`+Fw@fs8JS3>F9B~_2h9)%sqr{>f6CF8q&g)dLLpg5$VF2& zV{d#KYHw11>w5Q6(Ji_>QbouJ%AhYsoDm_nc5J2>cc(Af1?$%A$R$;jjIa{yDsyAQ zpr%<<+LP9gUXo<&QtV&p`8* z@1l$UJExBgH3n?lHJ@YBq}0A^K3HXm`A>SbII#J6<0n0vK`>}{@Ja7K_(mBdN7^G? P00000NkvXXu0mjf`VmQ> delta 1554 zcmV+t2JQKq3dRf}iBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=~e|*mdKQoq505tA2C{nt`hMm`Xl&#MqJoQP3JF7$JX?Ki8rn$HpB4C0P|qR zh7>IK0`x(O_8%u^lTJ1>V8$@DM;hRrHh@|U>&n*i6W zvdlkGzEw?c^xg34vb>#%wk)4`Nw?9$8lGQ^$J}aL-O1lUt-EvQFB5U>eb77;!4wkRakyQETLN z+#G$hZ~0swOLXuHe>lSlxMs7=C4tG^=Uy`sJabI~$|Uw;t2{vCaale;G1;Mr=?NqP z#YtdtAq&YhlSxGPt4-Z=L8*Q^O^X-pm?Us_!5NIj0KABwzGs zC5xY-jVBO>0<`t}n{Y~xj+#WR7g)K&IusDezMCniqy^iye=+4rV66F+>^hAjNnTIu z(37)0z0}R=gTgj)Y$La`fl20R=w7v?sY{5>_R12vIogYRZd=H#e<&MJqQN-8m>poT zKmP$*CwW6Y6-Ei#4UVNaSqD>s%NCRZb8VZr?XgXLl4Jd$cr?iiK~{FpYXJYb&P)Yv zCZI&IZb%ZQ&3{lt{Zf(d6#VjQx9XZA`F*~3Akf5 z^>k_M6!_|#WtFJ{4W80s#Hp!5g3PBRKyKvI73MjK=t46AwZFO) z!F7e|F{UdCOiC<004N+JM^8mTaKbwiP$D0@B{hZMe;K1vt0xIe>pr%N3n?7Zkr&)d zK}m9ISTAq9;TghVOailk9MFeUGg3IDBNtrOd&)7;7LnvMqAQkf-jPxE*%st&kzQpY z+*?ikt8ss&ElzzprrSC2Xc67IeF2AQ0Yp2fd9XoL_&p{dq!?8~iKW$y-TTk}|GINj zL1}Voe>o{Vp==G(*H?yV?c5SDS7B-ut(`wa-J=(RY&q$-MWR@pt*VQ8J4FZ1x_bQ{ zb4R5@mSR-MBtF3MzTi&f?Acne3%XlWAM<Se{}tRo9fD>zLaRZ2)~u|&Clzx%)= zXc>2(ea+ZgK);jG34E)FrmMm-2j-&Dx(_9mR5MaIWJY5e(It2`4*rmd$n=4^TBUGB zHG`8?3xM{gPGp`~^0<0VK6Ntxin%Vi`@;5-t19gIFaAt2nhWpaWB>pF07*qoM6N<$ Ef+6_jQ~&?~ 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 index 469169c480cba061b162dc1a5be8291e01deaf8e..183d6022b6c6c0198e0420a7db7b420a2f7f797a 100644 GIT binary patch delta 1935 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 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json index df61089a..e8f406a7 100644 --- a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json +++ b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Contents.json @@ -2,17 +2,17 @@ "images" : [ { "idiom" : "universal", - "filename" : "Group.png", + "filename" : "Empty state icon.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "Group@2x.png", + "filename" : "Empty state icon@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "Group@3x.png", + "filename" : "Empty state icon@3x.png", "scale" : "3x" } ], diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Empty state icon.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_incomplete.imageset/Empty state icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9623a477567a7ba520c7e64ac0fb9b7634cd8820 GIT binary patch literal 462 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 i2R~fp_ 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 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4169bd010b63a7674f70da18ce46f3f39e537047 GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~STEL88gA~qMxhWK=tk2WMF~mY} zZHTQmv!g)mZp%w6W}FC>>*(FO-+`NTE$c!11+B4u8>S{`*OiF|C#N#wDhnADNmy#-e|7TY^{{-^YKz*S+~?-bymwf-muD03w%&r+* zPbyBAy2O)kYTI_s+TZHamL95;Pm?+9*{vvdtb->vgIjT4na25!=;r@6Iq@L}cW>1w RJMaM%L!PdFF6*2UngFji&zb-L literal 0 HcmV?d00001 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon@2x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..65133b98f7a2a122313825e89c0258a2d8e9e48a GIT binary patch literal 1203 zcmV;k1WfyhP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91B%lKT1ONa40RR91Bme*a04fgS`~Uz19Z5t%R9FekSkFrpQ5Ze<`cf-W zpHY}pd!v>?KcN^9vx4F;p^=oE&iWlb1eKX&8&YADdz4!aZAZ06@K|YwqegtTy>&DQa5g`vXgCP@Q zh`m8r^w~<>uDggacQ4_ONoa?$cC>`RG1~7AL*$b98G{+x^^@dk{t9j+^7)t1Xd8C& z$uCjF4%w1qni09jYd1{=UQ`4aT2^r zasDwv;dNAuKEh>!9CrW)!xYn*ufa9bf$_hA`g>sqYR1NKh@#FBry;`Wt>2E5rWLc^ zE`I*4ps^0r1qEEEVKWV;cwDHsbiM^pH5)gOvrcXXS7~Y)Q(b7HV&*|iXziQrO%cx!`5<% z5s$Eh$)SJFzfIy2XI#TPLGGR5Fex(CmDs=H65hp)%h4BR^)l=e2l1LC&LVVi$TXWc zz7Kd|s={JVIU`eKi*+=7vjOhwog(KhKl|n)#HlTN-n_8TV#Fg3aj8#I$E~gt0{L?mZiBo=FgVo-| z|GRl(T8my<(Eqh}3$0dvYLFHiPT~MVmZQXbNmtJKByw zN8u#8lKRO`T;f#UYjA>8#BuypH#Mj_kilX!$3;$Y`$EzQa^x)Hbmm)mR_WzJ3lfL8 z;@s*pQgdyj9X(WZoL7fc9V|qWFSc)|v3}w^o@hkK)w}u%+PsRn2=R(4N}l>;IQboS zhqBqU7C|eA%|>Datu~!V;#i#UZZJl6u~dd6`S9l=h;Q z)W-%dO6Mi>IVLVj{U!6ks#KWvK3A!zIA9L!QsB~0dIoQqO7xj(+)DdN?+4Aq$O;#Q RME?K)002ovPDHLkV1ka`FYN#T literal 0 HcmV?d00001 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon@3x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/icon_tracker_invalid.imageset/Alert icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b628ef9e7afc78ac322418b3e5bb182186ddd9 GIT binary patch literal 1900 zcmV-y2b1`TP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91HlPCl1ONa40RR91HUIzs0P{mGqyPX0)=5M`RA>d=T2F{oRUH2A9mQ$l z>AaDMYLP*ML2UxXR-uc87NUZ=GB*(g7U?L{N*HJpqs|m16w$`qC_#z~!4^uJ8g$Vj zL(#}63lrZPm8P+o_io>J?)_cQyYJ1@d2`?VJMiB5bIDjtx4=9)xvC(~araFnk95S!^a`{%v)Zodm11Gx+I1>zD%zyr% zbTojj(Yx4Ktza`{ZKkZE--aMhhfA=l`yhVx%bTSinpk-s4Zh5-YZgBgu~Hx2;#~TKq?Sq;8&&xC z<+2C^kA8%|nsw0XvwwEuiF*MCNbn8z+mZA;!MXQt&k#O;kld!kqT}c&|A3D<4|b)3 z0$gV=Te^pFAuVfTVssDIRDcsC_>^_S`Fptd65b28^94^4!YRsKaUCgOq%*?W*&-zn z>PvkxIpRR^PcK^7EZ-=el9+~{uPILIqdnbN->#w82%MFvPxUPfRwit2idaD=Za5SZ zLvbdZQzA8t*E4PBBwN~puV^)QsB?m!ph4N#$e`3|OeQ_Ce$G&^{YY^I-kcK_4LVJ* zxM8UmFRa3xty)JcS*K!?PD9ZNY~{K%o^3c+d0`PIs_VKikladP&f=*drX2+9;5Z#5Q1&Jh`sE~;&f;{Y6!Jf|_oG~T7h zeQ=vJABSKJ?*6~SNUUiIIhfWQF`cLQuvZnhR+P2(ODoUwM9&Hw5atACZ^9+k7{}*M z!%xO1^V-mw%y!1Kl6QpJ`Y&$sXwFVd;eu`4E&|JpHc^(pVo?0k` z45!0P?8=LaIEA`+u?p_wJIzC)wVlhD!*NX54TCs^WT@LD7j&Grbgpq#FVYK@Ox}Cc zYSPCpPO^%tO&BNMB}?ZSS3~^m%i|k$_aA=QOw$?ct3_;;3FT^i)zW#!B=V;(FYLr^ zKc7cBgMF2V#TS`O=r$>jPO>t15mTeF+vC%_?8(Y&l+R!tRs0n&}l>F+R-3!p={}iPx&5FveD#*d2!iZAwf`IX?SS7W5>_>6Yf_S;Ao>MuR2nrY)7F#FUYD zp62qj(i}cqa&RKgAt||e1Yr_3VU#>!&VE_Ivf7Y*8E~GBRwhqIoYQTdcwD#`ca}!o zredA&k-#k;WY=bmQH{n_Q5EE!XM+jl8P=6=s_x}kNBPGY*wk#>3tkal5Ph7R1 zS)SwfsGM%xsnZWI`$3u#DK1AltamOUZ%_3F!IZ?*nB+c{uh#@I9+A^+wjCClQ+%7+ zGC55N4@n&+sdtoa6zYbeU#YkpyCuLYTQ?ry{A^lF^`$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 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 deleted file mode 100644 index b42ad2b0805906ed95509da9f379eede988b43f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index ffba745cb17779e8ccea41960617b6a05fe8eed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 From db5f51dd920933e98d3f5000904f7702cf895e04 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 13 Jul 2020 15:45:48 -0400 Subject: [PATCH 11/17] latest updates --- .../Order Tracker/OrderTracker.swift | 31 +++++++++++++------ .../Order Tracker/Step.swift | 4 +-- .../Order Tracker/StepModel.swift | 2 +- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 716a3968..af66cc8f 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -62,7 +62,7 @@ open class OrderTracker: View { if i == stepModels.count - 1 { bottomAnchor.constraint(equalTo: step.bottomAnchor).isActive = true - step.imageBottomConstraint?.isActive = false + step.imageBottomConstraint?.constant = 0 } previousStep = step @@ -75,6 +75,7 @@ open class OrderTracker: View { $0.reset() $0.removeFromSuperview() } + steps = [] } @@ -84,27 +85,39 @@ open class OrderTracker: View { open override func draw(_ rect: CGRect) { - guard let context = UIGraphicsGetCurrentContext(), let firstStep = steps.first else { return } + guard let context = UIGraphicsGetCurrentContext(), + let firstStep = steps.first + else { return } context.setLineWidth(1) let firstRect = convert(firstStep.stateImage.frame, from: firstStep.stateImage) let imageDimension = firstStep.stateImage.bounds.height - let startPoint = CGPoint(x: imageDimension / 2, y: firstRect.size.height - imageDimension / 2) + let halfDimension = imageDimension / 2 + let startPoint = CGPoint(x: halfDimension, y: firstRect.size.height - halfDimension) + let defaultGrey: UIColor = .mvmCoolGray3 context.move(to: startPoint) - var lineColor = (firstStep.state?.color() ?? .mvmCoolGray3).cgColor + var lineColor = (firstStep.state?.color() ?? defaultGrey).cgColor - for step in steps.dropFirst() { + for (i, step) in steps.dropFirst().enumerated() { + + if let state = step.state, state == .incomplete { + lineColor = defaultGrey.cgColor + } context.setStrokeColor(lineColor) let relativeOrigin = convert(step.stateImage.frame, from: step.stateImage) - let point = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y + imageDimension / 2) + let point = CGPoint(x: halfDimension, y: relativeOrigin.origin.y + halfDimension) context.addLine(to: point) context.strokePath() - let nextPoint = CGPoint(x: imageDimension / 2, y: relativeOrigin.origin.y + imageDimension) - lineColor = (step.state?.color() ?? .mvmCoolGray3).cgColor + if i == steps.count - 2 { + break + } + + let nextPoint = CGPoint(x: halfDimension, y: relativeOrigin.origin.y + imageDimension) + lineColor = (step.state?.color() ?? defaultGrey).cgColor context.move(to: nextPoint) } } @@ -114,7 +127,7 @@ open class OrderTracker: View { //------------------------------------------------------ public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { - return 320 + return 196 } public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 0304129d..6414609b 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -81,7 +81,7 @@ open class Step: View { bodyTop.text = "" bodyBottom.text = "" stateImage.image = nil - imageBottomConstraint?.isActive = true + imageBottomConstraint?.constant = Padding.Ten } //------------------------------------------------------ @@ -89,7 +89,7 @@ open class Step: View { //------------------------------------------------------ public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { - return 320 + return 64 } public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift index 915e860a..3fa25d22 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift @@ -51,7 +51,7 @@ open class StepModel: MoleculeModelProtocol { case .complete: return .mvmGreen - case .incomplete,.invalid: + case .incomplete, .invalid: return .mvmCoolGray3 } } From 5894387fd1a92be7f06d97552737f2f0dbab1ab2 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Mon, 13 Jul 2020 16:16:42 -0400 Subject: [PATCH 12/17] smoothing out the lines --- .../Order Tracker/OrderTracker.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index af66cc8f..9963ea37 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -106,17 +106,18 @@ open class OrderTracker: View { } context.setStrokeColor(lineColor) - let relativeOrigin = convert(step.stateImage.frame, from: step.stateImage) - let point = CGPoint(x: halfDimension, y: relativeOrigin.origin.y + halfDimension) + let relativeRect = convert(step.stateImage.frame, from: step.stateImage) + let point = CGPoint(x: halfDimension, y: relativeRect.origin.y + halfDimension) context.addLine(to: point) context.strokePath() + // Break out of loop since we're on the last step. if i == steps.count - 2 { break } - let nextPoint = CGPoint(x: halfDimension, y: relativeOrigin.origin.y + imageDimension) + let nextPoint = CGPoint(x: halfDimension, y: relativeRect.origin.y + halfDimension) lineColor = (step.state?.color() ?? defaultGrey).cgColor context.move(to: nextPoint) } From 4a5856f07183dcee9ffefb8254af61a7f323b594 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 14 Jul 2020 16:14:37 -0400 Subject: [PATCH 13/17] making yupdates --- .../Order Tracker/OrderTracker.swift | 26 +++++++------------ .../Order Tracker/Step.swift | 10 +++---- .../Order Tracker/StepModel.swift | 2 +- MVMCoreUI/BaseClasses/ImageView.swift | 1 + 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 9963ea37..93aa7c23 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -41,9 +41,10 @@ open class OrderTracker: View { guard let stepModels = stepModels else { return } + var anchor = topAnchor var previousStep: Step? - for (i, stepModel) in stepModels.enumerated() { + for stepModel in stepModels { let step = Step() step.set(with: stepModel, delegateObject, additionalData) @@ -52,21 +53,14 @@ open class OrderTracker: View { step.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true trailingAnchor.constraint(equalTo: step.trailingAnchor).isActive = true + step.topAnchor.constraint(equalTo: anchor).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 == stepModels.count - 1 { - bottomAnchor.constraint(equalTo: step.bottomAnchor).isActive = true - step.imageBottomConstraint?.constant = 0 - } - + anchor = step.bottomAnchor previousStep = step } + + bottomAnchor.constraint(equalTo: anchor).isActive = true + previousStep?.imageBottomConstraint?.constant = 0 } func resetSteps() { @@ -90,10 +84,9 @@ open class OrderTracker: View { else { return } context.setLineWidth(1) - let firstRect = convert(firstStep.stateImage.frame, from: firstStep.stateImage) let imageDimension = firstStep.stateImage.bounds.height let halfDimension = imageDimension / 2 - let startPoint = CGPoint(x: halfDimension, y: firstRect.size.height - halfDimension) + let startPoint = CGPoint(x: halfDimension, y: halfDimension) let defaultGrey: UIColor = .mvmCoolGray3 context.move(to: startPoint) @@ -117,9 +110,8 @@ open class OrderTracker: View { break } - let nextPoint = CGPoint(x: halfDimension, y: relativeRect.origin.y + halfDimension) lineColor = (step.state?.color() ?? defaultGrey).cgColor - context.move(to: nextPoint) + context.move(to: point) } } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 6414609b..1770c44a 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -20,7 +20,7 @@ open class Step: View { public var stateImage = ImageView() //-------------------------------------------------- - // MARK: - Computed Properties + // MARK: - Constraints //-------------------------------------------------- public var imageBottomConstraint: NSLayoutConstraint? @@ -77,10 +77,10 @@ open class Step: View { public override func reset() { super.reset() - headline.text = "" - bodyTop.text = "" - bodyBottom.text = "" - stateImage.image = nil + headline.reset() + bodyTop.reset() + bodyBottom.reset() + stateImage.reset() imageBottomConstraint?.constant = Padding.Ten } diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift index 3fa25d22..f4661945 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/StepModel.swift @@ -87,7 +87,7 @@ open class StepModel: MoleculeModelProtocol { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeIfPresent(headline, forKey: .headline) + try container.encode(headline, forKey: .headline) try container.encodeIfPresent(bodyTop, forKey: .bodyTop) try container.encodeIfPresent(bodyBottom, forKey: .bodyBottom) } diff --git a/MVMCoreUI/BaseClasses/ImageView.swift b/MVMCoreUI/BaseClasses/ImageView.swift index 66e5aacb..2acfc5ae 100644 --- a/MVMCoreUI/BaseClasses/ImageView.swift +++ b/MVMCoreUI/BaseClasses/ImageView.swift @@ -59,6 +59,7 @@ open class ImageView: UIImageView, MoleculeViewProtocol { } open func reset() { + image = nil backgroundColor = .clear } From b0f96969050d135f7643ee0a6661a83c29b636f8 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 15 Jul 2020 17:58:27 -0400 Subject: [PATCH 14/17] midy --- .../VerticalCombinationViews/Order Tracker/OrderTracker.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 93aa7c23..89942752 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -100,7 +100,7 @@ open class OrderTracker: View { context.setStrokeColor(lineColor) let relativeRect = convert(step.stateImage.frame, from: step.stateImage) - let point = CGPoint(x: halfDimension, y: relativeRect.origin.y + halfDimension) + let point = CGPoint(x: halfDimension, y: relativeRect.midY) context.addLine(to: point) context.strokePath() From 3c24714444c913ffaa94900454c2b8f85ceafb7a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 15 Jul 2020 18:04:05 -0400 Subject: [PATCH 15/17] remove image --- .../success.imageset/Contents.json | 23 ------------------ .../success.imageset/Standard@1x.png | Bin 645 -> 0 bytes .../success.imageset/Standard@2x.png | Bin 1397 -> 0 bytes .../success.imageset/Standard@3x.png | Bin 2312 -> 0 bytes 4 files changed, 23 deletions(-) delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Contents.json delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@1x.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@2x.png delete mode 100644 MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@3x.png diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Contents.json b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Contents.json deleted file mode 100644 index 05b81f4a..00000000 --- a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "Standard@1x.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "Standard@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "Standard@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@1x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@1x.png deleted file mode 100644 index 5c1f25fa954642fb06cbe4d57421f11d4159d030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmV;00($+4P)Px%KS@MER7efQ*FlQZKo|w!^dQ=2a3{!Iz@516wV;QX6LGPs8(g_`Hw$5Q z9zYPmSqOq6=u%MM*Q6w!PP&s$93Q++QuY7urINp@(u-;sP7-!Md>GyfZ`aJB`c(66 zj<3SY@K-nq%Va+ZKZn0t{E};Iw~Lh{_b5C{)>TOOXZSii3-5-v!UE^o^obEGM=p)Q zSS0dkSVrQ>kV}IW&AsMjr0)}W8cqcbTFhy8!uu#A zox`-4&?+O}dFRV?mO@&Uj2VwK4T=Y^zfk@<6ve+nDL7smoaEQsGY!U6? zajTCu4_;!b2cglLgHu6p9nw=&H^U})=;K*Et1r%6OhD80V|4CxXz^gov%07+raa~$ zro4DC=2^X~FPh7s_MsSRN{l>V z@z!)QnLWxw3rN#^>`0ly)&k;v4P7#szX=`3!mHd`G70>bO@gtl>MHceuXS6D-{!-N zu}%9_!%U#n`yo&~e4a43aLi#&qbx$Sd$CB*d00li>Ww_yA-9Z_ChfftP)6R&b8?iBi0Se-TAmn+aN3xWvZFy#G16rV6)A+SUGZgaqzj< fnHHH@|Fr!9&eh7D>A4!B00000NkvXXu0mjfToX9s diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@2x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@2x.png deleted file mode 100644 index f346a5304d59f70a9cc61da0c2090b2b59cbb3cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1397 zcmV-*1&aEKP)Px)FG)l}RA>d|n?Gw5Q53~jkcfhT2;!eFAPPd%RtPqNegZ#6L>v2<(k2#$G*hLq zOskE`T3MwM3$e3M5kw&*qURU)$=$neW_RDb`Ga0KzS%qP-Fwc?zIk_E#v_B~?1VyJ z7p@5xMmVeXma2)(y6Vz?^25cY&$iC`=-h(*la*@_tL2>U{+ z$g*+7BsMuZw;N*cQYa&9{RiszLD&_BBXEq5bGC2UF}cXux}8(TZJ~@9{&&Kra7VZ# zEC^-BIr`9-F^sK>O>Q`}Vz-s$s}LjfN&ZK|vQXEEK`dg%a>3!2(5T&0^q+z!@Lj$& zVNu9!#3VL3d|tS~DZ3q0#6s{1nR{Epd7)_|2f1SNy^tS{S?si;3!bF#10rR5Tf2DDhgXr0)}xQMeO%PAHKYz$h#1Q*=cS=(aK5G_1%m6lbayAX@uXlZ#+{$q9^c50V6SqnZCZr3DHbhLw`u9LB3Qxy{6;*Y|EoW>Aozx0uQFxXKmErv zL~lFMtYuxk&jF`d432i)<-(z5s-07huY$eO)Wt`qj_j@j+~8 diff --git a/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@3x.png b/MVMCoreUI/SupportingFiles/Media.xcassets/success.imageset/Standard@3x.png deleted file mode 100644 index 51d75aab99db8bba04736e3bd7afdd79bcbf3a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2312 zcmV+j3HSDiP)Px-!bwCyRCodHojq?9R}_YgWoQC%VG@#1*g`}u0u6>T2#8Axf;+@taD$u_p|b=v zmVZH-R5XYpqQOXsL{fmj1feL2kq`tWiip5a1Q5yltaF#~>^ZZuv-7$3kzQuzexCEp z-PxIYXU&$Odf8UFGa1t!9gj*oBGT^AYD7=9zasq{(<>dQo~z!XbWY;h z-WZ#arw^oFM=Bp_0zNGrl6v`QQ?P@xv`fm{ zXp^?-gTB)GMGO;CE$xK7N_!o?t+HHFc9s|kebFar}n zIX>V^8lQ=c7%MeK$q!ODhnH1mx>8T=&hZJ~y7^CxWq$hBc{{En9(j|TTvh%VX+)~4 z;Tt~UYf>!4O3bC&e)aZ9N^BNhA3W#+Qk$&`cB*;K|DDCahEf`tvjldMPZ9AyF=$Q!nm)a!;W2Xqnfefqyx9AqO zZTnJt(af;VTRwwgMM8!VtOB>_7Pf8kX6bgdOEi0@XvolkRTOa8hi%KY>fh&5$OzlJ zYuSzew+zSu63ha>u!Sv*hxQqn6j~&+;Z`POP{Aw!j&AqyjW|gO!+tcM*W=!*#O(ub6IlZY?1!P!x%vyu_YZZtN^RS;dDN^GzQ1;~_iUMYVUvvxO zq3?~%-^pm8RS7xZdaRu&WcK+Po;jy_gN%k*9Uy}Yc5%?lT%&i88?)8ean?g-!!Ald zDAH(uNh`8kVA)g!UpnBMo^(IX5l`T$~F@;*XUKl6YIKd6f=`} zufeO&HI#>lelH``Uy?qNEaPG1sPv1KS#X*adyDaXbsR=P*k0??8Rl~tQK7x~wx5w* z*O45MT{GgoPo}kGeuIoYtq9n4hYT{<#RnFQTQ}43jJzIL@`T+4$nbO@Sc-lG&jWT- zASXV8f2Fe!AJH5i;`HQX{lIPtWKhA(VhQ7+87K2JnK@cF*xafCHEQqcppLh2Q6HoG zFtb3zxYUXNUSKy3GAtJ*3v_F0fMphzTjB-oDy;}h0~^PhG?D`+n8i857RD`O0Wn^H zV-_5Xux_y5s8h=y(jH1xJn?no04vL9*tTEpSaMqV%t`MzndPG+5>IfJZLt!SM)|6q z_#Bto$sQ}7gxhvdd)C<~`UM(BCL`49JDyh8ksKhVdVz*HkE&h?O9Q*^kavpTOJl%v zyb{J)SuhGRs%FV7*pgt^9WrQO6#oQr4ATyqQi@ghc1Ou#5-iwFfD8>7S?pkHnss|Z z1INwM`6otUHw7|mEXaws$8%1l>-jTvTLd;QqOfg(!Nvj&OV^kb+5EAPi>D)FS}7Lf zu0Ix{rFp0F=Fi`t^VUYRYt7{Y9)?|QOeIz&>r9>LT6^OZfQ7{fb}&q3=T*vUWb-G= zYd_QW1|#fJ+vbn%eN;T$U6HJT_(17B{pg-HtRrGH6__H^Avo_qodc;c17GxNW_Z!pZAFo>b>GFyL8Ss7o z@v3l=E+lkvOL?QA-~eukjTo(wOd4!*vu$c=^A8Mm!p{8<406VpbLBT0-kJSPd4qJ# zCYGej1uS4vh>fe&N0JAdFN;CA8zBboi;vi00E-V1$dlI})=!^5#-4W?G{xb*M`l zwB_~VrQoNh(Jt-g8?R|LuSas2AL^QV}q7Su?vf6W1Uv{x zU|vdl{q{y%5$X7ZZ}>Pc#z%Wj%JPxU8!|rNOD~ru6>pwR$>jyfda*KZsG&XjqEGrR z-HNl-@{{Sk<88L2p&UWK4T>JSs)M{B*eP%kim> iS0o;jqk5&|TG)S9`Fv1;G6)&~0000 Date: Wed, 15 Jul 2020 19:10:14 -0400 Subject: [PATCH 16/17] height change --- .../VerticalCombinationViews/Order Tracker/Step.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 1770c44a..181fe1f1 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -55,8 +55,6 @@ open class Step: View { stateImage.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true stateImage.heightAnchor.constraint(equalToConstant: 18).isActive = true stateImage.widthAnchor.constraint(equalToConstant: 18).isActive = true - imageBottomConstraint = bottomAnchor.constraint(greaterThanOrEqualTo: stateImage.bottomAnchor, constant: Padding.Ten) - imageBottomConstraint?.isActive = true headline.topAnchor.constraint(equalTo: topAnchor, constant: 2).isActive = true headline.leadingAnchor.constraint(equalTo: stateImage.trailingAnchor, constant: Padding.Four).isActive = true @@ -72,6 +70,10 @@ open class Step: View { let bodyBottomConstraint = bottomAnchor.constraint(greaterThanOrEqualTo: bodyBottom.bottomAnchor) bodyBottomConstraint.priority = .defaultHigh bodyBottomConstraint.isActive = true + + let heightConstraint = heightAnchor.constraint(equalToConstant: 58) + heightConstraint.priority = .defaultLow + heightConstraint.isActive = true } public override func reset() { From d9b23e4a58fb64399a66edbf02700b4b0d09de96 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 15 Jul 2020 19:30:35 -0400 Subject: [PATCH 17/17] constraint change --- .../Order Tracker/OrderTracker.swift | 4 +--- .../VerticalCombinationViews/Order Tracker/Step.swift | 10 +++++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift index 89942752..076e77fe 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/OrderTracker.swift @@ -42,7 +42,6 @@ open class OrderTracker: View { guard let stepModels = stepModels else { return } var anchor = topAnchor - var previousStep: Step? for stepModel in stepModels { @@ -56,11 +55,10 @@ open class OrderTracker: View { step.topAnchor.constraint(equalTo: anchor).isActive = true anchor = step.bottomAnchor - previousStep = step } bottomAnchor.constraint(equalTo: anchor).isActive = true - previousStep?.imageBottomConstraint?.constant = 0 + (subviews.last as? Step)?.heightConstraint?.isActive = false } func resetSteps() { diff --git a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift index 181fe1f1..1d53d81a 100644 --- a/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift +++ b/MVMCoreUI/Atomic/Molecules/VerticalCombinationViews/Order Tracker/Step.swift @@ -23,7 +23,7 @@ open class Step: View { // MARK: - Constraints //-------------------------------------------------- - public var imageBottomConstraint: NSLayoutConstraint? + public var heightConstraint: NSLayoutConstraint? //-------------------------------------------------- // MARK: - Computed Properties @@ -71,9 +71,9 @@ open class Step: View { bodyBottomConstraint.priority = .defaultHigh bodyBottomConstraint.isActive = true - let heightConstraint = heightAnchor.constraint(equalToConstant: 58) - heightConstraint.priority = .defaultLow - heightConstraint.isActive = true + heightConstraint = heightAnchor.constraint(equalToConstant: 58) + heightConstraint?.priority = .defaultLow + heightConstraint?.isActive = true } public override func reset() { @@ -83,7 +83,7 @@ open class Step: View { bodyTop.reset() bodyBottom.reset() stateImage.reset() - imageBottomConstraint?.constant = Padding.Ten + heightConstraint?.isActive = true } //------------------------------------------------------