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.

185 lines
6.1 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
  1. //
  2. // ItemsPickerViewController.swift
  3. //
  4. //
  5. // Created by shishir sapkota
  6. //
  7. import UIKit
  8. class ItemsPickerViewController: 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. var data: [String] = []
  22. var filteredPlaces: [String] = [] {
  23. didSet {
  24. self.tableVIew.reloadData()
  25. self.setNoResultText()
  26. self.filteredPlaces.isEmpty ? (self.noResultFoundLabel.isHidden = false) : (self.noResultFoundLabel.isHidden = true)
  27. }
  28. }
  29. var allowMultipleSelection = false
  30. var allowSelection = true
  31. var doneAction: (([String]) -> ())?
  32. var defaultSelectedData: [String?] = []
  33. var searchText = ""
  34. var type: PickerTitle?
  35. override func viewDidLoad() {
  36. super.viewDidLoad()
  37. self.setupTableView()
  38. self.setupSearchService()
  39. // self.setupSearchTextFieldUi()
  40. self.setupPlaces()
  41. self.titleView.layer.cornerRadius = 10
  42. self.mainview.layer.cornerRadius = 10
  43. setTitle()
  44. }
  45. private func setNoResultText() {
  46. var text = ""
  47. if let type = self.type {
  48. text = "No matching \(type.rawValue) found for "
  49. } else {
  50. text = "No matching result found for "
  51. }
  52. self.noResultFoundLabel.text = text + "'\(searchText)'"
  53. }
  54. private func setTitle() {
  55. self.titleLabel.text = "Select " + (self.type?.rawValue ?? "Location").capitalized
  56. }
  57. private func setupPlaces() {
  58. self.filteredPlaces = self.data
  59. }
  60. private func setupTableView() {
  61. self.tableVIew.delegate = self
  62. self.tableVIew.dataSource = self
  63. self.tableVIew.separatorColor = UIColor.init(hex: Constants.seperatorColor)
  64. self.tableVIew.allowsMultipleSelection = self.allowMultipleSelection
  65. self.tableVIew.allowsSelection = self.allowSelection
  66. }
  67. private func setupSearchTextFieldUi() {
  68. // #imageLiteral(resourceName: "ic_search")
  69. let searchIconImageView = UIImageView(image: #imageLiteral(resourceName: "ic_search"))
  70. searchIconImageView.tintColor = Constants.tintColor
  71. self.searchTextField.leftView = searchIconImageView
  72. self.searchTextField.leftViewMode = .always
  73. }
  74. private func setupSearchService() {
  75. self.searchTextField.addTarget(self, action: #selector(self.search(sender:)), for: UIControlEvents.editingChanged)
  76. }
  77. @objc private func search(sender: UITextField) {
  78. let searchString = sender.text!
  79. self.searchText = searchString
  80. if searchString.isEmpty {
  81. self.filteredPlaces = self.data
  82. return
  83. }
  84. print("searchString : \(searchString), \(filteredPlaces)")
  85. self.filteredPlaces = self.data.filter({
  86. return searchString.isEmpty ||
  87. $0.lowercased().contains(searchString.lowercased())
  88. }).sorted(by: { (a, _) -> Bool in
  89. return (a.lowercased() ?? "").hasPrefix(searchString.lowercased())
  90. })
  91. print("after search")
  92. print(filteredPlaces)
  93. }
  94. // MARK: IBActions
  95. @IBAction func close(_ sender: Any?) {
  96. let selectedIndexPaths = self.tableVIew.indexPathsForSelectedRows ?? self.tableVIew.indexPathForSelectedRow.map({[$0]})
  97. let selectedData = selectedIndexPaths?.flatMap { indexPath -> String? in
  98. let value = data[indexPath.row]
  99. return value
  100. }
  101. self.doneAction?(selectedData ?? [])
  102. self.dismiss(animated: true, completion: nil)
  103. }
  104. @IBAction func dismiss(_ sender: Any) {
  105. self.dismiss(animated: true, completion: nil)
  106. }
  107. @IBAction func clear(_ sender: Any) {
  108. self.tableVIew.indexPathsForSelectedRows?.forEach({self.tableVIew.deselectRow(at: $0, animated: true)})
  109. self.tableVIew.indexPathForSelectedRow.map({self.tableVIew.deselectRow(at: $0, animated: true)})
  110. self.defaultSelectedData = []
  111. self.tableVIew.reloadData()
  112. }
  113. }
  114. extension ItemsPickerViewController: UITableViewDelegate {
  115. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  116. return 75
  117. }
  118. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  119. let selectedIndexPaths = self.tableVIew.indexPathsForSelectedRows ?? self.tableVIew.indexPathForSelectedRow.map({[$0]})
  120. let selectedData = selectedIndexPaths?.compactMap { indexPath -> String? in
  121. let value = filteredPlaces.elementAt(index: indexPath.row)
  122. return value
  123. }
  124. self.doneAction?(selectedData ?? [])
  125. self.dismiss(animated: true, completion: nil)
  126. }
  127. func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
  128. let cell = tableView.cellForRow(at: indexPath)
  129. cell?.accessoryType = .none
  130. }
  131. }
  132. extension ItemsPickerViewController: UITableViewDataSource {
  133. func numberOfSections(in tableView: UITableView) -> Int {
  134. return 1
  135. }
  136. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  137. return filteredPlaces.count
  138. }
  139. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  140. let cell = tableVIew.dequeueReusableCell(withIdentifier: "ItemsPickerCell", for: indexPath) as! ItemsPickerCell
  141. cell.place = self.filteredPlaces.elementAt(index: indexPath.row)
  142. if let selected = self.defaultSelectedData.first {
  143. cell.selectedPlace = selected
  144. }
  145. cell.setup()
  146. return cell
  147. }
  148. }