MultiSelectActionSheet.swift 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. //
  2. // MultiSelectActionSheet.swift
  3. // SheeeeeeeeetExample
  4. //
  5. // Created by Jonas Ullström on 2018-03-16.
  6. // Copyright © 2018 Jonas Ullström. All rights reserved.
  7. //
  8. import Sheeeeeeeeet
  9. class MultiSelectActionSheet: ActionSheet {
  10. init(options: [FoodOption], preselected: [FoodOption], action: @escaping ([ActionSheetItem]) -> ()) {
  11. let items = MultiSelectActionSheet.items(for: options, preselected: preselected)
  12. super.init(items: items) { sheet, item in
  13. guard item.isOkButton else { return }
  14. let selectItems = sheet.items.compactMap { $0 as? ActionSheetSelectItem }
  15. let selectedItems = selectItems.filter { $0.isSelected }
  16. action(selectedItems)
  17. }
  18. }
  19. required init?(coder aDecoder: NSCoder) {
  20. super.init(coder: aDecoder)
  21. }
  22. }
  23. private extension MultiSelectActionSheet {
  24. static func items(for options: [FoodOption], preselected: [FoodOption]) -> [ActionSheetItem] {
  25. var items = [ActionSheetItem]()
  26. items.append(titleItem(title: standardTitle))
  27. items.append(contentsOf: itemsGroup(for: options, preselected: .fast, group: "Appetizer"))
  28. items.append(ActionSheetSectionMargin())
  29. items.append(contentsOf: itemsGroup(for: options, preselected: .homeMade, group: "Main Dish"))
  30. items.append(okButton)
  31. items.append(cancelButton)
  32. return items
  33. }
  34. static func itemsGroup(for options: [FoodOption], preselected: FoodOption?, group: String) -> [ActionSheetItem] {
  35. var items = [ActionSheetItem]()
  36. let options = options.filter { $0 != .none && $0 != .fancy }
  37. let foodItems = options.map { $0.multiSelectItem(isSelected: $0 == preselected, group: group) }
  38. let toggler = ActionSheetMultiSelectToggleItem(title: group, state: .selectAll, group: group, selectAllTitle: "Select all", deselectAllTitle: "Deselect all")
  39. items.append(toggler)
  40. items.append(contentsOf: foodItems)
  41. return items
  42. }
  43. }