diff --git a/Schedule ICTIS/Main/Views/CreatedClassView.swift b/Schedule ICTIS/Main/Views/CreatedClassView.swift index c490534..8fb56fa 100644 --- a/Schedule ICTIS/Main/Views/CreatedClassView.swift +++ b/Schedule ICTIS/Main/Views/CreatedClassView.swift @@ -10,34 +10,32 @@ import SwiftUI struct CreatedClassView: View { let _class: ClassModel var body: some View { - if datesAreEqual(_class.day, ClassModel.dateNow) { - HStack(spacing: 10) { - VStack { - Text(getTimeString(_class.starttime)) - .font(.system(size: 15, weight: .regular)) - Text(getTimeString(_class.endtime)) - .font(.system(size: 15, weight: .regular)) - } + HStack(spacing: 10) { + VStack { + Text(getTimeString(_class.starttime)) + .font(.system(size: 15, weight: .regular)) + Text(getTimeString(_class.endtime)) + .font(.system(size: 15, weight: .regular)) + } + .padding(.top, 7) + .padding(.bottom, 7) + .padding(.leading, 10) + Rectangle() + .frame(width: 2) + .frame(maxHeight: UIScreen.main.bounds.height - 18) .padding(.top, 7) .padding(.bottom, 7) - .padding(.leading, 10) - Rectangle() - .frame(width: 2) - .frame(maxHeight: UIScreen.main.bounds.height - 18) - .padding(.top, 7) - .padding(.bottom, 7) - .foregroundColor(_class.important ? Color("redForImportant") : onlineOrNot(_class.online)) - Text(getSubjectName(_class.subject, _class.professor, _class.auditory)) - .font(.system(size: 18, weight: .regular)) - .padding(.top, 7) - .padding(.bottom, 7) - Spacer() - } - .frame(maxWidth: UIScreen.main.bounds.width - 40, maxHeight: 230) - .background(Color.white) - .cornerRadius(20) - .shadow(color: .black.opacity(0.25), radius: 4, x: 2, y: 2) + .foregroundColor(_class.important ? Color("redForImportant") : onlineOrNot(_class.online)) + Text(getSubjectName(_class.subject, _class.professor, _class.auditory)) + .font(.system(size: 18, weight: .regular)) + .padding(.top, 7) + .padding(.bottom, 7) + Spacer() } + .frame(maxWidth: UIScreen.main.bounds.width - 40, maxHeight: 230) + .background(Color.white) + .cornerRadius(20) + .shadow(color: .black.opacity(0.25), radius: 4, x: 2, y: 2) } } diff --git a/Schedule ICTIS/Main/Views/MainView.swift b/Schedule ICTIS/Main/Views/MainView.swift index 9d927c5..b9b38bb 100644 --- a/Schedule ICTIS/Main/Views/MainView.swift +++ b/Schedule ICTIS/Main/Views/MainView.swift @@ -10,7 +10,6 @@ import SwiftUI struct MainView: View { @State private var searchText: String = "" @State private var isShowingMonthSlider: Bool = false - @State private var isFirstAppearence = true @ObservedObject var vm: ScheduleViewModel var body: some View { diff --git a/Schedule ICTIS/Main/Views/ScheduleView.swift b/Schedule ICTIS/Main/Views/ScheduleView.swift index 78ab6aa..3725f72 100644 --- a/Schedule ICTIS/Main/Views/ScheduleView.swift +++ b/Schedule ICTIS/Main/Views/ScheduleView.swift @@ -9,9 +9,9 @@ import SwiftUI struct ScheduleView: View { @ObservedObject var vm: ScheduleViewModel - @FetchRequest(fetchRequest: ClassModel.all()) private var classes - @State private var isShowingEditClassView = false + @FetchRequest(fetchRequest: ClassModel.all()) private var classes //Делаем запрос в CoreData и получаем список сохраненных пар @State private var selectedClass: ClassModel? = nil + var provider = ClassProvider.shared var body: some View { if vm.isLoading { LoadingView(isLoading: $vm.isLoading) @@ -58,11 +58,13 @@ struct ScheduleView: View { } } ForEach(classes) { _class in - CreatedClassView(_class: _class) - .onTapGesture { - isShowingEditClassView = true - selectedClass = _class - } + if daysAreEqual(_class.day, vm.selectedDay) { + CreatedClassView(_class: _class) + .onTapGesture { + selectedClass = _class + print(selectedClass) + } + } } } .frame(width: UIScreen.main.bounds.width) @@ -74,17 +76,19 @@ struct ScheduleView: View { } .frame(width: UIScreen.main.bounds.width, height: 15) } - .sheet(isPresented: $isShowingEditClassView) { - if let selectedClass = selectedClass { - EditClassView(isShowingSheet: $isShowingEditClassView, _class: selectedClass) - } - } + //Sheet будет открываться, когда selectedClass будет становиться не nil + .sheet(item: $selectedClass, + onDismiss: { + selectedClass = nil + }, + content: { _class in + CreateEditClassView(vm: .init(provider: provider, _class: _class)) + }) } else { NoScheduleView() } } - } } diff --git a/Schedule ICTIS/Main/Views/SearchBarView.swift b/Schedule ICTIS/Main/Views/SearchBarView.swift index 3a6d275..b741925 100644 --- a/Schedule ICTIS/Main/Views/SearchBarView.swift +++ b/Schedule ICTIS/Main/Views/SearchBarView.swift @@ -9,7 +9,7 @@ import SwiftUI struct SearchBarView: View { @Binding var text: String - @State private var isEditing = false + @FocusState private var isFocused: Bool @State private var isShowingSheet: Bool = false @ObservedObject var vm: ScheduleViewModel @@ -24,11 +24,9 @@ struct SearchBarView: View { .padding(.trailing, 7) TextField("Поиск группы", text: $text) .disableAutocorrection(true) - .onTapGesture { - self.isEditing = true - } + .focused($isFocused) .onSubmit { - self.isEditing = false + self.isFocused = false if (!text.isEmpty) { vm.fetchWeekSchedule(text) vm.group = text @@ -36,21 +34,20 @@ struct SearchBarView: View { self.text = "" } .submitLabel(.search) - if isEditing { - Button { - self.text = "" - self.isEditing = false - UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) - } label: { - Image(systemName: "xmark.circle.fill") - .padding(.trailing, 20) - .offset(x: 10) - .foregroundColor(.gray) - .background( - ) + if isFocused { + Button { + self.text = "" + self.isFocused = false + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } label: { + Image(systemName: "xmark.circle.fill") + .padding(.trailing, 20) + .offset(x: 10) + .foregroundColor(.gray) + .background( + ) } - .background(Color.red) - } + } } .frame(height: 40) .background( @@ -80,7 +77,7 @@ struct SearchBarView: View { .frame(height: 40) .accentColor(.blue) .sheet(isPresented: $isShowingSheet) { - CreateClassView(isShowingSheet: $isShowingSheet, vm: .init(provider: provider)) + CreateEditClassView(vm: .init(provider: provider)) } } } diff --git a/Schedule ICTIS/Main/Views/Sheets/CreateClassView.swift b/Schedule ICTIS/Main/Views/Sheets/CreateEditClassView.swift similarity index 81% rename from Schedule ICTIS/Main/Views/Sheets/CreateClassView.swift rename to Schedule ICTIS/Main/Views/Sheets/CreateEditClassView.swift index e241272..a2894af 100644 --- a/Schedule ICTIS/Main/Views/Sheets/CreateClassView.swift +++ b/Schedule ICTIS/Main/Views/Sheets/CreateEditClassView.swift @@ -7,13 +7,13 @@ import SwiftUI -struct CreateClassView: View { - @Binding var isShowingSheet: Bool +struct CreateEditClassView: View { + @Environment(\.dismiss) private var dismiss @State private var isShowingDatePickerForDate: Bool = false @ObservedObject var vm: EditClassViewModel @State private var isIncorrectDate1: Bool = false @State private var isIncorrectDate2: Bool = false - + var provider = ClassProvider.shared var body: some View { NavigationView { ScrollView(.vertical, showsIndicators: false) { @@ -134,6 +134,31 @@ struct CreateClassView: View { .padding(.bottom, 10) CommentFieldView(textForComment: $vm._class.comment) + .padding(.bottom, 20) + + + if !vm.isNew { + Button { + do { + try delete(vm._class) + } catch { + print(error) + } + dismiss() + } label: { + HStack { + Spacer() + Image(systemName: "trash") + Text("Удалить занятие") + .font(.system(size: 17, weight: .medium)) + Spacer() + } + .frame(height: 40) + .background(Color.white) + .foregroundColor(Color.red) + .cornerRadius(10) + } + } Spacer() } .padding(.horizontal) @@ -142,56 +167,37 @@ struct CreateClassView: View { .toolbar { ToolbarItem(placement: .navigationBarLeading) { Button("Отменить") { - isShowingSheet = false + dismiss() } } ToolbarItem(placement: .navigationBarTrailing) { Button("Сохранить") { do { try vm.save() + dismiss() } catch { print(error) } - isShowingSheet = false } } } - .navigationTitle("Новая пара") + .navigationTitle(vm.isNew ? "Новая пара" : "Изменить данные") .background(Color("background")) } } - func checkStartTimeLessThenEndTime(_ startTime: Date, _ endTime: Date) -> Bool { - let calendar = Calendar.current - - let firstComponents = calendar.dateComponents([.hour, .minute], from: startTime) - let secondComponents = calendar.dateComponents([.hour, .minute], from: endTime) - - guard let startHours = firstComponents.hour, let startMinutes = firstComponents.minute else { - return false - } - guard let endHours = secondComponents.hour, let endMinutes = secondComponents.minute else { - return false - } - - print("\(startHours) - \(endHours)") - print("\(startMinutes) - \(endMinutes)") - if Int(startHours) > Int(endHours) { - return false - } - else if startHours == endHours { - if startMinutes < endMinutes { - return true - } - else { - return false + func delete(_ _class: ClassModel) throws { + let context = provider.viewContext + let existingClass = try context.existingObject(with: _class.objectID) + context.delete(existingClass) + Task (priority: .background) { + try await context.perform { + try context.save() } } - else { - return true - } + } } #Preview { - CreateClassView(isShowingSheet: .constant(true), vm: .init(provider: .shared)) + CreateEditClassView(vm: .init(provider: .shared)) } diff --git a/Schedule ICTIS/Main/Views/Sheets/EditClassView.swift b/Schedule ICTIS/Main/Views/Sheets/EditClassView.swift deleted file mode 100644 index a9476dd..0000000 --- a/Schedule ICTIS/Main/Views/Sheets/EditClassView.swift +++ /dev/null @@ -1,103 +0,0 @@ -// -// SheetCreateClassView.swift -// Schedule ICTIS -// -// Created by Mironov Egor on 12.12.2024. -// - -import SwiftUI - -struct EditClassView: View { - @State private var isIncorrectDate1: Bool = false - @State private var isIncorrectDate2: Bool = false - @Binding var isShowingSheet: Bool - - let _class: ClassModel - - @State private var subject: String = "" - - var body: some View { - NavigationStack { - ProfessorAuditoryClassFieldView(text: $subject, nameOfImage: "book", labelForField: "Предмет") - .padding(.bottom, 10) - List { - Section("General") { - LabeledContent { - Text(_class.subject) - } label: { - Text("Предмет") - } - - LabeledContent { - Text(_class.auditory) - } label: { - Text("Аудитория") - } - - LabeledContent { - Text(_class.day, style: .date) - } label: { - Text("Преподаватель") - } - - } - - Section("Notes") { - Text(_class.comment) - } - } - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - Button("Отменить") { - isShowingSheet = false - } - } - ToolbarItem(placement: .navigationBarTrailing) { - Button("Сохранить") { - isShowingSheet = false - } - } - } - } - .onAppear { - subject = _class.subject - } - } - - func checkStartTimeLessThenEndTime(_ startTime: Date, _ endTime: Date) -> Bool { - let calendar = Calendar.current - - let firstComponents = calendar.dateComponents([.hour, .minute], from: startTime) - let secondComponents = calendar.dateComponents([.hour, .minute], from: endTime) - - guard let startHours = firstComponents.hour, let startMinutes = firstComponents.minute else { - return false - } - guard let endHours = secondComponents.hour, let endMinutes = secondComponents.minute else { - return false - } - - print("\(startHours) - \(endHours)") - print("\(startMinutes) - \(endMinutes)") - if Int(startHours) > Int(endHours) { - return false - } - else if startHours == endHours { - if startMinutes < endMinutes { - return true - } - else { - return false - } - } - else { - return true - } - } -} - -#Preview { - NavigationStack { - EditClassView(isShowingSheet: .constant(true), _class: .preview()) - } -} diff --git a/Schedule ICTIS/Model/ClassModel.swift b/Schedule ICTIS/Model/ClassModel.swift index 87631cf..a211262 100644 --- a/Schedule ICTIS/Model/ClassModel.swift +++ b/Schedule ICTIS/Model/ClassModel.swift @@ -53,6 +53,7 @@ extension ClassModel { } // Получаем все данные и сортируем их по дню + // Этот метод будет использоваться на View(ScheduleView), где отображаются пары static func all() -> NSFetchRequest { let request: NSFetchRequest = classesFetchRequest request.sortDescriptors = [ diff --git a/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift b/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift index 60a3b1b..84a4562 100644 --- a/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift +++ b/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift @@ -72,7 +72,7 @@ extension View { } // MARK: ScheduleView - func datesAreEqual(_ date1: Date, _ date2: Date) -> Bool { + func daysAreEqual(_ date1: Date, _ date2: Date) -> Bool { let calendar = Calendar.current let components1 = calendar.dateComponents([.year, .month, .day], from: date1) @@ -120,10 +120,34 @@ extension View { return formatter } - func checkUpFields(_ subject: String, _ auditory: String, _ professor: String, _ time1: Date, _ time3: Date) -> Bool { - if (subject != "" || auditory != "" || professor != "") { + func checkStartTimeLessThenEndTime(_ startTime: Date, _ endTime: Date) -> Bool { + let calendar = Calendar.current + + let firstComponents = calendar.dateComponents([.hour, .minute], from: startTime) + let secondComponents = calendar.dateComponents([.hour, .minute], from: endTime) + + guard let startHours = firstComponents.hour, let startMinutes = firstComponents.minute else { + return false + } + guard let endHours = secondComponents.hour, let endMinutes = secondComponents.minute else { + return false + } + + print("\(startHours) - \(endHours)") + print("\(startMinutes) - \(endMinutes)") + if Int(startHours) > Int(endHours) { + return false + } + else if startHours == endHours { + if startMinutes < endMinutes { + return true + } + else { + return false + } + } + else { return true } - return true } } diff --git a/Schedule ICTIS/ViewModel/EditClassViewModel.swift b/Schedule ICTIS/ViewModel/EditClassViewModel.swift index 4eca1e5..dabab4d 100644 --- a/Schedule ICTIS/ViewModel/EditClassViewModel.swift +++ b/Schedule ICTIS/ViewModel/EditClassViewModel.swift @@ -11,11 +11,22 @@ import CoreData final class EditClassViewModel: ObservableObject { @Published var _class: ClassModel + let isNew: Bool + private let context: NSManagedObjectContext init(provider: ClassProvider, _class: ClassModel? = nil) { self.context = provider.newContext - self._class = ClassModel(context: self.context) + + if let _class, + let existingClassCopy = try? context.existingObject(with: _class.objectID) as? ClassModel { + self._class = existingClassCopy + self.isNew = false + } + else { + self._class = ClassModel(context: self.context) + self.isNew = true + } } func save() throws {