Digital ACT-191 ONEAPP-7016 story: updating footer with indicators data

This commit is contained in:
vasavk 2024-04-30 11:17:14 +05:30
parent c40ec7204e
commit 7438d65fe5
5 changed files with 230 additions and 16 deletions

View File

@ -18,12 +18,13 @@
18792A902B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18792A8F2B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift */; };
18A3F12A2BD9298900498E4A /* Calendar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A3F1292BD9298900498E4A /* Calendar.swift */; };
18A3F1322BD944E800498E4A /* CalendarDateCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A3F1312BD944E800498E4A /* CalendarDateCollectionViewCell.swift */; };
18A3F1382BDA693000498E4A /* CalendarHeaderReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A3F1372BDA693000498E4A /* CalendarHeaderReusableView.swift */; };
18A65A022B96E848006602CC /* Breadcrumbs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A65A012B96E848006602CC /* Breadcrumbs.swift */; };
18A65A042B96F050006602CC /* BreadcrumbItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A65A032B96F050006602CC /* BreadcrumbItem.swift */; };
18B463A42BBD3C46005C4528 /* DropdownOptionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B463A32BBD3C46005C4528 /* DropdownOptionModel.swift */; };
18BDEE822B75316E00452358 /* ButtonIconChangeLog.txt in Resources */ = {isa = PBXBuildFile; fileRef = 18BDEE812B75316E00452358 /* ButtonIconChangeLog.txt */; };
18FEA1AD2BDD137500A56439 /* CalendarIndicatorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18FEA1AC2BDD137500A56439 /* CalendarIndicatorModel.swift */; };
18FEA1B12BE0B69300A56439 /* CalendarLegendView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18FEA1B02BE0B69300A56439 /* CalendarLegendView.swift */; };
18FEA1B32BE0BC8700A56439 /* CalendarReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18FEA1B22BE0BC8700A56439 /* CalendarReusableView.swift */; };
445BA07829C07B3D0036A7C5 /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 445BA07729C07B3D0036A7C5 /* Notification.swift */; };
44604AD429CE186A00E62B51 /* NotificationButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44604AD329CE186A00E62B51 /* NotificationButtonModel.swift */; };
44604AD729CE196600E62B51 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44604AD629CE196600E62B51 /* Line.swift */; };
@ -211,12 +212,13 @@
18792A8F2B7431F2008C0D29 /* ButtonIconBadgeIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonIconBadgeIndicatorModel.swift; sourceTree = "<group>"; };
18A3F1292BD9298900498E4A /* Calendar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Calendar.swift; sourceTree = "<group>"; };
18A3F1312BD944E800498E4A /* CalendarDateCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarDateCollectionViewCell.swift; sourceTree = "<group>"; };
18A3F1372BDA693000498E4A /* CalendarHeaderReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarHeaderReusableView.swift; sourceTree = "<group>"; };
18A65A012B96E848006602CC /* Breadcrumbs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Breadcrumbs.swift; sourceTree = "<group>"; };
18A65A032B96F050006602CC /* BreadcrumbItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreadcrumbItem.swift; sourceTree = "<group>"; };
18B463A32BBD3C46005C4528 /* DropdownOptionModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropdownOptionModel.swift; sourceTree = "<group>"; };
18BDEE812B75316E00452358 /* ButtonIconChangeLog.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = ButtonIconChangeLog.txt; sourceTree = "<group>"; };
18FEA1AC2BDD137500A56439 /* CalendarIndicatorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarIndicatorModel.swift; sourceTree = "<group>"; };
18FEA1B02BE0B69300A56439 /* CalendarLegendView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarLegendView.swift; sourceTree = "<group>"; };
18FEA1B22BE0BC8700A56439 /* CalendarReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarReusableView.swift; sourceTree = "<group>"; };
445BA07729C07B3D0036A7C5 /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = "<group>"; };
44604AD329CE186A00E62B51 /* NotificationButtonModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationButtonModel.swift; sourceTree = "<group>"; };
44604AD629CE196600E62B51 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
@ -428,8 +430,9 @@
children = (
18A3F1292BD9298900498E4A /* Calendar.swift */,
18A3F1312BD944E800498E4A /* CalendarDateCollectionViewCell.swift */,
18A3F1372BDA693000498E4A /* CalendarHeaderReusableView.swift */,
18FEA1AC2BDD137500A56439 /* CalendarIndicatorModel.swift */,
18FEA1B02BE0B69300A56439 /* CalendarLegendView.swift */,
18FEA1B22BE0BC8700A56439 /* CalendarReusableView.swift */,
);
path = Calendar;
sourceTree = "<group>";
@ -1163,7 +1166,6 @@
71FC86DC2B96F4C800700965 /* PaginationCellItem.swift in Sources */,
EAC846F3294B95CE00F685BA /* ButtonGroupCollectionViewCell.swift in Sources */,
EAF7F0952899861000B287F5 /* CheckboxItem.swift in Sources */,
18A3F1382BDA693000498E4A /* CalendarHeaderReusableView.swift in Sources */,
EA985BE82968951C00F2FF2E /* TileletTitleModel.swift in Sources */,
71FC86DE2B9738B900700965 /* SurfaceConfigurationValue.swift in Sources */,
EA297A5529FB07760031ED56 /* TooltipLabelAttribute.swift in Sources */,
@ -1216,7 +1218,9 @@
EA0B180A2AA78F9000F2D0CD /* UIEdgeInsets.swift in Sources */,
EA985C1D296CD13600F2FF2E /* BundleManager.swift in Sources */,
EA0B18052A9E2D2D00F2D0CD /* SelectorBase.swift in Sources */,
18FEA1B12BE0B69300A56439 /* CalendarLegendView.swift in Sources */,
EAC71A1D2A2E155A00E47A9F /* Checkbox.swift in Sources */,
18FEA1B32BE0BC8700A56439 /* CalendarReusableView.swift in Sources */,
EAF7F0AB289B13FD00B287F5 /* TextStyleLabelAttribute.swift in Sources */,
EAB1D29C28A5618900DAE764 /* RadioButtonGroup.swift in Sources */,
EA81410B2A0E8E3C004F60D2 /* ButtonIcon.swift in Sources */,

View File

@ -62,8 +62,8 @@ open class CalendarBase: View {
/// Array of ``CalendarIndicatorModel`` you are wanting to show on legend.
open var indicators: [CalendarIndicatorModel] = [] { didSet { setNeedsUpdate() } }
/// Array of indicators for the legend.
open var indicatorData: [CalendarIndicatorModel] = [] { didSet { setNeedsUpdate() } }
// /// Array of indicators for the legend.
// open var indicatorData: [CalendarIndicatorModel] = [] { didSet { setNeedsUpdate() } }
/// A callback when the selected date changes..
open var onChangeSelectedDate: ((Date) -> String)?
@ -76,7 +76,7 @@ open class CalendarBase: View {
private let headerHeight = 104.0
private let footerHeight = 56.0
private let items = 35
internal var containerView = View().with {
$0.clipsToBounds = true
}
@ -127,6 +127,11 @@ open class CalendarBase: View {
collectionView.pinToSuperView()
}
open override func updateView() {
super.updateView()
collectionView.reloadData()
}
override open func layoutSubviews() {
super.layoutSubviews()
}
@ -163,7 +168,7 @@ extension CalendarBase: UICollectionViewDelegate, UICollectionViewDataSource, UI
guard let footer = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: CalendarFooterReusableView.identifier, for: indexPath) as? CalendarFooterReusableView else {
return UICollectionReusableView()
}
footer.configure(with: true)
footer.configure(with: indicators)
return footer
}
}

View File

@ -8,7 +8,7 @@
import Foundation
/// Custom data type for indicators prop
extension CalendarBase {
//extension CalendarBase {
public struct CalendarIndicatorModel {
/// Text that shown to an indicator for legend
@ -22,4 +22,4 @@ extension CalendarBase {
self.date = date
}
}
}
//}

View File

@ -0,0 +1,204 @@
//
// CalendarLegendView.swift
// VDS
//
// Created by Kanamarlapudi, Vasavi on 29/04/24.
//
import Foundation
import UIKit
import VDSTokens
import Combine
/// Legend view to show array of indicators as calendar footer view.
open class CalendarLegendView: View {
//--------------------------------------------------
// MARK: - Initializers
//--------------------------------------------------
required public init() {
super.init(frame: .zero)
}
public override init(frame: CGRect) {
super.init(frame: .zero)
}
public required init?(coder: NSCoder) {
super.init(coder: coder)
}
//--------------------------------------------------
// MARK: - Public Properties
//--------------------------------------------------
open var items: [CalendarIndicatorModel] = [] { didSet { setNeedsUpdate() } }
//--------------------------------------------------
// MARK: - Private Properties
//--------------------------------------------------
internal var containerSize: CGSize { CGSize(width: 320, height: 56) } //width:320/328
internal var containerView = View().with {
$0.clipsToBounds = true
}
private let flowLayout = UICollectionViewFlowLayout().with {
$0.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
$0.minimumLineSpacing = VDSLayout.space1X
$0.minimumInteritemSpacing = VDSLayout.space4X
$0.scrollDirection = .vertical
}
open lazy var legendCollectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout).with {
$0.isScrollEnabled = false
$0.translatesAutoresizingMaskIntoConstraints = false
$0.showsVerticalScrollIndicator = false
$0.showsHorizontalScrollIndicator = false
$0.isAccessibilityElement = true
$0.backgroundColor = .clear
$0.delegate = self
$0.dataSource = self
$0.register(LegendCollectionViewCell.self, forCellWithReuseIdentifier: LegendCollectionViewCell.identifier)
}
//--------------------------------------------------
// MARK: - Lifecycle
//--------------------------------------------------
open override func initialSetup() {
super.initialSetup()
}
open override func setup() {
super.setup()
isAccessibilityElement = false
addSubview(containerView)
containerView
.pinTop(VDSLayout.space6X)
.pinBottom(VDSLayout.space4X)
.pinLeadingGreaterThanOrEqualTo(leadingAnchor, VDSLayout.space5X, .defaultLow)
.pinTrailingLessThanOrEqualTo(trailingAnchor, VDSLayout.space5X, .defaultHigh)
.height(containerSize.height)
.width(containerSize.width)
containerView.centerXAnchor.constraint(equalTo: centerXAnchor).activate()
// legend Collection View
containerView.addSubview(legendCollectionView)
legendCollectionView.pinToSuperView()
}
open override func updateView() {
super.updateView()
legendCollectionView.reloadData()
}
override open func layoutSubviews() {
super.layoutSubviews()
}
open override func reset() {
super.reset()
}
}
extension CalendarLegendView: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard collectionView == legendCollectionView,
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: LegendCollectionViewCell.identifier, for: indexPath) as? LegendCollectionViewCell,
indexPath.row <= items.count else { return UICollectionViewCell() }
let text = items[indexPath.row].label
cell.updateTitle(text: text, color: VDSColor.elementsSecondaryOnlight, surface: surface, clearFullcircle: indexPath.row == 1, drawSemiCircle: indexPath.row == 2)
return cell
}
}
private class LegendCollectionViewCell: UICollectionViewCell {
static let identifier: String = String(describing: LegendCollectionViewCell.self)
private let textColorConfiguration = SurfaceColorConfiguration(VDSColor.elementsPrimaryOnlight, VDSColor.elementsPrimaryOndark)
private let indicatorColorConfiguration = SurfaceColorConfiguration(VDSColor.elementsSecondaryOnlight, VDSColor.elementsSecondaryOndark)
private var title = Label().with {
$0.translatesAutoresizingMaskIntoConstraints = false
$0.textAlignment = .left
$0.numberOfLines = 1
$0.textStyle = .bodySmall
$0.backgroundColor = .clear
$0.isAccessibilityElement = false
}
private var legendIndicatorWrapper: View = View().with {
$0.translatesAutoresizingMaskIntoConstraints = false
$0.backgroundColor = .clear
}
private var legendIndicator: View = View().with {
$0.translatesAutoresizingMaskIntoConstraints = false
$0.backgroundColor = .clear
$0.layer.borderWidth = 1.0
}
private lazy var stackView = UIStackView().with {
$0.translatesAutoresizingMaskIntoConstraints = false
$0.distribution = .equalSpacing
$0.spacing = VDSLayout.space2X
$0.axis = .horizontal
$0.backgroundColor = .clear
}
private lazy var shapeLayer = CAShapeLayer()
//--------------------------------------------------
// MARK: - Initializers
//--------------------------------------------------
override init(frame: CGRect) {
super.init(frame: frame)
setupCell()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupCell()
}
func setupCell() {
addSubview(stackView)
stackView.pinToSuperView()
legendIndicatorWrapper.addSubview(legendIndicator)
legendIndicator.pinLeading().pinTrailing().width(8).height(8).pinCenterY()
stackView.addArrangedSubview(legendIndicatorWrapper)
stackView.addArrangedSubview(title)
}
func updateTitle(text: String, color: UIColor, surface: Surface, clearFullcircle: Bool, drawSemiCircle: Bool) {
title.text = text
title.textColor = textColorConfiguration.getColor(surface)
legendIndicator.backgroundColor = drawSemiCircle ? .clear : (clearFullcircle ? .clear : color)
legendIndicator.layer.borderColor = indicatorColorConfiguration.getColor(surface).cgColor
self.layoutIfNeeded()
legendIndicator.layer.cornerRadius = legendIndicator.frame.size.height / 2.0
guard drawSemiCircle else { return }
let center = CGPoint(x: legendIndicator.frame.size.width/2, y: legendIndicator.frame.size.height/2)
let path = UIBezierPath()
path.move(to: center)
path.addArc(withCenter: center, radius: center.x, startAngle: 2 * .pi, endAngle: .pi, clockwise: true)
path.close()
shapeLayer.path = path.cgPath
shapeLayer.fillColor = color.cgColor
guard legendIndicator.layer.sublayers?.contains(shapeLayer) ?? true else { return }
legendIndicator.layer.addSublayer(shapeLayer)
}
}

View File

@ -1,11 +1,12 @@
//
// CalendarHeaderReusableView.swift
// CalendarReusableView.swift
// VDS
//
// Created by Kanamarlapudi, Vasavi on 24/04/24.
//
import UIKit
import VDSTokens
/// Custom header view
class CalendarHeaderReusableView: UICollectionReusableView {
@ -23,7 +24,6 @@ class CalendarHeaderReusableView: UICollectionReusableView {
func configure(with color: Bool) {
// Make a view and make in generic and dynamic
self.backgroundColor = .orange
}
override func layoutSubviews() {
@ -37,6 +37,8 @@ class CalendarFooterReusableView: UICollectionReusableView {
///Identifier for the Calendar Footer Reusable View
static let identifier: String = String(describing: CalendarFooterReusableView.self)
private lazy var footerView = CalendarLegendView()
override init(frame: CGRect) {
super.init(frame: frame)
}
@ -45,13 +47,12 @@ class CalendarFooterReusableView: UICollectionReusableView {
fatalError("init(coder:) has not been implemented")
}
func configure(with color: Bool) {
// Make a view and make in generic and dynamic
self.backgroundColor = .green
func configure(with indicators: [CalendarIndicatorModel]) {
footerView.items = indicators
addSubview(footerView)
}
override func layoutSubviews() {
super.layoutSubviews()
}
}