refactored to use new calendar
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
418b888987
commit
6f17c1b0da
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension Date {
|
public extension Date {
|
||||||
|
|
||||||
static var firstDayOfWeek = Calendar.current.firstWeekday
|
static var firstDayOfWeek = Calendar.current.firstWeekday
|
||||||
|
|
||||||
|
|||||||
@ -52,6 +52,10 @@ open class DatePicker: EntryFieldBase, DatePickerPopoverViewControllerDelegate,
|
|||||||
|
|
||||||
open var selectedDate: Date? { didSet { setNeedsUpdate() } }
|
open var selectedDate: Date? { didSet { setNeedsUpdate() } }
|
||||||
|
|
||||||
|
open var calendarModel: CalendarModel = .init() {
|
||||||
|
didSet { setNeedsUpdate() }
|
||||||
|
}
|
||||||
|
|
||||||
open override var value: String? {
|
open override var value: String? {
|
||||||
get { selectedDateLabel.text }
|
get { selectedDateLabel.text }
|
||||||
set { }
|
set { }
|
||||||
@ -154,14 +158,15 @@ open class DatePicker: EntryFieldBase, DatePickerPopoverViewControllerDelegate,
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal func togglePicker() {
|
internal func togglePicker() {
|
||||||
let calendarVC = DatePickerPopoverViewController(calendar: Calendar(identifier: .gregorian), delegate: self)
|
//let calendarVC = DatePickerPopoverViewController(calendar: Calendar(identifier: .gregorian), delegate: self)
|
||||||
|
let calendarVC = DatePickerPopoverViewController(calendarModel, delegate: self)
|
||||||
calendarVC.modalPresentationStyle = .popover
|
calendarVC.modalPresentationStyle = .popover
|
||||||
calendarVC.selectedDate = selectedDate ?? Date()
|
calendarVC.selectedDate = selectedDate ?? Date()
|
||||||
if let popoverController = calendarVC.popoverPresentationController {
|
if let popoverController = calendarVC.popoverPresentationController {
|
||||||
popoverController.delegate = self
|
popoverController.delegate = self
|
||||||
popoverController.sourceView = containerView
|
popoverController.sourceView = containerView
|
||||||
popoverController.sourceRect = containerView.bounds
|
popoverController.sourceRect = containerView.bounds
|
||||||
popoverController.permittedArrowDirections = .any
|
popoverController.permittedArrowDirections = .up
|
||||||
}
|
}
|
||||||
if let viewController = UIApplication.topViewController() {
|
if let viewController = UIApplication.topViewController() {
|
||||||
viewController.present(calendarVC, animated: true, completion: nil)
|
viewController.present(calendarVC, animated: true, completion: nil)
|
||||||
@ -179,44 +184,160 @@ open class DatePicker: EntryFieldBase, DatePickerPopoverViewControllerDelegate,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protocol DatePickerPopoverViewControllerDelegate: NSObject {
|
extension DatePicker {
|
||||||
func didSelectDate(_ controller: DatePickerPopoverViewController, date: Date)
|
public struct CalendarModel {
|
||||||
}
|
public let surface: Surface
|
||||||
|
|
||||||
class DatePickerPopoverViewController: UIViewController {
|
/// If set to true, the calendar will not have a border.
|
||||||
|
public let hideContainerBorder: Bool
|
||||||
|
|
||||||
private let picker = UIDatePicker()
|
/// If set to true, the calendar will not have current date indication.
|
||||||
weak var delegate: DatePickerPopoverViewControllerDelegate?
|
public let hideCurrentDateIndicator: Bool
|
||||||
|
|
||||||
init(calendar: Calendar, delegate: DatePickerPopoverViewControllerDelegate?) {
|
/// Enable specific days. Pass an array of string value in date format e.g. ['07/21/2024', '07/24/2024', 07/28/2024'].
|
||||||
self.delegate = delegate
|
/// All other dates will be inactive.
|
||||||
super.init(nibName: nil, bundle: nil)
|
public let activeDates: [Date]
|
||||||
picker.datePickerMode = .date
|
|
||||||
picker.preferredDatePickerStyle = .inline
|
|
||||||
picker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)
|
|
||||||
}
|
|
||||||
|
|
||||||
var selectedDate: Date = Date() {
|
/// Disable specific days. Pass an array of string value in date format e.g. ['07/21/2024', '07/24/2024', 07/28/2024'].
|
||||||
didSet {
|
/// All other dates will be active.
|
||||||
picker.date = selectedDate
|
public let inactiveDates: [Date]
|
||||||
|
|
||||||
|
/// If provided, the calendar will allow a selection to be made from this date forward. Defaults to today.
|
||||||
|
public let minDate: Date
|
||||||
|
|
||||||
|
/// If provided, the calendar will allow a selection to be made up to this date.
|
||||||
|
public let maxDate: Date
|
||||||
|
|
||||||
|
/// If provided, this is the date that will show as selected by the Calendar.
|
||||||
|
/// If no value is provided, the current date will be used. If null is provided, no date will be selected.
|
||||||
|
public let selectedDate: Date
|
||||||
|
|
||||||
|
/// Array of ``CalendarIndicatorModel`` you are wanting to show on legend.
|
||||||
|
public let indicators: [CalendarBase.CalendarIndicatorModel]
|
||||||
|
|
||||||
|
public init(surface: Surface = .light,
|
||||||
|
hideContainerBorder: Bool = false,
|
||||||
|
hideCurrentDateIndicator: Bool = false,
|
||||||
|
selectedDate: Date = Date(),
|
||||||
|
activeDates: [Date] = [],
|
||||||
|
inactiveDates: [Date] = [],
|
||||||
|
minDate: Date = Date().startOfMonth,
|
||||||
|
maxDate: Date = Date().endOfMonth,
|
||||||
|
indicators: [CalendarBase.CalendarIndicatorModel] = []) {
|
||||||
|
self.surface = surface
|
||||||
|
self.hideContainerBorder = hideContainerBorder
|
||||||
|
self.hideCurrentDateIndicator = hideCurrentDateIndicator
|
||||||
|
self.selectedDate = selectedDate
|
||||||
|
self.activeDates = activeDates
|
||||||
|
self.inactiveDates = inactiveDates
|
||||||
|
self.minDate = minDate
|
||||||
|
self.maxDate = maxDate
|
||||||
|
self.indicators = indicators
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) {
|
protocol DatePickerPopoverViewControllerDelegate: NSObject {
|
||||||
fatalError("init(coder:) has not been implemented")
|
func didSelectDate(_ controller: DatePicker.DatePickerPopoverViewController, date: Date)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func loadView() {
|
//class DatePickerPopoverViewController: UIViewController {
|
||||||
view = picker
|
//
|
||||||
view.backgroundColor = .white
|
// private let picker = UIDatePicker()
|
||||||
}
|
// weak var delegate: DatePickerPopoverViewControllerDelegate?
|
||||||
|
//
|
||||||
|
// init(calendar: Calendar, delegate: DatePickerPopoverViewControllerDelegate?) {
|
||||||
|
// self.delegate = delegate
|
||||||
|
// super.init(nibName: nil, bundle: nil)
|
||||||
|
// picker.datePickerMode = .date
|
||||||
|
// picker.preferredDatePickerStyle = .inline
|
||||||
|
// picker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// var selectedDate: Date = Date() {
|
||||||
|
// didSet {
|
||||||
|
// picker.date = selectedDate
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// required init?(coder: NSCoder) {
|
||||||
|
// fatalError("init(coder:) has not been implemented")
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// override func viewDidLoad() {
|
||||||
|
// super.viewDidLoad()
|
||||||
|
// let v = UIView().with {
|
||||||
|
// $0.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
// $0.backgroundColor = .white
|
||||||
|
// $0.width(constant: 250)
|
||||||
|
// $0.height(constant: 350)
|
||||||
|
// }
|
||||||
|
// view.addSubview(v)
|
||||||
|
// v.pinTop(25).pinLeading(15).pinTrailing(15).pinBottom(15)
|
||||||
|
//
|
||||||
|
// view.backgroundColor = .blue
|
||||||
|
//
|
||||||
|
// preferredContentSize = CGSize(width: 300, height: 400) // Adjust as needed
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @objc private func dateChanged(_ sender: UIDatePicker) {
|
||||||
|
// delegate?.didSelectDate(self, date: sender.date)
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
extension DatePicker {
|
||||||
|
class DatePickerPopoverViewController: UIViewController {
|
||||||
|
private var padding: CGFloat = 15
|
||||||
|
private var topPadding: CGFloat { 10 + padding }
|
||||||
|
private var calendarModel: CalendarModel
|
||||||
|
private let picker = CalendarBase()
|
||||||
|
weak var delegate: DatePickerPopoverViewControllerDelegate?
|
||||||
|
|
||||||
override func viewDidLoad() {
|
init(_ calendarModel: CalendarModel, delegate: DatePickerPopoverViewControllerDelegate?) {
|
||||||
super.viewDidLoad()
|
self.delegate = delegate
|
||||||
preferredContentSize = CGSize(width: 300, height: 400) // Adjust as needed
|
self.calendarModel = calendarModel
|
||||||
}
|
super.init(nibName: nil, bundle: nil)
|
||||||
|
self.picker.onChangeSelectedDate = { [weak self] date in
|
||||||
|
guard let self else { return }
|
||||||
|
self.delegate?.didSelectDate(self, date: date)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@objc private func dateChanged(_ sender: UIDatePicker) {
|
var selectedDate: Date = Date() {
|
||||||
delegate?.didSelectDate(self, date: sender.date)
|
didSet {
|
||||||
|
picker.selectedDate = selectedDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
view.addSubview(picker)
|
||||||
|
picker.surface = calendarModel.surface
|
||||||
|
picker.hideContainerBorder = calendarModel.hideContainerBorder
|
||||||
|
picker.hideCurrentDateIndicator = calendarModel.hideCurrentDateIndicator
|
||||||
|
picker.activeDates = calendarModel.activeDates
|
||||||
|
picker.inactiveDates = calendarModel.inactiveDates
|
||||||
|
picker.selectedDate = calendarModel.selectedDate
|
||||||
|
picker.indicators = calendarModel.indicators
|
||||||
|
picker.minDate = calendarModel.minDate
|
||||||
|
picker.maxDate = calendarModel.maxDate
|
||||||
|
picker.pinToSuperView(.init(top: topPadding, left: padding, bottom: padding, right: padding))
|
||||||
|
view.backgroundColor = picker.backgroundColor
|
||||||
|
}
|
||||||
|
|
||||||
|
override var preferredContentSize: CGSize {
|
||||||
|
get {
|
||||||
|
var size = picker.containerSize
|
||||||
|
size.height += 40
|
||||||
|
size.width += 30
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
super.preferredContentSize = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user