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.

256 lines
8.5 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
6 years ago
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 StringConstants {
  17. let cancelText = "cancel_text".localized()
  18. let emptyText = "no_result_found_text".localized()
  19. }
  20. struct Constants {
  21. static let seperatorColor = "#DFDFDF"
  22. static let tintColor = UIColor.red
  23. static let gradientviewLeftColor = UIColor.init(hex: "#FF0000")
  24. static let gradientviewRightColor = UIColor.init(hex: "#9C272D")
  25. }
  26. @IBOutlet weak var titleView: UIView!
  27. @IBOutlet weak var tableVIew: UITableView!
  28. @IBOutlet weak var searchTextField: UITextField!
  29. @IBOutlet weak var titleLabel: UILabel!
  30. @IBOutlet weak var noResultFoundLabel: UILabel!
  31. @IBOutlet weak var cancelButton: UIButton!
  32. @IBOutlet weak var mainview: UIView!
  33. var data: [ExchangeRateModel] = []
  34. var filteredPlaces: [ExchangeRateModel] = [] {
  35. didSet {
  36. self.tableVIew.reloadData()
  37. self.setNoResultText()
  38. self.filteredPlaces.isEmpty ? (self.noResultFoundLabel.isHidden = false) : (self.noResultFoundLabel.isHidden = true)
  39. }
  40. }
  41. var allowMultipleSelection = false
  42. var allowSelection = true
  43. var doneAction: (([ExchangeRateModel]) -> ())?
  44. var defaultSelectedData: [ExchangeRateModel] = []
  45. var searchText = ""
  46. var type: TablePickerViewTitle?
  47. override func viewDidLoad() {
  48. super.viewDidLoad()
  49. self.setupTableView()
  50. self.addGradientView()
  51. self.setupSearchService()
  52. // self.setupSearchTextFieldUi()
  53. self.setupPlaces()
  54. self.titleView.layer.cornerRadius = 10
  55. self.mainview.layer.cornerRadius = 10
  56. self.searchTextField.placeholder = (type?.rawValue ?? "").capitalized
  57. self.configureLanguage()
  58. }
  59. private func setNoResultText() {
  60. self.noResultFoundLabel.text = StringConstants().emptyText
  61. }
  62. func configureLanguage() {
  63. // doing doind doingi
  64. setupPlaceholderText()
  65. self.cancelButton.setTitle(StringConstants().cancelText, for: .normal)
  66. setTitle()
  67. }
  68. private func setupPlaceholderText() {
  69. var text = ""
  70. guard let type = type else {return}
  71. switch type {
  72. case .country:
  73. text = "search_country_text".localized()
  74. case .currency:
  75. text = "search_currency_text".localized()
  76. case .district:
  77. text = "search_district_text".localized()
  78. case .state:
  79. text = "search_province_text".localized()
  80. case .relations:
  81. text = "search_relation_text".localized()
  82. }
  83. self.searchTextField.placeholder = text
  84. }
  85. private func setTitle() {
  86. var text = ""
  87. guard let type = type else {return}
  88. switch type {
  89. case .country:
  90. text = "select_country_text".localized()
  91. case .currency:
  92. text = "search_currency_text".localized()
  93. case .district:
  94. text = "select_district_text".localized()
  95. case .state:
  96. text = "province_placeholder_text".localized()
  97. case .relations:
  98. text = "select_relation_text".localized()
  99. }
  100. self.titleLabel.text = text.capitalized
  101. }
  102. private func setupTableView() {
  103. self.tableVIew.delegate = self
  104. self.tableVIew.dataSource = self
  105. self.tableVIew.separatorColor = UIColor.init(hex: Constants.seperatorColor)
  106. self.tableVIew.allowsMultipleSelection = self.allowMultipleSelection
  107. self.tableVIew.allowsSelection = self.allowSelection
  108. self.noResultFoundLabel.isHidden = true
  109. }
  110. private func setupPlaces() {
  111. self.filteredPlaces = self.data
  112. }
  113. private func setupSearchTextFieldUi() {
  114. // #imageLiteral(resourceName: "ic_search")
  115. let searchIconImageView = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
  116. searchIconImageView.tintColor = Constants.tintColor
  117. self.searchTextField.leftView = searchIconImageView
  118. self.searchTextField.leftViewMode = .always
  119. }
  120. private func setupSearchService() {
  121. self.searchTextField.addTarget(self, action: #selector(self.search(sender:)), for: UIControlEvents.editingChanged)
  122. }
  123. private func addGradientView() {
  124. }
  125. @objc private func search(sender: UITextField) {
  126. let searchString = sender.text!
  127. self.searchText = searchString
  128. if searchString.isEmpty {
  129. self.filteredPlaces = self.data
  130. return
  131. }
  132. self.filteredPlaces = self.data.filter({
  133. return searchString.isEmpty ||
  134. ($0.country ?? "").lowercased().contains(searchString.lowercased())
  135. }).sorted(by: { (a, _) -> Bool in
  136. return (a.country?.lowercased() ?? "").hasPrefix(searchString.lowercased())
  137. })
  138. }
  139. // MARK: IBActions
  140. @IBAction func close(_ sender: Any?) {
  141. let selectedIndexPaths = self.tableVIew.indexPathsForSelectedRows ?? self.tableVIew.indexPathForSelectedRow.map({[$0]})
  142. let selectedData = selectedIndexPaths?.compactMap { indexPath -> ExchangeRateModel? in
  143. let value = filteredPlaces.elementAt(index: indexPath.row)
  144. return value
  145. }
  146. self.doneAction?(selectedData ?? [])
  147. self.dismiss(animated: true, completion: nil)
  148. }
  149. @IBAction func clear(_ sender: Any) {
  150. self.tableVIew.indexPathsForSelectedRows?.forEach({self.tableVIew.deselectRow(at: $0, animated: true)})
  151. self.tableVIew.indexPathForSelectedRow.map({self.tableVIew.deselectRow(at: $0, animated: true)})
  152. self.defaultSelectedData = []
  153. self.tableVIew.reloadData()
  154. }
  155. @IBAction func dismiss(_ sender: Any) {
  156. self.dismiss(animated: true, completion: nil)
  157. }
  158. }
  159. extension TablePickerViewController: UITableViewDelegate {
  160. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  161. let cell = tableView.cellForRow(at: indexPath) as! TablePickerTableViewCell
  162. cell.selectedPlace = self.filteredPlaces.elementAt(index: indexPath.row)
  163. cell.setup()
  164. if !self.allowMultipleSelection {
  165. self.close(nil)
  166. }
  167. }
  168. func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
  169. if let cell = tableView.cellForRow(at: indexPath) as? TablePickerTableViewCell {
  170. cell.selectedPlace = nil
  171. cell.setup()
  172. } else {
  173. print("something happened here??")
  174. }
  175. }
  176. func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
  177. // let onlyIndex = (filteredPlaces.elementAt(index: indexPath.row)?.countryCode ?? "")
  178. // if onlyIndex == defaultSelectedData.first?.country ?? "" {
  179. // tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
  180. // }
  181. // if defaultSelectedData.contains(onlyIndex) {
  182. // tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
  183. // }
  184. }
  185. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  186. return 75
  187. }
  188. }
  189. extension TablePickerViewController: UITableViewDataSource {
  190. func numberOfSections(in tableView: UITableView) -> Int {
  191. return 1
  192. }
  193. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  194. return filteredPlaces.count
  195. }
  196. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  197. return self.configureImageCell(tableView: tableView, indexPath: indexPath)
  198. }
  199. func configureImageCell(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
  200. let cell = tableVIew.dequeueReusableCell(withIdentifier: "TablePickerTableViewCell", for: indexPath) as! TablePickerTableViewCell
  201. cell.selectedPlace = self.defaultSelectedData.first
  202. cell.place = self.filteredPlaces.elementAt(index: indexPath.row)
  203. cell.setup()
  204. return cell
  205. // cell.title = filteredPlaces.elementAt(index: indexPath.row)?.country
  206. // let onlyIndex = filteredPlaces[indexPath.row]
  207. // cell.selectedPlaceShortCode = "korea"
  208. }
  209. }