From 94888c9ea5d43aba6d53fc42135b1a4ba6a403eb Mon Sep 17 00:00:00 2001 From: Trey t Date: Sun, 16 Jan 2022 20:50:41 -0600 Subject: [PATCH] Header chart view on main page change layout of main page rows --- Shared/Models/Mood.swift | 2 +- Shared/views/AddMoodHeaderView.swift | 2 +- Shared/views/ContentView.swift | 43 ++++++++++++++++++---------- Shared/views/FilterView.swift | 2 +- Shared/views/HeaderStatsView.swift | 35 ++++++++++++++++------ 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/Shared/Models/Mood.swift b/Shared/Models/Mood.swift index be011e0..cc24bb3 100644 --- a/Shared/Models/Mood.swift +++ b/Shared/Models/Mood.swift @@ -51,7 +51,7 @@ enum Mood: Int { } static var allValues: [Mood] { - return [Mood.horrible, Mood.bad, Mood.average, Mood.good, Mood.great] + return [Mood.horrible, Mood.bad, Mood.average, Mood.good, Mood.great].reversed() } var icon: Image { diff --git a/Shared/views/AddMoodHeaderView.swift b/Shared/views/AddMoodHeaderView.swift index b0aff8e..862e7bd 100644 --- a/Shared/views/AddMoodHeaderView.swift +++ b/Shared/views/AddMoodHeaderView.swift @@ -23,7 +23,7 @@ struct AddMoodHeaderView: View { .foregroundColor(Color(UIColor.label)) .padding() HStack{ - ForEach(Mood.allValues.reversed()) { mood in + ForEach(Mood.allValues) { mood in VStack { Button(action: { addItem(withMood: mood) diff --git a/Shared/views/ContentView.swift b/Shared/views/ContentView.swift index 89d9eba..8295247 100644 --- a/Shared/views/ContentView.swift +++ b/Shared/views/ContentView.swift @@ -57,25 +57,40 @@ struct ContentView: View { } } + private func weekdayName(fromDate date: Date) -> String { + let weekday = Calendar.current.component(.weekday, from: date) + let calendar = Calendar.current + let dayIndex = ((weekday - 1) + (calendar.firstWeekday - 1)) % 7 + return calendar.shortWeekdaySymbols[dayIndex] + } + private var listView: some View { List { ForEach(items) { item in HStack { item.mood.icon .resizable() - .frame(width: 50, height: 50, alignment: .center) + .frame(width: 40, height: 40, alignment: .center) .foregroundColor(item.mood.color) VStack { + HStack { + Text(weekdayName(fromDate:item.forDate!)) + .font(.title3) + .foregroundColor(Color(UIColor.label)) + .frame(maxWidth: 40, alignment: .leading) + Text(" - ") + .padding([.leading, .trailing], -10) + Text(item.forDate ?? Date(), style: .date) + .font(.title3) + .foregroundColor(Color(UIColor.label)) + .frame(maxWidth: .infinity, alignment: .leading) + } Text("\(item.moodString)") - .font(.title) + .font(.body) .foregroundColor(Color(UIColor.systemGray)) .frame(maxWidth: .infinity, alignment: .leading) - Text(item.forDate ?? Date(), style: .date) - .font(.body) - .foregroundColor(Color(UIColor.label)) - .frame(maxWidth: .infinity, alignment: .leading) } - .padding(.leading) + } } .onDelete(perform: deleteItems) @@ -90,15 +105,13 @@ struct ContentView: View { .frame(minHeight: 85, maxHeight: 180) .frame(minWidth: 0, maxWidth: .infinity) } else { - HeaderStatsView(entries: [ - //x - position of a bar, y - height of a bar - BarChartDataEntry(x: 1, y: 1), - BarChartDataEntry(x: 2, y: 5), - BarChartDataEntry(x: 3, y: 2), - BarChartDataEntry(x: 4, y: 4), - BarChartDataEntry(x: 5, y: 1) - ]) + HeaderStatsView(fakeData: false, backDays: 30) .frame(minHeight: 85, maxHeight: 180) + // should match backDays above + Text("Past \(30) days") + .font(.body) + .foregroundColor(Color(UIColor.systemGray)) + .frame(maxWidth: .infinity, alignment: .center) } listView } diff --git a/Shared/views/FilterView.swift b/Shared/views/FilterView.swift index 21570fb..e5807cb 100644 --- a/Shared/views/FilterView.swift +++ b/Shared/views/FilterView.swift @@ -214,7 +214,7 @@ struct FilterView: View { HStack { Spacer() - ForEach(Mood.allValues.reversed(), id: \.self) { mood in + ForEach(Mood.allValues, id: \.self) { mood in StatsSubView(data: self.dataHolder.uncategorizedData, mood: mood) Spacer() } diff --git a/Shared/views/HeaderStatsView.swift b/Shared/views/HeaderStatsView.swift index 7734ff1..4fae560 100644 --- a/Shared/views/HeaderStatsView.swift +++ b/Shared/views/HeaderStatsView.swift @@ -11,6 +11,30 @@ import Charts struct HeaderStatsView : UIViewRepresentable { //Bar chart accepts data as array of BarChartDataEntry objects var entries : [BarChartDataEntry] + + init(fakeData: Bool, backDays: Int) { + entries = [BarChartDataEntry]() + + var moodEntries: [MoodEntry]? + + if fakeData { + moodEntries = PersistenceController.shared.randomEntries(count: 10) + } else { + var daysAgo = Calendar.current.date(byAdding: .day, value: -backDays, to: Date())! + daysAgo = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: daysAgo)! + + moodEntries = PersistenceController.shared.getData(startDate: daysAgo, endDate: Date(), includedDays: [1,2,3,4,5,6,7]) + } + if let moodEntries = moodEntries { + for (index, mood) in Mood.allValues.enumerated() { + entries.append(BarChartDataEntry(x: Double(index + 1), + y: Double(moodEntries.filter({ + Int($0.moodValue) == mood.rawValue + }).count))) + } + } + } + // this func is required to conform to UIViewRepresentable protocol func makeUIView(context: Context) -> BarChartView { //crate new chart @@ -56,7 +80,7 @@ struct HeaderStatsView : UIViewRepresentable { //BarChartDataSet is an object that contains information about your data, styling and more let dataSet = BarChartDataSet(entries: entries) // change bars color to green - dataSet.colors = [NSUIColor.green] + dataSet.colors = Mood.allValues.map({ NSUIColor( $0.color ) }) //change data label data.append(dataSet) return data @@ -70,13 +94,6 @@ struct HeaderStatsView : UIViewRepresentable { struct HeaderStatsView_Previews: PreviewProvider { static var previews: some View { - HeaderStatsView(entries: [ - //x - position of a bar, y - height of a bar - BarChartDataEntry(x: 1, y: 1), - BarChartDataEntry(x: 2, y: 4), - BarChartDataEntry(x: 3, y: 3), - BarChartDataEntry(x: 4, y: 2), - BarChartDataEntry(x: 5, y: 1) - ]).frame(minHeight: 85, maxHeight: 90) + HeaderStatsView(fakeData: true, backDays: 30).frame(minHeight: 85, maxHeight: 90) } }