feat: add sort options

This commit is contained in:
dscyrescotti
2024-06-27 20:08:54 +07:00
parent 89c5a62612
commit 9508f3cf13
3 changed files with 79 additions and 3 deletions
+26 -3
View File
@@ -10,23 +10,43 @@ import SwiftUI
struct MemosView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(sortDescriptors: []) var memoObjects: FetchedResults<MemoObject>
@FetchRequest var memoObjects: FetchedResults<MemoObject>
@State var memo: MemoObject?
@AppStorage("memola.memo-objects.sort") var sort: Sort = .recent
let cellWidth: CGFloat = 250
let cellHeight: CGFloat = 150
init() {
let standard = UserDefaults.standard
var descriptors: [SortDescriptor<MemoObject>] = []
let sort = Sort(rawValue: standard.value(forKey: "memola.memo-objects.sort") as? String ?? "") ?? .recent
descriptors = sort.memoSortDescriptors
_memoObjects = FetchRequest(sortDescriptors: descriptors)
}
var body: some View {
NavigationStack {
memoGrid
.navigationTitle("Memos")
.toolbar {
ToolbarItem(placement: .primaryAction) {
ToolbarItemGroup(placement: .primaryAction) {
Menu {
Picker("", selection: $sort) {
ForEach(Sort.all) { sort in
Text(sort.name)
.tag(sort)
}
}
} label: {
Image(systemName: "arrow.up.arrow.down.circle")
}
Button {
createMemo(title: "Untitled")
} label: {
Image(systemName: "plus")
Image(systemName: "square.and.pencil")
}
.hoverEffect()
}
@@ -41,6 +61,9 @@ struct MemosView: View {
}
}
}
.onChange(of: sort) { oldValue, newValue in
memoObjects.sortDescriptors = newValue.memoSortDescriptors
}
}
var memoGrid: some View {
+49
View File
@@ -0,0 +1,49 @@
//
// Sort.swift
// Memola
//
// Created by Dscyre Scotti on 6/27/24.
//
import Foundation
enum Sort: String, Identifiable, Hashable, Equatable {
var id: String {
rawValue
}
case recent
case aToZ
case zToA
case newest
case oldest
var name: String {
switch self {
case .recent: return "Recent"
case .aToZ: return "A to Z"
case .zToA: return "Z to A"
case .newest: return "Newest"
case .oldest: return "Oldest"
}
}
static let all: [Sort] = [.recent, .aToZ, .zToA, .newest, .oldest]
}
extension Sort {
var memoSortDescriptors: [SortDescriptor<MemoObject>] {
switch self {
case .recent:
return [SortDescriptor(\.updatedAt, order: .reverse)]
case .aToZ:
return [SortDescriptor(\.title), SortDescriptor(\.updatedAt, order: .reverse)]
case .zToA:
return [SortDescriptor(\.title, order: .reverse), SortDescriptor(\.updatedAt, order: .reverse)]
case .newest:
return [SortDescriptor(\.createdAt, order: .reverse)]
case .oldest:
return [SortDescriptor(\.createdAt)]
}
}
}