added ParentViewProtocol to views and updated children

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-08-22 16:03:47 -05:00
parent d336b8dfda
commit c41599578a
21 changed files with 69 additions and 30 deletions

View File

@ -31,7 +31,6 @@ public protocol SelectorControlable: Control, Changeable {
@objcMembers @objcMembers
@objc(VDSSelectorBase) @objc(VDSSelectorBase)
open class SelectorBase: Control, SelectorControlable, ParentViewProtocol { open class SelectorBase: Control, SelectorControlable, ParentViewProtocol {
public var children: [any ViewProtocol] { [selectorView] }
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Initializers // MARK: - Initializers
@ -51,6 +50,8 @@ open class SelectorBase: Control, SelectorControlable, ParentViewProtocol {
//-------------------------------------------------- //--------------------------------------------------
// 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() } }

View File

@ -40,7 +40,6 @@ 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, ParentViewProtocol { open class SelectorGroupBase<SelectorItemType: Groupable>: Control, SelectorGroup, Changeable, ParentViewProtocol {
public var children: [any ViewProtocol] { items }
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Private Properties // MARK: - Private Properties
@ -58,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] = [] {

View File

@ -12,7 +12,6 @@ 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, ParentViewProtocol { open class SelectorItemBase<Selector: SelectorBase>: Control, Errorable, Changeable, Groupable, ParentViewProtocol {
public var children: [any ViewProtocol] { [label, childLabel, errorLabel, selectorView] }
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Initializers // MARK: - Initializers
@ -62,7 +61,9 @@ open class SelectorItemBase<Selector: SelectorBase>: Control, Errorable, Changea
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Public Properties // MARK: - Public Properties
//-------------------------------------------------- //--------------------------------------------------
open var onChangeSubscriber: AnyCancellable? open var children: [any ViewProtocol] { [label, childLabel, errorLabel, selectorView] }
open var onChangeSubscriber: AnyCancellable?
/// Label used to render labelText. /// Label used to render labelText.
open var label = Label().with { open var label = Label().with {

View File

@ -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

View File

@ -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)

View File

@ -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() } }

View File

@ -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

View File

@ -31,7 +31,7 @@ open class DropdownSelect: EntryFieldBase<String> {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Public Properties // MARK: - Public Properties
//-------------------------------------------------- //--------------------------------------------------
/// If true, the label will be displayed inside the dropdown containerView. Otherwise, the label will be above the dropdown containerView like a normal text input. /// If true, the label will be displayed inside the dropdown containerView. Otherwise, the label will be above the dropdown containerView like a normal text input.
open var showInlineLabel: Bool = false { didSet { setNeedsUpdate() }} open var showInlineLabel: Bool = false { didSet { setNeedsUpdate() }}

View File

@ -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.

View File

@ -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 }

View File

@ -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

View File

@ -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() } }

View File

@ -15,7 +15,6 @@ import VDSCoreTokens
@objcMembers @objcMembers
@objc(VDSRadioBoxItem) @objc(VDSRadioBoxItem)
open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable, ParentViewProtocol { open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable, ParentViewProtocol {
public var children: [any ViewProtocol] { [textLabel, subTextLabel, subTextRightLabel, selectorView] }
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Initializers // MARK: - Initializers
@ -54,6 +53,8 @@ open class RadioBoxItem: Control, Changeable, FormFieldable, Groupable, ParentVi
//-------------------------------------------------- //--------------------------------------------------
// 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.

View File

@ -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 doesnt 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 doesnt 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)?

View File

@ -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 {

View File

@ -44,7 +44,7 @@ open class TileContainer: TileContainerBase<TileContainer.Padding> {
} }
} }
open class TileContainerBase<PaddingType: DefaultValuing & Valuing>: View where PaddingType.ValueType == CGFloat { open class TileContainerBase<PaddingType: DefaultValuing & Valuing>: View where PaddingType.ValueType == CGFloat {
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Initializers // MARK: - Initializers
@ -122,7 +122,7 @@ open class TileContainerBase<PaddingType: DefaultValuing & Valuing>: View where
//-------------------------------------------------- //--------------------------------------------------
// MARK: - Public Properties // MARK: - Public Properties
//-------------------------------------------------- //--------------------------------------------------
/// This takes an image source url and applies it as a background image. /// This takes an image source url and applies it as a background image.
open var backgroundImage: UIImage? { didSet { setNeedsUpdate() } } open var backgroundImage: UIImage? { didSet { setNeedsUpdate() } }
@ -340,21 +340,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
} }
} }

View File

@ -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: [

View File

@ -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() } }

View File

@ -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.

View File

@ -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

View File

@ -42,15 +42,15 @@ extension ViewProtocol {
public func setNeedsUpdate() { public func setNeedsUpdate() {
if shouldUpdateView { if shouldUpdateView {
shouldUpdateView = false shouldUpdateView = false
//let parent = self as? ParentViewProtocol let parent = self as? ParentViewProtocol
//parent?.children.forEach{ $0.shouldUpdateView = false } parent?.children.forEach{ $0.shouldUpdateView = false }
updateView() updateView()
updateAccessibility() updateAccessibility()
// parent?.children.forEach{ parent?.children.forEach{
// $0.updateView() $0.updateView()
// $0.updateAccessibility() $0.updateAccessibility()
// $0.shouldUpdateView = true $0.shouldUpdateView = true
// } }
shouldUpdateView = true shouldUpdateView = true
} }
} }