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.4 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
  1. //
  2. // ItemsPickerViewController.swift
  3. //
  4. //
  5. // Created by shishir sapkota
  6. //
  7. import UIKit
  8. class BankBranchPickerViewController: UIViewController {
  9. struct Constants {
  10. static let seperatorColor = "#DFDFDF"
  11. static let tintColor = UIColor.red
  12. static let gradientviewLeftColor = UIColor.init(hex: "#FF0000")
  13. static let gradientviewRightColor = UIColor.init(hex: "#9C272D")
  14. }
  15. @IBOutlet weak var titleView: UIView!
  16. @IBOutlet weak var tableVIew: UITableView!
  17. @IBOutlet weak var searchTextField: UITextField!
  18. @IBOutlet weak var titleLabel: UILabel!
  19. @IBOutlet weak var noResultFoundLabel: UILabel!
  20. @IBOutlet weak var mainview: UIView!
  21. @IBOutlet weak var infoLabel: UILabel!
  22. var data: [SendMoneyBankBranch] = [] {
  23. didSet {
  24. self.tableVIew.reloadData()
  25. }
  26. }
  27. var countryCode: String?
  28. var bankId: String?
  29. var selectedData : SendMoneyBankBranch?
  30. var filteredPlaces: [SendMoneyBankBranch] = [] {
  31. didSet {
  32. self.tableVIew.reloadData()
  33. self.setNoResultText()
  34. self.filteredPlaces.isEmpty ? (self.noResultFoundLabel.isHidden = false) : (self.noResultFoundLabel.isHidden = true)
  35. }
  36. }
  37. var allowMultipleSelection = false
  38. var allowSelection = true
  39. var doneAction: (([SendMoneyBankBranch?]) -> ())?
  40. var defaultSelectedData: [SendMoneyBankBranch?] = []
  41. var searchText = ""
  42. var type: PickerTitle?
  43. override func viewDidLoad() {
  44. super.viewDidLoad()
  45. self.setupTableView()
  46. self.setupSearchService()
  47. self.setupPlaces()
  48. self.setupTarget()
  49. self.titleView.layer.cornerRadius = 10
  50. self.mainview.layer.cornerRadius = 10
  51. setTitle()
  52. self.showProgressHud()
  53. self.fetchBranch(searchString: "")
  54. }
  55. private func setNoResultText() {
  56. var text = ""
  57. if let type = self.type {
  58. text = "No matching \(type.rawValue) found for "
  59. } else {
  60. text = "No matching result found for "
  61. }
  62. self.noResultFoundLabel.text = text + "'\(searchText)'"
  63. }
  64. private func setupTarget() {
  65. self.searchTextField.addTarget(self, action: #selector(self.textChanged(sender:)), for: UIControlEvents.editingChanged)
  66. }
  67. @objc private func textChanged(sender: UITextField) {
  68. let text = sender.text!
  69. self.infoLabel.isHidden = text.count >= 3
  70. }
  71. private func setTitle() {
  72. self.titleLabel.text = "Select " + (self.type?.rawValue ?? "Location").capitalized
  73. }
  74. private func setupPlaces() {
  75. self.filteredPlaces = self.data
  76. }
  77. private func setupTableView() {
  78. self.tableVIew.delegate = self
  79. self.tableVIew.dataSource = self
  80. self.tableVIew.separatorColor = UIColor.init(hex: Constants.seperatorColor)
  81. self.tableVIew.allowsMultipleSelection = self.allowMultipleSelection
  82. self.tableVIew.allowsSelection = self.allowSelection
  83. }
  84. private func setupSearchTextFieldUi() {
  85. let searchIconImageView = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
  86. searchIconImageView.tintColor = Constants.tintColor
  87. self.searchTextField.leftView = searchIconImageView
  88. self.searchTextField.leftViewMode = .always
  89. }
  90. private func setupSearchService() {
  91. self.searchTextField.addTarget(self, action: #selector(self.search(sender:)), for: UIControlEvents.editingChanged)
  92. }
  93. @objc private func search(sender: UITextField) {
  94. let searchString = sender.text!
  95. // make a api call here
  96. guard searchString.count > 2 else {
  97. self.filteredPlaces = []
  98. return
  99. }
  100. fetchBranch(searchString: searchString)
  101. }
  102. private func fetchBranch(searchString: String) {
  103. self.infoLabel.isHidden = true
  104. let countryCode = self.countryCode ?? ""
  105. let bankId = self.bankId ?? ""
  106. self.fetchBranches(countryCode: countryCode, bankId: bankId, branchName: searchString)
  107. }
  108. // MARK: IBActions
  109. @IBAction func close(_ sender: Any?) {
  110. self.doneAction?([self.selectedData])
  111. self.dismiss(animated: true, completion: nil)
  112. }
  113. @IBAction func dismiss(_ sender: Any) {
  114. self.dismiss(animated: true, completion: nil)
  115. }
  116. @IBAction func clear(_ sender: Any) {
  117. self.tableVIew.indexPathsForSelectedRows?.forEach({self.tableVIew.deselectRow(at: $0, animated: true)})
  118. self.tableVIew.indexPathForSelectedRow.map({self.tableVIew.deselectRow(at: $0, animated: true)})
  119. self.defaultSelectedData = []
  120. self.tableVIew.reloadData()
  121. }
  122. }
  123. extension BankBranchPickerViewController: UITableViewDelegate {
  124. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  125. return 75
  126. }
  127. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  128. self.selectedData = filteredPlaces.elementAt(index: indexPath.row)
  129. if !self.allowMultipleSelection {
  130. self.close(nil)
  131. }
  132. }
  133. func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
  134. let cell = tableView.cellForRow(at: indexPath)
  135. cell?.accessoryType = .none
  136. }
  137. }
  138. extension BankBranchPickerViewController: UITableViewDataSource {
  139. func numberOfSections(in tableView: UITableView) -> Int {
  140. return 1
  141. }
  142. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  143. return filteredPlaces.count
  144. }
  145. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  146. let cell = tableVIew.dequeueReusableCell(withIdentifier: "BankBranchPickerCell", for: indexPath) as! BankBranchPickerCell
  147. cell.place = self.filteredPlaces.elementAt(index: indexPath.row)?.name
  148. cell.setup()
  149. return cell
  150. }
  151. }
  152. extension BankBranchPickerViewController: FetchBankBranchService {
  153. func fetchBranches(countryCode: String, bankId: String, branchName: String) {
  154. self.fetchBranch(countryCode: countryCode, bankId: bankId, branchName: branchName, success: { (models) in
  155. self.hideProgressHud()
  156. self.filteredPlaces = models
  157. }) { (error) in
  158. self.hideProgressHud()
  159. self.alert(message: error.localizedDescription)
  160. }
  161. }
  162. }