FacilitiesListViewController.swift 8.17 KB
Newer Older
1
2
3
4
5
//
//  LocationsListViewController.swift
//  WhatsOpen
//
//  Created by Zach Knox on 4/5/17.
Zach Knox's avatar
Zach Knox committed
6
//  Copyright © 2017 SRCT. Some rights reserved.
7
8
9
10
//

import UIKit

11
class FacilitiesListViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UIViewControllerPreviewingDelegate {
12

13
	var facilitiesArray = Array<Facility>()
Zach Knox's avatar
Zach Knox committed
14
	var filters = Filters()
15
	
16
	@IBOutlet var LeftButton: UIBarButtonItem!
17
		
18
19
20
21
	@IBAction func RightButton(_ sender: Any) {
	}
	@IBOutlet var RightButton: UIBarButtonItem!
	
22
23
	@IBOutlet var settingsButton: UIBarButtonItem!
	
24
25
	@IBOutlet var LocationsList: UICollectionView!
	
26
	@IBOutlet var LocationsListLayout: UICollectionViewFlowLayout!
27
	
28
	@IBOutlet var favoritesControl: UISegmentedControl!
Zach Knox's avatar
Zach Knox committed
29
30
	var showFavorites = false

31
32
	@IBOutlet var LastUpdatedLabel: UIBarButtonItem!
	
Zach Knox's avatar
Zach Knox committed
33
34
35
36
37
38
39
40
41
42
43
44
	@IBAction func favoritesControlChanges(_ sender: Any) {
		switch (self.favoritesControl.selectedSegmentIndex)
		{
		case 0:
			showFavorites = false
		case 1:
			showFavorites = true
		default:
			showFavorites = false
		}
		self.LocationsList.reloadData()
	}
45
	
Zach Knox's avatar
Zach Knox committed
46
47
	let refreshControl = UIRefreshControl()
	
48
	override func viewWillLayoutSubviews() {
Zach Knox's avatar
Zach Knox committed
49
50
51
52
53
54
		LocationsListLayout.itemSize.width = getCellWidth()
		LocationsListLayout.invalidateLayout()

	}
	
	func getCellWidth() -> CGFloat {
55
56
		let windowWidth = self.view.frame.size.width
		
Zach Knox's avatar
Zach Knox committed
57
58
		if(windowWidth < 640) {
			return windowWidth - 20
59
60
		}
		else if(windowWidth >= 640 && windowWidth < 1024) {
Zach Knox's avatar
Zach Knox committed
61
			return (windowWidth / 2) - 15
62
63
		}
		else if(windowWidth >= 1024) {
Zach Knox's avatar
Zach Knox committed
64
			return (windowWidth / 3) - 15
65
66
		}
		
Zach Knox's avatar
Zach Knox committed
67
		return 0
68
69
	}
	
70
71
72
73
74
75
	@IBAction func RefreshButton(_ sender: Any) {
		refresh(sender)
	}
	
	override func viewWillAppear(_ animated: Bool) {
		LastUpdatedLabel.isEnabled = false
Zach Knox's avatar
Zach Knox committed
76
77
78
79
		
		navigationItem.title = "What's Open?"


80
81
	}
	
82
83
84
    override func viewDidLoad() {
        super.viewDidLoad()
		
85
86
87
88
		if( traitCollection.forceTouchCapability == .available){
			registerForPreviewing(with: self, sourceView: self.LocationsList!)
		}
		
Zach Knox's avatar
Zach Knox committed
89
90
91
92
93
94
95
96
97
		let searchController = UISearchController(searchResultsController: nil) //TODO: ADD SEARCH
		if #available(iOS 11, *) {
			navigationController?.navigationBar.prefersLargeTitles = true
			navigationItem.searchController = searchController
			navigationItem.hidesSearchBarWhenScrolling = false
			navigationItem.searchController?.searchBar.barTintColor = UIColor.white
			navigationItem.searchController?.searchBar.barStyle = .default
		}
		
98
		LocationsListLayout.invalidateLayout()
Zach Knox's avatar
Zach Knox committed
99
		
100
101
102
		settingsButton.accessibilityLabel = "Settings"
		LastUpdatedLabel.accessibilityHint = ""
		
103
104
		LocationsListLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10)
		
Zach Knox's avatar
Zach Knox committed
105
106
107
108
		refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
		LocationsList.addSubview(refreshControl)
		LocationsList.alwaysBounceVertical = true
		
109
		
110
111
112
113
114
		SRCTNetworkController.performDownload { (facilities) in
			self.facilitiesArray = facilities
			//            print(self.facilitiesArray)
			DispatchQueue.main.async {
				self.LocationsList.reloadData()
115
116
				let date = Date()
				self.LastUpdatedLabel.title = "Updated: " + self.shortDateFormat(date)
117
118
			}
		}
119
120
		
	}
Zach Knox's avatar
Zach Knox committed
121
122
123
124
	
	func refresh(_ sender: Any) {
		refreshControl.beginRefreshing()
		LocationsList.reloadData()
125
126
		let date = Date()
		LastUpdatedLabel.title = "Updated: " + shortDateFormat(date)
Zach Knox's avatar
Zach Knox committed
127
128
		refreshControl.endRefreshing()
	}
129
130
131
132
133
134
135
136
137
	func shortDateFormat(_ date: Date) -> String {
		let dateFormatter = DateFormatter()
		dateFormatter.dateStyle = .short
		dateFormatter.timeStyle = .short

		// US English Locale (en_US)
		dateFormatter.locale = Locale(identifier: "en_US")
		return dateFormatter.string(from: date)
	}
Zach Knox's avatar
Zach Knox committed
138
	
139
140
141
142
143
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
	
144
145
146
147
148
	func numberOfSections(in collectionView: UICollectionView) -> Int {
		return 2
	}
	
	func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
Zach Knox's avatar
Zach Knox committed
149
		let count = countForOpenAndClosedFacilities(getLocationArray(facilitiesArray)) //TODO could be better optimized
Zach Knox's avatar
Zach Knox committed
150
		
151
152
153
154
155
156
157
158
159
160
161
		if(section == 1) {
			return count.open
		}
		else {
			return count.closed
		}
	}
	
	
	
	func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
162
		let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! FacilityCollectionViewCell
Zach Knox's avatar
Zach Knox committed
163
164
165
166
167
168
169
		/*
		let windowRect = self.view.window!.frame
		let windowWidth = windowRect.size.width
		if(windowWidth <= 320) {
			cell.frame.size.width = 280
		}
		*/
170
171
172
		
		let dataArray = placeOpenFacilitiesFirstInArray(facilitiesArray)
		let facility = dataArray[indexPath.row]
173
		cell.facility = facility
174
		cell.nameLabel.text = facility.name
175
176
177
		
		let open = Utilities.isOpen(facility: facility)
		if(open == true) {
178
			cell.openClosedLabel.text = "Open"
179
180
181
			cell.openClosedLabel.textColor = UIColor.black
			cell.openClosedLabel.backgroundColor = UIColor.white
			//cell.openClosedLabel.backgroundColor = UIColor(red:0.00, green:0.40, blue:0.20, alpha:1.0)
182
			cell.backgroundColor = UIColor(red:0.00, green:0.40, blue:0.20, alpha:1.0)
183
		} else {
184
			cell.openClosedLabel.text = "Closed"
185
186
187
			cell.openClosedLabel.textColor = UIColor.white
			cell.openClosedLabel.backgroundColor = UIColor.black
			//cell.openClosedLabel.backgroundColor = UIColor.red
188
189
			cell.backgroundColor = UIColor.red

190
191
192
193
		}
		
		cell.timeDescriptionLabel.text = Utilities.timeUntilFacility(facility)
		
194
195
196
197
		cell.accessibilityLabel = cell.nameLabel.text! + ", Currently " + cell.openClosedLabel.text! + "." + cell.timeDescriptionLabel.text!
		cell.accessibilityHint = "Double Tap to view details"

		
198
199
200
201
		self.reloadInputViews()
		return cell
	}
	
Zach Knox's avatar
Zach Knox committed
202
203
204
205
206
207
208
209
210
211
212
	func getLocationArray(_ facilitiesArray: [Facility]) -> [Facility] {
		if(!showFavorites) {
			return placeOpenFacilitiesFirstInArray(facilitiesArray)
		}
		else {
			return [] //TODO - INCOMPLETE
		}
		
		
	}
	
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
	//Returns an array which has the open locations listed first
	//Could be improved in the future because currently this means you're checking
	//open status twice per cell
	func placeOpenFacilitiesFirstInArray(_ facilitiesArray: Array<Facility>) -> [Facility] {
		var open = [Facility]()
		var closed = [Facility]()
		
		for i in facilitiesArray {
			if(Utilities.isOpen(facility: i)) {
				open.append(i)
			}
			else {
				closed.append(i)
			}
		}
		// Test
		return open + closed
	}
	
	func countForOpenAndClosedFacilities(_ facilitiesArray: Array<Facility>) -> (open: Int, closed: Int) {
		var open = 0
		var closed = 0
		
		for i in facilitiesArray {
			if(Utilities.isOpen(facility: i)) {
				open += 1
			}
			else {
				closed += 1
			}
		}
		
		return (open, closed)
	}
	
	
249
250
    // MARK: - Navigation

251
	//In a storyboard-based application, you will often want to do a little preparation before navigation
252
253
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
254
		if(segue.identifier == "toDetailView") {
255
256
			let destination = segue.destination as! FacilityDetailViewController
			let tapped = sender as! FacilityCollectionViewCell //this is probably a bad idea just FYI future me
257
258
259
			destination.facility = tapped.facility
			
		}
260
		else if(segue.identifier == "toFilters") {
261
262
263
			let destination = segue.destination as! UINavigationController
			let filterView = destination.topViewController as! FiltersTableViewController
			filterView.filters = self.filters
264
		}
265
		
266
267
        // Pass the selected object to the new view controller.
    }
268
	
269
270
271
272
	// MARK: - Peek and Pop
	
	func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
		guard let indexPath = LocationsList?.indexPathForItem(at: location) else { return nil }
273
274
		let cell = LocationsList?.cellForItem(at: indexPath) as! FacilityCollectionViewCell
		guard let detailView = storyboard?.instantiateViewController(withIdentifier: "detailView") as? FacilityDetailViewController else { return nil }
275
276
		
		detailView.facility = cell.facility
Zach Knox's avatar
Zach Knox committed
277

278
279
280
281
282
283
284
		return detailView
	}
	
	func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
		self.navigationController?.show(viewControllerToCommit, sender: Any?.self)
	}
	
285
}
286