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:
Satindar Dhillon
2022-06-02 14:29:39 -07:00
committed by GitHub
4 changed files with 77 additions and 5 deletions

View File

@ -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
}

View File

@ -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)")

View 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)]
}
}
}

View File

@ -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: {})
}