mirror of
				https://github.com/Mueller-Patrick/DHBW-Service-App.git
				synced 2025-11-03 18:35:47 +00:00 
			
		
		
		
	⚡ Adding preview content, improvements to RaPla stuff
- Now updating locally stored events instead of deleting them and creating completely new events - Added text color in the list view to distinguish exams from lectures
This commit is contained in:
		
							parent
							
								
									95f06cc87d
								
							
						
					
					
						commit
						fdbd88ce01
					
				| 
						 | 
					@ -10,6 +10,7 @@
 | 
				
			||||||
        <attribute name="location" optional="YES" attributeType="String"/>
 | 
					        <attribute name="location" optional="YES" attributeType="String"/>
 | 
				
			||||||
        <attribute name="startDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
 | 
					        <attribute name="startDate" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
 | 
				
			||||||
        <attribute name="summary" optional="YES" attributeType="String"/>
 | 
					        <attribute name="summary" optional="YES" attributeType="String"/>
 | 
				
			||||||
 | 
					        <attribute name="uid" optional="YES" attributeType="String"/>
 | 
				
			||||||
    </entity>
 | 
					    </entity>
 | 
				
			||||||
    <entity name="User" representedClassName="User" syncable="YES" codeGenerationType="class">
 | 
					    <entity name="User" representedClassName="User" syncable="YES" codeGenerationType="class">
 | 
				
			||||||
        <attribute name="course" optional="YES" attributeType="String"/>
 | 
					        <attribute name="course" optional="YES" attributeType="String"/>
 | 
				
			||||||
| 
						 | 
					@ -18,7 +19,7 @@
 | 
				
			||||||
    </entity>
 | 
					    </entity>
 | 
				
			||||||
    <elements>
 | 
					    <elements>
 | 
				
			||||||
        <element name="Item" positionX="-63" positionY="-18" width="128" height="44"/>
 | 
					        <element name="Item" positionX="-63" positionY="-18" width="128" height="44"/>
 | 
				
			||||||
 | 
					        <element name="RaPlaEvent" positionX="-63" positionY="9" width="128" height="134"/>
 | 
				
			||||||
        <element name="User" positionX="-63" positionY="-9" width="128" height="74"/>
 | 
					        <element name="User" positionX="-63" positionY="-9" width="128" height="74"/>
 | 
				
			||||||
        <element name="RaPlaEvent" positionX="-63" positionY="9" width="128" height="119"/>
 | 
					 | 
				
			||||||
    </elements>
 | 
					    </elements>
 | 
				
			||||||
</model>
 | 
					</model>
 | 
				
			||||||
| 
						 | 
					@ -65,12 +65,41 @@ struct PersistenceController {
 | 
				
			||||||
        let viewContext = result.container.viewContext
 | 
					        let viewContext = result.container.viewContext
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        // set mock user
 | 
					        // set mock user
 | 
				
			||||||
        let entity = NSEntityDescription.entity(forEntityName: "User", in: PersistenceController.shared.context)!
 | 
					        let userEntity = NSEntityDescription.entity(forEntityName: "User", in: PersistenceController.shared.context)!
 | 
				
			||||||
        let user = NSManagedObject(entity: entity, insertInto: PersistenceController.shared.context)
 | 
					        let user = NSManagedObject(entity: userEntity, insertInto: PersistenceController.shared.context)
 | 
				
			||||||
        user.setValue("Max Mustermann", forKey: "name")
 | 
					        user.setValue("Max Mustermann", forKey: "name")
 | 
				
			||||||
        user.setValue("TINF19B4", forKey: "course")
 | 
					        user.setValue("TINF19B4", forKey: "course")
 | 
				
			||||||
        user.setValue("Dr. Mustermann", forKey: "director")
 | 
					        user.setValue("Dr. Mustermann", forKey: "director")
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        // Generate mock events
 | 
				
			||||||
 | 
					        let eventEntity = NSEntityDescription.entity(forEntityName: "RaPlaEvent", in: PersistenceController.shared.context)!
 | 
				
			||||||
 | 
					        let normalEvent1 = NSManagedObject(entity: eventEntity, insertInto: PersistenceController.shared.context)
 | 
				
			||||||
 | 
					        let normalEvent2 = NSManagedObject(entity: eventEntity, insertInto: PersistenceController.shared.context)
 | 
				
			||||||
 | 
					        let examEvent = NSManagedObject(entity: eventEntity, insertInto: PersistenceController.shared.context)
 | 
				
			||||||
 | 
					        normalEvent1.setValue("Mock Event 1", forKey: "summary")
 | 
				
			||||||
 | 
					        normalEvent2.setValue("Mock Event 2", forKey: "summary")
 | 
				
			||||||
 | 
					        examEvent.setValue("Exam Event", forKey: "summary")
 | 
				
			||||||
 | 
					        normalEvent1.setValue("Mock Event 1 Description", forKey: "descr")
 | 
				
			||||||
 | 
					        normalEvent2.setValue("Mock Event 2 Description", forKey: "descr")
 | 
				
			||||||
 | 
					        examEvent.setValue("Exam Event Description", forKey: "descr")
 | 
				
			||||||
 | 
					        normalEvent1.setValue("E207 INF Hörsaal", forKey: "location")
 | 
				
			||||||
 | 
					        normalEvent2.setValue("A306 WI Hörsaal", forKey: "location")
 | 
				
			||||||
 | 
					        examEvent.setValue("Audimax A", forKey: "location")
 | 
				
			||||||
 | 
					        normalEvent1.setValue("Lehrveranstaltung", forKey: "category")
 | 
				
			||||||
 | 
					        normalEvent2.setValue("Lehrveranstaltung", forKey: "category")
 | 
				
			||||||
 | 
					        examEvent.setValue("Prüfung", forKey: "category")
 | 
				
			||||||
 | 
					        var currentDate = Date()
 | 
				
			||||||
 | 
					        currentDate.addTimeInterval(1*60*60);normalEvent1.setValue(currentDate, forKey: "startDate")
 | 
				
			||||||
 | 
					        currentDate.addTimeInterval(1*60*60);normalEvent2.setValue(currentDate, forKey: "startDate")
 | 
				
			||||||
 | 
					        currentDate.addTimeInterval(1*60*60);examEvent.setValue(currentDate, forKey: "startDate")
 | 
				
			||||||
 | 
					        currentDate.addTimeInterval(1*60*60);normalEvent1.setValue(currentDate, forKey: "endDate")
 | 
				
			||||||
 | 
					        currentDate.addTimeInterval(1*60*60);normalEvent2.setValue(currentDate, forKey: "endDate")
 | 
				
			||||||
 | 
					        currentDate.addTimeInterval(1*60*60);examEvent.setValue(currentDate, forKey: "endDate")
 | 
				
			||||||
 | 
					        normalEvent1.setValue("totalUniqueId1", forKey: "uid")
 | 
				
			||||||
 | 
					        normalEvent2.setValue("totalUniqueId2", forKey: "uid")
 | 
				
			||||||
 | 
					        examEvent.setValue("totalUniqueId3", forKey: "uid")
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        do {
 | 
					        do {
 | 
				
			||||||
            try viewContext.save()
 | 
					            try viewContext.save()
 | 
				
			||||||
        } catch {
 | 
					        } catch {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ class RaPlaFetcher {
 | 
				
			||||||
        var description: String = ""    //DESCRIPTION
 | 
					        var description: String = ""    //DESCRIPTION
 | 
				
			||||||
        var location: String = ""       //LOCATION
 | 
					        var location: String = ""       //LOCATION
 | 
				
			||||||
        var category: String = ""       //CATEGORIES
 | 
					        var category: String = ""       //CATEGORIES
 | 
				
			||||||
 | 
					        var uid: String = ""            //UID
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Get the RaPla file from the given URL and save the events to CoreData
 | 
					    // Get the RaPla file from the given URL and save the events to CoreData
 | 
				
			||||||
| 
						 | 
					@ -104,6 +105,8 @@ class RaPlaFetcher {
 | 
				
			||||||
                    evt.location = lineWithoutPrefix
 | 
					                    evt.location = lineWithoutPrefix
 | 
				
			||||||
                } else if(line.hasPrefix("CATEGORIES")){
 | 
					                } else if(line.hasPrefix("CATEGORIES")){
 | 
				
			||||||
                    evt.category = lineWithoutPrefix
 | 
					                    evt.category = lineWithoutPrefix
 | 
				
			||||||
 | 
					                } else if(line.hasPrefix("UID")){
 | 
				
			||||||
 | 
					                    evt.uid = lineWithoutPrefix
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
| 
						 | 
					@ -114,25 +117,34 @@ class RaPlaFetcher {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Save the given iCalEvent objects to CoreData
 | 
					    // Save the given iCalEvent objects to CoreData
 | 
				
			||||||
 | 
					    // Updates the events if they already exist
 | 
				
			||||||
    private class func saveToCoreData(eventObjects: [iCalEvent]) -> Bool{
 | 
					    private class func saveToCoreData(eventObjects: [iCalEvent]) -> Bool{
 | 
				
			||||||
        // Delete old data
 | 
					        let existingEvents = UtilityFunctions.getCoreDataObject(entity: "RaPlaEvent", sortDescriptors: [])
 | 
				
			||||||
        if(UtilityFunctions.deleteAllCoreDataEntitiesOfType(type: "RaPlaEvent")){
 | 
					        var existingEventsDict: [String:NSManagedObject] = [:]
 | 
				
			||||||
            for event in eventObjects {
 | 
					        for event in existingEvents {
 | 
				
			||||||
                let entity = NSEntityDescription.entity(forEntityName: "RaPlaEvent", in: PersistenceController.shared.context)!
 | 
					            existingEventsDict[event.value(forKey: "uid") as! String] = event
 | 
				
			||||||
                let evt = NSManagedObject(entity: entity, insertInto: PersistenceController.shared.context)
 | 
					 | 
				
			||||||
                evt.setValue(event.startDate, forKey: "startDate")
 | 
					 | 
				
			||||||
                evt.setValue(event.endDate, forKey: "endDate")
 | 
					 | 
				
			||||||
                evt.setValue(event.summary, forKey: "summary")
 | 
					 | 
				
			||||||
                evt.setValue(event.description, forKey: "descr")
 | 
					 | 
				
			||||||
                evt.setValue(event.location, forKey: "location")
 | 
					 | 
				
			||||||
                evt.setValue(event.category, forKey: "category")
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            PersistenceController.shared.save()
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            return true
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            return false
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        for event in eventObjects {
 | 
				
			||||||
 | 
					            // If the event already exists locally, update it. Otherwise, create a new record
 | 
				
			||||||
 | 
					            let evt: NSManagedObject
 | 
				
			||||||
 | 
					            if existingEventsDict.keys.contains(event.uid) {
 | 
				
			||||||
 | 
					                evt = existingEventsDict[event.uid]!
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                let entity = NSEntityDescription.entity(forEntityName: "RaPlaEvent", in: PersistenceController.shared.context)!
 | 
				
			||||||
 | 
					                evt = NSManagedObject(entity: entity, insertInto: PersistenceController.shared.context)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            evt.setValue(event.startDate, forKey: "startDate")
 | 
				
			||||||
 | 
					            evt.setValue(event.endDate, forKey: "endDate")
 | 
				
			||||||
 | 
					            evt.setValue(event.summary, forKey: "summary")
 | 
				
			||||||
 | 
					            evt.setValue(event.description, forKey: "descr")
 | 
				
			||||||
 | 
					            evt.setValue(event.location, forKey: "location")
 | 
				
			||||||
 | 
					            evt.setValue(event.category, forKey: "category")
 | 
				
			||||||
 | 
					            evt.setValue(event.uid, forKey: "uid")
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        PersistenceController.shared.save()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return true
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,13 +10,28 @@ import CoreData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct LecturePlanList: View {
 | 
					struct LecturePlanList: View {
 | 
				
			||||||
    @State private var events: [NSManagedObject] = []
 | 
					    @State private var events: [NSManagedObject] = []
 | 
				
			||||||
 | 
					    @State private var sortingAscending = true
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    var body: some View {
 | 
					    var body: some View {
 | 
				
			||||||
        List {
 | 
					        VStack {
 | 
				
			||||||
            ForEach(events, id: \.self) { event in
 | 
					            Button(action: {
 | 
				
			||||||
                HStack {
 | 
					                // This is obviously bullshit, but it could be used to sort afer summary or smth like that
 | 
				
			||||||
                    Text(formatDate(date: event.value(forKeyPath: "startDate") as! Date))
 | 
					                
 | 
				
			||||||
                    Text(event.value(forKeyPath: "summary") as! String)
 | 
					                self.sortingAscending = !self.sortingAscending
 | 
				
			||||||
 | 
					                let sectionSortDescriptor = NSSortDescriptor(key: "startDate", ascending: sortingAscending)
 | 
				
			||||||
 | 
					                let sortDescriptors = [sectionSortDescriptor]
 | 
				
			||||||
 | 
					                self.events = UtilityFunctions.getCoreDataObject(entity: "RaPlaEvent", sortDescriptors: sortDescriptors)
 | 
				
			||||||
 | 
					            }){
 | 
				
			||||||
 | 
					                Text("Switch order")
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            List {
 | 
				
			||||||
 | 
					                ForEach(events, id: \.self) { event in
 | 
				
			||||||
 | 
					                    HStack {
 | 
				
			||||||
 | 
					                        Text(formatDate(date: event.value(forKeyPath: "startDate") as! Date))
 | 
				
			||||||
 | 
					                            .foregroundColor(getEventForegroundColor(for: event))
 | 
				
			||||||
 | 
					                        Text(event.value(forKeyPath: "summary") as! String)
 | 
				
			||||||
 | 
					                            .foregroundColor(getEventForegroundColor(for: event))
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }.onAppear{
 | 
					        }.onAppear{
 | 
				
			||||||
| 
						 | 
					@ -30,6 +45,15 @@ struct LecturePlanList: View {
 | 
				
			||||||
struct LecturePlanList_Previews: PreviewProvider {
 | 
					struct LecturePlanList_Previews: PreviewProvider {
 | 
				
			||||||
    static var previews: some View {
 | 
					    static var previews: some View {
 | 
				
			||||||
        LecturePlanList()
 | 
					        LecturePlanList()
 | 
				
			||||||
 | 
					            .preferredColorScheme(.dark)
 | 
				
			||||||
 | 
					            .environmentObject(getFirstOpening())
 | 
				
			||||||
 | 
					            .environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    static func getFirstOpening() -> LocalSettings {
 | 
				
			||||||
 | 
					        let settings = LocalSettings();
 | 
				
			||||||
 | 
					        settings.isFirstOpening = false;
 | 
				
			||||||
 | 
					        return settings
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,4 +63,15 @@ extension LecturePlanList {
 | 
				
			||||||
        formatter.dateStyle = .short
 | 
					        formatter.dateStyle = .short
 | 
				
			||||||
        return formatter.string(from: date)
 | 
					        return formatter.string(from: date)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private func getEventForegroundColor(for event: NSManagedObject) -> Color {
 | 
				
			||||||
 | 
					        var textColor: Color = .primary
 | 
				
			||||||
 | 
					        if(event.value(forKeyPath: "category") as! String == "Prüfung") {
 | 
				
			||||||
 | 
					            textColor = Color.red
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            textColor = Color.primary
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return textColor
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user