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.

213 lines
7.3 KiB

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