From 73caedce5fe4817e30a5a6db31b68793e35d7c88 Mon Sep 17 00:00:00 2001 From: Vasavi Kanamarlapudi Date: Thu, 29 Aug 2024 19:09:22 +0530 Subject: [PATCH] Digital ACT-191 ONEAPP-10586 story: updating content as per configuration --- VDS/Components/Footnote/Footnote.swift | 80 +++++++++++++++++++------- 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/VDS/Components/Footnote/Footnote.swift b/VDS/Components/Footnote/Footnote.swift index 553dda5d..0771333c 100644 --- a/VDS/Components/Footnote/Footnote.swift +++ b/VDS/Components/Footnote/Footnote.swift @@ -10,7 +10,8 @@ import UIKit import VDSCoreTokens import Combine -/// A footnote is text that provides supporting details, legal copy and links to related content. If exists at the bottom or "foot" of a page or section. +/// A footnote is text that provides supporting details, legal copy and links to related content. +/// It exists at the bottom or "foot" of a page or section. @objcMembers @objc(VDSFootnote) open class Footnote: View { @@ -29,7 +30,7 @@ open class Footnote: View { public required init?(coder: NSCoder) { super.init(coder: coder) } - + //-------------------------------------------------- // MARK: - enums //-------------------------------------------------- @@ -98,25 +99,27 @@ open class Footnote: View { case percentage(CGFloat) case value(CGFloat) } - + //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- /// Color to the component. The default kind is Secondary. open var kind: Kind = .defaultValue { didSet { setNeedsUpdate() } } - + /// Size of the component. The default size is Micro. open var size: Size = .defaultValue { didSet { setNeedsUpdate() } } - + /// If hideSymbol true, the component will show text without symbol. open var hideSymbol: Bool = false { didSet { setNeedsUpdate() } } - + /// Size of the component. The default size is Micro. open var symbolType: SymbolType = .defaultValue { didSet { setNeedsUpdate() } } - + /// Text of the footnote item. open var text: String? { didSet { setNeedsUpdate() } } + open var tooltipModel: Tooltip.TooltipModel? { didSet { setNeedsUpdate() } } + /// Any percentage or pixel value and cannot exceed container size.. /// If there is a width that is larger than container size, the footnote will resize to container's width. open var width: Width? { @@ -144,27 +147,32 @@ open class Footnote: View { // MARK: - Private Properties //-------------------------------------------------- private var _width: Width? = nil - - internal var footnoteItem = UIStackView().with { + + private lazy var itemStackView = UIStackView().with { + $0.translatesAutoresizingMaskIntoConstraints = false $0.axis = .horizontal - $0.spacing = VDSLayout.space1X $0.alignment = .top - $0.distribution = .fillEqually + $0.distribution = .fill + $0.spacing = VDSLayout.space1X + $0.backgroundColor = .clear } internal var symbolLabel = Label().with { $0.isAccessibilityElement = true + $0.numberOfLines = 1 + $0.sizeToFit() } - internal var footnoteItemLabel = Label().with { + internal var textLabel = Label().with { $0.isAccessibilityElement = true $0.lineBreakMode = .byWordWrapping } //-------------------------------------------------- - // MARK: - Configuration Properties + // MARK: - Constraints //-------------------------------------------------- - + internal var symbolWidthConstraint: NSLayoutConstraint? + //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- @@ -173,29 +181,61 @@ open class Footnote: View { open override func setup() { super.setup() - addSubview(symbolLabel) - symbolLabel.pinToSuperView() + // add footnote item stackview. + addSubview(itemStackView) + itemStackView.pinToSuperView() + + // add symbol label, text label to stack. + itemStackView.addArrangedSubview(symbolLabel) + itemStackView.addArrangedSubview(textLabel) + itemStackView.setCustomSpacing(VDSLayout.space1X, after: symbolLabel) - addSubview(footnoteItemLabel) - footnoteItemLabel.pinToSuperView() + symbolWidthConstraint = symbolLabel.widthAnchor.constraint(greaterThanOrEqualToConstant: 0) + symbolWidthConstraint?.isActive = true } open override func setDefaults() { super.setDefaults() + hideSymbol = false + text = nil + tooltipModel = nil + width = nil } /// Resets to default settings. open override func reset() { + symbolLabel.reset() + textLabel.reset() super.reset() } /// Used to make changes to the View based off a change events or from local properties. open override func updateView() { super.updateView() + + // Update symbolLabel + symbolWidthConstraint?.isActive = false symbolLabel.text = hideSymbol ? "" : symbolType.text - footnoteItemLabel.text = text + symbolLabel.textColor = kind.colorConfiguration.getColor(self) + symbolLabel.textStyle = size.textStyle.regular symbolLabel.surface = surface - footnoteItemLabel.surface = surface + + // Update symbolLabel width as per updated text size + symbolWidthConstraint = symbolLabel.widthAnchor.constraint(equalToConstant: symbolLabel.intrinsicContentSize.width) + symbolWidthConstraint?.isActive = true + + // Update textLabel + textLabel.text = text + textLabel.textColor = kind.colorConfiguration.getColor(self) + textLabel.textStyle = size.textStyle.regular + textLabel.surface = surface + + // Set the textLabel attributes + if let tooltipModel { + var attributes: [any LabelAttributeModel] = [] + attributes.append(TooltipLabelAttribute(surface: surface, model: tooltipModel, presenter: self)) + textLabel.attributes = attributes + } } }