From 2f3ce29a4d63a68777619bf5f743593cb1d1f107 Mon Sep 17 00:00:00 2001 From: Deniz Duezgoeren Date: Sat, 13 Jul 2019 09:48:20 +0200 Subject: [PATCH] Implemented functions for fetching and storing general information and the food menu, including UI for the food menu, TODO: resizing cells for the plan and food menu --- AvH Plan.xcodeproj/project.pbxproj | 8 +- .../ic_german.imageset/ic_german-1.png | Bin 0 -> 1274 bytes .../ic_german.imageset/ic_german.png | Bin 0 -> 1067 bytes .../ic_politics.imageset/ic_politics.png | Bin 0 -> 1052 bytes .../ic_religion.imageset/ic_religion.png | Bin 0 -> 1090 bytes AvH Plan/Base.lproj/Main.storyboard | 225 ++++++++++++++++-- AvH Plan/DataFetcher.swift | 181 +++++++++++++- AvH Plan/MenuViewController.swift | 60 ++++- AvH Plan/PersonalViewController.swift | 85 ++++++- AvH Plan/PlanViewController.swift | 4 +- 10 files changed, 520 insertions(+), 43 deletions(-) create mode 100644 AvH Plan/Assets.xcassets/ic_german.imageset/ic_german-1.png create mode 100644 AvH Plan/Assets.xcassets/ic_german.imageset/ic_german.png create mode 100644 AvH Plan/Assets.xcassets/ic_politics.imageset/ic_politics.png create mode 100644 AvH Plan/Assets.xcassets/ic_religion.imageset/ic_religion.png diff --git a/AvH Plan.xcodeproj/project.pbxproj b/AvH Plan.xcodeproj/project.pbxproj index 2224bb6..06a60ee 100644 --- a/AvH Plan.xcodeproj/project.pbxproj +++ b/AvH Plan.xcodeproj/project.pbxproj @@ -9,7 +9,7 @@ /* Begin PBXBuildFile section */ 1BF3A6CA97BA41C38482C1A6 /* Pods_AvH_PlanTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9D6269E96544A9242A29611 /* Pods_AvH_PlanTests.framework */; }; 2E65263AFD35D6B542E89AE4 /* Pods_AvH_Plan.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7605BB0678C9E27A1D3E9DAA /* Pods_AvH_Plan.framework */; }; - A949F26322D7938700D4BFFD /* db.sqlite3 in Resources */ = {isa = PBXBuildFile; fileRef = A949F26222D7938700D4BFFD /* db.sqlite3 */; }; + A9128EDD22D88E8E006976C8 /* MenuViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9128EDC22D88E8E006976C8 /* MenuViewCell.swift */; }; A96133802299867400B541D4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A961337F2299867400B541D4 /* AppDelegate.swift */; }; A96133822299867400B541D4 /* PlanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A96133812299867400B541D4 /* PlanViewController.swift */; }; A96133842299867400B541D4 /* PersonalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A96133832299867400B541D4 /* PersonalViewController.swift */; }; @@ -47,7 +47,7 @@ 589FBD2CE6A9C73CD9B81441 /* Pods-AvH PlanUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AvH PlanUITests.release.xcconfig"; path = "Target Support Files/Pods-AvH PlanUITests/Pods-AvH PlanUITests.release.xcconfig"; sourceTree = ""; }; 74EDE3D8134812AB76BEB988 /* Pods_AvH_PlanUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AvH_PlanUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7605BB0678C9E27A1D3E9DAA /* Pods_AvH_Plan.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AvH_Plan.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A949F26222D7938700D4BFFD /* db.sqlite3 */ = {isa = PBXFileReference; lastKnownFileType = text; path = db.sqlite3; sourceTree = ""; }; + A9128EDC22D88E8E006976C8 /* MenuViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuViewCell.swift; sourceTree = ""; }; A961337C2299867400B541D4 /* AvH Plan.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "AvH Plan.app"; sourceTree = BUILT_PRODUCTS_DIR; }; A961337F2299867400B541D4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; A96133812299867400B541D4 /* PlanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlanViewController.swift; sourceTree = ""; }; @@ -162,8 +162,8 @@ A961338D2299867A00B541D4 /* Info.plist */, A96133AF229986DF00B541D4 /* CollectionViewCell.swift */, A9A3496B22D4859200F35AE0 /* SubstModel.swift */, + A9128EDC22D88E8E006976C8 /* MenuViewCell.swift */, A9C1D30122D7237200139043 /* DataFetcher.swift */, - A949F26222D7938700D4BFFD /* db.sqlite3 */, ); path = "AvH Plan"; sourceTree = ""; @@ -297,7 +297,6 @@ A961338C2299867A00B541D4 /* LaunchScreen.storyboard in Resources */, A96133892299867A00B541D4 /* Assets.xcassets in Resources */, A96133872299867400B541D4 /* Main.storyboard in Resources */, - A949F26322D7938700D4BFFD /* db.sqlite3 in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -424,6 +423,7 @@ A9A3496C22D4859200F35AE0 /* SubstModel.swift in Sources */, A9C1D30022D656DD00139043 /* MenuViewController.swift in Sources */, A96133B0229986DF00B541D4 /* CollectionViewCell.swift in Sources */, + A9128EDD22D88E8E006976C8 /* MenuViewCell.swift in Sources */, A9C1D2FE22D656A400139043 /* InfoViewController.swift in Sources */, A96133822299867400B541D4 /* PlanViewController.swift in Sources */, A9C1D30222D7237200139043 /* DataFetcher.swift in Sources */, diff --git a/AvH Plan/Assets.xcassets/ic_german.imageset/ic_german-1.png b/AvH Plan/Assets.xcassets/ic_german.imageset/ic_german-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcae5ac1c65d0d426326ece76c6f11e1dc16427 GIT binary patch literal 1274 zcmeAS@N?(olHy`uVBq!ia0vp^-XP4u0wgE7Z%PDGEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4iy3r8b8k6ZS$mDu3tf2_QC9(IluPS6}X6Asfl~WsVea0@{H>6x|ljUURIt}^H{Ss zd}(@?%M;5RCOGvx6XS$OeDSu=HYV`Bow7>qP?p=0nOCPZyRJ4Vc8{E29j^FSP+2E5 zB579Cfi7lFshLlAS})6-_-w78aocgPDa#_W7H*zXcz&z*hwgp}Dc(6r;!`boAIk4} zpdLI=%*xbGSHV;K`9rRkOl4N0;cc&_7N0rw_;~p0lLhBobdULNE!N`a%sXm%mSwjF zyMo))Eh#FVns4nKTU(6Wq#8VTy|~a2Bo@q@vSR6E)v(K_V?GJ@{0N!VEVDIB-tvrs zVL}hT&oRd4?PB%)EvEf-t>?YB&*l8J^4 zdCMu@OOX>s@tr6KPx1E~*a<*J{N8HM5Zcc(z^0<}RCAQSh zl{H!ZBCS94wugF~&>Ep_9$WL&_V8>ojC*2xp5qHKOjx z)9B5ap%+#ccyj+fl$E|&NT>htCh@S9zqZVr?er>IaGHGO&ujUbc~@3W_@wXoc?V~J z8te5GEZ%+U!Vy*NkCUEQ*e+{* zz*5b9Q0iG{sM(S~S47q?alRrx`)IIHT4l^8kI%Ex*NN$UdK`Vr#Pt37TFoVT@`x6ws+%lz`bC0uYS8AElFgc$#`23pxL)yS*Kl59 z;*l$0%RBQ!zVzJdZO8Oi)%eM`_&@t%j{-DJRt^xGY^aH?g=RwMZXmihgEte0pk8 ZZepGukhh|aDIRDAgQu&X%Q~loCIFtt9tQvb literal 0 HcmV?d00001 diff --git a/AvH Plan/Assets.xcassets/ic_german.imageset/ic_german.png b/AvH Plan/Assets.xcassets/ic_german.imageset/ic_german.png new file mode 100644 index 0000000000000000000000000000000000000000..1a04defc34fc6730b3963dcf21ea4ce3d06e1b06 GIT binary patch literal 1067 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamQHmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkWZDQH+(^r4^c85Zrk%NPUH`nxC=p^|NPF zj_vWeUwu+U{O`T9d!OGc-v54X@p;?lK|IgzT>j9wWI-I`n?i4aJKOemL`8L^9Maox zdh%lBi^jo<#iFW_jvAYG%u04u{brSAo0;oy@7(v_HzhtV3(tL9TYGnj)HL7UyO;m& z*PL#vktwV{OT1{y{yjE1vme@3T0Pgi^{}9FQr8}dUFQ$W@^7!5_wvq_NO!q)^ZK9k zo!?@#_52e>O=nAPOR-;#ku_L={c`0WUJZtf5Q!F)ME3D&Beb@79U1#J^PW1nGRNUx!!tDC> zb>5|WADDjFtiP3Y_uTN~i@MX62E9MRRC=mBD0cZCyEz-4&93-dBcl5J@sCx7AA0Vy z9+dAp=0B%PThFEU`=cMTbSuwJU87y8qQBOu!spYBBe#|xy0zRnqCAabl@{MEO~Ia- z9haE?qMw-@pPpKjo0z8u>Vl%J2XH literal 0 HcmV?d00001 diff --git a/AvH Plan/Assets.xcassets/ic_politics.imageset/ic_politics.png b/AvH Plan/Assets.xcassets/ic_politics.imageset/ic_politics.png new file mode 100644 index 0000000000000000000000000000000000000000..f457c691c4d96de55b43407a9cefe668cee262d4 GIT binary patch literal 1052 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=0wlMXIamQHmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkJ%NBR5*)=J7$LGH7#+) z%oZ`RtrmZVk9t*1KFt0vlG)x4r8cb&|` z#aYd*Zwli$KG$6`P;cS>#wTR>a*DvdPdhZX-+a2Gui#c}bMu}Bx^rF?Sw3AN5GNldp7421N z+oN0Cb~4HRI`Q|LBwPPX@wB&|^{bNFiw{lR(vkh`R+wCX`Pzq*mLHs<>}2uY)W7PG z;(m^YGeRE(*8jNq`MQdU`!$OflLYLH`#9UDTkT!C^~;}qUnPo7a<5$X6>(kjwQ<{p zkFD$mFC(s(U0SVvw{xwX*Zv<@-X2wmjun`7Zv$WGdX9&ig!@Wf7K*oiSZ0-1cw&yh z^Mghc@_U+j&v8xPn-Q|r+ui1|f8w>fFL%{WVm+z%&}EX7+J~*%&%7?lylm~4(A)c< zD{b29KX#I)E%*P_-km)y@=DLsohRDASkGD%@$a)@;IX@(jHdidyK{Kft#`o(m$R3v7@4h`S7}>M%G#B$Yp(T5`TB$M_$Up* z`m5X4_^L{OYOYGLPc)bzZW?dMH@Nj`BjoBeY0lkQ6& zbLu@NKK>r>U8XWQ?$Q=dUi)7L%8#vc0yo}{DwRIfAU=Cz^!;-^70;wjPm2CqKWAOM zY=Q8L8yQyL-^tzkoSSvEXx$(GHqJj*rLb;d`f2Y}q@T9n-Luqu zy@}QTrZ?n#FFf|K`uGEd)ob-;FUs4gnEi?0?=`QxwsBAWt@QQvovrjki&Kk=^|Mn-Q>*k{Qj4=o@(c9CQj<&ai(HBl z%M+7wQjLPk(sgqai%U|A^ns@6XC}uNNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5SkW4YY3AE#WE6yG|nXyasQ+J2?g@UoMm)=kC(W!rLOR32Rn z3J58TGjx?W;`3b4OJiAwY1pB)x*E5H=PYA#l+^TU5Iy$Ouch+ch4WD>a(=9s+RriH zeR*u^)SaPc&F*hp8zQd6w<1a4urXh=`;{kU3(CB*EPYtntalz#OPIIXC-?||+s}X* z9-FdK#2O!P=O&){*JRZ>VbSazKhpwSEg1@{E<9xtuRJ56bpOki59hvrh??&i^mF;@ z$!trHs#wmjS6L=goOvPP!@QJFYmCp#%HGT>6?^4Y+B3$J8BNAIl~MPN6&r(^Ie2*b z>zq$o9iJz%+VZ5SF~_ANnyDvF7VKw?JkqhInf=q8sh1AKMa~Okdot(Z2MKK@ZqG}{ z)l1$5y>H@h%RDPTvGK@@$+mxw#0nfNF6|MX*l1#)T%DHrt>H(43BSuMX9f|5(l)Galfl+o8E9RU`nx!`ayx~H$n?eMD}es;~+9OZh_5{)=*ce;GX|^e;EI^ z|H+=PXTRl}qWIv+OU~R2Et_3Cb<5^Ag%A5S-ORZjx#pWiY#PsLNt6ACbzbF7Gb($d zQ}3lu%gQfT8fMZB;0?d^}Bd%ZgJl;)zV04`gX7Wl=N>YoO=y^ZucnvpIc(Q z@=NWCUwfWM9Q&%zKfCUHW0>p|V7gZ=ag8WRNi0dVN-jzTQVd20hL*Yp=DLOkAqM7F z#^zQghS~;3Rt5&sKfiv2q9HdwB{QuOw}xlyg5!W1B0)A3m!(@JB^IaZmKJ3)q-Ex$ zTIuWSJ6q|87N-^!>u0BwrdH{@q!wqFtvC&rFUlO3lek&& literal 0 HcmV?d00001 diff --git a/AvH Plan/Base.lproj/Main.storyboard b/AvH Plan/Base.lproj/Main.storyboard index b89bc26..7ca1b71 100644 --- a/AvH Plan/Base.lproj/Main.storyboard +++ b/AvH Plan/Base.lproj/Main.storyboard @@ -166,34 +166,144 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + - + @@ -202,7 +312,21 @@ + + + + + + + + + + + + + + @@ -218,14 +342,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/AvH Plan/DataFetcher.swift b/AvH Plan/DataFetcher.swift index 5ec27f3..0c80a4f 100644 --- a/AvH Plan/DataFetcher.swift +++ b/AvH Plan/DataFetcher.swift @@ -7,15 +7,19 @@ // import UIKit +import Foundation import Alamofire import SwiftSoup import SQLite class DataFetcher { - let path = Bundle.main.path(forResource: "db", ofType: "sqlite3") + let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! let substitutions = Table("substitutions") + let personal = Table("personal") + let information = Table("information") + let foodmenu = Table("foodmenu") let id = Expression("id") let group = Expression("group") let course = Expression("course") @@ -23,28 +27,46 @@ class DataFetcher { let date = Expression("date") let time = Expression("time") let room = Expression("room") + let text = Expression("text") - func doAsync(completionHandler: @escaping (_ substitutions: Array) -> ()) { + func doAsync(do task: String, completionHandler: @escaping (_ substitutions: Array) -> ()) { DispatchQueue(label: "work-queue").async { - let url = "https://djd4rkn355.github.io/subst_test.html" + var url = "" + switch task { + case "menu": url = "https://djd4rkn355.github.io/food_test.html" + default: url = "https://djd4rkn355.github.io/subst_test.html" + } Alamofire.request(url).responseString { response in if let html = response.result.value { - completionHandler(self.parseHTML(html: html)) + switch task { + case "plan": completionHandler(self.parseHTML(html: html, isPersonal: false)) + case "personal": completionHandler(self.parseHTML(html: html, isPersonal: true)) + case "info": completionHandler(self.parseInformation(html: html)) + default: completionHandler(self.parseMenu(html: html)) + } + } } } } - func parseHTML(html: String) -> Array { + func parseHTML(html: String, isPersonal: Bool) -> Array { var subst = Array() + var personalSubst = Array() do { let doc: Document = try SwiftSoup.parse(html) let rows: Elements = try doc.select("tr") - let db = try Connection(path!) +// let prefs = UserDefaults.standard +// let courses = prefs.string(forKey: "courses") +// let classes = prefs.string(forKey: "classes") + let courses: String? = "GES7" + let classes: String? = "17" - try db.run(substitutions.create { t in + let db = try Connection("\(path)/db.sqlite3") + + try db.run(substitutions.create(ifNotExists: true) { t in t.column(id, primaryKey: true) t.column(group) t.column(course) @@ -54,6 +76,19 @@ class DataFetcher { t.column(room) }) + try db.run(personal.create(ifNotExists: true) { t in + t.column(id, primaryKey: true) + t.column(group) + t.column(course) + t.column(additional) + t.column(date) + t.column(time) + t.column(room) + }) + + try db.run(substitutions.delete()) + try db.run(personal.delete()) + for i in (0.. [SubstModel] { var substs = [SubstModel]() do { - let db = try Connection(path!) + let db = try Connection("\(path)/db.sqlite3") for subst in try db.prepare(substitutions) { substs.append(SubstModel(group: subst[group], course: subst[course], additional: subst[additional], date: subst[date], time: subst[time], room: subst[room])) } @@ -92,6 +158,103 @@ class DataFetcher { return substs } + func getPersonalFromDatabase() -> [SubstModel] { + var substs = [SubstModel]() + do { + let db = try Connection("\(path)/db.sqlite3") + for subst in try db.prepare(personal) { + substs.append(SubstModel(group: subst[group], course: subst[course], additional: subst[additional], date: subst[date], time: subst[time], room: subst[room])) + } + } catch {} + return substs + } + + func parseInformation(html: String) -> [String] { + var list = [String]() + do { + let doc: Document = try SwiftSoup.parse(html) + let p: Elements = try doc.select("p") + + let db = try Connection("\(path)/db.sqlite3") + + try db.run(information.create(ifNotExists: true) { t in + t.column(id, primaryKey: true) + t.column(text) + }) + + try db.run(information.delete()) + + for item in p { + + let t = try item.text() + + list.append(t) + + let insert = information.insert(text <- t) + _ = try db.run(insert) + + + + } + + } catch Exception.Error(let type, let message) { + print(type) + print(message) + } catch { + print("error") + } + return list + } + + func readInformation() -> [String] { + var list = [String]() + do { + let db = try Connection("\(path)/db.sqlite3") + for item in try db.prepare(information) { + list.append(item[text]) + } + } catch {} + return list + } + + func parseMenu(html: String) -> [String] { + + var items = [String]() + do { + let doc: Document = try SwiftSoup.parse(html) + let e: Elements = try doc.select("th") + + let db = try Connection("\(path)/db.sqlite3") + + try db.run(foodmenu.create(ifNotExists: true) { t in + t.column(id, primaryKey: true) + t.column(text) + }) + + try db.run(foodmenu.delete()) + + for i in 0.. [String] { + var menu = [String]() + do { + let db = try Connection("\(path)/db.sqlite3") + for item in try db.prepare(foodmenu) { + menu.append(item[text]) + } + } catch {} + return menu + } + func getImage(from icon: String) -> UIImage? { var imagePath = "" let i = icon.lowercased() diff --git a/AvH Plan/MenuViewController.swift b/AvH Plan/MenuViewController.swift index 05aecf9..297b251 100644 --- a/AvH Plan/MenuViewController.swift +++ b/AvH Plan/MenuViewController.swift @@ -2,12 +2,68 @@ // MenuViewController.swift // AvH Plan // -// Created by Deniz Duezgoeren on 10.07.19. +// Created by Deniz Duezgoeren on 11.07.19. // Copyright © 2019 Deniz Duezgoeren. All rights reserved. // import UIKit -class MenuViewController : UIViewController { +class MenuViewController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + let reuseIdentifier = "cell" + @IBOutlet weak var collectionView: UICollectionView! + var items = [String]() + private let refreshControl = UIRefreshControl() + let df = DataFetcher() + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + if #available(iOS 10.0, *) { + collectionView.refreshControl = refreshControl + } else { + collectionView.addSubview(refreshControl) + } + refreshControl.addTarget(self, action: #selector(objDoAsync(_:)), for: .valueChanged) + refreshControl.tintColor = UIColor(red: 0.39, green: 0.71, blue: 0.96, alpha: 1.0) + refreshControl.attributedTitle = NSAttributedString(string: "Fetching the food menu...") + } + + @objc private func objDoAsync(_ sender: Any) { + df.doAsync(do: "menu") { menuItems in + self.items = menuItems as! [String] + self.collectionView.reloadData() + self.refreshControl.endRefreshing() + } + } + + override func viewDidLoad() { + super.viewDidLoad() + collectionView.backgroundColor = UIColor(red: 0.8, green: 0.8, blue: 0.8, alpha: 1.0) + + self.items = self.df.readMenu() + self.collectionView.reloadData() + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.items.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MenuViewCell + if self.items.count != 0 { + cell.content.text = self.items[indexPath.item] + } + + cell.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + print("You selected cell#\(indexPath.item)!") + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return CGSize(width: view.frame.size.width, height: 64) + } } + diff --git a/AvH Plan/PersonalViewController.swift b/AvH Plan/PersonalViewController.swift index 6a3bb55..2cecefc 100644 --- a/AvH Plan/PersonalViewController.swift +++ b/AvH Plan/PersonalViewController.swift @@ -1,20 +1,91 @@ // -// SecondViewController.swift +// PersonalViewController.swift // AvH Plan // -// Created by Deniz Duezgoeren on 25.05.19. +// Created by Deniz Duezgoeren on 11.07.19. // Copyright © 2019 Deniz Duezgoeren. All rights reserved. // import UIKit -class PersonalViewController: UIViewController { - +class PersonalViewController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + + let reuseIdentifier = "cell" + @IBOutlet weak var collectionView: UICollectionView! + var substs = Array() + private let refreshControl = UIRefreshControl() + let df = DataFetcher() + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + if #available(iOS 10.0, *) { + collectionView.refreshControl = refreshControl + } else { + collectionView.addSubview(refreshControl) + } + refreshControl.addTarget(self, action: #selector(objDoAsync(_:)), for: .valueChanged) + refreshControl.tintColor = UIColor(red: 0.39, green: 0.71, blue: 0.96, alpha: 1.0) + refreshControl.attributedTitle = NSAttributedString(string: "Fetching your plan...") + } + + @objc private func objDoAsync(_ sender: Any) { + df.doAsync(do: "personal") { substitutions in + self.substs = substitutions as! [SubstModel] + self.collectionView.reloadData() + self.refreshControl.endRefreshing() + } + } + override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. + collectionView.backgroundColor = UIColor(red: 0.8, green: 0.8, blue: 0.8, alpha: 1.0) + + self.substs = self.df.getPersonalFromDatabase() + self.collectionView.reloadData() + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.substs.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! CollectionViewCell + if self.substs.count != 0 { + cell.group.text = self.substs[indexPath.item].group + cell.additional.text = self.substs[indexPath.item].additional + cell.date.text = self.substs[indexPath.item].date + cell.time.text = self.substs[indexPath.item].time + cell.room.text = self.substs[indexPath.item].room + + let course = self.substs[indexPath.item].course + let image = df.getImage(from: course) + + if image != nil { + let attachment: NSTextAttachment = NSTextAttachment() + attachment.bounds = CGRect(x: 0, y: 0, width: cell.course.frame.height - 6, height: cell.course.frame.height - 6) + attachment.image = image + + let courseImage = NSMutableAttributedString(attachment: attachment) + let courseString = NSAttributedString(string: " " + course) + courseImage.append(courseString) + + cell.course.attributedText = courseImage + } else { + cell.course.text = course + } + } + + cell.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) + cell.tintView.backgroundColor = cell.backgroundColor + return cell + } + + // func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + // print("You selected cell#\(indexPath.item)!") + // } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return CGSize(width: view.frame.size.width, height: 108) } - - } diff --git a/AvH Plan/PlanViewController.swift b/AvH Plan/PlanViewController.swift index 2c7069d..d578dbb 100644 --- a/AvH Plan/PlanViewController.swift +++ b/AvH Plan/PlanViewController.swift @@ -29,8 +29,8 @@ class PlanViewController : UIViewController, UICollectionViewDataSource, UIColle } @objc private func objDoAsync(_ sender: Any) { - df.doAsync() { substitutions in - self.substs = substitutions + df.doAsync(do: "plan") { substitutions in + self.substs = substitutions as! [SubstModel] self.collectionView.reloadData() self.refreshControl.endRefreshing() }