You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
11 KiB
318 lines
11 KiB
//
|
|
// TablePickerViewController.swift
|
|
//
|
|
//
|
|
// Created by shishir sapkota
|
|
//
|
|
|
|
import UIKit
|
|
|
|
enum PickerTitle: String {
|
|
case country = "Country"
|
|
case state = "Provience"
|
|
case district = "District"
|
|
case relation = "Relation"
|
|
case transferReasons = "Transfer Reason"
|
|
case bank = "Bank"
|
|
case branch = "Branch"
|
|
case currency = "Currency"
|
|
case occupation = "Occupation"
|
|
case verificationIdTypes = "Idi Type"
|
|
case sourceOfFund = "Source Of Fund"
|
|
}
|
|
|
|
class CountryPickerViewController: UIViewController {
|
|
|
|
struct StringConstants {
|
|
let searchPlaceholder = "search_country_text".localized()
|
|
let cancelText = "cancel_text".localized()
|
|
let titleText = "select_country_text".localized()
|
|
let emptyText = "no_result_found_text".localized()
|
|
}
|
|
|
|
struct Constants {
|
|
static let seperatorColor = "#DFDFDF"
|
|
static let tintColor = UIColor.red
|
|
static let gradientviewLeftColor = UIColor.init(hex: "#FF0000")
|
|
static let gradientviewRightColor = UIColor.init(hex: "#9C272D")
|
|
}
|
|
|
|
|
|
@IBOutlet weak var titleView: UIView!
|
|
@IBOutlet weak var tableVIew: UITableView!
|
|
@IBOutlet weak var searchTextField: UITextField!
|
|
@IBOutlet weak var titleLabel: UILabel!
|
|
@IBOutlet weak var noResultFoundLabel: UILabel!
|
|
@IBOutlet weak var cancelButton: UIButton!
|
|
@IBOutlet weak var searchStackView: UIStackView!
|
|
@IBOutlet weak var searchStackViewConstraint: NSLayoutConstraint!
|
|
|
|
@IBOutlet weak var mainview: UIView!
|
|
var isLanguageSelection = false
|
|
|
|
var data: [SendMoneyCountryViewModel] = []
|
|
var filteredPlaces: [SendMoneyCountryViewModel] = [] {
|
|
didSet {
|
|
self.tableVIew.reloadData()
|
|
self.setNoResultText()
|
|
self.filteredPlaces.isEmpty ? (self.noResultFoundLabel.isHidden = false) : (self.noResultFoundLabel.isHidden = true)
|
|
}
|
|
}
|
|
|
|
var allowMultipleSelection = false
|
|
var allowSelection = true
|
|
var doneAction: (([SendMoneyCountryViewModel]) -> ())?
|
|
var defaultSelectedData: [SendMoneyCountryViewModel?] = []
|
|
|
|
var searchText = ""
|
|
var type: PickerTitle?
|
|
|
|
override func viewDidLoad() {
|
|
super.viewDidLoad()
|
|
self.setupTableView()
|
|
self.addGradientView()
|
|
self.setupSearchService()
|
|
self.setupPlaces()
|
|
// self.titleView.layer.cornerRadius = 10
|
|
self.mainview.layer.cornerRadius = 10
|
|
cancelButton.layer.cornerRadius = 10
|
|
isLanguageSelection ? (self.searchStackViewConstraint.constant = 0) : (self.searchStackViewConstraint.constant = 45)
|
|
configureLanguage()
|
|
// setupForAnimation()
|
|
|
|
|
|
}
|
|
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
// self.animate()
|
|
|
|
mainview.bottomToOrigin()
|
|
}
|
|
|
|
|
|
func setupForAnimation() {
|
|
self.tableVIew.transform = CGAffineTransform.init(translationX: 0, y: self.view.frame.height)
|
|
}
|
|
|
|
func animate() {
|
|
UIView.animate(withDuration: 1) {
|
|
self.tableVIew.transform = CGAffineTransform.identity
|
|
}
|
|
guard let tableview = self.tableVIew else {return}
|
|
tableview.reloadData()
|
|
let cells = tableview.visibleCells
|
|
let tableHeight = self.view.bounds.size.height
|
|
|
|
cells.forEach({
|
|
$0.transform = CGAffineTransform(translationX: 0, y: tableHeight)
|
|
})
|
|
|
|
var delayCounter = 0
|
|
|
|
cells.forEach { (cell) in
|
|
UIView.animate(withDuration: 0.4, delay: (Double(delayCounter) * 0.05), usingSpringWithDamping: 0.7, initialSpringVelocity: 0, options: .curveEaseOut, animations: {
|
|
cell.transform = CGAffineTransform.identity
|
|
}, completion: nil)
|
|
delayCounter += 1
|
|
}
|
|
}
|
|
|
|
private func setNoResultText() {
|
|
self.noResultFoundLabel.text = StringConstants().emptyText
|
|
}
|
|
|
|
func configureLanguage() {
|
|
// doing doind doingi
|
|
setupPlaceholderText()
|
|
self.cancelButton.setTitle(StringConstants().cancelText, for: .normal)
|
|
setTitle()
|
|
}
|
|
|
|
|
|
private func setupPlaceholderText() {
|
|
var text = ""
|
|
guard let type = type else {return}
|
|
switch type {
|
|
case .bank:
|
|
text = "search_bank_text".localized()
|
|
case .branch:
|
|
text = "search_branch_text".localized()
|
|
case .country:
|
|
text = "search_country_text".localized()
|
|
case .currency:
|
|
text = "search_currency_text".localized()
|
|
case .district:
|
|
text = "search_district_text".localized()
|
|
case .occupation:
|
|
text = "search_occupation_text".localized()
|
|
case .relation:
|
|
text = "search_relation_text".localized()
|
|
case .sourceOfFund:
|
|
text = "search_source_of_fund".localized()
|
|
case .state:
|
|
text = "search_province_text".localized()
|
|
case .transferReasons:
|
|
text = "search_transfer_reason_text".localized()
|
|
case .verificationIdTypes:
|
|
text = "search_text".localized()
|
|
}
|
|
|
|
self.searchTextField.placeholder = text
|
|
}
|
|
|
|
private func setTitle() {
|
|
var text = ""
|
|
guard let type = type else {return}
|
|
switch type {
|
|
case .bank:
|
|
text = "select_currency_text".localized()
|
|
case .branch:
|
|
text = "select_branch_text".localized()
|
|
case .country:
|
|
text = "select_country_text".localized()
|
|
case .currency:
|
|
text = "search_currency_text".localized()
|
|
case .district:
|
|
text = "select_district_text".localized()
|
|
case .occupation:
|
|
text = "select_occupation_text".localized()
|
|
case .relation:
|
|
text = "select_relation_text".localized()
|
|
case .sourceOfFund:
|
|
text = "select_source_of_fund_text".localized()
|
|
case .state:
|
|
text = "province_placeholder_text".localized()
|
|
case .transferReasons:
|
|
text = "select_transfer_reason_text".localized()
|
|
case .verificationIdTypes:
|
|
text = "verification_id_placeholder_text".localized()
|
|
}
|
|
|
|
self.titleLabel.text = text.capitalized
|
|
}
|
|
|
|
private func setupTableView() {
|
|
self.tableVIew.delegate = self
|
|
self.tableVIew.dataSource = self
|
|
self.tableVIew.separatorColor = UIColor.init(hex: Constants.seperatorColor)
|
|
self.tableVIew.allowsMultipleSelection = self.allowMultipleSelection
|
|
self.tableVIew.allowsSelection = self.allowSelection
|
|
self.noResultFoundLabel.isHidden = true
|
|
}
|
|
|
|
private func setupPlaces() {
|
|
self.filteredPlaces = self.data
|
|
}
|
|
|
|
private func setupSearchTextFieldUi() {
|
|
let searchIconImageView = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
|
|
searchIconImageView.tintColor = Constants.tintColor
|
|
self.searchTextField.leftView = searchIconImageView
|
|
self.searchTextField.leftViewMode = .always
|
|
}
|
|
|
|
|
|
private func setupSearchService() {
|
|
self.searchTextField.addTarget(self, action: #selector(self.search(sender:)), for: UIControlEvents.editingChanged)
|
|
}
|
|
|
|
private func addGradientView() {
|
|
|
|
}
|
|
|
|
@objc private func search(sender: UITextField) {
|
|
let searchString = sender.text!
|
|
self.searchText = searchString
|
|
if searchString.isEmpty {
|
|
self.filteredPlaces = self.data
|
|
return
|
|
}
|
|
self.filteredPlaces = self.data.filter({
|
|
return searchString.isEmpty ||
|
|
($0.name ?? "").lowercased().contains(searchString.lowercased())
|
|
}).sorted(by: { (a, _) -> Bool in
|
|
return (a.name?.lowercased() ?? "").hasPrefix(searchString.lowercased())
|
|
})
|
|
}
|
|
|
|
// MARK: IBActions
|
|
|
|
@IBAction func close(_ sender: Any?) {
|
|
let selectedIndexPaths = self.tableVIew.indexPathsForSelectedRows ?? self.tableVIew.indexPathForSelectedRow.map({[$0]})
|
|
let selectedData = selectedIndexPaths?.compactMap { indexPath -> SendMoneyCountryViewModel? in
|
|
let value = filteredPlaces.elementAt(index: indexPath.row)
|
|
return value
|
|
}
|
|
self.doneAction?(selectedData ?? [])
|
|
self.mainview.originToBottom() {
|
|
self.dismiss(animated: true)
|
|
}
|
|
}
|
|
|
|
@IBAction func clear(_ sender: Any) {
|
|
self.tableVIew.indexPathsForSelectedRows?.forEach({self.tableVIew.deselectRow(at: $0, animated: true)})
|
|
self.tableVIew.indexPathForSelectedRow.map({self.tableVIew.deselectRow(at: $0, animated: true)})
|
|
self.defaultSelectedData = []
|
|
self.tableVIew.reloadData()
|
|
}
|
|
|
|
|
|
@IBAction func dismiss(_ sender: Any) {
|
|
self.dismiss(animated: true, completion: nil)
|
|
}
|
|
}
|
|
|
|
extension CountryPickerViewController: UITableViewDelegate {
|
|
|
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|
let cell = tableView.cellForRow(at: indexPath) as! CountryPickerTableViewCell
|
|
cell.selectedPlace = self.filteredPlaces.elementAt(index: indexPath.row)
|
|
cell.setup()
|
|
if !self.allowMultipleSelection {
|
|
self.close(nil)
|
|
}
|
|
}
|
|
|
|
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
|
|
if let cell = tableView.cellForRow(at: indexPath) as? CountryPickerTableViewCell {
|
|
cell.selectedPlace = nil
|
|
cell.setup()
|
|
} else {
|
|
print("something happened here??")
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
|
return 50
|
|
}
|
|
|
|
}
|
|
|
|
extension CountryPickerViewController: UITableViewDataSource {
|
|
|
|
func numberOfSections(in tableView: UITableView) -> Int {
|
|
return 1
|
|
}
|
|
|
|
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
return filteredPlaces.count
|
|
}
|
|
|
|
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
return self.configureImageCell(tableView: tableView, indexPath: indexPath)
|
|
}
|
|
|
|
func configureImageCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
|
|
let cell = tableVIew.dequeueReusableCell(withIdentifier: "CountryPickerTableViewCell", for: indexPath) as! CountryPickerTableViewCell
|
|
if let _default = self.defaultSelectedData.first {
|
|
cell.selectedPlace = _default
|
|
}
|
|
cell.place = self.filteredPlaces.elementAt(index: indexPath.row)
|
|
cell.setup()
|
|
return cell
|
|
}
|
|
}
|