Merge pull request #735 from omnivore-app/feature/ios-sort-chip
Add chip to change sort order of linked items
This commit is contained in:
@ -49,6 +49,9 @@ import Views
|
||||
.onChange(of: viewModel.appliedFilter) { _ in
|
||||
loadItems(isRefresh: true)
|
||||
}
|
||||
.onChange(of: viewModel.appliedSort) { _ in
|
||||
loadItems(isRefresh: true)
|
||||
}
|
||||
.sheet(item: $viewModel.itemUnderLabelEdit) { item in
|
||||
ApplyLabelsView(mode: .item(item), onSave: nil)
|
||||
}
|
||||
@ -156,11 +159,23 @@ import Views
|
||||
}
|
||||
},
|
||||
label: {
|
||||
TextChipButton.makeFilterButton(
|
||||
TextChipButton.makeMenuButton(
|
||||
title: LinkedItemFilter(rawValue: viewModel.appliedFilter)?.displayName ?? "Filter"
|
||||
)
|
||||
}
|
||||
)
|
||||
Menu(
|
||||
content: {
|
||||
ForEach(LinkedItemSort.allCases, id: \.self) { sort in
|
||||
Button(sort.displayName, action: { viewModel.appliedSort = sort.rawValue })
|
||||
}
|
||||
},
|
||||
label: {
|
||||
TextChipButton.makeMenuButton(
|
||||
title: LinkedItemSort(rawValue: viewModel.appliedSort)?.displayName ?? "Sort"
|
||||
)
|
||||
}
|
||||
)
|
||||
TextChipButton.makeAddLabelButton {
|
||||
showLabelsSheet = true
|
||||
}
|
||||
|
||||
@ -22,9 +22,10 @@ import Views
|
||||
@Published var selectedLinkItem: NSManagedObjectID?
|
||||
@Published var linkRequest: LinkRequest?
|
||||
@Published var showLoadingBar = false
|
||||
@Published var appliedFilter = LinkedItemFilter.inbox.rawValue
|
||||
@Published var appliedSort = LinkedItemSort.newest.rawValue
|
||||
|
||||
@AppStorage(UserDefaultKey.lastSelectedLinkedItemFilter.rawValue)
|
||||
var appliedFilter = LinkedItemFilter.inbox.rawValue
|
||||
|
||||
var cursor: String?
|
||||
|
||||
@ -111,7 +112,6 @@ import Views
|
||||
|
||||
private var fetchRequest: NSFetchRequest<Models.LinkedItem> {
|
||||
let fetchRequest: NSFetchRequest<Models.LinkedItem> = LinkedItem.fetchRequest()
|
||||
fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false)]
|
||||
|
||||
var subPredicates = [NSPredicate]()
|
||||
|
||||
@ -142,6 +142,8 @@ import Views
|
||||
}
|
||||
|
||||
fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: subPredicates)
|
||||
fetchRequest.sortDescriptors = (LinkedItemSort(rawValue: appliedSort) ?? .newest).sortDescriptors
|
||||
|
||||
return fetchRequest
|
||||
}
|
||||
|
||||
@ -197,7 +199,8 @@ import Views
|
||||
|
||||
private var searchQuery: String {
|
||||
let filter = LinkedItemFilter(rawValue: appliedFilter) ?? .inbox
|
||||
var query = "\(filter.queryString)"
|
||||
let sort = LinkedItemSort(rawValue: appliedSort) ?? .newest
|
||||
var query = "\(filter.queryString) \(sort.queryString)"
|
||||
|
||||
if !searchTerm.isEmpty {
|
||||
query.append(" \(searchTerm)")
|
||||
|
||||
54
apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift
Normal file
54
apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift
Normal file
@ -0,0 +1,54 @@
|
||||
import Foundation
|
||||
|
||||
public enum LinkedItemSort: String, CaseIterable {
|
||||
case newest
|
||||
case oldest
|
||||
case recentlyRead
|
||||
case recentlyPublished
|
||||
case relevance
|
||||
}
|
||||
|
||||
public extension LinkedItemSort {
|
||||
var displayName: String {
|
||||
switch self {
|
||||
case .newest:
|
||||
return "Newest"
|
||||
case .oldest:
|
||||
return "Oldest"
|
||||
case .recentlyRead:
|
||||
return "Recently Read"
|
||||
case .recentlyPublished:
|
||||
return "Recently Published"
|
||||
case .relevance:
|
||||
return "Relevance"
|
||||
}
|
||||
}
|
||||
|
||||
var queryString: String {
|
||||
switch self {
|
||||
case .newest:
|
||||
return "sort:saved"
|
||||
case .oldest:
|
||||
return "sort:saved-ASC"
|
||||
case .recentlyRead:
|
||||
return "sort:updated"
|
||||
case .recentlyPublished:
|
||||
return "sort:published"
|
||||
case .relevance:
|
||||
return "relevance"
|
||||
}
|
||||
}
|
||||
|
||||
var sortDescriptors: [NSSortDescriptor] {
|
||||
switch self {
|
||||
case .newest, .relevance:
|
||||
return [NSSortDescriptor(keyPath: \LinkedItem.createdAt, ascending: false)]
|
||||
case .oldest:
|
||||
return [NSSortDescriptor(keyPath: \LinkedItem.createdAt, ascending: true)]
|
||||
case .recentlyRead:
|
||||
return [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false)]
|
||||
case .recentlyPublished:
|
||||
return [NSSortDescriptor(keyPath: \LinkedItem.publishDate, ascending: false)]
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -42,7 +42,7 @@ public struct TextChipButton: View {
|
||||
TextChipButton(title: "Labels", color: .systemGray6, actionType: .show, negated: false, onTap: onTap)
|
||||
}
|
||||
|
||||
public static func makeFilterButton(title: String) -> TextChipButton {
|
||||
public static func makeMenuButton(title: String) -> TextChipButton {
|
||||
TextChipButton(title: title, color: .systemGray6, actionType: .show, negated: false, onTap: {})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user