Merge branch 'develop' of https://gitlab.verizon.com/BPHV_MIPS/mvm_core_ui into feature/monarch
This commit is contained in:
commit
16d9f59142
@ -126,7 +126,6 @@
|
|||||||
0AE98BB523FF18D2004C5109 /* Arrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB423FF18D2004C5109 /* Arrow.swift */; };
|
0AE98BB523FF18D2004C5109 /* Arrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB423FF18D2004C5109 /* Arrow.swift */; };
|
||||||
0AE98BB723FF18E9004C5109 /* ArrowModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB623FF18E9004C5109 /* ArrowModel.swift */; };
|
0AE98BB723FF18E9004C5109 /* ArrowModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE98BB623FF18E9004C5109 /* ArrowModel.swift */; };
|
||||||
0AF60F0926B3316E00AC3DB4 /* MVMCoreUIUtility+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AF60F0826B3316E00AC3DB4 /* MVMCoreUIUtility+Extension.swift */; };
|
0AF60F0926B3316E00AC3DB4 /* MVMCoreUIUtility+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AF60F0826B3316E00AC3DB4 /* MVMCoreUIUtility+Extension.swift */; };
|
||||||
187FEB2A2844D2A600BF29C2 /* VDSFormControlsTokens.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 187FEB292844D2A600BF29C2 /* VDSFormControlsTokens.xcframework */; };
|
|
||||||
1D6D258826899B0C00DEBB08 /* ImageButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6D258626899B0B00DEBB08 /* ImageButtonModel.swift */; };
|
1D6D258826899B0C00DEBB08 /* ImageButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6D258626899B0B00DEBB08 /* ImageButtonModel.swift */; };
|
||||||
1D6D258926899B0C00DEBB08 /* ImageButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6D258726899B0B00DEBB08 /* ImageButton.swift */; };
|
1D6D258926899B0C00DEBB08 /* ImageButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D6D258726899B0B00DEBB08 /* ImageButton.swift */; };
|
||||||
22B678F929E7944E00CF4196 /* GetNotificationAuthStatusBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22B678F829E7944E00CF4196 /* GetNotificationAuthStatusBehavior.swift */; };
|
22B678F929E7944E00CF4196 /* GetNotificationAuthStatusBehavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22B678F829E7944E00CF4196 /* GetNotificationAuthStatusBehavior.swift */; };
|
||||||
@ -174,8 +173,6 @@
|
|||||||
5870636F2ACF238E00CA18D5 /* ReadableDecodingErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5870636E2ACF238E00CA18D5 /* ReadableDecodingErrors.swift */; };
|
5870636F2ACF238E00CA18D5 /* ReadableDecodingErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5870636E2ACF238E00CA18D5 /* ReadableDecodingErrors.swift */; };
|
||||||
58A9DD7D2AC2103300F5E0B0 /* ReplaceableMoleculeBehaviorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A9DD7C2AC2103300F5E0B0 /* ReplaceableMoleculeBehaviorModel.swift */; };
|
58A9DD7D2AC2103300F5E0B0 /* ReplaceableMoleculeBehaviorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58A9DD7C2AC2103300F5E0B0 /* ReplaceableMoleculeBehaviorModel.swift */; };
|
||||||
608211282AC6B57E00C3FC39 /* MVMCoreUILoggingHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608211262AC6AF8200C3FC39 /* MVMCoreUILoggingHandler.swift */; };
|
608211282AC6B57E00C3FC39 /* MVMCoreUILoggingHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608211262AC6AF8200C3FC39 /* MVMCoreUILoggingHandler.swift */; };
|
||||||
7199C8162A4F3A64001568B7 /* AccessibilityHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7199C8152A4F3A64001568B7 /* AccessibilityHandler.swift */; };
|
|
||||||
71BE969E2AD96BE6000B5DB7 /* RotorHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71BE969D2AD96BE6000B5DB7 /* RotorHandler.swift */; };
|
|
||||||
8D070BB0241B56530099AC56 /* ListRightVariableTotalDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D070BAF241B56530099AC56 /* ListRightVariableTotalDataModel.swift */; };
|
8D070BB0241B56530099AC56 /* ListRightVariableTotalDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D070BAF241B56530099AC56 /* ListRightVariableTotalDataModel.swift */; };
|
||||||
8D070BB2241B56AD0099AC56 /* ListRightVariableTotalData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D070BB1241B56AD0099AC56 /* ListRightVariableTotalData.swift */; };
|
8D070BB2241B56AD0099AC56 /* ListRightVariableTotalData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D070BB1241B56AD0099AC56 /* ListRightVariableTotalData.swift */; };
|
||||||
8D084AD02410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D084ACF2410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift */; };
|
8D084AD02410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D084ACF2410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift */; };
|
||||||
@ -302,7 +299,6 @@
|
|||||||
AFA4932229E5EF2E001A9663 /* NotificationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA4932129E5EF2E001A9663 /* NotificationHandler.swift */; };
|
AFA4932229E5EF2E001A9663 /* NotificationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA4932129E5EF2E001A9663 /* NotificationHandler.swift */; };
|
||||||
AFA4933F29E874F0001A9663 /* MVMCoreUILoggingDelegateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA4933E29E874F0001A9663 /* MVMCoreUILoggingDelegateProtocol.swift */; };
|
AFA4933F29E874F0001A9663 /* MVMCoreUILoggingDelegateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA4933E29E874F0001A9663 /* MVMCoreUILoggingDelegateProtocol.swift */; };
|
||||||
AFA4935729EE3DCC001A9663 /* AlertDelegateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA4935629EE3DCC001A9663 /* AlertDelegateProtocol.swift */; };
|
AFA4935729EE3DCC001A9663 /* AlertDelegateProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA4935629EE3DCC001A9663 /* AlertDelegateProtocol.swift */; };
|
||||||
AFE4A1D127DFB5EE00C458D0 /* VDSColorTokens.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFE4A1D027DFB5EE00C458D0 /* VDSColorTokens.xcframework */; };
|
|
||||||
AFE4A1D627DFBB6F00C458D0 /* UINavigationController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFE4A1D527DFBB6F00C458D0 /* UINavigationController+Extension.swift */; };
|
AFE4A1D627DFBB6F00C458D0 /* UINavigationController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFE4A1D527DFBB6F00C458D0 /* UINavigationController+Extension.swift */; };
|
||||||
B4CC8FBD29DF34680005D28B /* Badge.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4CC8FBC29DF34680005D28B /* Badge.swift */; };
|
B4CC8FBD29DF34680005D28B /* Badge.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4CC8FBC29DF34680005D28B /* Badge.swift */; };
|
||||||
B4CC8FBF29DF34730005D28B /* BadgeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4CC8FBE29DF34730005D28B /* BadgeModel.swift */; };
|
B4CC8FBF29DF34730005D28B /* BadgeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4CC8FBE29DF34730005D28B /* BadgeModel.swift */; };
|
||||||
@ -589,7 +585,6 @@
|
|||||||
EA985C3E2970938F00F2FF2E /* Tilelet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C3D2970938F00F2FF2E /* Tilelet.swift */; };
|
EA985C3E2970938F00F2FF2E /* Tilelet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C3D2970938F00F2FF2E /* Tilelet.swift */; };
|
||||||
EA985C402970939A00F2FF2E /* TileletModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C3F2970939A00F2FF2E /* TileletModel.swift */; };
|
EA985C402970939A00F2FF2E /* TileletModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C3F2970939A00F2FF2E /* TileletModel.swift */; };
|
||||||
EA985C602970A3F000F2FF2E /* VDS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA985C5F2970A3F000F2FF2E /* VDS.framework */; };
|
EA985C602970A3F000F2FF2E /* VDS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA985C5F2970A3F000F2FF2E /* VDS.framework */; };
|
||||||
EA985C642970A40E00F2FF2E /* VDSTypographyTokens.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA985C632970A40E00F2FF2E /* VDSTypographyTokens.xcframework */; };
|
|
||||||
EA985C852981AA9C00F2FF2E /* VDS-Enums+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C842981AA9C00F2FF2E /* VDS-Enums+Codable.swift */; };
|
EA985C852981AA9C00F2FF2E /* VDS-Enums+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C842981AA9C00F2FF2E /* VDS-Enums+Codable.swift */; };
|
||||||
EA985C872981AB0F00F2FF2E /* VDS-Tilelet+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C862981AB0F00F2FF2E /* VDS-Tilelet+Codable.swift */; };
|
EA985C872981AB0F00F2FF2E /* VDS-Tilelet+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C862981AB0F00F2FF2E /* VDS-Tilelet+Codable.swift */; };
|
||||||
EA985C892981AB7100F2FF2E /* VDS-TextStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C882981AB7100F2FF2E /* VDS-TextStyle.swift */; };
|
EA985C892981AB7100F2FF2E /* VDS-TextStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA985C882981AB7100F2FF2E /* VDS-TextStyle.swift */; };
|
||||||
@ -604,6 +599,7 @@
|
|||||||
EABFC1412763BB8D00E78B40 /* FormLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EABFC1402763BB8D00E78B40 /* FormLabel.swift */; };
|
EABFC1412763BB8D00E78B40 /* FormLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EABFC1402763BB8D00E78B40 /* FormLabel.swift */; };
|
||||||
EABFC152276913E800E78B40 /* FormLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EABFC151276913E800E78B40 /* FormLabelModel.swift */; };
|
EABFC152276913E800E78B40 /* FormLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EABFC151276913E800E78B40 /* FormLabelModel.swift */; };
|
||||||
EACCF38C2ABB346700E0F104 /* VDS-Interpreters.swift in Sources */ = {isa = PBXBuildFile; fileRef = EACCF38B2ABB346700E0F104 /* VDS-Interpreters.swift */; };
|
EACCF38C2ABB346700E0F104 /* VDS-Interpreters.swift in Sources */ = {isa = PBXBuildFile; fileRef = EACCF38B2ABB346700E0F104 /* VDS-Interpreters.swift */; };
|
||||||
|
EAD715AA2BBC8FAF00DEDA6A /* VDSTokens.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAD715A92BBC8FAF00DEDA6A /* VDSTokens.xcframework */; };
|
||||||
FD99130028E21E4900542CC3 /* RuleNotEqualsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9912FF28E21E4900542CC3 /* RuleNotEqualsModel.swift */; };
|
FD99130028E21E4900542CC3 /* RuleNotEqualsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9912FF28E21E4900542CC3 /* RuleNotEqualsModel.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
@ -777,8 +773,6 @@
|
|||||||
5870636E2ACF238E00CA18D5 /* ReadableDecodingErrors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadableDecodingErrors.swift; sourceTree = "<group>"; };
|
5870636E2ACF238E00CA18D5 /* ReadableDecodingErrors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadableDecodingErrors.swift; sourceTree = "<group>"; };
|
||||||
58A9DD7C2AC2103300F5E0B0 /* ReplaceableMoleculeBehaviorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReplaceableMoleculeBehaviorModel.swift; sourceTree = "<group>"; };
|
58A9DD7C2AC2103300F5E0B0 /* ReplaceableMoleculeBehaviorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReplaceableMoleculeBehaviorModel.swift; sourceTree = "<group>"; };
|
||||||
608211262AC6AF8200C3FC39 /* MVMCoreUILoggingHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMCoreUILoggingHandler.swift; sourceTree = "<group>"; };
|
608211262AC6AF8200C3FC39 /* MVMCoreUILoggingHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MVMCoreUILoggingHandler.swift; sourceTree = "<group>"; };
|
||||||
7199C8152A4F3A64001568B7 /* AccessibilityHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityHandler.swift; sourceTree = "<group>"; };
|
|
||||||
71BE969D2AD96BE6000B5DB7 /* RotorHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RotorHandler.swift; sourceTree = "<group>"; };
|
|
||||||
8D070BAF241B56530099AC56 /* ListRightVariableTotalDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariableTotalDataModel.swift; sourceTree = "<group>"; };
|
8D070BAF241B56530099AC56 /* ListRightVariableTotalDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariableTotalDataModel.swift; sourceTree = "<group>"; };
|
||||||
8D070BB1241B56AD0099AC56 /* ListRightVariableTotalData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariableTotalData.swift; sourceTree = "<group>"; };
|
8D070BB1241B56AD0099AC56 /* ListRightVariableTotalData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRightVariableTotalData.swift; sourceTree = "<group>"; };
|
||||||
8D084ACF2410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextBodyTextModel.swift; sourceTree = "<group>"; };
|
8D084ACF2410BF4800951227 /* ListOneColumnFullWidthTextBodyTextModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListOneColumnFullWidthTextBodyTextModel.swift; sourceTree = "<group>"; };
|
||||||
@ -1208,6 +1202,7 @@
|
|||||||
EABFC1402763BB8D00E78B40 /* FormLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormLabel.swift; sourceTree = "<group>"; };
|
EABFC1402763BB8D00E78B40 /* FormLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormLabel.swift; sourceTree = "<group>"; };
|
||||||
EABFC151276913E800E78B40 /* FormLabelModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormLabelModel.swift; sourceTree = "<group>"; };
|
EABFC151276913E800E78B40 /* FormLabelModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormLabelModel.swift; sourceTree = "<group>"; };
|
||||||
EACCF38B2ABB346700E0F104 /* VDS-Interpreters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VDS-Interpreters.swift"; sourceTree = "<group>"; };
|
EACCF38B2ABB346700E0F104 /* VDS-Interpreters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "VDS-Interpreters.swift"; sourceTree = "<group>"; };
|
||||||
|
EAD715A92BBC8FAF00DEDA6A /* VDSTokens.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = VDSTokens.xcframework; path = ../SharedFrameworks/VDSTokens.xcframework; sourceTree = "<group>"; };
|
||||||
FD9912FF28E21E4900542CC3 /* RuleNotEqualsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleNotEqualsModel.swift; sourceTree = "<group>"; };
|
FD9912FF28E21E4900542CC3 /* RuleNotEqualsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleNotEqualsModel.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
@ -1217,10 +1212,8 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */,
|
D29DF0E621E4F3C7003B2FB9 /* MVMCore.framework in Frameworks */,
|
||||||
AFE4A1D127DFB5EE00C458D0 /* VDSColorTokens.xcframework in Frameworks */,
|
|
||||||
EA985C602970A3F000F2FF2E /* VDS.framework in Frameworks */,
|
EA985C602970A3F000F2FF2E /* VDS.framework in Frameworks */,
|
||||||
187FEB2A2844D2A600BF29C2 /* VDSFormControlsTokens.xcframework in Frameworks */,
|
EAD715AA2BBC8FAF00DEDA6A /* VDSTokens.xcframework in Frameworks */,
|
||||||
EA985C642970A40E00F2FF2E /* VDSTypographyTokens.xcframework in Frameworks */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -2081,6 +2074,7 @@
|
|||||||
D29DF0E421E4F3C7003B2FB9 /* Frameworks */ = {
|
D29DF0E421E4F3C7003B2FB9 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
EAD715A92BBC8FAF00DEDA6A /* VDSTokens.xcframework */,
|
||||||
EA985C632970A40E00F2FF2E /* VDSTypographyTokens.xcframework */,
|
EA985C632970A40E00F2FF2E /* VDSTypographyTokens.xcframework */,
|
||||||
EA985C5F2970A3F000F2FF2E /* VDS.framework */,
|
EA985C5F2970A3F000F2FF2E /* VDS.framework */,
|
||||||
187FEB292844D2A600BF29C2 /* VDSFormControlsTokens.xcframework */,
|
187FEB292844D2A600BF29C2 /* VDSFormControlsTokens.xcframework */,
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDS
|
import VDS
|
||||||
import MVMCore
|
import MVMCore
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDS
|
import VDS
|
||||||
|
|
||||||
open class Link: VDS.TextLink, VDSMoleculeViewProtocol {
|
open class Link: VDS.TextLink, VDSMoleculeViewProtocol {
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDS
|
import VDS
|
||||||
import MVMCore
|
import MVMCore
|
||||||
import Combine
|
import Combine
|
||||||
@ -36,7 +36,7 @@ open class PillButton: VDS.Button, MVMCoreUIViewConstrainingProtocol, MFButtonPr
|
|||||||
text = viewModel.title
|
text = viewModel.title
|
||||||
isEnabled = viewModel.enabled
|
isEnabled = viewModel.enabled
|
||||||
size = viewModel.size
|
size = viewModel.size
|
||||||
use = viewModel.style ?? .primary
|
use = viewModel.style
|
||||||
surface = viewModel.inverted ? .dark : .light
|
surface = viewModel.inverted ? .dark : .light
|
||||||
if let accessibilityText = viewModel.accessibilityText {
|
if let accessibilityText = viewModel.accessibilityText {
|
||||||
accessibilityLabel = accessibilityText
|
accessibilityLabel = accessibilityText
|
||||||
|
|||||||
@ -7,8 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDSFormControlsTokens
|
|
||||||
|
|
||||||
@objcMembers open class RadioButton: Control, MFButtonProtocol {
|
@objcMembers open class RadioButton: Control, MFButtonProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
// Created by Kevin Christiano on 1/30/20.
|
// Created by Kevin Christiano on 1/30/20.
|
||||||
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
//
|
//
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
open class CarouselIndicator: Control, CarouselPageControlProtocol {
|
open class CarouselIndicator: Control, CarouselPageControlProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelProtocol, EnableableModelProtocol {
|
open class CarouselIndicatorModel: CarouselPagingModelProtocol, MoleculeModelProtocol, EnableableModelProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -64,9 +64,8 @@
|
|||||||
bottomLabelConstraint.isActive = true
|
bottomLabelConstraint.isActive = true
|
||||||
|
|
||||||
alignCheckbox(.center)
|
alignCheckbox(.center)
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = false
|
||||||
accessibilityHint = checkbox.accessibilityHint
|
accessibilityElements = [checkbox, label]
|
||||||
accessibilityTraits = checkbox.accessibilityTraits
|
|
||||||
observation = observe(\.checkbox.isSelected, options: [.new]) { [weak self] _, _ in
|
observation = observe(\.checkbox.isSelected, options: [.new]) { [weak self] _, _ in
|
||||||
self?.updateAccessibilityLabel()
|
self?.updateAccessibilityLabel()
|
||||||
}
|
}
|
||||||
@ -139,6 +138,8 @@
|
|||||||
|
|
||||||
open func updateAccessibilityLabel() {
|
open func updateAccessibilityLabel() {
|
||||||
checkbox.updateAccessibilityLabel()
|
checkbox.updateAccessibilityLabel()
|
||||||
accessibilityLabel = [checkbox.accessibilityLabel, label.text].compactMap { $0 }.joined(separator: ",")
|
if let text = label.text {
|
||||||
|
checkbox.accessibilityLabel?.append(", \(text)")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import VDS
|
import VDS
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
open class IconModel: MoleculeModelProtocol {
|
open class IconModel: MoleculeModelProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDS
|
import VDS
|
||||||
|
|
||||||
public class LineModel: MoleculeModelProtocol, Invertable {
|
public class LineModel: MoleculeModelProtocol, Invertable {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import VDS
|
import VDS
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import MVMCore
|
import MVMCore
|
||||||
|
|
||||||
open class TooltipModel: MoleculeModelProtocol {
|
open class TooltipModel: MoleculeModelProtocol {
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import VDS
|
import VDS
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Codable Extensions
|
// MARK: - Codable Extensions
|
||||||
|
|||||||
@ -74,7 +74,7 @@ public class HeadersH2ButtonsModel: HeaderModel, MoleculeModelProtocol, ParentMo
|
|||||||
|
|
||||||
required public init(from decoder: Decoder) throws {
|
required public init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup)
|
titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup)
|
||||||
buttons = try typeContainer.decode(TwoButtonViewModel.self, forKey: .buttons)
|
buttons = try typeContainer.decode(TwoButtonViewModel.self, forKey: .buttons)
|
||||||
try super.init(from: decoder)
|
try super.init(from: decoder)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,7 +67,7 @@ public class HeadersH2CaretLinkModel: HeaderModel, MoleculeModelProtocol, Parent
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
required public init(from decoder: Decoder) throws {
|
required public init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup)
|
titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup)
|
||||||
caretLink = try typeContainer.decode(CaretLinkModel.self, forKey: .caretLink)
|
caretLink = try typeContainer.decode(CaretLinkModel.self, forKey: .caretLink)
|
||||||
try super.init(from: decoder)
|
try super.init(from: decoder)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,7 +73,7 @@ public class HeadersH2LinkModel: HeaderModel, MoleculeModelProtocol, ParentMolec
|
|||||||
|
|
||||||
required public init(from decoder: Decoder) throws {
|
required public init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup)
|
titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup)
|
||||||
link = try typeContainer.decode(LinkModel.self, forKey: .link)
|
link = try typeContainer.decode(LinkModel.self, forKey: .link)
|
||||||
try super.init(from: decoder)
|
try super.init(from: decoder)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -76,7 +76,7 @@ public class HeadersH2TinyButtonModel: HeaderModel, MoleculeModelProtocol, Paren
|
|||||||
|
|
||||||
required public init(from decoder: Decoder) throws {
|
required public init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
titleLockup = try typeContainer.decodeMolecule(codingKey: .titleLockup)
|
titleLockup = try helper.deprecatedCreate(from: decoder) ?? typeContainer.decodeMolecule(codingKey: .titleLockup)
|
||||||
button = try typeContainer.decode(ButtonModel.self, forKey: .button)
|
button = try typeContainer.decode(ButtonModel.self, forKey: .button)
|
||||||
try super.init(from: decoder)
|
try super.init(from: decoder)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
// Copyright © 2022 Verizon Wireless. All rights reserved.
|
// Copyright © 2022 Verizon Wireless. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDS
|
import VDS
|
||||||
|
|
||||||
public class TitleLockupModel: MoleculeModelProtocol, ParentMoleculeModelProtocol {
|
public class TitleLockupModel: MoleculeModelProtocol, ParentMoleculeModelProtocol {
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
// Created by Scott Pfeil on 5/28/20.
|
// Created by Scott Pfeil on 5/28/20.
|
||||||
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
//
|
//
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
@objcMembers open class TabBar: UITabBar, MoleculeViewProtocol, TabBarProtocol, UITabBarDelegate {
|
@objcMembers open class TabBar: UITabBar, MoleculeViewProtocol, TabBarProtocol, UITabBarDelegate {
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
open class TabBarModel: MoleculeModelProtocol {
|
open class TabBarModel: MoleculeModelProtocol {
|
||||||
public static var identifier: String = "tabBar"
|
public static var identifier: String = "tabBar"
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDS
|
import VDS
|
||||||
|
|
||||||
@objc public protocol TabsDelegate {
|
@objc public protocol TabsDelegate {
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
import VDS
|
import VDS
|
||||||
open class TabsModel: MoleculeModelProtocol {
|
open class TabsModel: MoleculeModelProtocol {
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
public enum NavigationItemStyle: String, Codable {
|
public enum NavigationItemStyle: String, Codable {
|
||||||
case light
|
case light
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import Foundation
|
|||||||
import Combine
|
import Combine
|
||||||
import Dispatch
|
import Dispatch
|
||||||
import MVMCore
|
import MVMCore
|
||||||
|
import VDSTokens
|
||||||
|
|
||||||
@objcMembers open class CollapsableNotification: View {
|
@objcMembers open class CollapsableNotification: View {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -50,7 +51,7 @@ import MVMCore
|
|||||||
open override func reset() {
|
open override func reset() {
|
||||||
super.reset()
|
super.reset()
|
||||||
verticalStack.reset()
|
verticalStack.reset()
|
||||||
backgroundColor = .mvmGreen()
|
backgroundColor = bottomView.backgroundColor
|
||||||
}
|
}
|
||||||
|
|
||||||
open func subscribeForNotifications() {
|
open func subscribeForNotifications() {
|
||||||
@ -98,6 +99,8 @@ import MVMCore
|
|||||||
guard let model = model as? CollapsableNotificationModel else { return }
|
guard let model = model as? CollapsableNotificationModel else { return }
|
||||||
topView.set(with: model, delegateObject, additionalData)
|
topView.set(with: model, delegateObject, additionalData)
|
||||||
bottomView.set(with: model, delegateObject, additionalData)
|
bottomView.set(with: model, delegateObject, additionalData)
|
||||||
|
topView.label.textColorConfiguration = bottomView.titleLabel.textColorConfiguration
|
||||||
|
topView.label.surface = bottomView.surface
|
||||||
|
|
||||||
// Update top view default noop to expand.
|
// Update top view default noop to expand.
|
||||||
if let topAction = model.topAction,
|
if let topAction = model.topAction,
|
||||||
@ -110,6 +113,7 @@ import MVMCore
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
initialState()
|
initialState()
|
||||||
|
backgroundColor = bottomView.backgroundColor
|
||||||
}
|
}
|
||||||
|
|
||||||
open func performBlockOperation(with block: @escaping (MVMCoreBlockOperation) -> Void) {
|
open func performBlockOperation(with block: @escaping (MVMCoreBlockOperation) -> Void) {
|
||||||
@ -214,7 +218,7 @@ import MVMCore
|
|||||||
|
|
||||||
extension CollapsableNotification: StatusBarUI {
|
extension CollapsableNotification: StatusBarUI {
|
||||||
public func getStatusBarUI() -> (color: UIColor, style: UIStatusBarStyle) {
|
public func getStatusBarUI() -> (color: UIColor, style: UIStatusBarStyle) {
|
||||||
let color = backgroundColor ?? UIColor.mvmGreen
|
let color = backgroundColor ?? VDSColor.feedbackInformationBackgroundOnlight
|
||||||
var greyScale: CGFloat = 0
|
var greyScale: CGFloat = 0
|
||||||
topView.label.textColor.getWhite(&greyScale, alpha: nil)
|
topView.label.textColor.getWhite(&greyScale, alpha: nil)
|
||||||
return (color, greyScale > 0.5 ? .lightContent : .default)
|
return (color, greyScale > 0.5 ? .lightContent : .default)
|
||||||
@ -226,7 +230,7 @@ extension CollapsableNotification: AccessibilityProtocol {
|
|||||||
if !topView.isHidden {
|
if !topView.isHidden {
|
||||||
return topView
|
return topView
|
||||||
} else {
|
} else {
|
||||||
return bottomView.headline
|
return bottomView.titleLabel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,21 +26,13 @@ open class CollapsableNotificationModel: NotificationMoleculeModel {
|
|||||||
self.collapseTime = collapseTime
|
self.collapseTime = collapseTime
|
||||||
}
|
}
|
||||||
super.init(with: headline, style: style, backgroundColor: backgroundColor, body: body, button: button, closeButton: closeButton)
|
super.init(with: headline, style: style, backgroundColor: backgroundColor, body: body, button: button, closeButton: closeButton)
|
||||||
|
setDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func setDefaults() {
|
open func setDefaults() {
|
||||||
super.setDefaults()
|
|
||||||
if topLabel.numberOfLines == nil {
|
if topLabel.numberOfLines == nil {
|
||||||
topLabel.numberOfLines = 1
|
topLabel.numberOfLines = 1
|
||||||
}
|
}
|
||||||
if topLabel.textColor == nil {
|
|
||||||
switch style {
|
|
||||||
case .error, .warning:
|
|
||||||
topLabel.textColor = Color(uiColor: .mvmBlack)
|
|
||||||
default:
|
|
||||||
topLabel.textColor = Color(uiColor: .mvmWhite)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if topLabel.textAlignment == nil {
|
if topLabel.textAlignment == nil {
|
||||||
topLabel.textAlignment = .center
|
topLabel.textAlignment = .center
|
||||||
}
|
}
|
||||||
@ -69,6 +61,7 @@ open class CollapsableNotificationModel: NotificationMoleculeModel {
|
|||||||
self.initiallyCollapsed = initiallyCollapsed
|
self.initiallyCollapsed = initiallyCollapsed
|
||||||
}
|
}
|
||||||
try super.init(from: decoder)
|
try super.init(from: decoder)
|
||||||
|
setDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func encode(to encoder: Encoder) throws {
|
open override func encode(to encoder: Encoder) throws {
|
||||||
|
|||||||
@ -52,7 +52,7 @@ import Foundation
|
|||||||
open override func reset() {
|
open override func reset() {
|
||||||
super.reset()
|
super.reset()
|
||||||
label.setFontStyle(.BoldBodySmall)
|
label.setFontStyle(.BoldBodySmall)
|
||||||
label.textColor = .white
|
label.textColor = .black
|
||||||
label.textAlignment = .center
|
label.textAlignment = .center
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,9 +5,9 @@
|
|||||||
// Created by Scott Pfeil on 9/15/20.
|
// Created by Scott Pfeil on 9/15/20.
|
||||||
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
// Copyright © 2020 Verizon Wireless. All rights reserved.
|
||||||
//
|
//
|
||||||
|
import VDS
|
||||||
|
|
||||||
|
open class NotificationMoleculeModel: MoleculeModelProtocol {
|
||||||
open class NotificationMoleculeModel: ContainerModel, MoleculeModelProtocol {
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The style of the notification:
|
The style of the notification:
|
||||||
@ -21,91 +21,48 @@ open class NotificationMoleculeModel: ContainerModel, MoleculeModelProtocol {
|
|||||||
case error
|
case error
|
||||||
case warning
|
case warning
|
||||||
case information
|
case information
|
||||||
|
|
||||||
|
var toVDSStyle: VDS.Notification.Style {
|
||||||
|
switch self {
|
||||||
|
case .success:
|
||||||
|
.success
|
||||||
|
case .error:
|
||||||
|
.error
|
||||||
|
case .warning:
|
||||||
|
.warning
|
||||||
|
case .information:
|
||||||
|
.info
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
public var id: String = UUID().uuidString
|
||||||
public class var identifier: String { "notification" }
|
public class var identifier: String { "notification" }
|
||||||
public var accessibilityIdentifier: String?
|
public var accessibilityIdentifier: String?
|
||||||
public var backgroundColor: Color?
|
public var backgroundColor: Color?
|
||||||
public var headline: LabelModel
|
public var headline: LabelModel
|
||||||
public var body: LabelModel?
|
public var body: LabelModel?
|
||||||
public var button: ButtonModel?
|
public var button: ButtonModel?
|
||||||
|
public var secondaryButton: ButtonModel?
|
||||||
public var closeButton: NotificationXButtonModel?
|
public var closeButton: NotificationXButtonModel?
|
||||||
public var style: NotificationMoleculeModel.Style = .success
|
public var style: Style = .success
|
||||||
|
public var inverted: Bool = false
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializer
|
// MARK: - Initializer
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
public init(with headline: LabelModel, style: NotificationMoleculeModel.Style = .success, backgroundColor: Color? = nil, body: LabelModel? = nil, button: ButtonModel? = nil, closeButton: NotificationXButtonModel? = nil) {
|
public init(with headline: LabelModel, style: NotificationMoleculeModel.Style = .success, backgroundColor: Color? = nil, body: LabelModel? = nil, button: ButtonModel? = nil, secondaryButton: ButtonModel? = nil, closeButton: NotificationXButtonModel? = nil) {
|
||||||
self.headline = headline
|
self.headline = headline
|
||||||
self.style = style
|
self.style = style
|
||||||
self.backgroundColor = backgroundColor
|
self.backgroundColor = backgroundColor
|
||||||
self.body = body
|
self.body = body
|
||||||
self.button = button
|
self.button = button
|
||||||
|
self.secondaryButton = secondaryButton
|
||||||
self.closeButton = closeButton
|
self.closeButton = closeButton
|
||||||
super.init()
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Default
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
open override func setDefaults() {
|
|
||||||
useHorizontalMargins = true
|
|
||||||
useVerticalMargins = true
|
|
||||||
topPadding = PaddingTwo
|
|
||||||
bottomPadding = PaddingTwo
|
|
||||||
|
|
||||||
if backgroundColor == nil {
|
|
||||||
switch style {
|
|
||||||
case .error:
|
|
||||||
backgroundColor = Color(uiColor: .mvmOrange)
|
|
||||||
case .warning:
|
|
||||||
backgroundColor = Color(uiColor: .mvmYellow)
|
|
||||||
case .information:
|
|
||||||
backgroundColor = Color(uiColor: .mvmBlue)
|
|
||||||
default:
|
|
||||||
backgroundColor = Color(uiColor: .mvmGreen)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if headline.textColor == nil {
|
|
||||||
switch style {
|
|
||||||
case .error, .warning:
|
|
||||||
headline.textColor = Color(uiColor: .mvmBlack)
|
|
||||||
default:
|
|
||||||
headline.textColor = Color(uiColor: .mvmWhite)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if body?.textColor == nil {
|
|
||||||
switch style {
|
|
||||||
case .error, .warning:
|
|
||||||
body?.textColor = Color(uiColor: .mvmBlack)
|
|
||||||
default:
|
|
||||||
body?.textColor = Color(uiColor: .mvmWhite)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button?.size = .small
|
|
||||||
button?.style = .secondary
|
|
||||||
switch style {
|
|
||||||
case .error, .warning:
|
|
||||||
button?.inverted = false
|
|
||||||
default:
|
|
||||||
button?.inverted = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if closeButton?.color == nil {
|
|
||||||
switch style {
|
|
||||||
case .error, .warning:
|
|
||||||
closeButton?.color = Color(uiColor: .mvmBlack)
|
|
||||||
default:
|
|
||||||
closeButton?.color = Color(uiColor: .mvmWhite)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -119,7 +76,9 @@ open class NotificationMoleculeModel: ContainerModel, MoleculeModelProtocol {
|
|||||||
case headline
|
case headline
|
||||||
case body
|
case body
|
||||||
case button
|
case button
|
||||||
|
case secondaryButton
|
||||||
case closeButton
|
case closeButton
|
||||||
|
case inverted
|
||||||
case style
|
case style
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,27 +88,34 @@ open class NotificationMoleculeModel: ContainerModel, MoleculeModelProtocol {
|
|||||||
|
|
||||||
required public init(from decoder: Decoder) throws {
|
required public init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor)
|
|
||||||
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
|
accessibilityIdentifier = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityIdentifier)
|
||||||
headline = try typeContainer.decode(LabelModel.self, forKey: .headline)
|
headline = try typeContainer.decode(LabelModel.self, forKey: .headline)
|
||||||
body = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .body)
|
body = try typeContainer.decodeIfPresent(LabelModel.self, forKey: .body)
|
||||||
button = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .button)
|
button = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .button)
|
||||||
|
secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton)
|
||||||
closeButton = try typeContainer.decodeIfPresent(NotificationXButtonModel.self, forKey: .closeButton)
|
closeButton = try typeContainer.decodeIfPresent(NotificationXButtonModel.self, forKey: .closeButton)
|
||||||
|
inverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) ?? false
|
||||||
if let style = try typeContainer.decodeIfPresent(NotificationMoleculeModel.Style.self, forKey: .style) {
|
if let style = try typeContainer.decodeIfPresent(NotificationMoleculeModel.Style.self, forKey: .style) {
|
||||||
self.style = style
|
self.style = style
|
||||||
}
|
}
|
||||||
super.init()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func encode(to encoder: Encoder) throws {
|
open func encode(to encoder: Encoder) throws {
|
||||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
try container.encode(moleculeName, forKey: .moleculeName)
|
try container.encode(moleculeName, forKey: .moleculeName)
|
||||||
try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor)
|
|
||||||
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
|
try container.encodeIfPresent(accessibilityIdentifier, forKey: .accessibilityIdentifier)
|
||||||
try container.encode(headline, forKey: .headline)
|
try container.encode(headline, forKey: .headline)
|
||||||
try container.encodeIfPresent(body, forKey: .body)
|
try container.encodeIfPresent(body, forKey: .body)
|
||||||
try container.encodeIfPresent(button, forKey: .button)
|
try container.encodeIfPresent(button, forKey: .button)
|
||||||
|
try container.encodeIfPresent(secondaryButton, forKey: .secondaryButton)
|
||||||
try container.encodeIfPresent(closeButton, forKey: .closeButton)
|
try container.encodeIfPresent(closeButton, forKey: .closeButton)
|
||||||
|
try container.encodeIfPresent(inverted, forKey: .inverted)
|
||||||
try container.encode(style, forKey: .style)
|
try container.encode(style, forKey: .style)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension NotificationMoleculeModel {
|
||||||
|
public var surface: Surface {
|
||||||
|
inverted ? .dark : .light
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -7,90 +7,101 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import VDS
|
||||||
@objcMembers open class NotificationMoleculeView: Container {
|
@objcMembers open class NotificationMoleculeView: VDS.Notification, VDSMoleculeViewProtocol {
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Properties
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
open var viewModel: NotificationMoleculeModel!
|
||||||
|
public var delegateObject: MVMCoreUIDelegateObject?
|
||||||
|
public var additionalData: [AnyHashable: Any]?
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - VDSMoleculeViewProtocol
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
open func viewModelDidUpdate() {
|
||||||
|
surface = viewModel.surface
|
||||||
|
title = viewModel.headline.text
|
||||||
|
subTitle = viewModel.body?.text
|
||||||
|
|
||||||
|
if let button = viewModel.button {
|
||||||
|
primaryButtonModel = .init(text: button.title, onClick: {[weak self] _ in
|
||||||
|
guard let self else { return }
|
||||||
|
self.executeAction(model: button, delegateObject: self.delegateObject, additionalData: self.additionalData)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if let secondaryButton = viewModel.secondaryButton {
|
||||||
|
secondaryButtonModel = .init(text: secondaryButton.title, onClick: {[weak self] _ in
|
||||||
|
guard let self else { return }
|
||||||
|
self.executeAction(model: secondaryButton, delegateObject: self.delegateObject, additionalData: self.additionalData)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if let accessibilityIdentifier = viewModel.accessibilityIdentifier {
|
||||||
|
self.accessibilityIdentifier = accessibilityIdentifier
|
||||||
|
}
|
||||||
|
|
||||||
|
if let closeButton = viewModel.closeButton {
|
||||||
|
onCloseClick = { [weak self] _ in
|
||||||
|
guard let self else { return }
|
||||||
|
self.executeAction(model: closeButton, delegateObject: self.delegateObject, additionalData: self.additionalData) }
|
||||||
|
}
|
||||||
|
|
||||||
|
hideCloseButton = viewModel.closeButton == nil
|
||||||
|
style = viewModel.style.toVDSStyle
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Outlets
|
// MARK: - Outlets
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
public let headline = Label(fontStyle: .BoldBodySmall)
|
|
||||||
public let body = Label(fontStyle: .RegularBodySmall)
|
|
||||||
public let button = PillButton()
|
|
||||||
public let closeButton = NotificationXButton()
|
|
||||||
public var labelStack: Stack<StackModel>!
|
|
||||||
public var horizontalStack: Stack<StackModel>!
|
|
||||||
|
|
||||||
// Legacy constant
|
// Legacy constant
|
||||||
private static let viewHeight: CGFloat = 96.0
|
private static let viewHeight: CGFloat = 96.0
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Life Cycle
|
// MARK: - Life Cycle
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open override func updateAccessibility() {
|
||||||
public override func setupView() {
|
super.updateAccessibility()
|
||||||
super.setupView()
|
Self.amendAccesibilityLabel(for: titleLabel)
|
||||||
reset()
|
Self.amendAccesibilityLabel(for: subTitleLabel)
|
||||||
|
Self.amendAccesibilityLabel(for: primaryButton)
|
||||||
// Buttons should have highest priority, then headline, then body
|
Self.amendAccesibilityLabel(for: secondaryButton)
|
||||||
headline.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 500), for: .horizontal)
|
Self.amendAccesibilityLabel(for: closeButton)
|
||||||
headline.setContentHuggingPriority(.required, for: .vertical)
|
|
||||||
body.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 500), for: .horizontal)
|
|
||||||
body.setContentHuggingPriority(.required, for: .vertical)
|
|
||||||
headline.setContentCompressionResistancePriority(UILayoutPriority(rawValue: body.contentCompressionResistancePriority(for: .vertical).rawValue + 40), for: .vertical)
|
|
||||||
headline.lineBreakMode = .byTruncatingTail
|
|
||||||
body.lineBreakMode = .byTruncatingTail
|
|
||||||
button.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
|
|
||||||
|
|
||||||
labelStack = Stack<StackModel>.createStack(with: [headline, body], spacing: 0)
|
|
||||||
horizontalStack = Stack<StackModel>.createStack(with: [(view: labelStack, model: StackItemModel()),(view: button, model: StackItemModel(horizontalAlignment: .fill)),(view: closeButton, model: StackItemModel(horizontalAlignment: .fill))], axis: .horizontal)
|
|
||||||
addAndContain(horizontalStack)
|
|
||||||
labelStack.restack()
|
|
||||||
horizontalStack.restack()
|
|
||||||
|
|
||||||
heightAnchor.constraint(equalToConstant: Self.viewHeight).isActive = true
|
|
||||||
}
|
|
||||||
|
|
||||||
open override func reset() {
|
|
||||||
super.reset()
|
|
||||||
backgroundColor = .mvmGreen()
|
|
||||||
headline.textColor = .white
|
|
||||||
body.textColor = .white
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Molecule
|
// MARK: - Molecule
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
public func updateView(_ size: CGFloat) { }
|
||||||
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) {
|
|
||||||
super.set(with: model, delegateObject, additionalData)
|
open class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
||||||
guard let model = model as? NotificationMoleculeModel else { return }
|
|
||||||
labelStack.updateContainedMolecules(with: [model.headline, model.body], delegateObject, nil)
|
|
||||||
horizontalStack.updateContainedMolecules(with: [labelStack.stackModel, model.button, model.closeButton], delegateObject, nil)
|
|
||||||
updateAccessibility()
|
|
||||||
}
|
|
||||||
|
|
||||||
open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? {
|
|
||||||
return viewHeight
|
return viewHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
open func updateAccessibility() {
|
|
||||||
NotificationMoleculeView.amendAccesibilityLabel(for: headline)
|
|
||||||
NotificationMoleculeView.amendAccesibilityLabel(for: body)
|
|
||||||
NotificationMoleculeView.amendAccesibilityLabel(for: button)
|
|
||||||
NotificationMoleculeView.amendAccesibilityLabel(for: closeButton)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Formats the accessibilityLabel so voice over users know it's in the notification.
|
/// Formats the accessibilityLabel so voice over users know it's in the notification.
|
||||||
static public func amendAccesibilityLabel(for view: UIView) {
|
public class func amendAccesibilityLabel(for view: UIView?) {
|
||||||
guard let amendment = MVMCoreUIUtility.hardcodedString(withKey: "top_alert_notification"),
|
guard let view,
|
||||||
let accessibilityLabel = view.accessibilityLabel,
|
let amendment = MVMCoreUIUtility.hardcodedString(withKey: "top_alert_notification")
|
||||||
!accessibilityLabel.hasPrefix(amendment) else { return }
|
else { return }
|
||||||
view.accessibilityLabel = "\(amendment) - \(accessibilityLabel)"
|
view.amendAccesibilityLabel(with: amendment)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension NotificationMoleculeView: AccessibilityProtocol {
|
extension NotificationMoleculeView: AccessibilityProtocol {
|
||||||
public func getAccessibilityLayoutChangedArgument() -> Any? {
|
public func getAccessibilityLayoutChangedArgument() -> Any? {
|
||||||
return headline
|
return titleLabel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension UIView {
|
||||||
|
/// Formats the accessibilityLabel so voice over users know it's in the notification.
|
||||||
|
public func amendAccesibilityLabel(with amendment: String) {
|
||||||
|
guard let accessibilityLabel, !accessibilityLabel.hasPrefix(amendment) else { return }
|
||||||
|
self.accessibilityLabel = "\(amendment) - \(accessibilityLabel)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,6 @@ import MVMCore
|
|||||||
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) {
|
open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) {
|
||||||
super.set(with: model, delegateObject, additionalData)
|
super.set(with: model, delegateObject, additionalData)
|
||||||
guard let model = model as? NotificationXButtonModel else { return }
|
guard let model = model as? NotificationXButtonModel else { return }
|
||||||
tintColor = model.color?.uiColor ?? .white
|
|
||||||
|
|
||||||
// TODO: Temporary, consider action for dismissing top alert
|
// TODO: Temporary, consider action for dismissing top alert
|
||||||
if model.action.actionType == ActionNoopModel.identifier {
|
if model.action.actionType == ActionNoopModel.identifier {
|
||||||
|
|||||||
@ -15,25 +15,21 @@ public class NotificationXButtonModel: ButtonModelProtocol, MoleculeModelProtoco
|
|||||||
public var id: String = UUID().uuidString
|
public var id: String = UUID().uuidString
|
||||||
|
|
||||||
public var backgroundColor: Color?
|
public var backgroundColor: Color?
|
||||||
public var color: Color?
|
|
||||||
public var action: ActionModelProtocol = ActionNoopModel()
|
public var action: ActionModelProtocol = ActionNoopModel()
|
||||||
|
|
||||||
private enum CodingKeys: String, CodingKey {
|
private enum CodingKeys: String, CodingKey {
|
||||||
case id
|
case id
|
||||||
case moleculeName
|
case moleculeName
|
||||||
case color
|
|
||||||
case action
|
case action
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(color: Color? = nil, action: ActionModelProtocol = ActionNoopModel()) {
|
public init(action: ActionModelProtocol = ActionNoopModel()) {
|
||||||
self.color = color
|
|
||||||
self.action = action
|
self.action = action
|
||||||
}
|
}
|
||||||
|
|
||||||
public required init(from decoder: Decoder) throws {
|
public required init(from decoder: Decoder) throws {
|
||||||
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
let typeContainer = try decoder.container(keyedBy: CodingKeys.self)
|
||||||
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
|
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
|
||||||
color = try typeContainer.decodeIfPresent(Color.self, forKey: .color)
|
|
||||||
if let action: ActionModelProtocol = try typeContainer.decodeModelIfPresent(codingKey: .action) {
|
if let action: ActionModelProtocol = try typeContainer.decodeModelIfPresent(codingKey: .action) {
|
||||||
self.action = action
|
self.action = action
|
||||||
}
|
}
|
||||||
@ -43,7 +39,6 @@ public class NotificationXButtonModel: ButtonModelProtocol, MoleculeModelProtoco
|
|||||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||||
try container.encode(id, forKey: .id)
|
try container.encode(id, forKey: .id)
|
||||||
try container.encode(moleculeName, forKey: .moleculeName)
|
try container.encode(moleculeName, forKey: .moleculeName)
|
||||||
try container.encodeIfPresent(color, forKey: .color)
|
|
||||||
try container.encodeModel(action, forKey: .action)
|
try container.encodeModel(action, forKey: .action)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,6 +66,14 @@ extension MoleculeViewProtocol {
|
|||||||
set(with: model, delegateObject, additionalData)
|
set(with: model, delegateObject, additionalData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func executeAction<T: ButtonModelProtocol & MoleculeModelProtocol>(model: T, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) {
|
||||||
|
Task(priority: .userInitiated) {
|
||||||
|
try await (delegateObject?.actionDelegate as? ActionDelegateProtocol)?.performAction(with: model.action,
|
||||||
|
additionalData: MVMCoreUIActionHandler.add(sourceModel: model, to: additionalData),
|
||||||
|
delegateObject: delegateObject)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convenience Functions
|
// Convenience Functions
|
||||||
|
|||||||
@ -21,7 +21,11 @@ public protocol VDSMoleculeViewProtocol: MoleculeViewProtocol, MVMCoreViewProtoc
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension VDSMoleculeViewProtocol {
|
extension VDSMoleculeViewProtocol {
|
||||||
|
public var model: MoleculeModelProtocol {
|
||||||
|
get { viewModel }
|
||||||
|
set { }
|
||||||
|
}
|
||||||
|
|
||||||
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
|
self.model = model
|
||||||
guard let castedModel = model as? ViewModel else { return }
|
guard let castedModel = model as? ViewModel else { return }
|
||||||
|
|||||||
@ -56,6 +56,18 @@ extension UIColor {
|
|||||||
"upGold2": (.vzupGold2, "#F4CA53"),
|
"upGold2": (.vzupGold2, "#F4CA53"),
|
||||||
"upGold3": (.vzupGold3, "#CC9B2D")]
|
"upGold3": (.vzupGold3, "#CC9B2D")]
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Helper
|
||||||
|
//--------------------------------------------------
|
||||||
|
public var rgbComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
|
||||||
|
var red: CGFloat = 0
|
||||||
|
var green: CGFloat = 0
|
||||||
|
var blue: CGFloat = 0
|
||||||
|
var alpha: CGFloat = 0
|
||||||
|
getRed(&red, green: &green, blue: &blue, alpha: &alpha)
|
||||||
|
return (red, green, blue, alpha)
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Brand
|
// MARK: - Brand
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|||||||
@ -34,6 +34,7 @@ import Combine
|
|||||||
public static func setupNavigationControllerAsMainController() -> Self? {
|
public static func setupNavigationControllerAsMainController() -> Self? {
|
||||||
guard let navigationController = setupNavigationController() else { return nil }
|
guard let navigationController = setupNavigationController() else { return nil }
|
||||||
MVMCoreUISession.sharedGlobal()?.setup(asStandardLoadViewDelegate: navigationController)
|
MVMCoreUISession.sharedGlobal()?.setup(asStandardLoadViewDelegate: navigationController)
|
||||||
|
MVMCoreObject.sharedInstance()?.viewControllerManager = navigationController
|
||||||
return navigationController
|
return navigationController
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,6 +137,31 @@ extension NavigationController: MVMCoreViewManagerProtocol {
|
|||||||
public func displayedViewController(_ viewController: UIViewController) {
|
public func displayedViewController(_ viewController: UIViewController) {
|
||||||
manager?.displayedViewController?(viewController)
|
manager?.displayedViewController?(viewController)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func go(to index: Int) async {
|
||||||
|
guard index != viewControllers.count - 1 else { return }
|
||||||
|
await NavigationHandler.shared().set(viewControllers: Array(viewControllers[0...index]), navigationController: self)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func navigate(toViewControllerOfPageType pageType: String, controllerType: AnyClass?) async -> UIViewController? {
|
||||||
|
for (index, controller) in viewControllers.enumerated() {
|
||||||
|
if let manager = controller as? MVMCoreViewManagerProtocol,
|
||||||
|
let viewController = await manager.navigate(toViewControllerOfPageType: pageType, controllerType: controllerType) {
|
||||||
|
await go(to: index)
|
||||||
|
return viewController
|
||||||
|
} else if let controller = controller as? MVMCoreViewControllerProtocol & UIViewController,
|
||||||
|
controller.pageType == pageType {
|
||||||
|
guard let controllerType = controllerType else {
|
||||||
|
await go(to: index)
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
guard (type(of: controller) == controllerType) else { continue }
|
||||||
|
await go(to: index)
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension UIColor {
|
extension UIColor {
|
||||||
|
|||||||
@ -102,7 +102,7 @@ public extension UINavigationController {
|
|||||||
navigationBar.standardAppearance = appearance
|
navigationBar.standardAppearance = appearance
|
||||||
navigationBar.scrollEdgeAppearance = appearance
|
navigationBar.scrollEdgeAppearance = appearance
|
||||||
|
|
||||||
setNavigationBarHidden(model.hidden, animated: true)
|
setNavigationBarHidden(model.hidden, animated: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc @MainActor
|
@objc @MainActor
|
||||||
|
|||||||
@ -269,6 +269,10 @@ extension MVMCoreUISplitViewController: MVMCoreViewManagerProtocol {
|
|||||||
public func newDataReceived(in viewController: UIViewController) {
|
public func newDataReceived(in viewController: UIViewController) {
|
||||||
updateState(with: viewController)
|
updateState(with: viewController)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func navigate(toViewControllerOfPageType pageType: String, controllerType: AnyClass?) async -> UIViewController? {
|
||||||
|
return await navigationController?.navigate(toViewControllerOfPageType: pageType, controllerType: controllerType)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc public extension MVMCoreUISplitViewController {
|
@objc public extension MVMCoreUISplitViewController {
|
||||||
|
|||||||
@ -95,6 +95,7 @@ CGFloat const PanelAnimationDuration = 0.2;
|
|||||||
if (topAlertView) {
|
if (topAlertView) {
|
||||||
[splitViewController subscribeForNotifications];
|
[splitViewController subscribeForNotifications];
|
||||||
}
|
}
|
||||||
|
[MVMCoreObject sharedInstance].viewControllerManager = splitViewController;
|
||||||
return splitViewController;
|
return splitViewController;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import MVMCore
|
import MVMCore
|
||||||
import VDSColorTokens
|
import VDSTokens
|
||||||
|
|
||||||
open class SubNavManagerController: ViewController, MVMCoreViewManagerProtocol, TabsDelegate, MVMCorePresentationDelegateProtocol, SubNavSwipeNavigationProtocol {
|
open class SubNavManagerController: ViewController, MVMCoreViewManagerProtocol, TabsDelegate, MVMCorePresentationDelegateProtocol, SubNavSwipeNavigationProtocol {
|
||||||
/// The number of tabs count or less that will turn on the fillContainer
|
/// The number of tabs count or less that will turn on the fillContainer
|
||||||
@ -362,6 +362,35 @@ open class SubNavManagerController: ViewController, MVMCoreViewManagerProtocol,
|
|||||||
manager?.displayedViewController?(viewController)
|
manager?.displayedViewController?(viewController)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func go(to index: Int) async {
|
||||||
|
// Load controller from the cache
|
||||||
|
guard index != self.index,
|
||||||
|
let controller = viewControllers[index] else { return }
|
||||||
|
needToTrackTabSelect = true
|
||||||
|
self.index = index
|
||||||
|
await NavigationHandler.shared().replace(viewController: controller, navigationController:subNavigationController, delegateObject:delegateObject(), tryToReplace: false, animated: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func navigate(toViewControllerOfPageType pageType: String, controllerType: AnyClass?) async -> UIViewController? {
|
||||||
|
for (index, controller) in viewControllers.enumerated() {
|
||||||
|
if let manager = controller as? MVMCoreViewManagerProtocol,
|
||||||
|
let viewController = await manager.navigate(toViewControllerOfPageType: pageType, controllerType: controllerType) {
|
||||||
|
await go(to: index)
|
||||||
|
return viewController
|
||||||
|
} else if let controller = controller as? MVMCoreViewControllerProtocol & UIViewController,
|
||||||
|
controller.pageType == pageType {
|
||||||
|
guard let controllerType = controllerType else {
|
||||||
|
await go(to: index)
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
guard (type(of: controller) == controllerType) else { continue }
|
||||||
|
await go(to: index)
|
||||||
|
return controller
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - MVMCoreUISwipeNavigationProtocol
|
// MARK: - MVMCoreUISwipeNavigationProtocol
|
||||||
|
|
||||||
public func swipeLeft() {
|
public func swipeLeft() {
|
||||||
|
|||||||
@ -73,6 +73,7 @@ public extension MVMCoreUIUtility {
|
|||||||
|
|
||||||
@objc
|
@objc
|
||||||
public extension MVMCoreUIUtility {
|
public extension MVMCoreUIUtility {
|
||||||
|
/// Returns the current visible viewcontroller.
|
||||||
@objc @MainActor
|
@objc @MainActor
|
||||||
static func getVisibleViewController() -> UIViewController? {
|
static func getVisibleViewController() -> UIViewController? {
|
||||||
var viewController = NavigationHandler.shared().getViewControllerToPresentOn()
|
var viewController = NavigationHandler.shared().getViewControllerToPresentOn()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user