diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index 3b70fa6..2a48f22 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 1808BEBE2BA4479500129230 /* CarouselScrollbarViewConttroller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1808BEBD2BA4479500129230 /* CarouselScrollbarViewConttroller.swift */; }; 1832AC5B2BA1347B008AE476 /* BreadcrumbsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1832AC5A2BA1347B008AE476 /* BreadcrumbsViewController.swift */; }; 186D13CD2BBA990800986B53 /* DropdownSelectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 186D13CC2BBA990800986B53 /* DropdownSelectViewController.swift */; }; + 18A3F1302BD9332500498E4A /* CalendarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A3F12F2BD9332500498E4A /* CalendarViewController.swift */; }; 445BA07A29C088470036A7C5 /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 445BA07929C088470036A7C5 /* NotificationViewController.swift */; }; 44604AD929CE1CF900E62B51 /* LineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44604AD829CE1CF900E62B51 /* LineViewController.swift */; }; 5FC35BE928D5235A004EBEAC /* ButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FC35BE828D5235A004EBEAC /* ButtonViewController.swift */; }; @@ -130,6 +131,7 @@ 1808BEBD2BA4479500129230 /* CarouselScrollbarViewConttroller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarouselScrollbarViewConttroller.swift; sourceTree = ""; }; 1832AC5A2BA1347B008AE476 /* BreadcrumbsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BreadcrumbsViewController.swift; sourceTree = ""; }; 186D13CC2BBA990800986B53 /* DropdownSelectViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropdownSelectViewController.swift; sourceTree = ""; }; + 18A3F12F2BD9332500498E4A /* CalendarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarViewController.swift; sourceTree = ""; }; 445BA07929C088470036A7C5 /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = ""; }; 44604AD829CE1CF900E62B51 /* LineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineViewController.swift; sourceTree = ""; }; 5FC35BE828D5235A004EBEAC /* ButtonViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonViewController.swift; sourceTree = ""; }; @@ -319,6 +321,7 @@ EAB5FEEE2927E28400998C17 /* ButtonGroupViewController.swift */, EA81410D2A0ED8DC004F60D2 /* ButtonIconViewController.swift */, 5FC35BE828D5235A004EBEAC /* ButtonViewController.swift */, + 18A3F12F2BD9332500498E4A /* CalendarViewController.swift */, 1808BEBD2BA4479500129230 /* CarouselScrollbarViewConttroller.swift */, EA89204D28B67332006B9984 /* CheckBoxGroupViewController.swift */, EAF7F09B2899B92400B287F5 /* CheckboxItemViewController.swift */, @@ -533,6 +536,7 @@ 71B23C312B921D740027F7D9 /* PaginationViewController.swift in Sources */, EAF7F09C2899B92400B287F5 /* CheckboxItemViewController.swift in Sources */, EA0D1C2F2A66CFE900E5C127 /* CheckboxViewController.swift in Sources */, + 18A3F1302BD9332500498E4A /* CalendarViewController.swift in Sources */, EA596ABA2A16B2ED00300C4B /* TabsViewController.swift in Sources */, EA89204E28B67332006B9984 /* CheckBoxGroupViewController.swift in Sources */, EAA5EEAD28EB6924003B3210 /* InputFieldViewController.swift in Sources */, diff --git a/VDSSample/ViewControllers/CalendarViewController.swift b/VDSSample/ViewControllers/CalendarViewController.swift new file mode 100644 index 0000000..6b7b107 --- /dev/null +++ b/VDSSample/ViewControllers/CalendarViewController.swift @@ -0,0 +1,305 @@ +// +// CalendarViewController.swift +// VDSSample +// +// Created by Kanamarlapudi, Vasavi on 19/04/24. +// + +import Foundation +import UIKit +import VDS +import Combine +import VDSTokens + +class CalendarViewController: BaseViewController { + + var containerBorderSwitch = Toggle() + var hideCurrentDateIndicatorSwitch = Toggle() + var transparentBgSwitch = Toggle() + var indicatorOneSwitch = Toggle() + var indicatorTwoSwitch = Toggle() + var indicatorThreeSwitch = Toggle() + var clearActiveDatesSwitch = Toggle() + var clearInactiveDatesSwitch = Toggle() + var activeDatesField = TextField() + var inactiveDatesField = TextField() + var legendOneField = TextField() + var legendTwoField = TextField() + var legendThreeField = TextField() + + private var minDatePicker: UIDatePicker = UIDatePicker() + private var maxDatePicker: UIDatePicker = UIDatePicker() + private var indicatorOnePicker: UIDatePicker = UIDatePicker() + private var indicatorTwoPicker: UIDatePicker = UIDatePicker() + private var indicatorThreePicker: UIDatePicker = UIDatePicker() + private var activeDatePicker: UIDatePicker = UIDatePicker() + private var inactiveDatePicker: UIDatePicker = UIDatePicker() + + var indicators: [CalendarBase.CalendarIndicatorModel] = [] + let indicatorOnePickerTag = 1 + let indicatorTwoPickerTag = 2 + let indicatorThreePickerTag = 3 + let minDatePickerTag = 4 + let maxDatePickerTag = 5 + let activeDatePickerTag = 6 + let inactiveDatePickerTag = 7 + + override func viewDidLoad() { + super.viewDidLoad() + addContentTopView(view: component) + setupPicker() + setupModel() + } + + override func setupForm() { + super.setupForm() + configurePicker(indicatorOnePicker) + indicatorOnePicker.tag = indicatorOnePickerTag + configurePicker(indicatorTwoPicker) + indicatorTwoPicker.tag = indicatorTwoPickerTag + configurePicker(indicatorThreePicker) + indicatorThreePicker.tag = indicatorThreePickerTag + configurePicker(minDatePicker) + minDatePicker.tag = minDatePickerTag + configurePicker(maxDatePicker) + maxDatePicker.tag = maxDatePickerTag + configurePicker(activeDatePicker) + activeDatePicker.tag = activeDatePickerTag + configurePicker(inactiveDatePicker) + inactiveDatePicker.tag = inactiveDatePickerTag + indicators = [ + .init(label: "Due Date", date: indicatorOnePicker.date), + .init(label: "Auto Pay", date: indicatorTwoPicker.date), + .init(label: "Scheduled", date: indicatorThreePicker.date) + ] + + //add form rows + addFormRow(label: "Surface", view: surfacePickerSelectorView) + addFormRow(label: "Hide Container Border", view: containerBorderSwitch) + addFormRow(label: "Hide Current Date Indicator", view: hideCurrentDateIndicatorSwitch) + addFormRow(label: "Min Date", view: minDatePicker) + addFormRow(label: "Max Date", view: maxDatePicker) + addFormRow(label: "Transparent Background", view: transparentBgSwitch) + addFormRow(label: "Active Dates", view: activeDatesField) + addFormRow(label: "Select ActiveDate", view: activeDatePicker) + addFormRow(label: "Clear Active Dates", view: clearActiveDatesSwitch) + addFormRow(label: "Inactive Dates", view: inactiveDatesField) + addFormRow(label: "Select InActiveDate", view: inactiveDatePicker) + addFormRow(label: "Clear Inactive Dates", view: clearInactiveDatesSwitch) + addFormRow(label: "Indicator One", view: indicatorOneSwitch) + addFormRow(label: "Indicator Two", view: indicatorTwoSwitch) + addFormRow(label: "Indicator Three", view: indicatorThreeSwitch) + addFormRow(label: "Legend One", view: legendOneField) + addFormRow(label: "Legend Two", view: legendTwoField) + addFormRow(label: "Legend Three", view: legendThreeField) + addFormRow(label: "Indicator One Date", view: indicatorOnePicker) + addFormRow(label: "Indicator Two Date", view: indicatorTwoPicker) + addFormRow(label: "Indicator Three Date", view: indicatorThreePicker) + activeDatesField.isUserInteractionEnabled = false + inactiveDatesField.isUserInteractionEnabled = false + activeDatesField.isEnabled = false + inactiveDatesField.isEnabled = false + + containerBorderSwitch.onChange = { [weak self] sender in + guard let self else { return } + component.hideContainerBorder = sender.isOn + } + + hideCurrentDateIndicatorSwitch.onChange = { [weak self] sender in + guard let self else { return } + component.hideCurrentDateIndicator = sender.isOn + } + + transparentBgSwitch.onChange = { [weak self] sender in + guard let self else { return } + component.transparentBackground = sender.isOn + } + + clearActiveDatesSwitch.onChange = { [weak self] sender in + guard let self else { return } + if sender.isOn { + activeDatesField.text = "" + component.activeDates = [] + } + } + + clearInactiveDatesSwitch.onChange = { [weak self] sender in + guard let self else { return } + if sender.isOn { + inactiveDatesField.text = "" + component.inactiveDates = [] + } + } + + legendOneField + .textPublisher + .sink { + [weak self] text in + self?.updateIndicatorData(label: text, date: self?.indicatorOnePicker.date, index: 0) + }.store(in: &subscribers) + + legendTwoField + .textPublisher + .sink { + [weak self] text in + self?.updateIndicatorData(label: text, date: self?.indicatorTwoPicker.date, index: 1) + }.store(in: &subscribers) + + legendThreeField + .textPublisher + .sink { + [weak self] text in + self?.updateIndicatorData(label: text, date: self?.indicatorThreePicker.date, index: 2) + }.store(in: &subscribers) + + indicatorOneSwitch.onChange = { [weak self] sender in + guard let self else { return } + if !sender.isOn { + component.indicators.removeAll() + } else { + self.setIndicatorsData() + } + } + + indicatorTwoSwitch.onChange = { [weak self] sender in + guard let self else { return } + if !sender.isOn { + if component.indicators.count > 2 { + component.indicators.removeLast() + component.indicators.removeLast() + } else if component.indicators.count == 2 { + component.indicators.removeLast() + } + } else { + self.setIndicatorsData() + } + + } + + indicatorThreeSwitch.onChange = { [weak self] sender in + guard let self else { return } + if !sender.isOn { + if component.indicators.count > 2 { + component.indicators.removeLast() + } + } else { + self.setIndicatorsData() + } + } + } + + func setupPicker(){ + surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.component.surface = item + self?.contentTopView.backgroundColor = item.color + } + } + + func setupModel() { + component.indicators = indicators + legendOneField.text = "Due Date" + legendTwoField.text = "Auto Pay" + legendThreeField.text = "Scheduled" + indicatorOneSwitch.isOn = true + indicatorTwoSwitch.isOn = true + indicatorThreeSwitch.isOn = true + hideCurrentDateIndicatorSwitch.isOn = false + indicatorOnePicker.date = Calendar.current.date(byAdding: .day, value: 1, to: Date())! + indicatorTwoPicker.date = Calendar.current.date(byAdding: .day, value: 1, to: Date())! + indicatorThreePicker.date = Calendar.current.date(byAdding: .day, value: 1, to: Date())! + updateIndicatorData(label: legendOneField.text ?? "", date: indicatorOnePicker.date, index: 0) + updateIndicatorData(label: legendTwoField.text ?? "", date: indicatorTwoPicker.date, index: 1) + updateIndicatorData(label: legendThreeField.text ?? "", date: indicatorThreePicker.date, index: 2) + } + + func updateIndicatorData(label: String = "", date: Date?, index:Int) { + indicators[index].label = label + indicators[index].date = date ?? Date() + component.indicators = indicators + } + + func setIndicatorsData() { + if indicatorOneSwitch.isOn && indicatorTwoSwitch.isOn && indicatorThreeSwitch.isOn { + component.indicators = [ + .init(label: self.legendOneField.text ?? "", date: indicatorOnePicker.date), + .init(label: self.legendTwoField.text ?? "", date: indicatorTwoPicker.date), + .init(label: self.legendThreeField.text ?? "", date: indicatorThreePicker.date) + ] + } else if indicatorOneSwitch.isOn && indicatorTwoSwitch.isOn && !indicatorThreeSwitch.isOn { + component.indicators = [ + .init(label: self.legendOneField.text ?? "", date: indicatorOnePicker.date), + .init(label: self.legendTwoField.text ?? "", date: indicatorTwoPicker.date), + ] + + } else if indicatorOneSwitch.isOn && !indicatorTwoSwitch.isOn { + component.indicators = [ + .init(label: self.legendOneField.text ?? "", date: indicatorOnePicker.date), + ] + } + } + + func configurePicker(_ sender:UIDatePicker) { + // Set some of UIDatePicker properties + sender.timeZone = NSTimeZone.local + sender.backgroundColor = UIColor.white + + // Add an event to call onDidChangeDate function when value is changed. + sender.addTarget(self, action: #selector(self.datePickerValueChanged(_:)), for: .valueChanged) + } + + @objc func datePickerValueChanged(_ sender: UIDatePicker){ + + // Create date formatter + let dateFormatter: DateFormatter = DateFormatter() + + // Set date format + dateFormatter.dateFormat = "MM/dd/yyyy hh:mm a" + + // Apply date format + // let selectedDate: String = dateFormatter.string(from: sender.date) + // print("Selected value \(selectedDate)") + + switch sender.tag { + case indicatorOnePickerTag: + updateIndicatorData(label: legendOneField.text ?? "", date: sender.date, index: 0) + case indicatorTwoPickerTag: + updateIndicatorData(label: legendTwoField.text ?? "", date: sender.date, index: 1) + case indicatorThreePickerTag: + updateIndicatorData(label: legendThreeField.text ?? "", date: sender.date, index: 2) + case minDatePickerTag: + component.minDate = sender.date + case maxDatePickerTag: + component.maxDate = sender.date + case activeDatePickerTag: + component.activeDates.append(sender.date) + var text = activeDatesField.text + if let textEmpty = text?.isEmpty, textEmpty == true { + text?.append("") + } else { + text?.append(", ") + } + text?.append("\(self.getSelectedDate(with: sender.date))") + clearActiveDatesSwitch.isOn = false + activeDatesField.text = text + case inactiveDatePickerTag: + component.inactiveDates.append(sender.date) + var text = inactiveDatesField.text + if let textEmpty = text?.isEmpty, textEmpty == true { + text?.append("") + } else { + text?.append(", ") + } + text?.append("\(self.getSelectedDate(with: sender.date))") + clearInactiveDatesSwitch.isOn = false + inactiveDatesField.text = text + default: break + } + } + + func getSelectedDate(with date:Date) -> String { + let dateFormatter: DateFormatter = DateFormatter() + dateFormatter.dateFormat = "MM/dd/yyyy" + let day: String = dateFormatter.string(from: date) + return day + } +} diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index 7600428..197db25 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -74,6 +74,7 @@ class MenuViewController: UITableViewController, TooltipLaunchable { MenuComponent(title: "Button", completed: true, viewController: ButtonViewController.self), MenuComponent(title: "ButtonGroup", completed: true, viewController: ButtonGroupViewController.self), MenuComponent(title: "ButtonIcon", completed: true, viewController: ButtonIconViewController.self), + MenuComponent(title: "Calendar", completed: false, viewController: CalendarViewController.self), MenuComponent(title: "Carousel Scrollbar", completed: true, viewController: CarouselScrollbarViewConttroller.self), MenuComponent(title: "Checkbox", completed: true, viewController: CheckboxViewController.self), MenuComponent(title: "CheckboxItem", completed: true, viewController: CheckboxItemViewController.self),