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.

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