Allow hiding system labels
This commit is contained in:
@ -2,6 +2,7 @@
|
||||
import Models
|
||||
import Services
|
||||
import SwiftUI
|
||||
import Utils
|
||||
import Views
|
||||
|
||||
@MainActor
|
||||
@ -195,15 +196,21 @@ struct ApplyLabelsView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func isSystemLabel(_ label: LinkedItemLabel) -> Bool {
|
||||
label.name == "RSS" || label.name == "Newsletter" || label.name == "Pinned"
|
||||
}
|
||||
|
||||
extension Sequence where Element == LinkedItemLabel {
|
||||
func applySearchFilter(_ searchFilter: String) -> [LinkedItemLabel] {
|
||||
let hideSystemLabels = UserDefaults(suiteName: "group.app.omnivoreapp")?.bool(forKey: UserDefaultKey.hideSystemLabels.rawValue) ?? false
|
||||
|
||||
if searchFilter.isEmpty || searchFilter == ZWSP {
|
||||
return map { $0 } // return the identity of the sequence
|
||||
}
|
||||
if searchFilter.starts(with: ZWSP) {
|
||||
let index = searchFilter.index(searchFilter.startIndex, offsetBy: 1)
|
||||
let trimmed = searchFilter.suffix(from: index).lowercased()
|
||||
return filter { ($0.name ?? "").lowercased().contains(trimmed) }
|
||||
return filter { ($0.name ?? "").lowercased().contains(trimmed) && (!hideSystemLabels || !isSystemLabel($0)) }
|
||||
}
|
||||
return filter { ($0.name ?? "").lowercased().contains(searchFilter.lowercased()) }
|
||||
}
|
||||
|
||||
@ -2,11 +2,12 @@ import CoreData
|
||||
import Models
|
||||
import Services
|
||||
import SwiftUI
|
||||
import Utils
|
||||
import Views
|
||||
|
||||
@MainActor final class FilterByLabelsViewModel: ObservableObject {
|
||||
@Published var isLoading = false
|
||||
@Published var errorMessage: String? = nil
|
||||
@Published var errorMessage: String?
|
||||
@Published var labels = [LinkedItemLabel]()
|
||||
@Published var selectedLabels = [LinkedItemLabel]()
|
||||
@Published var negatedLabels = [LinkedItemLabel]()
|
||||
@ -14,7 +15,9 @@ import Views
|
||||
@Published var labelSearchFilter = ""
|
||||
|
||||
func setLabels(_ labels: [LinkedItemLabel]) {
|
||||
self.labels = labels.sorted { left, right in
|
||||
let hideSystemLabels = UserDefaults(suiteName: "group.app.omnivoreapp")?.bool(forKey: UserDefaultKey.hideSystemLabels.rawValue) ?? false
|
||||
|
||||
self.labels = labels.filter { !hideSystemLabels || !isSystemLabel($0) }.sorted { left, right in
|
||||
let aTrimmed = left.unwrappedName.trimmingCharacters(in: .whitespaces)
|
||||
let bTrimmed = right.unwrappedName.trimmingCharacters(in: .whitespaces)
|
||||
return aTrimmed.caseInsensitiveCompare(bTrimmed) == .orderedAscending
|
||||
|
||||
@ -10,22 +10,29 @@ struct LabelsView: View {
|
||||
@State private var showDeleteConfirmation = false
|
||||
@State private var labelToRemove: LinkedItemLabel?
|
||||
|
||||
@AppStorage(UserDefaultKey.hideSystemLabels.rawValue, store: UserDefaults(suiteName: "group.app.omnivoreapp")) var hideSystemLabels = false
|
||||
|
||||
var body: some View {
|
||||
List {
|
||||
ForEach(viewModel.labels, id: \.id) { label in
|
||||
HStack {
|
||||
TextChip(feedItemLabel: label).allowsHitTesting(false)
|
||||
Spacer()
|
||||
Button(
|
||||
action: {
|
||||
labelToRemove = label
|
||||
showDeleteConfirmation = true
|
||||
},
|
||||
label: { Image(systemName: "trash") }
|
||||
)
|
||||
Section {
|
||||
ForEach(viewModel.labels, id: \.id) { label in
|
||||
HStack {
|
||||
TextChip(feedItemLabel: label).allowsHitTesting(false)
|
||||
Spacer()
|
||||
Button(
|
||||
action: {
|
||||
labelToRemove = label
|
||||
showDeleteConfirmation = true
|
||||
},
|
||||
label: { Image(systemName: "trash") }
|
||||
)
|
||||
}
|
||||
}
|
||||
createLabelButton
|
||||
}
|
||||
Section("Label settings") {
|
||||
Toggle("Hide system labels", isOn: $hideSystemLabels)
|
||||
}
|
||||
createLabelButton
|
||||
}
|
||||
.navigationTitle(LocalText.labelsGeneric)
|
||||
.alert("Are you sure you want to delete this label?", isPresented: $showDeleteConfirmation) {
|
||||
@ -43,6 +50,11 @@ struct LabelsView: View {
|
||||
}
|
||||
Button(LocalText.cancelGeneric, role: .cancel) { self.labelToRemove = nil }
|
||||
}
|
||||
.onChange(of: hideSystemLabels) { _ in
|
||||
Task {
|
||||
await viewModel.loadLabels(dataService: dataService, item: nil)
|
||||
}
|
||||
}
|
||||
.sheet(isPresented: $viewModel.showCreateLabelModal) {
|
||||
CreateLabelView(viewModel: viewModel, newLabelName: viewModel.labelSearchFilter)
|
||||
}
|
||||
|
||||
@ -2,6 +2,7 @@ import CoreData
|
||||
import Models
|
||||
import Services
|
||||
import SwiftUI
|
||||
import Utils
|
||||
|
||||
@MainActor public final class LabelsViewModel: ObservableObject {
|
||||
let labelNameMaxLength = 64
|
||||
@ -16,7 +17,9 @@ import SwiftUI
|
||||
public init() {}
|
||||
|
||||
func setLabels(_ labels: [LinkedItemLabel]) {
|
||||
self.labels = labels.sorted { left, right in
|
||||
let hideSystemLabels = UserDefaults(suiteName: "group.app.omnivoreapp")?.bool(forKey: UserDefaultKey.hideSystemLabels.rawValue) ?? false
|
||||
|
||||
self.labels = labels.filter { !hideSystemLabels || !isSystemLabel($0) }.sorted { left, right in
|
||||
let aTrimmed = left.unwrappedName.trimmingCharacters(in: .whitespaces)
|
||||
let bTrimmed = right.unwrappedName.trimmingCharacters(in: .whitespaces)
|
||||
return aTrimmed.caseInsensitiveCompare(bTrimmed) == .orderedAscending
|
||||
|
||||
@ -41,6 +41,7 @@ import Views
|
||||
} else {
|
||||
self.hasBadgePermission = false
|
||||
}
|
||||
|
||||
print("notification settings: ", settings.badgeSetting.rawValue)
|
||||
print("got the notification settings")
|
||||
}
|
||||
|
||||
@ -33,6 +33,7 @@ public enum UserDefaultKey: String {
|
||||
case deviceTokenID
|
||||
case userWordsPerMinute
|
||||
case hideFeatureSection
|
||||
case hideSystemLabels
|
||||
case justifyText
|
||||
case prefersHideStatusBarInReader
|
||||
case visibleShareExtensionTab
|
||||
|
||||
Reference in New Issue
Block a user