filtering days in customize will filter views

This commit is contained in:
Trey t
2022-03-31 14:45:08 -05:00
parent 9e4cfd2775
commit bdd0b0ce59
14 changed files with 102 additions and 66 deletions

View File

@@ -14,6 +14,8 @@ struct FeelsApp: App {
@Environment(\.scenePhase) private var scenePhase
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@StateObject var daysFilter = DaysFilterClass()
let persistenceController = PersistenceController.shared
init() {
@@ -28,6 +30,7 @@ struct FeelsApp: App {
WindowGroup {
MainTabView()
.environment(\.managedObjectContext, persistenceController.viewContext)
.environmentObject(daysFilter)
}.onChange(of: scenePhase) { phase in
if phase == .background {
// BGTask.scheduleBackgroundProcessing()

View File

@@ -5,13 +5,14 @@
// Created by Trey Tartt on 3/31/22.
//
import Foundation
import SwiftUI
class DaysFilterClass: ObservableObject {
@Published public private(set) var currentFilters = [Int]()
@Published public var currentFilters = [Int]()
init() {
currentFilters = UserDefaultsStore.getDaysFilter()
let storedDays = UserDefaultsStore.getDaysFilter()
currentFilters = storedDays
}
func addFilter(newFilter: Int) {

View File

@@ -48,10 +48,10 @@ extension PersistenceController {
return data
}
public func splitIntoYearMonth() -> [Int: [Int: [MoodEntry]]] {
public func splitIntoYearMonth(includedDays: [Int]) -> [Int: [Int: [MoodEntry]]] {
let data = PersistenceController.shared.getData(startDate: Date(timeIntervalSince1970: 0),
endDate: Date(),
includedDays: [1,2,3,4,5,6,7]).sorted(by: {
includedDays: includedDays).sorted(by: {
$0.forDate! < $1.forDate!
})
var returnData = [Int: [Int: [MoodEntry]]]()

View File

@@ -33,7 +33,7 @@ struct CustomizeView: View {
@StateObject private var selectedWidget = StupidAssCustomWidgetObservableObject()
@StateObject private var daysFilter = DaysFilterClass()
@EnvironmentObject var daysFilter: DaysFilterClass
let weekdays = [("Sun", 1),
("mon", 2),

View File

@@ -27,4 +27,12 @@ struct DayChartView: ChartViewItemBuildable, View, Hashable {
alignment: .center)
.opacity(color == Mood.missing.color ? 0.5 : 1.0)
}
var filteredDaysView: some View {
shape.view(withText: Text(""), bgColor: Mood.missing.color, textColor: .clear)
.frame(minWidth: 5, idealWidth: 50, maxWidth: 50,
minHeight: 5, idealHeight: 20, maxHeight: 50,
alignment: .center)
.opacity(color == Mood.missing.color ? 0.5 : 1.0)
}
}

View File

@@ -9,14 +9,16 @@ import SwiftUI
import CoreData
import Charts
struct HomeViewConstants {
struct DayViewConstants {
static let maxHeaderHeight = 200.0
static let minHeaderHeight = 120.0
}
struct DayView: View {
@EnvironmentObject var daysFilter: DaysFilterClass
@Environment(\.managedObjectContext) private var viewContext
@AppStorage(UserDefaultsStore.Keys.deleteEnable.rawValue, store: GroupUserDefaults.groupDefaults) private var deleteEnabled = true
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
@@ -47,12 +49,12 @@ struct DayView: View {
@StateObject private var onboardingData = OnboardingDataDataManager.shared
// MARK: header properties
@State private var headerHeight: CGFloat = HomeViewConstants.maxHeaderHeight
@State private var headerHeight: CGFloat = DayViewConstants.maxHeaderHeight
@State private var headerViewType: MainSwitchableViewType = .total
@State private var headerOpacity: Double = 1.0
//
@ObservedObject var viewModel = HomeViewViewModel(addMonthStartWeekdayPadding: false)
@ObservedObject var viewModel: DayViewViewModel = DayViewViewModel(addMonthStartWeekdayPadding: false)
var body: some View {
mainView
@@ -62,7 +64,7 @@ struct DayView: View {
.sheet(isPresented: $showingSheet) {
SettingsView()
}
.alert(HomeViewViewModel.updateTitleHeader(forEntry: selectedEntry),
.alert(DayViewViewModel.updateTitleHeader(forEntry: selectedEntry),
isPresented: $showUpdateEntryAlert) {
ForEach(Mood.allValues) { mood in
Button(mood.strValue, action: {
@@ -92,7 +94,7 @@ struct DayView: View {
// MARK: functions that do view type work
func calcuateViewAlpha() {
let perc = (((Double(headerHeight) - HomeViewConstants.minHeaderHeight) * 100) / (HomeViewConstants.maxHeaderHeight - HomeViewConstants.minHeaderHeight)) / 100
let perc = (((Double(headerHeight) - DayViewConstants.minHeaderHeight) * 100) / (DayViewConstants.maxHeaderHeight - DayViewConstants.minHeaderHeight)) / 100
headerOpacity = perc
}
@@ -142,7 +144,7 @@ struct DayView: View {
VStack {
SmallRollUpHeaderView(entries: getBackEntries(),
viewType: $currentSelectedHeaderViewViewType)
.frame(height: HomeViewConstants.minHeaderHeight)
.frame(height: DayViewConstants.minHeaderHeight)
.padding([.trailing, .leading])
.background(
theme.currentTheme.secondaryBGColor
@@ -263,8 +265,8 @@ struct DayView: View {
.coordinateSpace(name: "scroll")
.onPreferenceChange(ViewOffsetKey.self) { value in
if viewModel.numberOfItems > 10 {
calculateHeight(minHeight: HomeViewConstants.minHeaderHeight,
maxHeight: HomeViewConstants.maxHeaderHeight,
calculateHeight(minHeight: DayViewConstants.minHeaderHeight,
maxHeight: DayViewConstants.maxHeaderHeight,
yOffset: value)
}
}
@@ -298,12 +300,14 @@ extension DayView {
ForEach(entries.sorted(by: {
return $0.forDate! > $1.forDate!
}), id: \.self) { entry in
EntryListView(entry: entry)
.contentShape(Rectangle())
.onTapGesture(perform: {
selectedEntry = entry
showUpdateEntryAlert = true
})
if daysFilter.currentFilters.contains(Int(entry.weekDay)) {
EntryListView(entry: entry)
.contentShape(Rectangle())
.onTapGesture(perform: {
selectedEntry = entry
showUpdateEntryAlert = true
})
}
}
}
}
@@ -326,12 +330,12 @@ private let itemFormatter: DateFormatter = {
struct DayView_Previews: PreviewProvider {
static var previews: some View {
DayView().environment(\.managedObjectContext, PersistenceController.shared.viewContext)
DayView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: false)).environment(\.managedObjectContext, PersistenceController.shared.viewContext)
.onAppear(perform: {
PersistenceController.shared.populateMemory()
})
DayView()
DayView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: false))
.preferredColorScheme(.dark)
.environment(\.managedObjectContext, PersistenceController.shared.viewContext)
}

View File

@@ -8,7 +8,7 @@
import SwiftUI
import CoreData
class HomeViewViewModel: ObservableObject {
class DayViewViewModel: ObservableObject {
@Published var grouped = [Int: [Int: [MoodEntry]]]()
@Published var numberOfItems = 0
@@ -52,7 +52,7 @@ class HomeViewViewModel: ObservableObject {
}
private func getGroupedData(addMonthStartWeekdayPadding: Bool) {
var newStuff = PersistenceController.shared.splitIntoYearMonth()
var newStuff = PersistenceController.shared.splitIntoYearMonth(includedDays: [1,2,3,4,5,6,7])
if addMonthStartWeekdayPadding {
newStuff = MoodEntryFunctions.padMoodEntriesForCalendar(entries: newStuff)
}

View File

@@ -11,7 +11,7 @@ struct EmptyHomeView: View {
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
@AppStorage(UserDefaultsStore.Keys.textColor.rawValue, store: GroupUserDefaults.groupDefaults) private var textColor: Color = DefaultTextColor.textColor
let viewModel: HomeViewViewModel
let viewModel: DayViewViewModel
var body: some View {
ZStack {
@@ -32,6 +32,6 @@ struct EmptyHomeView: View {
struct EmptyHomeView_Previews: PreviewProvider {
static var previews: some View {
EmptyHomeView(viewModel: HomeViewViewModel(addMonthStartWeekdayPadding: false))
EmptyHomeView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: false))
}
}

View File

@@ -8,6 +8,8 @@
import SwiftUI
struct MainTabView: View {
@EnvironmentObject var daysFilter: DaysFilterClass
@AppStorage(UserDefaultsStore.Keys.needsOnboarding.rawValue, store: GroupUserDefaults.groupDefaults) private var needsOnboarding = true
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
@@ -23,7 +25,7 @@ struct MainTabView: View {
Label(String(localized: "content_view_tab_main"), systemImage: "list.dash")
}
MonthView()
MonthView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: true))
.tabItem {
Label(String(localized: "content_view_tab_month"), systemImage: "calendar")
}

View File

@@ -23,7 +23,7 @@ struct MonthDetailView: View {
let monthInt: Int
let yearInt: Int
@State var entries: [MoodEntry]
var parentViewModel: HomeViewViewModel
var parentViewModel: DayViewViewModel
let columns = [
GridItem(.flexible(minimum: 5, maximum: 500)),
@@ -86,7 +86,7 @@ struct MonthDetailView: View {
ShareSheet(photo: uiImage)
}
}
.alert(HomeViewViewModel.updateTitleHeader(forEntry: selectedEntry), isPresented: $showUpdateEntryAlert) {
.alert(DayViewViewModel.updateTitleHeader(forEntry: selectedEntry), isPresented: $showUpdateEntryAlert) {
ForEach(Mood.allValues) { mood in
Button(mood.strValue, action: {
if let selectedEntry = selectedEntry {
@@ -225,6 +225,6 @@ struct MonthDetailView_Previews: PreviewProvider {
MonthDetailView(monthInt: 5, yearInt: 2022, entries:
PersistenceController.shared.randomEntries(count: 30).sorted(by: {
$0.forDate! < $1.forDate!
}), parentViewModel: HomeViewViewModel(addMonthStartWeekdayPadding: true))
}), parentViewModel: DayViewViewModel(addMonthStartWeekdayPadding: true))
}
}

View File

@@ -8,6 +8,8 @@
import SwiftUI
struct MonthView: View {
@EnvironmentObject var daysFilter: DaysFilterClass
@AppStorage(UserDefaultsStore.Keys.needsOnboarding.rawValue, store: GroupUserDefaults.groupDefaults) private var needsOnboarding = true
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
@@ -22,7 +24,6 @@ struct MonthView: View {
// store a value that gets changed when user updates custom colors to update the view since the moodTint doesn't change
@AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0
@ObservedObject var viewModel = HomeViewViewModel(addMonthStartWeekdayPadding: true)
@StateObject private var selectedDetail = StupidAssDetailViewObservableObject()
@State private var showingSheet = false
@@ -43,6 +44,8 @@ struct MonthView: View {
GridItem(.flexible(minimum: 5, maximum: 400))
]
@ObservedObject var viewModel: DayViewViewModel
var body: some View {
ZStack {
if viewModel.hasNoData {
@@ -201,10 +204,17 @@ extension MonthView {
Divider()
LazyVGrid(columns: columns, spacing: 15) {
ForEach(entries, id: \.self) { entry in
shape.view(withText: Text(""),
bgColor: entry.mood == .placeholder ? .clear : moodTint.color(forMood: entry.mood),
textColor: .clear)
.frame(minHeight: 25, idealHeight: 25, maxHeight: 50, alignment: .center)
if daysFilter.currentFilters.contains(Int(entry.weekDay)) {
shape.view(withText: Text(""),
bgColor: entry.mood == .placeholder ? .clear : moodTint.color(forMood: entry.mood),
textColor: .clear)
.frame(minHeight: 25, idealHeight: 25, maxHeight: 50, alignment: .center)
} else {
shape.view(withText: Text(""),
bgColor: .clear,
textColor: .clear)
.frame(minHeight: 25, idealHeight: 25, maxHeight: 50, alignment: .center)
}
}
}
}
@@ -223,6 +233,6 @@ extension MonthView {
struct HomeViewTwo_Previews: PreviewProvider {
static var previews: some View {
MonthView()
MonthView(viewModel: DayViewViewModel(addMonthStartWeekdayPadding: true))
}
}

View File

@@ -9,6 +9,8 @@ import SwiftUI
import CoreData
struct YearView: View {
@EnvironmentObject var daysFilter: DaysFilterClass
let months = [(0, "J"), (1, "F"), (2,"M"), (3,"A"), (4,"M"), (5, "J"), (6,"J"), (7,"A"), (8,"S"), (9,"O"), (10, "N"), (11,"D")]
@State private var toggle = true
@@ -22,7 +24,7 @@ struct YearView: View {
@AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default
@AppStorage(UserDefaultsStore.Keys.textColor.rawValue, store: GroupUserDefaults.groupDefaults) private var textColor: Color = DefaultTextColor.textColor
@StateObject private var viewModel = FilterViewModel()
@StateObject private var viewModel = YearViewModel()
//[
// 2001: [0: [], 1: [], 2: []],
// 2002: [0: [], 1: [], 2: []]
@@ -159,12 +161,18 @@ struct YearView: View {
}
private struct monthGridView: View {
@EnvironmentObject var daysFilter: DaysFilterClass
let monthData: [DayChartView]
var body: some View {
VStack {
ForEach(monthData, id: \.self) { view in
view
if daysFilter.currentFilters.contains(view.weekDay) {
view
} else {
view.filteredDaysView
}
}
}
}

View File

@@ -7,7 +7,7 @@
import Foundation
class FilterViewModel: ObservableObject {
class YearViewModel: ObservableObject {
@Published public var entryStartDate: Date = Date()
@Published public var entryEndDate: Date = Date()
@Published var selectedDays = [Int]()