Merge branch 'develop' of https://gitlab.verizon.com/BPHV_MIPS/vds_ios into vasavk/footnote
# Conflicts: # VDS.xcodeproj/project.pbxproj
This commit is contained in:
commit
e22b64095b
@ -11,6 +11,7 @@
|
|||||||
180636C92C29B0DF00C92D86 /* InputStepperLog.txt in Resources */ = {isa = PBXBuildFile; fileRef = 180636C82C29B0DF00C92D86 /* InputStepperLog.txt */; };
|
180636C92C29B0DF00C92D86 /* InputStepperLog.txt in Resources */ = {isa = PBXBuildFile; fileRef = 180636C82C29B0DF00C92D86 /* InputStepperLog.txt */; };
|
||||||
1808BEBC2BA41C3200129230 /* CarouselScrollbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1808BEBB2BA41C3200129230 /* CarouselScrollbar.swift */; };
|
1808BEBC2BA41C3200129230 /* CarouselScrollbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1808BEBB2BA41C3200129230 /* CarouselScrollbar.swift */; };
|
||||||
1832AC572BA0791D008AE476 /* BreadcrumbCellItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1832AC562BA0791D008AE476 /* BreadcrumbCellItem.swift */; };
|
1832AC572BA0791D008AE476 /* BreadcrumbCellItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1832AC562BA0791D008AE476 /* BreadcrumbCellItem.swift */; };
|
||||||
|
183B16F32C78CF7C00BA6A10 /* CarouselSlotCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183B16F22C78CF7C00BA6A10 /* CarouselSlotCell.swift */; };
|
||||||
183B16F72C80B32200BA6A10 /* FootnoteGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183B16F62C80B32200BA6A10 /* FootnoteGroup.swift */; };
|
183B16F72C80B32200BA6A10 /* FootnoteGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 183B16F62C80B32200BA6A10 /* FootnoteGroup.swift */; };
|
||||||
184023452C61E7AD00A412C8 /* PriceLockup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184023442C61E7AD00A412C8 /* PriceLockup.swift */; };
|
184023452C61E7AD00A412C8 /* PriceLockup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184023442C61E7AD00A412C8 /* PriceLockup.swift */; };
|
||||||
184023472C61E7EC00A412C8 /* PriceLockupChangeLog.txt in Resources */ = {isa = PBXBuildFile; fileRef = 184023462C61E7EC00A412C8 /* PriceLockupChangeLog.txt */; };
|
184023472C61E7EC00A412C8 /* PriceLockupChangeLog.txt in Resources */ = {isa = PBXBuildFile; fileRef = 184023462C61E7EC00A412C8 /* PriceLockupChangeLog.txt */; };
|
||||||
@ -73,7 +74,6 @@
|
|||||||
EA33617C288B19210071C351 /* VDSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33617B288B19210071C351 /* VDSTests.swift */; };
|
EA33617C288B19210071C351 /* VDSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33617B288B19210071C351 /* VDSTests.swift */; };
|
||||||
EA33617D288B19210071C351 /* VDS.h in Headers */ = {isa = PBXBuildFile; fileRef = EA33616F288B19200071C351 /* VDS.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
EA33617D288B19210071C351 /* VDS.h in Headers */ = {isa = PBXBuildFile; fileRef = EA33616F288B19200071C351 /* VDS.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
EA3361A8288B23300071C351 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361A7288B23300071C351 /* UIColor.swift */; };
|
EA3361A8288B23300071C351 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361A7288B23300071C351 /* UIColor.swift */; };
|
||||||
EA3361AA288B25E40071C351 /* Disabling.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361A9288B25E40071C351 /* Disabling.swift */; };
|
|
||||||
EA3361AF288B26310071C351 /* FormFieldable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361AE288B26310071C351 /* FormFieldable.swift */; };
|
EA3361AF288B26310071C351 /* FormFieldable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361AE288B26310071C351 /* FormFieldable.swift */; };
|
||||||
EA3361B6288B2A410071C351 /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B5288B2A410071C351 /* Control.swift */; };
|
EA3361B6288B2A410071C351 /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B5288B2A410071C351 /* Control.swift */; };
|
||||||
EA3361B8288B2AAA0071C351 /* ViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */; };
|
EA3361B8288B2AAA0071C351 /* ViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */; };
|
||||||
@ -105,6 +105,7 @@
|
|||||||
EA6642952BCEBF9500D81DC4 /* TextLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA6642942BCEBF9500D81DC4 /* TextLinkModel.swift */; };
|
EA6642952BCEBF9500D81DC4 /* TextLinkModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA6642942BCEBF9500D81DC4 /* TextLinkModel.swift */; };
|
||||||
EA6F330E2B911E9000BACAB9 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA6F330D2B911E9000BACAB9 /* TextView.swift */; };
|
EA6F330E2B911E9000BACAB9 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA6F330D2B911E9000BACAB9 /* TextView.swift */; };
|
||||||
EA78C7962C00CAC200430AD1 /* Groupable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA78C7952C00CAC200430AD1 /* Groupable.swift */; };
|
EA78C7962C00CAC200430AD1 /* Groupable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA78C7952C00CAC200430AD1 /* Groupable.swift */; };
|
||||||
|
EA7AE5592C78C7D000107C74 /* ParentViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA7AE5582C78C7D000107C74 /* ParentViewProtocol.swift */; };
|
||||||
EA81410B2A0E8E3C004F60D2 /* ButtonIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */; };
|
EA81410B2A0E8E3C004F60D2 /* ButtonIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */; };
|
||||||
EA8141102A127066004F60D2 /* UIColor+VDSColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410F2A127066004F60D2 /* UIColor+VDSColor.swift */; };
|
EA8141102A127066004F60D2 /* UIColor+VDSColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410F2A127066004F60D2 /* UIColor+VDSColor.swift */; };
|
||||||
EA89200428AECF4B006B9984 /* UITextField+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */; };
|
EA89200428AECF4B006B9984 /* UITextField+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */; };
|
||||||
@ -219,6 +220,7 @@
|
|||||||
1808BEBB2BA41C3200129230 /* CarouselScrollbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselScrollbar.swift; sourceTree = "<group>"; };
|
1808BEBB2BA41C3200129230 /* CarouselScrollbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselScrollbar.swift; sourceTree = "<group>"; };
|
||||||
1808BEBF2BA456B700129230 /* CarouselScrollbarChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CarouselScrollbarChangeLog.txt; sourceTree = "<group>"; };
|
1808BEBF2BA456B700129230 /* CarouselScrollbarChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CarouselScrollbarChangeLog.txt; sourceTree = "<group>"; };
|
||||||
1832AC562BA0791D008AE476 /* BreadcrumbCellItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreadcrumbCellItem.swift; sourceTree = "<group>"; };
|
1832AC562BA0791D008AE476 /* BreadcrumbCellItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreadcrumbCellItem.swift; sourceTree = "<group>"; };
|
||||||
|
183B16F22C78CF7C00BA6A10 /* CarouselSlotCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselSlotCell.swift; sourceTree = "<group>"; };
|
||||||
183B16F62C80B32200BA6A10 /* FootnoteGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FootnoteGroup.swift; sourceTree = "<group>"; };
|
183B16F62C80B32200BA6A10 /* FootnoteGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FootnoteGroup.swift; sourceTree = "<group>"; };
|
||||||
184023442C61E7AD00A412C8 /* PriceLockup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceLockup.swift; sourceTree = "<group>"; };
|
184023442C61E7AD00A412C8 /* PriceLockup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceLockup.swift; sourceTree = "<group>"; };
|
||||||
184023462C61E7EC00A412C8 /* PriceLockupChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = PriceLockupChangeLog.txt; sourceTree = "<group>"; };
|
184023462C61E7EC00A412C8 /* PriceLockupChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = PriceLockupChangeLog.txt; sourceTree = "<group>"; };
|
||||||
@ -296,7 +298,6 @@
|
|||||||
EA336176288B19210071C351 /* VDSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VDSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
EA336176288B19210071C351 /* VDSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VDSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
EA33617B288B19210071C351 /* VDSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSTests.swift; sourceTree = "<group>"; };
|
EA33617B288B19210071C351 /* VDSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSTests.swift; sourceTree = "<group>"; };
|
||||||
EA3361A7288B23300071C351 /* UIColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = "<group>"; };
|
EA3361A7288B23300071C351 /* UIColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = "<group>"; };
|
||||||
EA3361A9288B25E40071C351 /* Disabling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Disabling.swift; sourceTree = "<group>"; };
|
|
||||||
EA3361AE288B26310071C351 /* FormFieldable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormFieldable.swift; sourceTree = "<group>"; };
|
EA3361AE288B26310071C351 /* FormFieldable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormFieldable.swift; sourceTree = "<group>"; };
|
||||||
EA3361B5288B2A410071C351 /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = "<group>"; };
|
EA3361B5288B2A410071C351 /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = "<group>"; };
|
||||||
EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewProtocol.swift; sourceTree = "<group>"; };
|
EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewProtocol.swift; sourceTree = "<group>"; };
|
||||||
@ -331,6 +332,7 @@
|
|||||||
EA78C7952C00CAC200430AD1 /* Groupable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Groupable.swift; sourceTree = "<group>"; };
|
EA78C7952C00CAC200430AD1 /* Groupable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Groupable.swift; sourceTree = "<group>"; };
|
||||||
EA78C7A12C0E63D200430AD1 /* vds-dev.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "vds-dev.xcconfig"; sourceTree = "<group>"; };
|
EA78C7A12C0E63D200430AD1 /* vds-dev.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "vds-dev.xcconfig"; sourceTree = "<group>"; };
|
||||||
EA78C7A22C0E63DD00430AD1 /* vds.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = vds.xcconfig; sourceTree = "<group>"; };
|
EA78C7A22C0E63DD00430AD1 /* vds.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = vds.xcconfig; sourceTree = "<group>"; };
|
||||||
|
EA7AE5582C78C7D000107C74 /* ParentViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParentViewProtocol.swift; sourceTree = "<group>"; };
|
||||||
EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonIcon.swift; sourceTree = "<group>"; };
|
EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonIcon.swift; sourceTree = "<group>"; };
|
||||||
EA81410F2A127066004F60D2 /* UIColor+VDSColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+VDSColor.swift"; sourceTree = "<group>"; };
|
EA81410F2A127066004F60D2 /* UIColor+VDSColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+VDSColor.swift"; sourceTree = "<group>"; };
|
||||||
EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Publisher.swift"; sourceTree = "<group>"; };
|
EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Publisher.swift"; sourceTree = "<group>"; };
|
||||||
@ -540,6 +542,7 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
18AE874F2C06FDA60075F181 /* Carousel.swift */,
|
18AE874F2C06FDA60075F181 /* Carousel.swift */,
|
||||||
|
183B16F22C78CF7C00BA6A10 /* CarouselSlotCell.swift */,
|
||||||
18B9763E2C11BA4A009271DF /* CarouselPaginationModel.swift */,
|
18B9763E2C11BA4A009271DF /* CarouselPaginationModel.swift */,
|
||||||
18B42AC52C09D197008D6262 /* CarouselSlotAlignmentModel.swift */,
|
18B42AC52C09D197008D6262 /* CarouselSlotAlignmentModel.swift */,
|
||||||
18AE87532C06FE610075F181 /* CarouselChangeLog.txt */,
|
18AE87532C06FE610075F181 /* CarouselChangeLog.txt */,
|
||||||
@ -788,7 +791,6 @@
|
|||||||
EAF1FE9829D4850E00101452 /* Clickable.swift */,
|
EAF1FE9829D4850E00101452 /* Clickable.swift */,
|
||||||
EAA5EEDF28F49DB3003B3210 /* Colorable.swift */,
|
EAA5EEDF28F49DB3003B3210 /* Colorable.swift */,
|
||||||
EAACB8972B92706F006A3869 /* DefaultValuing.swift */,
|
EAACB8972B92706F006A3869 /* DefaultValuing.swift */,
|
||||||
EA3361A9288B25E40071C351 /* Disabling.swift */,
|
|
||||||
71BFA7092B7F70E6000DCE33 /* DropShadowable.swift */,
|
71BFA7092B7F70E6000DCE33 /* DropShadowable.swift */,
|
||||||
EAF978202A99035B00C2FEA9 /* Enabling.swift */,
|
EAF978202A99035B00C2FEA9 /* Enabling.swift */,
|
||||||
EA5E305929510F8B0082B959 /* EnumSubset.swift */,
|
EA5E305929510F8B0082B959 /* EnumSubset.swift */,
|
||||||
@ -797,6 +799,7 @@
|
|||||||
EA78C7952C00CAC200430AD1 /* Groupable.swift */,
|
EA78C7952C00CAC200430AD1 /* Groupable.swift */,
|
||||||
EA33624628931B050071C351 /* Initable.swift */,
|
EA33624628931B050071C351 /* Initable.swift */,
|
||||||
EA471F392A95587500CE9E58 /* LayoutConstraintable.swift */,
|
EA471F392A95587500CE9E58 /* LayoutConstraintable.swift */,
|
||||||
|
EA7AE5582C78C7D000107C74 /* ParentViewProtocol.swift */,
|
||||||
EA985C7C297DAED300F2FF2E /* Primitive.swift */,
|
EA985C7C297DAED300F2FF2E /* Primitive.swift */,
|
||||||
EAF7F0A5289B0CE000B287F5 /* Resetable.swift */,
|
EAF7F0A5289B0CE000B287F5 /* Resetable.swift */,
|
||||||
EA3361C8289054C50071C351 /* Surfaceable.swift */,
|
EA3361C8289054C50071C351 /* Surfaceable.swift */,
|
||||||
@ -1358,6 +1361,7 @@
|
|||||||
EAF7F0A4289B017C00B287F5 /* LabelAttributeModel.swift in Sources */,
|
EAF7F0A4289B017C00B287F5 /* LabelAttributeModel.swift in Sources */,
|
||||||
EA0B18022A9E236900F2D0CD /* SelectorGroupBase.swift in Sources */,
|
EA0B18022A9E236900F2D0CD /* SelectorGroupBase.swift in Sources */,
|
||||||
EA5F86D02A1F936100BC83E4 /* TabsContainer.swift in Sources */,
|
EA5F86D02A1F936100BC83E4 /* TabsContainer.swift in Sources */,
|
||||||
|
EA7AE5592C78C7D000107C74 /* ParentViewProtocol.swift in Sources */,
|
||||||
EAF7F0B1289B177F00B287F5 /* ColorLabelAttribute.swift in Sources */,
|
EAF7F0B1289B177F00B287F5 /* ColorLabelAttribute.swift in Sources */,
|
||||||
EAC9258F2911C9DE00091998 /* EntryFieldBase.swift in Sources */,
|
EAC9258F2911C9DE00091998 /* EntryFieldBase.swift in Sources */,
|
||||||
18B9763F2C11BA4A009271DF /* CarouselPaginationModel.swift in Sources */,
|
18B9763F2C11BA4A009271DF /* CarouselPaginationModel.swift in Sources */,
|
||||||
@ -1419,6 +1423,7 @@
|
|||||||
EA985BF02968A93600F2FF2E /* TitleLockupEyebrowModel.swift in Sources */,
|
EA985BF02968A93600F2FF2E /* TitleLockupEyebrowModel.swift in Sources */,
|
||||||
EA5E30532950DDA60082B959 /* TitleLockup.swift in Sources */,
|
EA5E30532950DDA60082B959 /* TitleLockup.swift in Sources */,
|
||||||
EAD062B02A3B873E0015965D /* BadgeIndicator.swift in Sources */,
|
EAD062B02A3B873E0015965D /* BadgeIndicator.swift in Sources */,
|
||||||
|
183B16F32C78CF7C00BA6A10 /* CarouselSlotCell.swift in Sources */,
|
||||||
44A952DD2BE3DA820009F874 /* TableFlowLayout.swift in Sources */,
|
44A952DD2BE3DA820009F874 /* TableFlowLayout.swift in Sources */,
|
||||||
EAA5EEB528ECBFB4003B3210 /* ImageLabelAttribute.swift in Sources */,
|
EAA5EEB528ECBFB4003B3210 /* ImageLabelAttribute.swift in Sources */,
|
||||||
18792A902B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift in Sources */,
|
18792A902B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift in Sources */,
|
||||||
@ -1426,7 +1431,6 @@
|
|||||||
EAB5FF0129424ACB00998C17 /* UIControl.swift in Sources */,
|
EAB5FF0129424ACB00998C17 /* UIControl.swift in Sources */,
|
||||||
EA985BF5296C60C000F2FF2E /* Icon.swift in Sources */,
|
EA985BF5296C60C000F2FF2E /* Icon.swift in Sources */,
|
||||||
1842B1E32BECF0A20021AFCA /* CalendarFooterReusableView.swift in Sources */,
|
1842B1E32BECF0A20021AFCA /* CalendarFooterReusableView.swift in Sources */,
|
||||||
EA3361AA288B25E40071C351 /* Disabling.swift in Sources */,
|
|
||||||
EA3361B6288B2A410071C351 /* Control.swift in Sources */,
|
EA3361B6288B2A410071C351 /* Control.swift in Sources */,
|
||||||
EAC58C122BED0DDD00BA39FA /* Text.swift in Sources */,
|
EAC58C122BED0DDD00BA39FA /* Text.swift in Sources */,
|
||||||
5F21D7BF28DCEB3D003E7CD6 /* Useable.swift in Sources */,
|
5F21D7BF28DCEB3D003E7CD6 /* Useable.swift in Sources */,
|
||||||
@ -1609,7 +1613,7 @@
|
|||||||
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 72;
|
CURRENT_PROJECT_VERSION = 73;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
@ -1647,7 +1651,7 @@
|
|||||||
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 72;
|
CURRENT_PROJECT_VERSION = 73;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
|||||||
@ -30,7 +30,8 @@ public protocol SelectorControlable: Control, Changeable {
|
|||||||
/// Base Class used to build out a Selector control.
|
/// Base Class used to build out a Selector control.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSSelectorBase)
|
@objc(VDSSelectorBase)
|
||||||
open class SelectorBase: Control, SelectorControlable {
|
open class SelectorBase: Control, SelectorControlable, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -49,6 +50,8 @@ open class SelectorBase: Control, SelectorControlable {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [selectorView] }
|
||||||
|
|
||||||
open var onChangeSubscriber: AnyCancellable?
|
open var onChangeSubscriber: AnyCancellable?
|
||||||
|
|
||||||
open var size = CGSize(width: 20, height: 20) { didSet { setNeedsUpdate() } }
|
open var size = CGSize(width: 20, height: 20) { didSet { setNeedsUpdate() } }
|
||||||
@ -84,9 +87,6 @@ open class SelectorBase: Control, SelectorControlable {
|
|||||||
|
|
||||||
open var selectorColorConfiguration = ControlColorConfiguration() { didSet { setNeedsUpdate() } }
|
open var selectorColorConfiguration = ControlColorConfiguration() { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
/// The natural size for the receiving view, considering only properties of the view itself.
|
|
||||||
open override var intrinsicContentSize: CGSize { size }
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -106,6 +106,16 @@ open class SelectorBase: Control, SelectorControlable {
|
|||||||
super.setup()
|
super.setup()
|
||||||
isAccessibilityElement = true
|
isAccessibilityElement = true
|
||||||
accessibilityTraits = .button
|
accessibilityTraits = .button
|
||||||
|
|
||||||
|
let layoutGuide = UILayoutGuide()
|
||||||
|
addLayoutGuide(layoutGuide)
|
||||||
|
layoutGuide
|
||||||
|
.pinTop(0)
|
||||||
|
.pinLeading(0)
|
||||||
|
.pinTrailing(0, .defaultHigh)
|
||||||
|
.pinBottom(0, .defaultHigh)
|
||||||
|
.width(size.width)
|
||||||
|
.height(size.height)
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func setDefaults() {
|
open override func setDefaults() {
|
||||||
|
|||||||
@ -39,7 +39,7 @@ extension SelectorGroupSingleSelect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Base Class used for any Grouped Form Control of a Selector Type.
|
/// Base Class used for any Grouped Form Control of a Selector Type.
|
||||||
open class SelectorGroupBase<SelectorItemType: Groupable>: Control, SelectorGroup, Changeable {
|
open class SelectorGroupBase<SelectorItemType: Groupable>: Control, SelectorGroup, Changeable, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
@ -57,6 +57,8 @@ open class SelectorGroupBase<SelectorItemType: Groupable>: Control, SelectorGrou
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { items }
|
||||||
|
|
||||||
/// Array of the HandlerType registered.
|
/// Array of the HandlerType registered.
|
||||||
/// Array of HandlerType that the user will have the ability to select from.
|
/// Array of HandlerType that the user will have the ability to select from.
|
||||||
open var items: [SelectorItemType] = [] {
|
open var items: [SelectorItemType] = [] {
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import Combine
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
/// Base Class used to build out a SelectorControlable control.
|
/// Base Class used to build out a SelectorControlable control.
|
||||||
open class SelectorItemBase<Selector: SelectorBase>: Control, Errorable, Changeable, Groupable {
|
open class SelectorItemBase<Selector: SelectorBase>: Control, Errorable, Changeable, Groupable, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -61,6 +61,8 @@ open class SelectorItemBase<Selector: SelectorBase>: Control, Errorable, Changea
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [label, childLabel, errorLabel, selectorView] }
|
||||||
|
|
||||||
open var onChangeSubscriber: AnyCancellable?
|
open var onChangeSubscriber: AnyCancellable?
|
||||||
|
|
||||||
/// Label used to render labelText.
|
/// Label used to render labelText.
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import Combine
|
|||||||
/// to its parent this object will stretch to the parent's width.
|
/// to its parent this object will stretch to the parent's width.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSBadge)
|
@objc(VDSBadge)
|
||||||
open class Badge: View {
|
open class Badge: View, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -45,6 +45,8 @@ open class Badge: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [label] }
|
||||||
|
|
||||||
/// Label used to render text
|
/// Label used to render text
|
||||||
open var label = Label().with {
|
open var label = Label().with {
|
||||||
$0.isAccessibilityElement = false
|
$0.isAccessibilityElement = false
|
||||||
|
|||||||
@ -13,7 +13,7 @@ import Combine
|
|||||||
/// A badge indicator is a visual label used to convey status or highlight supplemental information.
|
/// A badge indicator is a visual label used to convey status or highlight supplemental information.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSBadgeIndicator)
|
@objc(VDSBadgeIndicator)
|
||||||
open class BadgeIndicator: View {
|
open class BadgeIndicator: View, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -135,6 +135,8 @@ open class BadgeIndicator: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [label, badgeView] }
|
||||||
|
|
||||||
/// Label used for the numeric kind.
|
/// Label used for the numeric kind.
|
||||||
open var label = Label().with {
|
open var label = Label().with {
|
||||||
$0.setContentCompressionResistancePriority(.required, for: .vertical)
|
$0.setContentCompressionResistancePriority(.required, for: .vertical)
|
||||||
|
|||||||
@ -8,8 +8,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension Breadcrumbs {
|
extension Breadcrumbs {
|
||||||
public struct BreadcrumbItemModel {
|
public struct BreadcrumbItemModel: Equatable {
|
||||||
|
|
||||||
///Text that goes in the breadcrumb item
|
///Text that goes in the breadcrumb item
|
||||||
public var text: String
|
public var text: String
|
||||||
|
|
||||||
@ -24,5 +23,10 @@ extension Breadcrumbs {
|
|||||||
self.selected = selected
|
self.selected = selected
|
||||||
self.onClick = onClick
|
self.onClick = onClick
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: Breadcrumbs.BreadcrumbItemModel, rhs: Breadcrumbs.BreadcrumbItemModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.selected == rhs.selected
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,11 +15,13 @@ import Combine
|
|||||||
/// Breadcrumbs are secondary navigation that use a hierarchy of internal links to tell customers where they are in an experience. Each breadcrumb links to its respective page, except for that of current page.
|
/// Breadcrumbs are secondary navigation that use a hierarchy of internal links to tell customers where they are in an experience. Each breadcrumb links to its respective page, except for that of current page.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSBreadcrumbs)
|
@objc(VDSBreadcrumbs)
|
||||||
open class Breadcrumbs: View {
|
open class Breadcrumbs: View, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { breadcrumbs }
|
||||||
|
|
||||||
/// Array of ``BreadcrumbItem`` views for the Breadcrumbs.
|
/// Array of ``BreadcrumbItem`` views for the Breadcrumbs.
|
||||||
open var breadcrumbs: [BreadcrumbItem] = [] { didSet { setNeedsUpdate() } }
|
open var breadcrumbs: [BreadcrumbItem] = [] { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import Foundation
|
|||||||
|
|
||||||
/// Custom data type for indicators prop
|
/// Custom data type for indicators prop
|
||||||
extension CalendarBase {
|
extension CalendarBase {
|
||||||
public struct CalendarIndicatorModel {
|
public struct CalendarIndicatorModel: Equatable {
|
||||||
|
|
||||||
/// Text that shown to an indicator for legend
|
/// Text that shown to an indicator for legend
|
||||||
public var label: String
|
public var label: String
|
||||||
|
|||||||
@ -154,27 +154,38 @@ open class Carousel: View {
|
|||||||
$0.backgroundColor = .clear
|
$0.backgroundColor = .clear
|
||||||
}
|
}
|
||||||
|
|
||||||
private var scrollView = UIScrollView().with {
|
private lazy var collectionView: UICollectionView = {
|
||||||
$0.translatesAutoresizingMaskIntoConstraints = false
|
let layout = UICollectionViewFlowLayout()
|
||||||
$0.backgroundColor = .clear
|
layout.scrollDirection = .horizontal
|
||||||
}
|
let collectionView = UICollectionView(frame: frame, collectionViewLayout: layout)
|
||||||
|
collectionView.isScrollEnabled = true
|
||||||
|
collectionView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
collectionView.delegate = self
|
||||||
|
collectionView.dataSource = self
|
||||||
|
collectionView.showsHorizontalScrollIndicator = false
|
||||||
|
collectionView.showsVerticalScrollIndicator = false
|
||||||
|
collectionView.backgroundColor = .clear
|
||||||
|
collectionView.register(CarouselSlotCell.self,
|
||||||
|
forCellWithReuseIdentifier: CarouselSlotCell.identifier)
|
||||||
|
return collectionView
|
||||||
|
}()
|
||||||
|
|
||||||
/// Previous button to show previous slide.
|
/// Previous button to show previous slide.
|
||||||
private var previousButton = ButtonIcon().with {
|
private var previousButton = ButtonIcon().with {
|
||||||
$0.kind = .lowContrast
|
$0.kind = .lowContrast
|
||||||
$0.iconName = .leftCaret
|
$0.iconName = .paginationLeftCaret
|
||||||
$0.iconOffset = .init(x: -2, y: 0)
|
$0.iconOffset = .init(x: -2, y: 0)
|
||||||
$0.customContainerSize = UIDevice.isIPad ? 40 : 28
|
$0.customContainerSize = UIDevice.isIPad ? 40 : 28
|
||||||
$0.icon.customSize = UIDevice.isIPad ? 16 : 12
|
$0.customIconSize = UIDevice.isIPad ? 16 : 12
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Next button to show next slide.
|
/// Next button to show next slide.
|
||||||
private var nextButton = ButtonIcon().with {
|
private var nextButton = ButtonIcon().with {
|
||||||
$0.kind = .lowContrast
|
$0.kind = .lowContrast
|
||||||
$0.iconName = .rightCaret
|
$0.iconName = .paginationRightCaret
|
||||||
$0.iconOffset = .init(x: 2, y: 0)
|
$0.iconOffset = .init(x: 2, y: 0)
|
||||||
$0.customContainerSize = UIDevice.isIPad ? 40 : 28
|
$0.customContainerSize = UIDevice.isIPad ? 40 : 28
|
||||||
$0.icon.customSize = UIDevice.isIPad ? 16 : 12
|
$0.customIconSize = UIDevice.isIPad ? 16 : 12
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A publisher for when moving the carousel. Passes parameters selectedGroupIndex (position).
|
/// A publisher for when moving the carousel. Passes parameters selectedGroupIndex (position).
|
||||||
@ -215,8 +226,8 @@ open class Carousel: View {
|
|||||||
containerView.addSubview(contentStackView)
|
containerView.addSubview(contentStackView)
|
||||||
|
|
||||||
// Add scrollview
|
// Add scrollview
|
||||||
scrollContainerView.addSubview(scrollView)
|
scrollContainerView.addSubview(collectionView)
|
||||||
scrollView.pinToSuperView()
|
collectionView.pinToSuperView()
|
||||||
|
|
||||||
// Add pagination button icons
|
// Add pagination button icons
|
||||||
scrollContainerView.addSubview(previousButton)
|
scrollContainerView.addSubview(previousButton)
|
||||||
@ -259,14 +270,25 @@ open class Carousel: View {
|
|||||||
/// Used to make changes to the View based off a change events or from local properties.
|
/// Used to make changes to the View based off a change events or from local properties.
|
||||||
open override func updateView() {
|
open override func updateView() {
|
||||||
super.updateView()
|
super.updateView()
|
||||||
|
updateScrollbar()
|
||||||
|
updateCarousel()
|
||||||
|
collectionView.collectionViewLayout.invalidateLayout()
|
||||||
|
collectionView.reloadData()
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Private Methods
|
||||||
|
//--------------------------------------------------
|
||||||
|
private func updateScrollbar() {
|
||||||
carouselScrollBar.numberOfSlides = views.count
|
carouselScrollBar.numberOfSlides = views.count
|
||||||
carouselScrollBar.layout = layout
|
carouselScrollBar.layout = layout
|
||||||
if (carouselScrollBar.position == 0 || carouselScrollBar.position > carouselScrollBar.numberOfSlides) {
|
if (carouselScrollBar.position == 0 || carouselScrollBar.position > carouselScrollBar.numberOfSlides) {
|
||||||
carouselScrollBar.position = 1
|
carouselScrollBar.position = 1
|
||||||
}
|
}
|
||||||
carouselScrollBar.isHidden = (totalPositions() <= 1) ? true : false
|
carouselScrollBar.isHidden = (totalPositions() <= 1) ? true : false
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateCarousel() {
|
||||||
// Mobile/Tablet layouts without peek - must show pagination controls.
|
// Mobile/Tablet layouts without peek - must show pagination controls.
|
||||||
// If peek is ‘none’, pagination controls should show. So set to persistent.
|
// If peek is ‘none’, pagination controls should show. So set to persistent.
|
||||||
if peek == .none {
|
if peek == .none {
|
||||||
@ -284,12 +306,9 @@ open class Carousel: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updatePaginationControls()
|
updatePaginationControls()
|
||||||
addCarouselSlots()
|
updateContainerHeight()
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
// MARK: - Private Methods
|
|
||||||
//--------------------------------------------------
|
|
||||||
private func addlisteners() {
|
private func addlisteners() {
|
||||||
nextButton.onClick = { _ in self.nextButtonClick() }
|
nextButton.onClick = { _ in self.nextButtonClick() }
|
||||||
previousButton.onClick = { _ in self.previousButtonClick() }
|
previousButton.onClick = { _ in self.previousButtonClick() }
|
||||||
@ -365,47 +384,13 @@ open class Carousel: View {
|
|||||||
return height
|
return height
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add carousel slots and load data if any
|
// update carousel size and load data if any
|
||||||
private func addCarouselSlots() {
|
private func updateContainerHeight() {
|
||||||
getSlotWidth()
|
getSlotWidth()
|
||||||
if containerView.frame.size.width > 0 {
|
if containerView.frame.size.width > 0 {
|
||||||
containerViewHeightConstraint?.isActive = false
|
containerViewHeightConstraint?.isActive = false
|
||||||
containerStackHeightConstraint?.isActive = false
|
containerStackHeightConstraint?.isActive = false
|
||||||
let slotHeight = fetchCarouselHeight()
|
let slotHeight = fetchCarouselHeight()
|
||||||
|
|
||||||
// Perform a loop to iterate each subView
|
|
||||||
scrollView.subviews.forEach { subView in
|
|
||||||
// Removing subView from its parent view
|
|
||||||
subView.removeFromSuperview()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add carousel items
|
|
||||||
if views.count > 0 {
|
|
||||||
var xPos = 0.0
|
|
||||||
for index in 0...views.count - 1 {
|
|
||||||
|
|
||||||
// Add Carousel Slot
|
|
||||||
let carouselSlot = View().with {
|
|
||||||
$0.clipsToBounds = true
|
|
||||||
}
|
|
||||||
scrollView.addSubview(carouselSlot)
|
|
||||||
scrollView.delegate = self
|
|
||||||
|
|
||||||
carouselSlot
|
|
||||||
.pinTop()
|
|
||||||
.pinBottom()
|
|
||||||
.pinLeading(xPos)
|
|
||||||
.width(minimumSlotWidth)
|
|
||||||
.height(slotHeight)
|
|
||||||
xPos = xPos + minimumSlotWidth + gutter.value
|
|
||||||
|
|
||||||
let component = views[index]
|
|
||||||
carouselSlot.addSubview(component)
|
|
||||||
setSlotAlignment(contentView: component)
|
|
||||||
}
|
|
||||||
scrollView.contentSize = CGSize(width: xPos - gutter.value, height: slotHeight)
|
|
||||||
}
|
|
||||||
|
|
||||||
let containerHeight = slotHeight + scrollbarTopSpace + containerSize.height
|
let containerHeight = slotHeight + scrollbarTopSpace + containerSize.height
|
||||||
if carouselScrollBar.isHidden {
|
if carouselScrollBar.isHidden {
|
||||||
containerStackHeightConstraint = contentStackView.heightAnchor.constraint(equalToConstant: slotHeight)
|
containerStackHeightConstraint = contentStackView.heightAnchor.constraint(equalToConstant: slotHeight)
|
||||||
@ -419,43 +404,6 @@ open class Carousel: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set slot alignment if provided. Used only when slot content have different heights or widths.
|
|
||||||
private func setSlotAlignment(contentView: UIView) {
|
|
||||||
switch slotAlignment?.vertical {
|
|
||||||
case .top:
|
|
||||||
contentView
|
|
||||||
.pinTop()
|
|
||||||
.pinBottomLessThanOrEqualTo()
|
|
||||||
case .middle:
|
|
||||||
contentView
|
|
||||||
.pinTopGreaterThanOrEqualTo()
|
|
||||||
.pinBottomLessThanOrEqualTo()
|
|
||||||
.pinCenterY()
|
|
||||||
case .bottom:
|
|
||||||
contentView
|
|
||||||
.pinTopGreaterThanOrEqualTo()
|
|
||||||
.pinBottom()
|
|
||||||
default: break
|
|
||||||
}
|
|
||||||
|
|
||||||
switch slotAlignment?.horizontal {
|
|
||||||
case .left:
|
|
||||||
contentView
|
|
||||||
.pinLeading()
|
|
||||||
.pinTrailingLessThanOrEqualTo()
|
|
||||||
case .center:
|
|
||||||
contentView
|
|
||||||
.pinLeadingGreaterThanOrEqualTo()
|
|
||||||
.pinTrailingLessThanOrEqualTo()
|
|
||||||
.pinCenterX()
|
|
||||||
case .right:
|
|
||||||
contentView
|
|
||||||
.pinLeadingGreaterThanOrEqualTo()
|
|
||||||
.pinTrailing()
|
|
||||||
default: break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the slot width relative to the peak
|
// Get the slot width relative to the peak
|
||||||
private func getSlotWidth() {
|
private func getSlotWidth() {
|
||||||
let actualWidth = containerView.frame.size.width
|
let actualWidth = containerView.frame.size.width
|
||||||
@ -505,7 +453,7 @@ open class Carousel: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func updateScrollbarPosition(targetContentOffsetXPos:CGFloat) {
|
private func updateScrollbarPosition(targetContentOffsetXPos:CGFloat) {
|
||||||
let scrollContentSizeWidth = scrollView.contentSize.width
|
let scrollContentSizeWidth = collectionView.contentSize.width
|
||||||
let totalPositions = totalPositions()
|
let totalPositions = totalPositions()
|
||||||
let layoutSpace = Int (floor( Double(scrollContentSizeWidth / Double(totalPositions))))
|
let layoutSpace = Int (floor( Double(scrollContentSizeWidth / Double(totalPositions))))
|
||||||
let remindSpace = Int(targetContentOffsetXPos) % layoutSpace
|
let remindSpace = Int(targetContentOffsetXPos) % layoutSpace
|
||||||
@ -515,10 +463,11 @@ open class Carousel: View {
|
|||||||
updateScrollPosition(position: contentPos, callbackText: "ScrollViewMoved")
|
updateScrollPosition(position: contentPos, callbackText: "ScrollViewMoved")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update scrollview offset relative to scrollbar thumb position
|
// Update collectionview offset relative to scrollbar thumb position
|
||||||
private func updateScrollPosition(position: Int, callbackText: String) {
|
private func updateScrollPosition(position: Int, callbackText: String) {
|
||||||
if carouselScrollBar.numberOfSlides > 0 {
|
if carouselScrollBar.numberOfSlides > 0 {
|
||||||
let scrollContentSizeWidth = scrollView.contentSize.width
|
let scrollContentSizeWidth = collectionView.contentSize.width
|
||||||
|
|
||||||
let totalPositions = totalPositions()
|
let totalPositions = totalPositions()
|
||||||
var xPos = 0.0
|
var xPos = 0.0
|
||||||
if position == 1 {
|
if position == 1 {
|
||||||
@ -536,8 +485,8 @@ open class Carousel: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
carouselScrollBar.scrubberId = position+1
|
carouselScrollBar.scrubberId = position+1
|
||||||
let yPos = scrollView.contentOffset.y
|
let yPos = collectionView.contentOffset.y
|
||||||
scrollView.setContentOffset(CGPoint(x: xPos, y: yPos), animated: true)
|
collectionView.setContentOffset(CGPoint(x: xPos, y: yPos), animated: true)
|
||||||
showPaginationControls()
|
showPaginationControls()
|
||||||
groupIndex = position-1
|
groupIndex = position-1
|
||||||
onChangePublisher.send(groupIndex)
|
onChangePublisher.send(groupIndex)
|
||||||
@ -557,5 +506,35 @@ extension Carousel: UIScrollViewDelegate {
|
|||||||
public func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
|
public func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
|
||||||
updateScrollbarPosition(targetContentOffsetXPos: targetContentOffset.pointee.x)
|
updateScrollbarPosition(targetContentOffsetXPos: targetContentOffset.pointee.x)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
extension Carousel: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - UICollectionView Delegate & Datasource
|
||||||
|
//--------------------------------------------------
|
||||||
|
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||||||
|
views.count
|
||||||
|
}
|
||||||
|
|
||||||
|
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||||||
|
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CarouselSlotCell.identifier, for: indexPath) as? CarouselSlotCell else { return UICollectionViewCell() }
|
||||||
|
let component = views[indexPath.row]
|
||||||
|
cell.update(with: component, slotAlignment: slotAlignment, surface: surface)
|
||||||
|
cell.layoutIfNeeded()
|
||||||
|
//component.setNeedsLayout()
|
||||||
|
if hasDebugBorder {
|
||||||
|
cell.addDebugBorder()
|
||||||
|
} else {
|
||||||
|
cell.removeDebugBorder()
|
||||||
|
}
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
|
||||||
|
return gutter.value
|
||||||
|
}
|
||||||
|
|
||||||
|
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
|
||||||
|
return CGSize(width: minimumSlotWidth, height: fetchCarouselHeight())
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
/// Custom data type for pagination prop for 'Carousel' component.
|
/// Custom data type for pagination prop for 'Carousel' component.
|
||||||
extension Carousel {
|
extension Carousel {
|
||||||
public struct CarouselPaginationModel {
|
public struct CarouselPaginationModel: Equatable {
|
||||||
|
|
||||||
/// Pagination supports Button icon property 'kind'.
|
/// Pagination supports Button icon property 'kind'.
|
||||||
public var kind: ButtonIcon.Kind
|
public var kind: ButtonIcon.Kind
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import Foundation
|
|||||||
extension Carousel {
|
extension Carousel {
|
||||||
|
|
||||||
/// Used only when slot content have different heights or widths.
|
/// Used only when slot content have different heights or widths.
|
||||||
public struct CarouselSlotAlignmentModel {
|
public struct CarouselSlotAlignmentModel: Equatable {
|
||||||
|
|
||||||
/// Used for vertical alignment of slot alignment.
|
/// Used for vertical alignment of slot alignment.
|
||||||
public var vertical: Carousel.Vertical
|
public var vertical: Carousel.Vertical
|
||||||
|
|||||||
85
VDS/Components/Carousel/CarouselSlotCell.swift
Normal file
85
VDS/Components/Carousel/CarouselSlotCell.swift
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
//
|
||||||
|
// CarouselSlotCell.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Kanamarlapudi, Vasavi on 23/08/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
final class CarouselSlotCell: UICollectionViewCell {
|
||||||
|
|
||||||
|
///Identifier for the Calendar Date Cell.
|
||||||
|
static let identifier: String = String(describing: CarouselSlotCell.self)
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Initializers
|
||||||
|
//--------------------------------------------------
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
setUp()
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
super.init(coder: coder)
|
||||||
|
setUp()
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------
|
||||||
|
// MARK: - Private Methods
|
||||||
|
//--------------------------------------------------
|
||||||
|
|
||||||
|
/// Configuring the cell with default setup.
|
||||||
|
private func setUp() {
|
||||||
|
isAccessibilityElement = true
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Updating UI based on data along with surface.
|
||||||
|
func update(with component: UIView, slotAlignment: Carousel.CarouselSlotAlignmentModel?, surface: Surface) {
|
||||||
|
contentView.subviews.forEach { $0.removeFromSuperview() }
|
||||||
|
contentView.addSubview(component)
|
||||||
|
if var surfacedView = component as? Surfaceable {
|
||||||
|
surfacedView.surface = surface
|
||||||
|
}
|
||||||
|
setSlotAlignment(alignment: slotAlignment, contentView: component)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set slot alignment if provided. Used only when slot content have different heights or widths.
|
||||||
|
private func setSlotAlignment(alignment: Carousel.CarouselSlotAlignmentModel?, contentView: UIView) {
|
||||||
|
switch alignment?.vertical {
|
||||||
|
case .top:
|
||||||
|
contentView
|
||||||
|
.pinTop()
|
||||||
|
.pinBottomLessThanOrEqualTo()
|
||||||
|
case .middle:
|
||||||
|
contentView
|
||||||
|
.pinTopGreaterThanOrEqualTo()
|
||||||
|
.pinBottomLessThanOrEqualTo()
|
||||||
|
.pinCenterY()
|
||||||
|
case .bottom:
|
||||||
|
contentView
|
||||||
|
.pinTopGreaterThanOrEqualTo()
|
||||||
|
.pinBottom()
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
|
||||||
|
switch alignment?.horizontal {
|
||||||
|
case .left:
|
||||||
|
contentView
|
||||||
|
.pinLeading()
|
||||||
|
.pinTrailingLessThanOrEqualTo()
|
||||||
|
case .center:
|
||||||
|
contentView
|
||||||
|
.pinLeadingGreaterThanOrEqualTo()
|
||||||
|
.pinTrailingLessThanOrEqualTo()
|
||||||
|
.pinCenterX()
|
||||||
|
case .right:
|
||||||
|
contentView
|
||||||
|
.pinLeadingGreaterThanOrEqualTo()
|
||||||
|
.pinTrailing()
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -44,7 +44,7 @@ open class CheckboxGroup: SelectorGroupBase<CheckboxItem>, SelectorGroupMultiSel
|
|||||||
if let selectorModels {
|
if let selectorModels {
|
||||||
items = selectorModels.enumerated().map { index, model in
|
items = selectorModels.enumerated().map { index, model in
|
||||||
return CheckboxItem().with {
|
return CheckboxItem().with {
|
||||||
$0.isEnabled = !model.disabled
|
$0.isEnabled = model.enabled
|
||||||
$0.surface = model.surface
|
$0.surface = model.surface
|
||||||
$0.inputId = model.inputId
|
$0.inputId = model.inputId
|
||||||
$0.hiddenValue = model.value
|
$0.hiddenValue = model.value
|
||||||
@ -108,10 +108,10 @@ open class CheckboxGroup: SelectorGroupBase<CheckboxItem>, SelectorGroupMultiSel
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension CheckboxGroup {
|
extension CheckboxGroup {
|
||||||
public struct CheckboxItemModel : Surfaceable, Initable, Errorable {
|
public struct CheckboxItemModel : Surfaceable, Initable, Errorable, Equatable {
|
||||||
|
|
||||||
/// Whether this object is disabled or not
|
/// Whether this object is enabled or not
|
||||||
public var disabled: Bool
|
public var enabled: Bool
|
||||||
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
||||||
public var surface: Surface
|
public var surface: Surface
|
||||||
public var inputId: String?
|
public var inputId: String?
|
||||||
@ -128,8 +128,8 @@ extension CheckboxGroup {
|
|||||||
public var showError: Bool
|
public var showError: Bool
|
||||||
public var errorText: String?
|
public var errorText: String?
|
||||||
|
|
||||||
public init(disabled: Bool, surface: Surface = .light, inputId: String? = nil, value: AnyHashable? = nil, accessibileText: String? = nil, labelText: String? = nil, labelTextAttributes: [any LabelAttributeModel]? = nil, childText: String? = nil, childTextAttributes: [any LabelAttributeModel]? = nil, selected: Bool = false, showError: Bool = false, errorText: String? = nil) {
|
public init(enabled: Bool, surface: Surface = .light, inputId: String? = nil, value: AnyHashable? = nil, accessibileText: String? = nil, labelText: String? = nil, labelTextAttributes: [any LabelAttributeModel]? = nil, childText: String? = nil, childTextAttributes: [any LabelAttributeModel]? = nil, selected: Bool = false, showError: Bool = false, errorText: String? = nil) {
|
||||||
self.disabled = disabled
|
self.enabled = enabled
|
||||||
self.surface = surface
|
self.surface = surface
|
||||||
self.inputId = inputId
|
self.inputId = inputId
|
||||||
self.value = value
|
self.value = value
|
||||||
@ -144,7 +144,22 @@ extension CheckboxGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public init() {
|
public init() {
|
||||||
self.init(disabled: false)
|
self.init(enabled: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: CheckboxGroup.CheckboxItemModel, rhs: CheckboxGroup.CheckboxItemModel) -> Bool {
|
||||||
|
lhs.enabled == rhs.enabled
|
||||||
|
&& lhs.surface == rhs.surface
|
||||||
|
&& lhs.inputId == rhs.inputId
|
||||||
|
&& lhs.value == rhs.value
|
||||||
|
&& lhs.accessibileText == rhs.accessibileText
|
||||||
|
&& lhs.labelText == rhs.labelText
|
||||||
|
&& lhs.labelTextAttributes == rhs.labelTextAttributes
|
||||||
|
&& lhs.childText == rhs.childText
|
||||||
|
&& lhs.childTextAttributes == rhs.childTextAttributes
|
||||||
|
&& lhs.selected == rhs.selected
|
||||||
|
&& lhs.showError == rhs.showError
|
||||||
|
&& lhs.errorText == rhs.errorText
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -94,6 +94,12 @@ open class DatePicker: EntryFieldBase<String> {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open override var children: [any ViewProtocol] {
|
||||||
|
var current = super.children
|
||||||
|
current.append(selectedDateLabel)
|
||||||
|
return current
|
||||||
|
}
|
||||||
|
|
||||||
open var calendarIcon = Icon().with {
|
open var calendarIcon = Icon().with {
|
||||||
$0.name = .calendar
|
$0.name = .calendar
|
||||||
$0.size = .medium
|
$0.size = .medium
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import Foundation
|
|||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
extension DatePicker {
|
extension DatePicker {
|
||||||
public struct CalendarModel {
|
public struct CalendarModel: Equatable {
|
||||||
/// If set to true, the calendar will not have a border.
|
/// If set to true, the calendar will not have a border.
|
||||||
public let hideContainerBorder: Bool
|
public let hideContainerBorder: Bool
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension DropdownSelect {
|
extension DropdownSelect {
|
||||||
public struct DropdownOptionModel {
|
public struct DropdownOptionModel: Equatable {
|
||||||
|
|
||||||
/// Text that goes as option to DropdownSelect
|
/// Text that goes as option to DropdownSelect
|
||||||
public var text: String
|
public var text: String
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import Combine
|
|||||||
/// It usually represents a supplementary or utilitarian action. A button icon can stand alone, but often
|
/// It usually represents a supplementary or utilitarian action. A button icon can stand alone, but often
|
||||||
/// exists in a group when there are several actions that can be performed.
|
/// exists in a group when there are several actions that can be performed.
|
||||||
@objc(VDSButtonIcon)
|
@objc(VDSButtonIcon)
|
||||||
open class ButtonIcon: Control, Changeable {
|
open class ButtonIcon: Control, Changeable, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -109,6 +109,8 @@ open class ButtonIcon: Control, Changeable {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [icon] }
|
||||||
|
|
||||||
public var onChangeSubscriber: AnyCancellable?
|
public var onChangeSubscriber: AnyCancellable?
|
||||||
|
|
||||||
///Badge Indicator object used to render for the ButtonIcon.
|
///Badge Indicator object used to render for the ButtonIcon.
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import Foundation
|
|||||||
extension ButtonIcon {
|
extension ButtonIcon {
|
||||||
|
|
||||||
//Model that represents the options available for the Badge Indicator
|
//Model that represents the options available for the Badge Indicator
|
||||||
public struct BadgeIndicatorModel {
|
public struct BadgeIndicatorModel: Equatable {
|
||||||
/// Enum used to describe the badge indicator direction of icon button determining the expand direction.
|
/// Enum used to describe the badge indicator direction of icon button determining the expand direction.
|
||||||
public enum ExpandDirection: String, CaseIterable {
|
public enum ExpandDirection: String, CaseIterable {
|
||||||
case right, center, left
|
case right, center, left
|
||||||
|
|||||||
@ -24,7 +24,7 @@ extension Icon {
|
|||||||
/// let icon = Icon()
|
/// let icon = Icon()
|
||||||
/// icon.name = .foo
|
/// icon.name = .foo
|
||||||
/// ```
|
/// ```
|
||||||
public struct Name: RawRepresentable {
|
public struct Name: RawRepresentable, Equatable {
|
||||||
public typealias RawValue = String
|
public typealias RawValue = String
|
||||||
public var rawValue: String
|
public var rawValue: String
|
||||||
|
|
||||||
|
|||||||
@ -70,6 +70,12 @@ open class InputStepper: EntryFieldBase<Int> {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open override var children: [any ViewProtocol] {
|
||||||
|
var current = super.children
|
||||||
|
current.append(contentsOf: [decrementButton, incrementButton, textLabel])
|
||||||
|
return current
|
||||||
|
}
|
||||||
|
|
||||||
/// If there is a width that is larger than this size's minimumWidth, the input stepper will resize to this width.
|
/// If there is a width that is larger than this size's minimumWidth, the input stepper will resize to this width.
|
||||||
open var controlWidth: ControlWidth? {
|
open var controlWidth: ControlWidth? {
|
||||||
get { _controlWidth }
|
get { _controlWidth }
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import Combine
|
|||||||
/// experience-wide.
|
/// experience-wide.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSNotification)
|
@objc(VDSNotification)
|
||||||
open class Notification: View {
|
open class Notification: View, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -101,6 +101,8 @@ open class Notification: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [typeIcon, closeButton, titleLabel, subTitleLabel, primaryButton, secondaryButton] }
|
||||||
|
|
||||||
/// Icon used for denoting type.
|
/// Icon used for denoting type.
|
||||||
open var typeIcon = Icon().with {
|
open var typeIcon = Icon().with {
|
||||||
$0.name = .infoBold
|
$0.name = .infoBold
|
||||||
|
|||||||
@ -8,12 +8,16 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension Notification {
|
extension Notification {
|
||||||
public struct ButtonModel {
|
public struct ButtonModel: Equatable {
|
||||||
public var text: String
|
public var text: String
|
||||||
public var onClick: (Button) -> ()
|
public var onClick: (Button) -> ()
|
||||||
public init(text: String, onClick: @escaping (Button) -> Void) {
|
public init(text: String, onClick: @escaping (Button) -> Void) {
|
||||||
self.text = text
|
self.text = text
|
||||||
self.onClick = onClick
|
self.onClick = onClick
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: Notification.ButtonModel, rhs: Notification.ButtonModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,8 @@ open class Pagination: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Private Properties
|
// MARK: - Private Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
private let pageChangedSubject = PassthroughSubject<Pagination, Never>()
|
||||||
|
|
||||||
///Maximum component width
|
///Maximum component width
|
||||||
private let maxWidth: CGFloat = 288.0
|
private let maxWidth: CGFloat = 288.0
|
||||||
///Collectionview width anchor
|
///Collectionview width anchor
|
||||||
@ -52,6 +54,8 @@ open class Pagination: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
public var pageChangedPublisher: AnyPublisher<Pagination, Never> { pageChangedSubject.eraseToAnyPublisher() }
|
||||||
|
|
||||||
///Previous button to select previous page
|
///Previous button to select previous page
|
||||||
public let previousButton: PaginationButton = .init(type: .previous)
|
public let previousButton: PaginationButton = .init(type: .previous)
|
||||||
///Next button to select next page
|
///Next button to select next page
|
||||||
@ -145,6 +149,11 @@ open class Pagination: View {
|
|||||||
.sink { [weak self] value in
|
.sink { [weak self] value in
|
||||||
self?.collectionViewWidthAnchor?.constant = value //As cell width is dynamic i.e cell may contain 2 or 3 or 4 charcters. Make sure that all the visible cells are displayed.
|
self?.collectionViewWidthAnchor?.constant = value //As cell width is dynamic i.e cell may contain 2 or 3 or 4 charcters. Make sure that all the visible cells are displayed.
|
||||||
}.store(in: &subscribers)
|
}.store(in: &subscribers)
|
||||||
|
|
||||||
|
pageChangedPublisher.sink { [weak self] control in
|
||||||
|
guard let self else { return }
|
||||||
|
onPageDidSelect?(control.selectedPage)
|
||||||
|
}.store(in: &subscribers)
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func setDefaults() {
|
open override func setDefaults() {
|
||||||
@ -195,6 +204,7 @@ open class Pagination: View {
|
|||||||
let isNextAction = sender == nextButton
|
let isNextAction = sender == nextButton
|
||||||
_selectedPageIndex = if isNextAction { _selectedPageIndex + 1 } else { _selectedPageIndex - 1 }
|
_selectedPageIndex = if isNextAction { _selectedPageIndex + 1 } else { _selectedPageIndex - 1 }
|
||||||
updateSelection()
|
updateSelection()
|
||||||
|
pageChangedSubject.send(self)
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
UIAccessibility.post(notification: .announcement, argument: paginationDescription)
|
UIAccessibility.post(notification: .announcement, argument: paginationDescription)
|
||||||
@ -249,7 +259,7 @@ extension Pagination: UICollectionViewDelegate, UICollectionViewDataSource, UICo
|
|||||||
guard _selectedPageIndex != indexPath.row else { return }
|
guard _selectedPageIndex != indexPath.row else { return }
|
||||||
_selectedPageIndex = indexPath.row
|
_selectedPageIndex = indexPath.row
|
||||||
updateSelection()
|
updateSelection()
|
||||||
onPageDidSelect?(selectedPage)
|
pageChangedSubject.send(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import VDSCoreTokens
|
|||||||
|
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSPriceLockup)
|
@objc(VDSPriceLockup)
|
||||||
open class PriceLockup: View {
|
open class PriceLockup: View, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -90,6 +90,7 @@ open class PriceLockup: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [priceLockupLabel] }
|
||||||
|
|
||||||
/// If true, the component will render as bold.
|
/// If true, the component will render as bold.
|
||||||
open var bold: Bool = false { didSet { setNeedsUpdate() } }
|
open var bold: Bool = false { didSet { setNeedsUpdate() } }
|
||||||
|
|||||||
@ -49,7 +49,7 @@ open class RadioBoxGroup: SelectorGroupBase<RadioBoxItem>, SelectorGroupSingleSe
|
|||||||
$0.subTextAttributes = model.subTextAttributes
|
$0.subTextAttributes = model.subTextAttributes
|
||||||
$0.subTextRight = model.subTextRight
|
$0.subTextRight = model.subTextRight
|
||||||
$0.subTextRightAttributes = model.subTextRightAttributes
|
$0.subTextRightAttributes = model.subTextRightAttributes
|
||||||
$0.isEnabled = !model.disabled
|
$0.isEnabled = model.enabled
|
||||||
$0.inputId = model.inputId
|
$0.inputId = model.inputId
|
||||||
$0.hiddenValue = model.value
|
$0.hiddenValue = model.value
|
||||||
$0.isSelected = model.selected
|
$0.isSelected = model.selected
|
||||||
@ -113,9 +113,9 @@ open class RadioBoxGroup: SelectorGroupBase<RadioBoxItem>, SelectorGroupSingleSe
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension RadioBoxGroup {
|
extension RadioBoxGroup {
|
||||||
public struct RadioBoxItemModel: Surfaceable, Initable, FormFieldable {
|
public struct RadioBoxItemModel: Surfaceable, Initable, FormFieldable, Equatable {
|
||||||
/// Whether this object is disabled or not
|
/// Whether this object is enabled or not
|
||||||
public var disabled: Bool
|
public var enabled: Bool
|
||||||
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
||||||
public var surface: Surface
|
public var surface: Surface
|
||||||
public var inputId: String?
|
public var inputId: String?
|
||||||
@ -134,12 +134,12 @@ extension RadioBoxGroup {
|
|||||||
public var strikethrough: Bool = false
|
public var strikethrough: Bool = false
|
||||||
public var strikethroughAccessibileText: String
|
public var strikethroughAccessibileText: String
|
||||||
|
|
||||||
public init(disabled: Bool, surface: Surface = .light, inputId: String? = nil, value: String? = nil,
|
public init(enabled: Bool, surface: Surface = .light, inputId: String? = nil, value: String? = nil,
|
||||||
text: String = "", textAttributes: [any LabelAttributeModel]? = nil,
|
text: String = "", textAttributes: [any LabelAttributeModel]? = nil,
|
||||||
subText: String? = nil, subTextAttributes: [any LabelAttributeModel]? = nil,
|
subText: String? = nil, subTextAttributes: [any LabelAttributeModel]? = nil,
|
||||||
subTextRight: String? = nil, subTextRightAttributes: [any LabelAttributeModel]? = nil,
|
subTextRight: String? = nil, subTextRightAttributes: [any LabelAttributeModel]? = nil,
|
||||||
selected: Bool = false, errorText: String? = nil, accessibileText: String? = nil, strikethrough: Bool = false, strikethroughAccessibileText: String = "not available") {
|
selected: Bool = false, errorText: String? = nil, accessibileText: String? = nil, strikethrough: Bool = false, strikethroughAccessibileText: String = "not available") {
|
||||||
self.disabled = disabled
|
self.enabled = enabled
|
||||||
self.surface = surface
|
self.surface = surface
|
||||||
self.inputId = inputId
|
self.inputId = inputId
|
||||||
self.value = value
|
self.value = value
|
||||||
@ -156,7 +156,24 @@ extension RadioBoxGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public init() {
|
public init() {
|
||||||
self.init(disabled: false)
|
self.init(enabled: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: RadioBoxGroup.RadioBoxItemModel, rhs: RadioBoxGroup.RadioBoxItemModel) -> Bool {
|
||||||
|
lhs.enabled == rhs.enabled
|
||||||
|
&& lhs.surface == rhs.surface
|
||||||
|
&& lhs.inputId == rhs.inputId
|
||||||
|
&& lhs.value == rhs.value
|
||||||
|
&& lhs.accessibileText == rhs.accessibileText
|
||||||
|
&& lhs.text == rhs.text
|
||||||
|
&& lhs.textAttributes == rhs.textAttributes
|
||||||
|
&& lhs.subText == rhs.subText
|
||||||
|
&& lhs.subTextAttributes == rhs.subTextAttributes
|
||||||
|
&& lhs.subTextRight == rhs.subTextRight
|
||||||
|
&& lhs.subTextRightAttributes == rhs.subTextRightAttributes
|
||||||
|
&& lhs.selected == rhs.selected
|
||||||
|
&& lhs.strikethrough == rhs.strikethrough
|
||||||
|
&& lhs.strikethroughAccessibileText == rhs.strikethroughAccessibileText
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import VDSCoreTokens
|
|||||||
/// that are used within a ``RadioBoxGroup``.
|
/// that are used within a ``RadioBoxGroup``.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSRadioBoxItem)
|
@objc(VDSRadioBoxItem)
|
||||||
open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable {
|
open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -53,6 +53,8 @@ open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [textLabel, subTextLabel, subTextRightLabel, selectorView] }
|
||||||
|
|
||||||
open var onChangeSubscriber: AnyCancellable?
|
open var onChangeSubscriber: AnyCancellable?
|
||||||
|
|
||||||
/// Label used to render the text.
|
/// Label used to render the text.
|
||||||
|
|||||||
@ -43,7 +43,7 @@ open class RadioButtonGroup: SelectorGroupBase<RadioButtonItem>, SelectorGroupSi
|
|||||||
if let selectorModels {
|
if let selectorModels {
|
||||||
items = selectorModels.enumerated().map { index, model in
|
items = selectorModels.enumerated().map { index, model in
|
||||||
return RadioButtonItem().with {
|
return RadioButtonItem().with {
|
||||||
$0.isEnabled = !model.disabled
|
$0.isEnabled = model.enabled
|
||||||
$0.surface = model.surface
|
$0.surface = model.surface
|
||||||
$0.inputId = model.inputId
|
$0.inputId = model.inputId
|
||||||
$0.hiddenValue = model.value
|
$0.hiddenValue = model.value
|
||||||
@ -103,10 +103,10 @@ open class RadioButtonGroup: SelectorGroupBase<RadioButtonItem>, SelectorGroupSi
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension RadioButtonGroup {
|
extension RadioButtonGroup {
|
||||||
public struct RadioButtonItemModel: Surfaceable, Initable, FormFieldable, Errorable {
|
public struct RadioButtonItemModel: Surfaceable, Initable, FormFieldable, Errorable, Equatable {
|
||||||
|
|
||||||
/// Whether this object is disabled or not
|
/// Whether this object is enabled or not
|
||||||
public var disabled: Bool
|
public var enabled: Bool
|
||||||
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
||||||
public var surface: Surface
|
public var surface: Surface
|
||||||
public var inputId: String?
|
public var inputId: String?
|
||||||
@ -123,8 +123,8 @@ extension RadioButtonGroup {
|
|||||||
public var showError: Bool
|
public var showError: Bool
|
||||||
public var errorText: String?
|
public var errorText: String?
|
||||||
|
|
||||||
public init(disabled: Bool, surface: Surface = .light, inputId: String? = nil, value: AnyHashable? = nil, accessibileText: String? = nil, labelText: String? = nil, labelTextAttributes: [any LabelAttributeModel]? = nil, childText: String? = nil, childTextAttributes: [any LabelAttributeModel]? = nil, selected: Bool = false, showError: Bool = false, errorText: String? = nil) {
|
public init(enabled: Bool, surface: Surface = .light, inputId: String? = nil, value: AnyHashable? = nil, accessibileText: String? = nil, labelText: String? = nil, labelTextAttributes: [any LabelAttributeModel]? = nil, childText: String? = nil, childTextAttributes: [any LabelAttributeModel]? = nil, selected: Bool = false, showError: Bool = false, errorText: String? = nil) {
|
||||||
self.disabled = disabled
|
self.enabled = enabled
|
||||||
self.surface = surface
|
self.surface = surface
|
||||||
self.inputId = inputId
|
self.inputId = inputId
|
||||||
self.value = value
|
self.value = value
|
||||||
@ -139,7 +139,22 @@ extension RadioButtonGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public init() {
|
public init() {
|
||||||
self.init(disabled: false)
|
self.init(enabled: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: RadioButtonGroup.RadioButtonItemModel, rhs: RadioButtonGroup.RadioButtonItemModel) -> Bool {
|
||||||
|
lhs.enabled == rhs.enabled
|
||||||
|
&& lhs.surface == rhs.surface
|
||||||
|
&& lhs.inputId == rhs.inputId
|
||||||
|
&& lhs.value == rhs.value
|
||||||
|
&& lhs.accessibileText == rhs.accessibileText
|
||||||
|
&& lhs.labelText == rhs.labelText
|
||||||
|
&& lhs.labelTextAttributes == rhs.labelTextAttributes
|
||||||
|
&& lhs.childText == rhs.childText
|
||||||
|
&& lhs.childTextAttributes == rhs.childTextAttributes
|
||||||
|
&& lhs.selected == rhs.selected
|
||||||
|
&& lhs.showError == rhs.showError
|
||||||
|
&& lhs.errorText == rhs.errorText
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import UIKit
|
|||||||
import VDSCoreTokens
|
import VDSCoreTokens
|
||||||
|
|
||||||
/// Model that represent the content of each cell of Table component
|
/// Model that represent the content of each cell of Table component
|
||||||
public struct TableItemModel {
|
public struct TableItemModel: Equatable {
|
||||||
|
|
||||||
public let defaultHeight: CGFloat = 50.0
|
public let defaultHeight: CGFloat = 50.0
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public struct TableRowModel {
|
public struct TableRowModel: Equatable {
|
||||||
|
|
||||||
public var columns: [TableItemModel]
|
public var columns: [TableItemModel]
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension Tabs {
|
extension Tabs {
|
||||||
public struct TabModel {
|
public struct TabModel: Equatable {
|
||||||
|
|
||||||
///Text that goes in the Tab
|
///Text that goes in the Tab
|
||||||
public var text: String
|
public var text: String
|
||||||
@ -24,5 +24,10 @@ extension Tabs {
|
|||||||
self.onClick = onClick
|
self.onClick = onClick
|
||||||
self.width = width
|
self.width = width
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: Tabs.TabModel, rhs: Tabs.TabModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.width == rhs.width
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import VDSCoreTokens
|
|||||||
/// Tabs are organizational components that group content and allow customers to navigate its display. Use them to separate content when the content is related but doesn’t need to be compared.
|
/// Tabs are organizational components that group content and allow customers to navigate its display. Use them to separate content when the content is related but doesn’t need to be compared.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSTabs)
|
@objc(VDSTabs)
|
||||||
open class Tabs: View {
|
open class Tabs: View, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -84,6 +84,8 @@ open class Tabs: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { tabViews }
|
||||||
|
|
||||||
/// A callback when the selectedIndex changes. Passes parameters (tabIndex).
|
/// A callback when the selectedIndex changes. Passes parameters (tabIndex).
|
||||||
open var onTabDidSelect: ((Int) -> Void)?
|
open var onTabDidSelect: ((Int) -> Void)?
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import VDSCoreTokens
|
|||||||
import Combine
|
import Combine
|
||||||
|
|
||||||
/// Base Class used to build out a Input controls.
|
/// Base Class used to build out a Input controls.
|
||||||
open class EntryFieldBase<ValueType>: Control, Changeable, FormFieldInternalValidatable {
|
open class EntryFieldBase<ValueType>: Control, Changeable, FormFieldInternalValidatable, ParentViewProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -155,6 +155,8 @@ open class EntryFieldBase<ValueType>: Control, Changeable, FormFieldInternalVali
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [titleLabel, helperLabel, errorLabel, statusIcon] }
|
||||||
|
|
||||||
/// This is the view that will be wrapped with the border for userInteraction.
|
/// This is the view that will be wrapped with the border for userInteraction.
|
||||||
/// The only subview of this view is the fieldStackView
|
/// The only subview of this view is the fieldStackView
|
||||||
open var containerView = View().with {
|
open var containerView = View().with {
|
||||||
|
|||||||
@ -82,10 +82,25 @@ open class TileContainerBase<PaddingType: DefaultValuing & Valuing>: View where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Enum used to describe the background effect choices used for this component.
|
/// Enum used to describe the background effect choices used for this component.
|
||||||
public enum BackgroundEffect {
|
public enum BackgroundEffect: Equatable {
|
||||||
case transparency
|
case transparency
|
||||||
case gradient(UIColor, UIColor)
|
case gradient(UIColor, UIColor)
|
||||||
case none
|
case none
|
||||||
|
|
||||||
|
public static func == (lhs: TileContainerBase.BackgroundEffect, rhs: TileContainerBase.BackgroundEffect) -> Bool {
|
||||||
|
lhs.description == lhs.description
|
||||||
|
}
|
||||||
|
|
||||||
|
public var description: String {
|
||||||
|
switch self {
|
||||||
|
case .transparency:
|
||||||
|
"transparency"
|
||||||
|
case .gradient(let first, let second):
|
||||||
|
"gradient(\(first), \(second)"
|
||||||
|
case .none:
|
||||||
|
"none"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Enum used to describe the aspect ratios used for this component.
|
/// Enum used to describe the aspect ratios used for this component.
|
||||||
@ -340,21 +355,21 @@ open class TileContainerBase<PaddingType: DefaultValuing & Valuing>: View where
|
|||||||
|
|
||||||
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||||
super.touchesBegan(touches, with: event)
|
super.touchesBegan(touches, with: event)
|
||||||
if let onClickSubscriber {
|
if onClickSubscriber != nil {
|
||||||
isHighlighted = true
|
isHighlighted = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
|
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||||
super.touchesEnded(touches, with: event)
|
super.touchesEnded(touches, with: event)
|
||||||
if let onClickSubscriber {
|
if onClickSubscriber != nil {
|
||||||
isHighlighted = false
|
isHighlighted = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
|
open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||||
super.touchesCancelled(touches, with: event)
|
super.touchesCancelled(touches, with: event)
|
||||||
if let onClickSubscriber {
|
if onClickSubscriber != nil {
|
||||||
isHighlighted = false
|
isHighlighted = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import Combine
|
|||||||
/// function.
|
/// function.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSTilelet)
|
@objc(VDSTilelet)
|
||||||
open class Tilelet: TileContainerBase<Tilelet.Padding> {
|
open class Tilelet: TileContainerBase<Tilelet.Padding>, ParentViewProtocol {
|
||||||
|
|
||||||
/// Enum used to describe the padding choices used for this component.
|
/// Enum used to describe the padding choices used for this component.
|
||||||
public enum Padding: String, DefaultValuing, Valuing, CaseIterable {
|
public enum Padding: String, DefaultValuing, Valuing, CaseIterable {
|
||||||
@ -110,6 +110,8 @@ open class Tilelet: TileContainerBase<Tilelet.Padding> {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [badge, titleLockup, descriptiveIcon, directionalIcon] }
|
||||||
|
|
||||||
/// Title lockup positioned in the contentView.
|
/// Title lockup positioned in the contentView.
|
||||||
open var titleLockup = TitleLockup().with {
|
open var titleLockup = TitleLockup().with {
|
||||||
$0.standardStyleConfiguration = .init(styleConfigurations: [
|
$0.standardStyleConfiguration = .init(styleConfigurations: [
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import UIKit
|
|||||||
extension Tilelet {
|
extension Tilelet {
|
||||||
|
|
||||||
/// Model that represents the options available for the badge.
|
/// Model that represents the options available for the badge.
|
||||||
public struct BadgeModel {
|
public struct BadgeModel: Equatable {
|
||||||
/// Text that will be used for the badge.
|
/// Text that will be used for the badge.
|
||||||
public var text: String = ""
|
public var text: String = ""
|
||||||
|
|
||||||
|
|||||||
@ -32,7 +32,7 @@ extension Tilelet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Model that represents the options available for the descriptive icon.
|
/// Model that represents the options available for the descriptive icon.
|
||||||
public struct DescriptiveIcon {
|
public struct DescriptiveIcon: Equatable {
|
||||||
/// A representation that will be used to render the icon with corresponding name.
|
/// A representation that will be used to render the icon with corresponding name.
|
||||||
public var name: Icon.Name
|
public var name: Icon.Name
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ extension Tilelet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Model that represents the options available for the directional icon.
|
/// Model that represents the options available for the directional icon.
|
||||||
public struct DirectionalIcon {
|
public struct DirectionalIcon: Equatable {
|
||||||
public enum IconType: String, CaseIterable {
|
public enum IconType: String, CaseIterable {
|
||||||
case rightArrow
|
case rightArrow
|
||||||
case externalLink
|
case externalLink
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
extension Tilelet {
|
extension Tilelet {
|
||||||
/// Model that represents the options available for the sub title label.
|
/// Model that represents the options available for the sub title label.
|
||||||
public struct SubTitleModel {
|
public struct SubTitleModel: Equatable {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Enums
|
// MARK: - Enums
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -67,5 +67,13 @@ extension Tilelet {
|
|||||||
textAttributes: textAttributes,
|
textAttributes: textAttributes,
|
||||||
lineBreakMode: lineBreakMode)
|
lineBreakMode: lineBreakMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: Tilelet.SubTitleModel, rhs: Tilelet.SubTitleModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.textColor == rhs.textColor
|
||||||
|
&& lhs.otherStandardStyle == rhs.otherStandardStyle
|
||||||
|
&& lhs.textAttributes == rhs.textAttributes
|
||||||
|
&& lhs.lineBreakMode == rhs.lineBreakMode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
extension Tilelet {
|
extension Tilelet {
|
||||||
/// Model that represents the options available for the title label.
|
/// Model that represents the options available for the title label.
|
||||||
public struct TitleModel {
|
public struct TitleModel: Equatable {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Enums
|
// MARK: - Enums
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -75,5 +75,14 @@ extension Tilelet {
|
|||||||
standardStyle: standardStyle.value,
|
standardStyle: standardStyle.value,
|
||||||
lineBreakMode: lineBreakMode)
|
lineBreakMode: lineBreakMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: Tilelet.TitleModel, rhs: Tilelet.TitleModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.textColor == rhs.textColor
|
||||||
|
&& lhs.isBold == rhs.isBold
|
||||||
|
&& lhs.textAttributes == rhs.textAttributes
|
||||||
|
&& lhs.standardStyle == rhs.standardStyle
|
||||||
|
&& lhs.lineBreakMode == rhs.lineBreakMode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import UIKit
|
|||||||
extension Tilelet {
|
extension Tilelet {
|
||||||
|
|
||||||
/// Model that represents the options available for the eyebrow label.
|
/// Model that represents the options available for the eyebrow label.
|
||||||
public struct EyebrowModel {
|
public struct EyebrowModel: Equatable {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -60,5 +60,14 @@ extension Tilelet {
|
|||||||
standardStyle: standardStyle.value,
|
standardStyle: standardStyle.value,
|
||||||
textAttributes: textAttributes)
|
textAttributes: textAttributes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static func == (lhs: Tilelet.EyebrowModel, rhs: Tilelet.EyebrowModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.textColor == rhs.textColor
|
||||||
|
&& lhs.isBold == rhs.isBold
|
||||||
|
&& lhs.textAttributes == rhs.textAttributes
|
||||||
|
&& lhs.standardStyle == rhs.standardStyle
|
||||||
|
&& lhs.lineBreakMode == rhs.lineBreakMode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import Combine
|
|||||||
/// with approved built in text size configurations.
|
/// with approved built in text size configurations.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSTitleLockup)
|
@objc(VDSTitleLockup)
|
||||||
open class TitleLockup: View {
|
open class TitleLockup: View, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -62,6 +62,8 @@ open class TitleLockup: View {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [eyebrowLabel, titleLabel, subTitleLabel] }
|
||||||
|
|
||||||
/// Aligns TitleLockup's subcomponent's text
|
/// Aligns TitleLockup's subcomponent's text
|
||||||
open var textAlignment: TextAlignment = .left { didSet { setNeedsUpdate() } }
|
open var textAlignment: TextAlignment = .left { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import Foundation
|
|||||||
|
|
||||||
extension TitleLockup {
|
extension TitleLockup {
|
||||||
/// Model that represents the options available for the eyebrow label.
|
/// Model that represents the options available for the eyebrow label.
|
||||||
public struct EyebrowModel {
|
public struct EyebrowModel: Equatable {
|
||||||
/// Text that will be used for the eyebrow label.
|
/// Text that will be used for the eyebrow label.
|
||||||
public var text: String
|
public var text: String
|
||||||
|
|
||||||
@ -44,6 +44,15 @@ extension TitleLockup {
|
|||||||
|
|
||||||
/// Text style that will be used for the eyebrow label.
|
/// Text style that will be used for the eyebrow label.
|
||||||
public var textStyle: TextStyle { isBold ? standardStyle.value.bold : standardStyle.value.regular }
|
public var textStyle: TextStyle { isBold ? standardStyle.value.bold : standardStyle.value.regular }
|
||||||
|
|
||||||
|
public static func == (lhs: TitleLockup.EyebrowModel, rhs: TitleLockup.EyebrowModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.textColor == rhs.textColor
|
||||||
|
&& lhs.isBold == rhs.isBold
|
||||||
|
&& lhs.standardStyle == rhs.standardStyle
|
||||||
|
&& lhs.textAttributes == rhs.textAttributes
|
||||||
|
&& lhs.numberOfLines == rhs.numberOfLines
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -46,6 +46,14 @@ extension TitleLockup {
|
|||||||
/// TextStyle used to render the text.
|
/// TextStyle used to render the text.
|
||||||
public var textStyle: TextStyle { otherStandardStyle.value.regular }
|
public var textStyle: TextStyle { otherStandardStyle.value.regular }
|
||||||
|
|
||||||
|
public static func == (lhs: TitleLockup.SubTitleModel, rhs: TitleLockup.SubTitleModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.textColor == rhs.textColor
|
||||||
|
&& lhs.otherStandardStyle == rhs.otherStandardStyle
|
||||||
|
&& lhs.textAttributes == rhs.textAttributes
|
||||||
|
&& lhs.lineBreakMode == rhs.lineBreakMode
|
||||||
|
&& lhs.numberOfLines == rhs.numberOfLines
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import UIKit
|
|||||||
|
|
||||||
extension TitleLockup {
|
extension TitleLockup {
|
||||||
/// Model that represents the options available for the sub title label.
|
/// Model that represents the options available for the sub title label.
|
||||||
public struct TitleModel {
|
public struct TitleModel: Equatable {
|
||||||
/// Text that will be used for the title label.
|
/// Text that will be used for the title label.
|
||||||
public var text: String
|
public var text: String
|
||||||
|
|
||||||
@ -51,5 +51,14 @@ extension TitleLockup {
|
|||||||
/// TextStyle used to render the text.
|
/// TextStyle used to render the text.
|
||||||
public var textStyle: TextStyle { isBold ? standardStyle.value.bold : standardStyle.value.regular }
|
public var textStyle: TextStyle { isBold ? standardStyle.value.bold : standardStyle.value.regular }
|
||||||
|
|
||||||
|
public static func == (lhs: TitleLockup.TitleModel, rhs: TitleLockup.TitleModel) -> Bool {
|
||||||
|
lhs.text == rhs.text
|
||||||
|
&& lhs.textColor == rhs.textColor
|
||||||
|
&& lhs.isBold == rhs.isBold
|
||||||
|
&& lhs.standardStyle == rhs.standardStyle
|
||||||
|
&& lhs.textAttributes == rhs.textAttributes
|
||||||
|
&& lhs.numberOfLines == rhs.numberOfLines
|
||||||
|
&& lhs.lineBreakMode == rhs.lineBreakMode
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import Combine
|
|||||||
/// or turn off a single option, setting or function.
|
/// or turn off a single option, setting or function.
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSToggle)
|
@objc(VDSToggle)
|
||||||
open class Toggle: Control, Changeable, FormFieldable {
|
open class Toggle: Control, Changeable, FormFieldable, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -90,6 +90,8 @@ open class Toggle: Control, Changeable, FormFieldable {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [toggleView, label] }
|
||||||
|
|
||||||
open var onChangeSubscriber: AnyCancellable?
|
open var onChangeSubscriber: AnyCancellable?
|
||||||
|
|
||||||
/// Actual toggle used in this component.
|
/// Actual toggle used in this component.
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import VDSCoreTokens
|
|||||||
|
|
||||||
@objcMembers
|
@objcMembers
|
||||||
@objc(VDSTooltipDialog)
|
@objc(VDSTooltipDialog)
|
||||||
open class TooltipDialog: View, UIScrollViewDelegate {
|
open class TooltipDialog: View, UIScrollViewDelegate, ParentViewProtocol {
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -55,6 +55,8 @@ open class TooltipDialog: View, UIScrollViewDelegate {
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Public Properties
|
// MARK: - Public Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
open var children: [any ViewProtocol] { [titleLabel, contentLabel] }
|
||||||
|
|
||||||
open var tooltipModel = Tooltip.TooltipModel() { didSet { setNeedsUpdate() } }
|
open var tooltipModel = Tooltip.TooltipModel() { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
open var titleLabel = Label().with { label in
|
open var titleLabel = Label().with { label in
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import UIKit
|
|||||||
extension Tooltip {
|
extension Tooltip {
|
||||||
|
|
||||||
/// Model used to represent the tooltip.
|
/// Model used to represent the tooltip.
|
||||||
public struct TooltipModel {
|
public struct TooltipModel: Equatable {
|
||||||
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
/// Current Surface and this is used to pass down to child objects that implement Surfacable
|
||||||
public var closeButtonText: String
|
public var closeButtonText: String
|
||||||
public var title: String?
|
public var title: String?
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
//
|
|
||||||
// Disabling.swift
|
|
||||||
// VDS
|
|
||||||
//
|
|
||||||
// Created by Matt Bruce on 7/22/22.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
///// Any object that can be disabled, which may change the appearance
|
|
||||||
//public protocol Disabling {
|
|
||||||
// /// Whether this object is disabled or not
|
|
||||||
// var disabled: Bool { get set }
|
|
||||||
//}
|
|
||||||
37
VDS/Protocols/ParentViewProtocol.swift
Normal file
37
VDS/Protocols/ParentViewProtocol.swift
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
//
|
||||||
|
// ParentViewProtocol.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 8/23/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
|
||||||
|
/// This is used in a View or Control to denote subviews of the ViewProtocol
|
||||||
|
/// type, more or less for composite views/controls.
|
||||||
|
public protocol ParentViewProtocol: ViewProtocol {
|
||||||
|
var children: [any ViewProtocol] { get }
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ParentViewProtocol {
|
||||||
|
|
||||||
|
/// This will get all of the children for yourself as well as all
|
||||||
|
/// of the children within the full tree hierarchy.
|
||||||
|
/// - Returns: All children within the hierachy
|
||||||
|
public func getAllChildren() -> [any ViewProtocol] {
|
||||||
|
var allChildren = [any ViewProtocol]()
|
||||||
|
|
||||||
|
func traverse(view: any ViewProtocol) {
|
||||||
|
if let parentView = view as? any ParentViewProtocol {
|
||||||
|
for child in parentView.children {
|
||||||
|
allChildren.append(child)
|
||||||
|
traverse(view: child)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
traverse(view: self)
|
||||||
|
return children
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -38,8 +38,23 @@ extension ViewProtocol {
|
|||||||
public func setNeedsUpdate() {
|
public func setNeedsUpdate() {
|
||||||
if shouldUpdateView {
|
if shouldUpdateView {
|
||||||
shouldUpdateView = false
|
shouldUpdateView = false
|
||||||
|
|
||||||
|
//see if this is a view that has children
|
||||||
|
let parent = self as? any ParentViewProtocol
|
||||||
|
let children = parent?.getAllChildren()
|
||||||
|
//if so turn off the shouldUpdate to keep UI
|
||||||
|
//from blocking
|
||||||
|
children?.forEach{ $0.shouldUpdateView = false }
|
||||||
|
|
||||||
updateView()
|
updateView()
|
||||||
updateAccessibility()
|
updateAccessibility()
|
||||||
|
|
||||||
|
//if so turn on
|
||||||
|
children?.forEach{
|
||||||
|
$0.updateView()
|
||||||
|
$0.updateAccessibility()
|
||||||
|
$0.shouldUpdateView = true
|
||||||
|
}
|
||||||
shouldUpdateView = true
|
shouldUpdateView = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
- CXTDT-597984 - Table - Text wrap
|
- CXTDT-597984 - Table - Text wrap
|
||||||
- CXTDT-586372 - Table - Stripes defect
|
- CXTDT-586372 - Table - Stripes defect
|
||||||
- CXTDT-586383 - Table - Line style
|
- CXTDT-586383 - Table - Line style
|
||||||
|
- CXTDT-603719 - Carousel - Pagination caret icon
|
||||||
|
|
||||||
1.0.72
|
1.0.72
|
||||||
----------------
|
----------------
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user