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.

206 lines
6.8 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // TablePickerViewController.swift
  3. // Sipradi
  4. //
  5. // Created by shishir sapkota on 7/25/17.
  6. // Copyright © 2017 Ekbana. All rights reserved.
  7. //
  8. import UIKit
  9. enum PickerTitle: String {
  10. case country = "Country"
  11. case state = "Provience"
  12. case district = "District"
  13. case relation = "Relation"
  14. case transferReasons = "Transfer Reason"
  15. case bank = "Bank"
  16. case branch = "Branch"
  17. case currency = "Currency"
  18. case occupation = "Occupation"
  19. case verificationIdTypes = "Idi Type"
  20. case sourceOfFund = "Source Of Fund"
  21. }
  22. class CountryPickerViewController: UIViewController {
  23. struct Constants {
  24. static let seperatorColor = "#DFDFDF"
  25. static let tintColor = UIColor.red
  26. static let gradientviewLeftColor = UIColor.init(hex: "#FF0000")
  27. static let gradientviewRightColor = UIColor.init(hex: "#9C272D")
  28. }
  29. @IBOutlet weak var titleView: UIView!
  30. @IBOutlet weak var tableVIew: UITableView!
  31. @IBOutlet weak var searchTextField: UITextField!
  32. @IBOutlet weak var titleLabel: UILabel!
  33. @IBOutlet weak var noResultFoundLabel: UILabel!
  34. @IBOutlet weak var mainview: UIView!
  35. var data: [SendMoneyCountryViewModel] = []
  36. var filteredPlaces: [SendMoneyCountryViewModel] = [] {
  37. didSet {
  38. self.tableVIew.reloadData()
  39. self.setNoResultText()
  40. self.filteredPlaces.isEmpty ? (self.noResultFoundLabel.isHidden = false) : (self.noResultFoundLabel.isHidden = true)
  41. }
  42. }
  43. var allowMultipleSelection = false
  44. var allowSelection = true
  45. var doneAction: (([SendMoneyCountryViewModel]) -> ())?
  46. var defaultSelectedData: [SendMoneyCountryViewModel?] = []
  47. var searchText = ""
  48. var type: PickerTitle?
  49. override func viewDidLoad() {
  50. super.viewDidLoad()
  51. self.setupTableView()
  52. self.addGradientView()
  53. self.setupSearchService()
  54. self.setupPlaces()
  55. self.titleView.layer.cornerRadius = 10
  56. self.mainview.layer.cornerRadius = 10
  57. setTitle()
  58. }
  59. private func setNoResultText() {
  60. var text = ""
  61. if let type = self.type {
  62. text = "No matching \(type.rawValue) found for "
  63. } else {
  64. text = "No matching result found for "
  65. }
  66. self.noResultFoundLabel.text = text + "'\(searchText)'"
  67. }
  68. private func setTitle() {
  69. self.titleLabel.text = "Select " + (self.type?.rawValue ?? "Location").capitalized
  70. }
  71. private func setupTableView() {
  72. self.tableVIew.delegate = self
  73. self.tableVIew.dataSource = self
  74. self.tableVIew.separatorColor = UIColor.init(hex: Constants.seperatorColor)
  75. self.tableVIew.allowsMultipleSelection = self.allowMultipleSelection
  76. self.tableVIew.allowsSelection = self.allowSelection
  77. self.noResultFoundLabel.isHidden = true
  78. }
  79. private func setupPlaces() {
  80. self.filteredPlaces = self.data
  81. }
  82. private func setupSearchTextFieldUi() {
  83. let searchIconImageView = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
  84. searchIconImageView.tintColor = Constants.tintColor
  85. self.searchTextField.leftView = searchIconImageView
  86. self.searchTextField.leftViewMode = .always
  87. }
  88. private func setupSearchService() {
  89. self.searchTextField.addTarget(self, action: #selector(self.search(sender:)), for: UIControlEvents.editingChanged)
  90. }
  91. private func addGradientView() {
  92. }
  93. @objc private func search(sender: UITextField) {
  94. let searchString = sender.text!
  95. self.searchText = searchString
  96. if searchString.isEmpty {
  97. self.filteredPlaces = self.data
  98. return
  99. }
  100. self.filteredPlaces = self.data.filter({
  101. return searchString.isEmpty ||
  102. ($0.name ?? "").lowercased().contains(searchString.lowercased())
  103. }).sorted(by: { (a, _) -> Bool in
  104. return (a.name?.lowercased() ?? "").hasPrefix(searchString.lowercased())
  105. })
  106. }
  107. // MARK: IBActions
  108. @IBAction func close(_ sender: Any?) {
  109. let selectedIndexPaths = self.tableVIew.indexPathsForSelectedRows ?? self.tableVIew.indexPathForSelectedRow.map({[$0]})
  110. let selectedData = selectedIndexPaths?.compactMap { indexPath -> SendMoneyCountryViewModel? in
  111. let value = filteredPlaces.elementAt(index: indexPath.row)
  112. return value
  113. }
  114. self.doneAction?(selectedData ?? [])
  115. self.dismiss(animated: true, completion: nil)
  116. }
  117. @IBAction func clear(_ sender: Any) {
  118. self.tableVIew.indexPathsForSelectedRows?.forEach({self.tableVIew.deselectRow(at: $0, animated: true)})
  119. self.tableVIew.indexPathForSelectedRow.map({self.tableVIew.deselectRow(at: $0, animated: true)})
  120. self.defaultSelectedData = []
  121. self.tableVIew.reloadData()
  122. }
  123. @IBAction func dismiss(_ sender: Any) {
  124. self.dismiss(animated: true, completion: nil)
  125. }
  126. }
  127. extension CountryPickerViewController: UITableViewDelegate {
  128. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  129. let cell = tableView.cellForRow(at: indexPath) as! CountryPickerTableViewCell
  130. cell.selectedPlace = self.filteredPlaces.elementAt(index: indexPath.row)
  131. cell.setup()
  132. if !self.allowMultipleSelection {
  133. self.close(nil)
  134. }
  135. }
  136. func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
  137. if let cell = tableView.cellForRow(at: indexPath) as? CountryPickerTableViewCell {
  138. cell.selectedPlace = nil
  139. cell.setup()
  140. } else {
  141. print("something happened here??")
  142. }
  143. }
  144. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  145. return 75
  146. }
  147. }
  148. extension CountryPickerViewController: UITableViewDataSource {
  149. func numberOfSections(in tableView: UITableView) -> Int {
  150. return 1
  151. }
  152. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  153. return filteredPlaces.count
  154. }
  155. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  156. return self.configureImageCell(tableView: tableView, indexPath: indexPath)
  157. }
  158. func configureImageCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
  159. let cell = tableVIew.dequeueReusableCell(withIdentifier: "CountryPickerTableViewCell", for: indexPath) as! CountryPickerTableViewCell
  160. if let _default = self.defaultSelectedData.first {
  161. cell.selectedPlace = _default
  162. }
  163. cell.place = self.filteredPlaces.elementAt(index: indexPath.row)
  164. cell.setup()
  165. return cell
  166. }
  167. }