mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
Sort the filter labels on iOS
This commit is contained in:
parent
c8c27bae89
commit
27eb891acc
1 changed files with 56 additions and 10 deletions
|
|
@ -1,3 +1,4 @@
|
|||
import CoreData
|
||||
import Models
|
||||
import Services
|
||||
import SwiftUI
|
||||
|
|
@ -11,6 +12,14 @@ import Views
|
|||
@Published var unselectedLabels = [LinkedItemLabel]()
|
||||
@Published var labelSearchFilter = ""
|
||||
|
||||
func setLabels(_ labels: [LinkedItemLabel]) {
|
||||
self.labels = labels.sorted { left, right in
|
||||
let aTrimmed = left.unwrappedName.trimmingCharacters(in: .whitespaces)
|
||||
let bTrimmed = right.unwrappedName.trimmingCharacters(in: .whitespaces)
|
||||
return aTrimmed.caseInsensitiveCompare(bTrimmed) == .orderedAscending
|
||||
}
|
||||
}
|
||||
|
||||
func loadLabels(
|
||||
dataService: DataService,
|
||||
initiallySelectedLabels: [LinkedItemLabel],
|
||||
|
|
@ -18,22 +27,59 @@ import Views
|
|||
) async {
|
||||
isLoading = true
|
||||
|
||||
if let labelIDs = try? await dataService.labels() {
|
||||
dataService.viewContext.performAndWait {
|
||||
self.labels = labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel }
|
||||
await loadLabelsFromStore(dataService: dataService)
|
||||
for label in labels {
|
||||
if initiallySelectedLabels.contains(label) {
|
||||
selectedLabels.append(label)
|
||||
} else if initiallyNegatedLabels.contains(label) {
|
||||
negatedLabels.append(label)
|
||||
} else {
|
||||
unselectedLabels.append(label)
|
||||
}
|
||||
}
|
||||
|
||||
for label in labels {
|
||||
if initiallySelectedLabels.contains(label) {
|
||||
selectedLabels.append(label)
|
||||
} else if initiallyNegatedLabels.contains(label) {
|
||||
negatedLabels.append(label)
|
||||
} else {
|
||||
unselectedLabels.append(label)
|
||||
Task.detached(priority: .userInitiated) {
|
||||
if let labelIDs = try? await dataService.labels() {
|
||||
DispatchQueue.main.async {
|
||||
dataService.viewContext.performAndWait {
|
||||
self.setLabels(labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel })
|
||||
}
|
||||
for label in self.labels {
|
||||
if initiallySelectedLabels.contains(label) {
|
||||
self.selectedLabels.append(label)
|
||||
} else if initiallyNegatedLabels.contains(label) {
|
||||
self.negatedLabels.append(label)
|
||||
} else {
|
||||
self.unselectedLabels.append(label)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isLoading = false
|
||||
}
|
||||
|
||||
func loadLabelsFromStore(dataService: DataService) async {
|
||||
let fetchRequest: NSFetchRequest<Models.LinkedItemLabel> = LinkedItemLabel.fetchRequest()
|
||||
|
||||
let fetchedLabels = await dataService.viewContext.perform {
|
||||
try? fetchRequest.execute()
|
||||
}
|
||||
|
||||
setLabels(fetchedLabels ?? [])
|
||||
unselectedLabels = fetchedLabels ?? []
|
||||
}
|
||||
|
||||
func fetchLabelsFromNetwork(dataService: DataService) async {
|
||||
let labelIDs = try? await dataService.labels()
|
||||
guard let labelIDs = labelIDs else { return }
|
||||
|
||||
let fetchedLabels = await dataService.viewContext.perform {
|
||||
labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel }
|
||||
}
|
||||
|
||||
setLabels(fetchedLabels)
|
||||
unselectedLabels = fetchedLabels
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue