diff --git a/Class.swift b/Class.swift deleted file mode 100644 index e8d6e56..0000000 --- a/Class.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// Class.swift -// Schedule ICTIS -// -// Created by G412 on 18.12.2024. -// - -import Foundation diff --git a/ClassDataModel.xcdatamodeld/ClassDataModel.xcdatamodel/contents b/ClassDataModel.xcdatamodeld/ClassDataModel.xcdatamodel/contents index 2f123c7..65ba196 100644 --- a/ClassDataModel.xcdatamodeld/ClassDataModel.xcdatamodel/contents +++ b/ClassDataModel.xcdatamodeld/ClassDataModel.xcdatamodel/contents @@ -1,2 +1,15 @@ - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Schedule ICTIS.xcodeproj/xcuserdata/g412.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Schedule ICTIS.xcodeproj/xcuserdata/g412.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index f13775b..1c2910a 100644 --- a/Schedule ICTIS.xcodeproj/xcuserdata/g412.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Schedule ICTIS.xcodeproj/xcuserdata/g412.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,4 +3,22 @@ uuid = "38CE0E1B-29C0-4785-BF18-FE1BA38F677F" type = "1" version = "2.0"> + + + + + + diff --git a/Schedule ICTIS/Assets.xcassets/AccentColor.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/Schedule ICTIS/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Schedule ICTIS/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 080ba9c..0000000 --- a/Schedule ICTIS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images" : [ - { - "filename" : "ICTIS_logo.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/AppIcon.appiconset/ICTIS_logo.png b/Schedule ICTIS/Assets.xcassets/AppIcon.appiconset/ICTIS_logo.png deleted file mode 100644 index 44b05e5..0000000 Binary files a/Schedule ICTIS/Assets.xcassets/AppIcon.appiconset/ICTIS_logo.png and /dev/null differ diff --git a/Schedule ICTIS/Assets.xcassets/Contents.json b/Schedule ICTIS/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/Schedule ICTIS/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/arrowdown.imageset/Contents.json b/Schedule ICTIS/Assets.xcassets/arrowdown.imageset/Contents.json deleted file mode 100644 index 4ce8416..0000000 --- a/Schedule ICTIS/Assets.xcassets/arrowdown.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "arrow.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/arrowdown.imageset/arrow.png b/Schedule ICTIS/Assets.xcassets/arrowdown.imageset/arrow.png deleted file mode 100644 index 68f840b..0000000 Binary files a/Schedule ICTIS/Assets.xcassets/arrowdown.imageset/arrow.png and /dev/null differ diff --git a/Schedule ICTIS/Assets.xcassets/arrowup.imageset/Contents.json b/Schedule ICTIS/Assets.xcassets/arrowup.imageset/Contents.json deleted file mode 100644 index 446d6be..0000000 --- a/Schedule ICTIS/Assets.xcassets/arrowup.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "Vector.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/arrowup.imageset/Vector.png b/Schedule ICTIS/Assets.xcassets/arrowup.imageset/Vector.png deleted file mode 100644 index 4d0fca6..0000000 Binary files a/Schedule ICTIS/Assets.xcassets/arrowup.imageset/Vector.png and /dev/null differ diff --git a/Schedule ICTIS/Assets.xcassets/background.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/background.colorset/Contents.json deleted file mode 100644 index 5cdfbad..0000000 --- a/Schedule ICTIS/Assets.xcassets/background.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xF6", - "green" : "0xF0", - "red" : "0xF1" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0xFF", - "red" : "0xFF" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/blueColor.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/blueColor.colorset/Contents.json deleted file mode 100644 index 5b28f5e..0000000 --- a/Schedule ICTIS/Assets.xcassets/blueColor.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xA4", - "green" : "0x60", - "red" : "0x28" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xA4", - "green" : "0x60", - "red" : "0x28" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/blueForOnline.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/blueForOnline.colorset/Contents.json deleted file mode 100644 index 213c5b9..0000000 --- a/Schedule ICTIS/Assets.xcassets/blueForOnline.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0x7A", - "red" : "0x00" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0xFF", - "red" : "0xFF" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/customGray1.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/customGray1.colorset/Contents.json deleted file mode 100644 index ea75ab6..0000000 --- a/Schedule ICTIS/Assets.xcassets/customGray1.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xD9", - "green" : "0xD9", - "red" : "0xD9" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xD9", - "green" : "0xD9", - "red" : "0xD9" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/customGray2.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/customGray2.colorset/Contents.json deleted file mode 100644 index 80b1768..0000000 --- a/Schedule ICTIS/Assets.xcassets/customGray2.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x7D", - "green" : "0x7D", - "red" : "0x7D" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x7D", - "green" : "0x7D", - "red" : "0x7D" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/customGray3.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/customGray3.colorset/Contents.json deleted file mode 100644 index 80b1768..0000000 --- a/Schedule ICTIS/Assets.xcassets/customGray3.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x7D", - "green" : "0x7D", - "red" : "0x7D" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x7D", - "green" : "0x7D", - "red" : "0x7D" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/grayForDate.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/grayForDate.colorset/Contents.json deleted file mode 100644 index a039c0b..0000000 --- a/Schedule ICTIS/Assets.xcassets/grayForDate.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x7A", - "green" : "0x7A", - "red" : "0x7A" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x7A", - "green" : "0x7A", - "red" : "0x7A" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/grayForFields.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/grayForFields.colorset/Contents.json deleted file mode 100644 index 58b6ec3..0000000 --- a/Schedule ICTIS/Assets.xcassets/grayForFields.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x84", - "green" : "0x80", - "red" : "0x80" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x84", - "green" : "0x80", - "red" : "0x80" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/greenForOffline.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/greenForOffline.colorset/Contents.json deleted file mode 100644 index 7aba1dd..0000000 --- a/Schedule ICTIS/Assets.xcassets/greenForOffline.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x0A", - "green" : "0x97", - "red" : "0x00" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0xFF", - "red" : "0xFF" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/greyForDaysInMonthTabView.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/greyForDaysInMonthTabView.colorset/Contents.json deleted file mode 100644 index bfc2a11..0000000 --- a/Schedule ICTIS/Assets.xcassets/greyForDaysInMonthTabView.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x99", - "green" : "0x99", - "red" : "0x99" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x99", - "green" : "0x99", - "red" : "0x99" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/Assets.xcassets/turquoise.colorset/Contents.json b/Schedule ICTIS/Assets.xcassets/turquoise.colorset/Contents.json deleted file mode 100644 index ba13876..0000000 --- a/Schedule ICTIS/Assets.xcassets/turquoise.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xDE", - "green" : "0xE4", - "red" : "0x22" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xDE", - "green" : "0xE4", - "red" : "0x22" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Schedule ICTIS/ContentView.swift b/Schedule ICTIS/ContentView.swift index 789de6c..275b738 100644 --- a/Schedule ICTIS/ContentView.swift +++ b/Schedule ICTIS/ContentView.swift @@ -9,7 +9,7 @@ import SwiftUI struct ContentView: View { @State private var selectedTab: Int = 1 - @StateObject var vm = ViewModel() + @StateObject var vm = ScheduleViewModel() var body: some View { TabView(selection: $selectedTab) { diff --git a/Schedule ICTIS/Main/Views/Fields/CommentFieldView.swift b/Schedule ICTIS/Main/Views/Fields/CommentFieldView.swift index 4c6aea8..333ae5d 100644 --- a/Schedule ICTIS/Main/Views/Fields/CommentFieldView.swift +++ b/Schedule ICTIS/Main/Views/Fields/CommentFieldView.swift @@ -41,6 +41,3 @@ struct CommentFieldView: View { } } -#Preview { - SheetCreateClassView(isShowingSheet: .constant(true)) -} diff --git a/Schedule ICTIS/Main/Views/Fields/StartEndTimeFieldView.swift b/Schedule ICTIS/Main/Views/Fields/StartEndTimeFieldView.swift index 8eb486c..61c55c2 100644 --- a/Schedule ICTIS/Main/Views/Fields/StartEndTimeFieldView.swift +++ b/Schedule ICTIS/Main/Views/Fields/StartEndTimeFieldView.swift @@ -46,12 +46,6 @@ struct StartEndTimeFieldView: View { } } } - - private var timeFormatter: DateFormatter { - let formatter = DateFormatter() - formatter.dateFormat = "HH:mm" - return formatter - } } #Preview { diff --git a/Schedule ICTIS/Main/Views/MainView.swift b/Schedule ICTIS/Main/Views/MainView.swift index f5e8339..9d927c5 100644 --- a/Schedule ICTIS/Main/Views/MainView.swift +++ b/Schedule ICTIS/Main/Views/MainView.swift @@ -11,7 +11,7 @@ struct MainView: View { @State private var searchText: String = "" @State private var isShowingMonthSlider: Bool = false @State private var isFirstAppearence = true - @ObservedObject var vm: ViewModel + @ObservedObject var vm: ScheduleViewModel var body: some View { VStack { @@ -64,7 +64,7 @@ struct MainView: View { Image(isShowingMonthSlider ? "arrowup" : "arrowdown") .resizable() .scaledToFit() - .frame(width: 15, height: 15) // Установите размер изображения + .frame(width: 15, height: 15) } } } diff --git a/Schedule ICTIS/Main/Views/ScheduleView.swift b/Schedule ICTIS/Main/Views/ScheduleView.swift index 6de3952..faf0d83 100644 --- a/Schedule ICTIS/Main/Views/ScheduleView.swift +++ b/Schedule ICTIS/Main/Views/ScheduleView.swift @@ -9,7 +9,8 @@ import SwiftUI struct ScheduleView: View { @State private var isShowingSheet: Bool = false - @ObservedObject var vm: ViewModel + @ObservedObject var vm: ScheduleViewModel + @FetchRequest(fetchRequest: ClassModel.all()) private var classes var body: some View { if vm.isLoading { LoadingView(isLoading: $vm.isLoading) @@ -58,6 +59,39 @@ struct ScheduleView: View { } } } + ForEach(classes) { _class in + if datesAreEqual(_class.day, vm.selectedDay) { + 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) + .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) + .onTapGesture { + isShowingSheet = true + } + } + } } .frame(width: UIScreen.main.bounds.width) .padding(.bottom, 100) diff --git a/Schedule ICTIS/Main/Views/SearchBarView.swift b/Schedule ICTIS/Main/Views/SearchBarView.swift index 80cba82..5cff2c7 100644 --- a/Schedule ICTIS/Main/Views/SearchBarView.swift +++ b/Schedule ICTIS/Main/Views/SearchBarView.swift @@ -11,7 +11,9 @@ struct SearchBarView: View { @Binding var text: String @State private var isEditing = false @State private var isShowingSheet: Bool = false - @ObservedObject var vm: ViewModel + @ObservedObject var vm: ScheduleViewModel + + var provider = ClassProvider.shared var body: some View { HStack (spacing: 11) { @@ -28,6 +30,9 @@ struct SearchBarView: View { .onSubmit { self.isEditing = false if (!text.isEmpty) { + if !vm.numOfGroup.isEmpty { + + } vm.fetchWeekSchedule(text) vm.group = text } @@ -78,7 +83,7 @@ struct SearchBarView: View { .frame(height: 40) .accentColor(.blue) .sheet(isPresented: $isShowingSheet) { - SheetCreateClassView(isShowingSheet: $isShowingSheet) + SheetCreateClassView(isShowingSheet: $isShowingSheet, vm: .init(provider: provider)) } } } diff --git a/Schedule ICTIS/Main/Views/Sheets/SheetCreateClassView.swift b/Schedule ICTIS/Main/Views/Sheets/SheetCreateClassView.swift index 6b6b5ac..0486619 100644 --- a/Schedule ICTIS/Main/Views/Sheets/SheetCreateClassView.swift +++ b/Schedule ICTIS/Main/Views/Sheets/SheetCreateClassView.swift @@ -13,22 +13,21 @@ struct SheetCreateClassView: View { @State private var textForNameOfAuditory = "" @State private var textForNameOfProfessor = "" @State private var isShowingDatePickerForDate: Bool = false - @State private var selectedDay: Date = Date() - @State private var selectedStartTime: Date = Date() - @State private var selectedEndTime: Date = Date() @State private var isImportant: Bool = false - @State private var selectedOption: String = "Нет" + @State private var selectedOptionForNotification: String = "Нет" + @State private var selectedOptionForOnline: String = "Оффлайн" @State private var textForComment: String = "" + @ObservedObject var vm: EditClassViewModel var body: some View { NavigationView { ScrollView(.vertical, showsIndicators: false) { VStack { - ProfessorAuditoryClassFieldView(text: $textForNameOfClass, nameOfImage: "book", labelForField: "Предмет") + ProfessorAuditoryClassFieldView(text: $vm._class.subject, nameOfImage: "book", labelForField: "Предмет") .padding(.bottom, 10) - ProfessorAuditoryClassFieldView(text: $textForNameOfAuditory, nameOfImage: "mappin.and.ellipse", labelForField: "Корпус-аудитория") + ProfessorAuditoryClassFieldView(text: $vm._class.auditory, nameOfImage: "mappin.and.ellipse", labelForField: "Корпус-аудитория") .padding(.bottom, 10) - ProfessorAuditoryClassFieldView(text: $textForNameOfProfessor, nameOfImage: "book", labelForField: "Преподаватель") + ProfessorAuditoryClassFieldView(text: $vm._class.professor, nameOfImage: "book", labelForField: "Преподаватель") .padding(.bottom, 10) HStack { Image(systemName: "calendar") @@ -39,7 +38,7 @@ struct SheetCreateClassView: View { .foregroundColor(Color("grayForFields").opacity(0.5)) .font(.system(size: 18, weight: .regular)) Spacer() - Text("\(selectedDay, formatter: dateFormatter)") + Text("\(vm._class.day, formatter: dateFormatter)") .foregroundColor(.black) .font(.system(size: 18, weight: .medium)) .padding(.trailing, 20) @@ -50,18 +49,30 @@ struct SheetCreateClassView: View { .fill(.white) ) .overlay { - DatePicker("", selection: $selectedDay, in: Date()..., displayedComponents: .date) + DatePicker("", selection: $vm._class.day, in: Date()..., displayedComponents: .date) .blendMode(.destinationOver) } .padding(.bottom, 10) HStack { - StartEndTimeFieldView(selectedTime: $selectedStartTime, imageName: "clock", text: "Начало") + StartEndTimeFieldView(selectedTime: $vm._class.starttime, imageName: "clock", text: "Начало") + .onChange(of: vm._class.starttime) { oldValue, newValue in + if !checkStartTimeLessThenEndTime(vm._class.starttime, vm._class.endtime) { + print("Values \(oldValue) - \(newValue) 1") + print(vm._class.starttime) + vm._class.starttime = oldValue + } + } Spacer() - StartEndTimeFieldView(selectedTime: $selectedEndTime, imageName: "clock.badge.xmark", text: "Конец") + StartEndTimeFieldView(selectedTime: $vm._class.endtime, imageName: "clock.badge.xmark", text: "Конец") + .onChange(of: vm._class.endtime) { oldValue, newValue in + print("Values \(oldValue) - \(newValue) 2") + print(vm._class.endtime) + validateTime(old: oldValue, new: newValue, isStartChanged: false) + } } .frame(height: 40) .padding(.bottom, 10) - Toggle("Пометить как важную", isOn: $isImportant) + Toggle("Пометить как важную", isOn: $vm._class.important) .frame(height: 40) .padding(.horizontal) .background( @@ -73,7 +84,7 @@ struct SheetCreateClassView: View { HStack { Text("Напоминанние") Spacer() - Picker("Напоминание", selection: $selectedOption, content: { + Picker("Напоминание", selection: $vm._class.notification, content: { ForEach(MockData.notifications, id: \.self) { Text($0) } @@ -87,8 +98,25 @@ struct SheetCreateClassView: View { .fill(.white) ) .padding(.bottom, 10) + HStack { + Text("Тип") + Spacer() + Picker("Тип", selection: $vm._class.online, content: { + ForEach(MockData.onlineOrOffline, id: \.self) { + Text($0) + } + }) + .accentColor(Color("grayForFields")) + } + .frame(height: 40) + .padding(.horizontal) + .background( + RoundedRectangle(cornerRadius: 10) + .fill(.white) + ) + .padding(.bottom, 10) - CommentFieldView(textForComment: $textForComment) + CommentFieldView(textForComment: $vm._class.comment) Spacer() } .padding(.horizontal) @@ -102,6 +130,11 @@ struct SheetCreateClassView: View { } ToolbarItem(placement: .navigationBarTrailing) { Button("Сохранить") { + do { + try vm.save() + } catch { + print(error) + } isShowingSheet = false } } @@ -110,14 +143,18 @@ struct SheetCreateClassView: View { .background(Color("background")) } } - private var dateFormatter: DateFormatter { - let formatter = DateFormatter() - formatter.dateStyle = .medium - formatter.timeStyle = .none - return formatter + func validateTime(old oldValue: Date, new newValue: Date, isStartChanged: Bool) { + if !checkStartTimeLessThenEndTime(vm._class.starttime, vm._class.endtime) { + if isStartChanged { + vm._class.starttime = Date() + } else { + vm._class.starttime = Date() + } + print("Invalid time selected. Reverting to old value.") + } } } #Preview { - SheetCreateClassView(isShowingSheet: .constant(true)) + SheetCreateClassView(isShowingSheet: .constant(true), vm: .init(provider: .shared)) } diff --git a/Schedule ICTIS/Main/Views/TabViews/MonthTabView.swift b/Schedule ICTIS/Main/Views/TabViews/MonthTabView.swift index 75d059b..1ea3a12 100644 --- a/Schedule ICTIS/Main/Views/TabViews/MonthTabView.swift +++ b/Schedule ICTIS/Main/Views/TabViews/MonthTabView.swift @@ -2,7 +2,7 @@ // MonthTabView.swift // Schedule ICTIS // -// Created by G412 on 10.12.2024. +// Created by Mironov Egor on 10.12.2024. // import SwiftUI @@ -12,7 +12,7 @@ struct MonthTabView: View { @State private var monthSlider: [[Date.MonthWeek]] = [] @State private var createMonth: Bool = false @State private var currentWeekIndex: Int = 0 - @ObservedObject var vm: ViewModel + @ObservedObject var vm: ScheduleViewModel var body: some View { VStack { HStack (spacing: 34) { @@ -25,7 +25,6 @@ struct MonthTabView: View { } } .padding(.top, 14) - //.background(Color.red) TabView(selection: $currentMonthIndex) { ForEach(monthSlider.indices, id: \.self) { index in let month = monthSlider[index] @@ -37,7 +36,6 @@ struct MonthTabView: View { .padding(.bottom, -10) .padding(.horizontal, -15) .tabViewStyle(.page(indexDisplayMode: .never)) - //.background(Color.green) } .onAppear(perform: { vm.updateSelectedDayIndex() diff --git a/Schedule ICTIS/Main/Views/TabViews/WeekTabView.swift b/Schedule ICTIS/Main/Views/TabViews/WeekTabView.swift index 4adc101..7504705 100644 --- a/Schedule ICTIS/Main/Views/TabViews/WeekTabView.swift +++ b/Schedule ICTIS/Main/Views/TabViews/WeekTabView.swift @@ -11,7 +11,7 @@ struct WeekTabView: View { @State private var currentWeekIndex: Int = 1 @State private var weekSlider: [[Date.WeekDay]] = [] @State private var createWeek: Bool = false - @ObservedObject var vm: ViewModel + @ObservedObject var vm: ScheduleViewModel var body: some View { HStack { TabView(selection: $currentWeekIndex) { diff --git a/Schedule ICTIS/MockData.swift b/Schedule ICTIS/MockData.swift index 3a34855..602d106 100644 --- a/Schedule ICTIS/MockData.swift +++ b/Schedule ICTIS/MockData.swift @@ -10,5 +10,9 @@ import Foundation struct MockData { static let daysOfWeek = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"] + + // MARK: SheetCreateClassView static let notifications = ["Нет", "За 10 минут", "За 30 миннут", "За 1 час"] + + static let onlineOrOffline = ["Оффлайн", "Онлайн"] } diff --git a/Schedule ICTIS/Model/ClassModel.swift b/Schedule ICTIS/Model/ClassModel.swift index f43300e..649d7e5 100644 --- a/Schedule ICTIS/Model/ClassModel.swift +++ b/Schedule ICTIS/Model/ClassModel.swift @@ -8,7 +8,7 @@ import Foundation import CoreData -final class ClassModel: NSManagedObject { +final class ClassModel: NSManagedObject, Identifiable { @NSManaged var auditory: String @NSManaged var professor: String @NSManaged var subject: String @@ -18,16 +18,40 @@ final class ClassModel: NSManagedObject { @NSManaged var starttime: Date @NSManaged var endtime: Date @NSManaged var important: Bool + @NSManaged var online: String // Здесь мы выполняем дополнительную инициализацию, назначая значения по умолчанию override func awakeFromInsert() { super.awakeFromInsert() + let calendar = Calendar.current + let endTime = calendar.date(byAdding: .hour, value: 1, to: Date.init()) + setPrimitiveValue("", forKey: "auditory") setPrimitiveValue("", forKey: "professor") setPrimitiveValue("", forKey: "subject") setPrimitiveValue("", forKey: "comment") setPrimitiveValue("Нет", forKey: "notification") setPrimitiveValue(false, forKey: "important") + setPrimitiveValue("Оффлайн", forKey: "online") + setPrimitiveValue(Date.init(), forKey: "day") + setPrimitiveValue(Date.init(), forKey: "starttime") + setPrimitiveValue(endTime, forKey: "endtime") + } +} + +// Расширение для загрузки данных из памяти +extension ClassModel { + private static var classesFetchRequest: NSFetchRequest { + NSFetchRequest(entityName: "ClassModel") + } + + // Получаем все данные из памяти + static func all() -> NSFetchRequest { + let request: NSFetchRequest = classesFetchRequest + request.sortDescriptors = [ + NSSortDescriptor(keyPath: \ClassModel.day, ascending: true) + ] + return request } } diff --git a/Schedule ICTIS/Model/TabBarModel.swift b/Schedule ICTIS/Model/TabBarModel.swift index b0ce5a2..51a1e7b 100644 --- a/Schedule ICTIS/Model/TabBarModel.swift +++ b/Schedule ICTIS/Model/TabBarModel.swift @@ -2,7 +2,7 @@ // Tab.swift // Schedule ICTIS // -// Created by G412 on 13.11.2024. +// Created by Mironov Egor on 13.11.2024. // import SwiftUI diff --git a/Schedule ICTIS/Provider/ClassProvider.swift b/Schedule ICTIS/Provider/ClassProvider.swift index 74a906a..c197b1f 100644 --- a/Schedule ICTIS/Provider/ClassProvider.swift +++ b/Schedule ICTIS/Provider/ClassProvider.swift @@ -2,7 +2,43 @@ // ClassProvider.swift // Schedule ICTIS // -// Created by G412 on 18.12.2024. +// Created by Mironov Egor on 18.12.2024. // import Foundation +import CoreData + +// Это класс служит посредником между View и моделью данных +// Он позволяет открыть наш файл данных чтобы записывать и извлекать значения +// Объект этого класса должен быть единственным за весь жизненный цикл приложения, чтобы не было рассинхронизации +// Для этого мы делаем его синглтоном +final class ClassProvider { + static let shared = ClassProvider() + + // Это свойство для хранения открытого файла модели данных + private let persistentContainer: NSPersistentContainer + + var viewContext: NSManagedObjectContext { + persistentContainer.viewContext + } + + var newContext: NSManagedObjectContext { + persistentContainer.newBackgroundContext() + } + + private init() { + // Открытие файла + persistentContainer = NSPersistentContainer(name: "ClassDataModel") + + // Выставляем флаг для автоматического сохранения изменений данных из Veiw в память + persistentContainer.viewContext.automaticallyMergesChangesFromParent = true + + // Выполняем открытие файла с данными + persistentContainer.loadPersistentStores {_, error in + if let error { + fatalError("Unable to load store. Error: \(error)") + } + } + + } +} diff --git a/Schedule ICTIS/Schedule_ICTISApp.swift b/Schedule ICTIS/Schedule_ICTISApp.swift index b78f483..3c3000d 100644 --- a/Schedule ICTIS/Schedule_ICTISApp.swift +++ b/Schedule ICTIS/Schedule_ICTISApp.swift @@ -12,6 +12,7 @@ struct Schedule_ICTISApp: App { var body: some Scene { WindowGroup { ContentView() + .environment(\.managedObjectContext, ClassProvider.shared.viewContext) } } } diff --git a/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift b/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift index 6ee27db..bfe8449 100644 --- a/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift +++ b/Schedule ICTIS/Utilities/Extensions/View+Extensions.swift @@ -71,7 +71,90 @@ extension View { } } - func hideKeyboard() { - UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + // MARK: ScheduleView + func datesAreEqual(_ date1: Date, _ date2: Date) -> Bool { + let calendar = Calendar.current + + let components1 = calendar.dateComponents([.year, .month, .day], from: date1) + let components2 = calendar.dateComponents([.year, .month, .day], from: date2) + + return components1.year == components2.year && + components1.month == components2.month && + components1.day == components2.day + } + + func onlineOrNot(_ str: String) -> Color { + if (str == "Онлайн") { + return Color("blueForOnline") + } + else { + return Color("greenForOffline") + } + } + + func getSubjectName(_ subject: String, _ professor: String, _ auditory: String) -> String { + return "\(subject) \(professor) \(auditory)" + } + + func getTimeString(_ date: Date) -> String { + let calendar = Calendar.current + let components = calendar.dateComponents([.hour, .minute], from: date) + + guard let hour = components.hour, let minute = components.minute else { + return "Invalid time" + } + + return String(format: "%02d:%02d", hour, minute) + } + + var dateFormatter: DateFormatter { + let formatter = DateFormatter() + formatter.dateStyle = .medium + formatter.timeStyle = .none + return formatter + } + + var timeFormatter: DateFormatter { + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm" + return formatter + } + + 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 startHours > endHours { + return false + } + else if startHours == endHours { + if startMinutes < endMinutes { + return true + } + else { + return false + } + } + else { + return true + } + } + + func checkUpFields(_ subject: String, _ auditory: String, _ professor: String, _ time1: Date, _ time3: Date) -> Bool { + if (subject != "" || auditory != "" || professor != "") { + return true + } + return true } } diff --git a/Schedule ICTIS/Utilities/Model/Class.swift b/Schedule ICTIS/Utilities/Model/Class.swift deleted file mode 100644 index a302649..0000000 --- a/Schedule ICTIS/Utilities/Model/Class.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// Class.swift -// Schedule ICTIS -// -// Created by Mironov Egor on 18.12.2024. -// - -import Foundation -import CoreData - -final class Class: NSManagedObject { - @NSManaged var auditory: String - @NSManaged var professor: String - @NSManaged var subject: String - @NSManaged var comment: String - @NSManaged var notification: String - @NSManaged var day: Date - @NSManaged var starttime: Date - @NSManaged var endtime: Date - @NSManaged var important: Bool - - // Здесь мы выполняем дополнительную инициализацию, назначая значения по умолчанию - override func awakeFromInsert() { - super.awakeFromInsert() - - setPrimitiveValue("", forKey: "auditory") - setPrimitiveValue("", forKey: "professor") - setPrimitiveValue("", forKey: "subject") - setPrimitiveValue("", forKey: "comment") - setPrimitiveValue("Нет", forKey: "notification") - setPrimitiveValue(false, forKey: "important") - } -} diff --git a/Schedule ICTIS/Utilities/Model/ScheduleModel.swift b/Schedule ICTIS/Utilities/Model/ScheduleModel.swift deleted file mode 100644 index a3ab6f6..0000000 --- a/Schedule ICTIS/Utilities/Model/ScheduleModel.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// Model.swift -// Schedule ICTIS -// -// Created by Mironov Egor on 13.11.2024. -// - -import Foundation - -// MARK: - Welcome -struct Schedule: Decodable { - let table: Table - let weeks: [Int] -} - -// MARK: - Table -struct Table: Decodable { - let type, name: String - let week: Int - let group: String - let table: [[String]] - let link: String -} diff --git a/Schedule ICTIS/Utilities/Model/TabBarModel.swift b/Schedule ICTIS/Utilities/Model/TabBarModel.swift deleted file mode 100644 index b0ce5a2..0000000 --- a/Schedule ICTIS/Utilities/Model/TabBarModel.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// Tab.swift -// Schedule ICTIS -// -// Created by G412 on 13.11.2024. -// - -import SwiftUI - -enum TabBarModel: String, CaseIterable { - case schedule = "house" - case tasks = "books.vertical" - case settings = "gear" -} diff --git a/Schedule ICTIS/Utilities/Provider/ClassProvider.swift b/Schedule ICTIS/Utilities/Provider/ClassProvider.swift deleted file mode 100644 index 74a906a..0000000 --- a/Schedule ICTIS/Utilities/Provider/ClassProvider.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// ClassProvider.swift -// Schedule ICTIS -// -// Created by G412 on 18.12.2024. -// - -import Foundation diff --git a/Schedule ICTIS/ViewModel/EditClassViewModel.swift b/Schedule ICTIS/ViewModel/EditClassViewModel.swift index 9aab8b1..4eca1e5 100644 --- a/Schedule ICTIS/ViewModel/EditClassViewModel.swift +++ b/Schedule ICTIS/ViewModel/EditClassViewModel.swift @@ -6,3 +6,21 @@ // import Foundation +import CoreData + +final class EditClassViewModel: ObservableObject { + @Published var _class: ClassModel + + private let context: NSManagedObjectContext + + init(provider: ClassProvider, _class: ClassModel? = nil) { + self.context = provider.newContext + self._class = ClassModel(context: self.context) + } + + func save() throws { + if context.hasChanges { + try context.save() + } + } +} diff --git a/Schedule ICTIS/ViewModel/Model/Class.swift b/Schedule ICTIS/ViewModel/Model/Class.swift deleted file mode 100644 index a302649..0000000 --- a/Schedule ICTIS/ViewModel/Model/Class.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// Class.swift -// Schedule ICTIS -// -// Created by Mironov Egor on 18.12.2024. -// - -import Foundation -import CoreData - -final class Class: NSManagedObject { - @NSManaged var auditory: String - @NSManaged var professor: String - @NSManaged var subject: String - @NSManaged var comment: String - @NSManaged var notification: String - @NSManaged var day: Date - @NSManaged var starttime: Date - @NSManaged var endtime: Date - @NSManaged var important: Bool - - // Здесь мы выполняем дополнительную инициализацию, назначая значения по умолчанию - override func awakeFromInsert() { - super.awakeFromInsert() - - setPrimitiveValue("", forKey: "auditory") - setPrimitiveValue("", forKey: "professor") - setPrimitiveValue("", forKey: "subject") - setPrimitiveValue("", forKey: "comment") - setPrimitiveValue("Нет", forKey: "notification") - setPrimitiveValue(false, forKey: "important") - } -} diff --git a/Schedule ICTIS/ViewModel/Model/ScheduleModel.swift b/Schedule ICTIS/ViewModel/Model/ScheduleModel.swift deleted file mode 100644 index a3ab6f6..0000000 --- a/Schedule ICTIS/ViewModel/Model/ScheduleModel.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// Model.swift -// Schedule ICTIS -// -// Created by Mironov Egor on 13.11.2024. -// - -import Foundation - -// MARK: - Welcome -struct Schedule: Decodable { - let table: Table - let weeks: [Int] -} - -// MARK: - Table -struct Table: Decodable { - let type, name: String - let week: Int - let group: String - let table: [[String]] - let link: String -} diff --git a/Schedule ICTIS/ViewModel/Model/TabBarModel.swift b/Schedule ICTIS/ViewModel/Model/TabBarModel.swift deleted file mode 100644 index b0ce5a2..0000000 --- a/Schedule ICTIS/ViewModel/Model/TabBarModel.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// Tab.swift -// Schedule ICTIS -// -// Created by G412 on 13.11.2024. -// - -import SwiftUI - -enum TabBarModel: String, CaseIterable { - case schedule = "house" - case tasks = "books.vertical" - case settings = "gear" -} diff --git a/Schedule ICTIS/ViewModel/Provider/ClassProvider.swift b/Schedule ICTIS/ViewModel/Provider/ClassProvider.swift deleted file mode 100644 index 74a906a..0000000 --- a/Schedule ICTIS/ViewModel/Provider/ClassProvider.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// ClassProvider.swift -// Schedule ICTIS -// -// Created by G412 on 18.12.2024. -// - -import Foundation diff --git a/Schedule ICTIS/ViewModel/ScheduleViewModel.swift b/Schedule ICTIS/ViewModel/ScheduleViewModel.swift index c98efe2..ee0d251 100644 --- a/Schedule ICTIS/ViewModel/ScheduleViewModel.swift +++ b/Schedule ICTIS/ViewModel/ScheduleViewModel.swift @@ -42,13 +42,13 @@ final class ScheduleViewModel: ObservableObject { else { schedule = try await NetworkManager.shared.getSchedule(group) } - weekSchedule = schedule.table - week = weekSchedule.week - numOfGroup = weekSchedule.group - classes = weekSchedule.table + self.weekSchedule = schedule.table + self.week = weekSchedule.week + self.numOfGroup = weekSchedule.group + self.classes = weekSchedule.table self.isFirstStartOffApp = false self.isShowingAlertForIncorrectGroup = false - isLoading = false + self.isLoading = false self.errorInNetwork = .noError }