Role filters

This commit is contained in:
Garth Vander Houwen 2024-06-29 16:19:56 -07:00
parent b19109b7c7
commit 236955900e
4 changed files with 23 additions and 34 deletions

View file

@ -668,9 +668,6 @@
},
"All device and app data will be deleted. You will also need to forget your devices under Settings > Bluetooth." : {
},
"All Roles" : {
},
"Allow Position Requests" : {

View file

@ -25,7 +25,6 @@ struct UserList: View {
@State private var distanceFilter = false
@State private var maxDistance: Double = 800000
@State private var hopsAway: Int = -1
@State private var deviceRole: Int = -1
@State private var roleFilter = false
@State private var deviceRoles: Set<Int> = []
@State var isEditingFilters = false
@ -172,7 +171,7 @@ struct UserList: View {
.listStyle(.plain)
.navigationTitle(String.localizedStringWithFormat("contacts %@".localized, String(users.count == 0 ? 0 : users.count - 1)))
.sheet(isPresented: $isEditingFilters) {
NodeListFilter(filterTitle: "Contact Filters", viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, deviceRole: $deviceRole, roleFilter: $roleFilter, deviceRoles: $deviceRoles)
NodeListFilter(filterTitle: "Contact Filters", viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, roleFilter: $roleFilter, deviceRoles: $deviceRoles)
}
.onChange(of: searchText) { _ in
searchUserList()
@ -189,7 +188,7 @@ struct UserList: View {
}
searchUserList()
}
.onChange(of: deviceRole) { _ in
.onChange(of: [deviceRoles]) { _ in
searchUserList()
}
.onChange(of: hopsAway) { _ in
@ -261,10 +260,15 @@ struct UserList: View {
predicates.append(mqttPredicate)
}
}
/// Role
if deviceRole > -1 {
let rolePredicate = NSPredicate(format: "role == %i", Int32(deviceRole))
predicates.append(rolePredicate)
/// Roles
if roleFilter && deviceRoles.count > 0 {
var rolesArray: [NSPredicate] = []
for dr in deviceRoles {
let deviceRolePredicate = NSPredicate(format: "user.role == %i", Int32(dr))
rolesArray.append(deviceRolePredicate)
}
let compoundPredicate = NSCompoundPredicate(type: .or, subpredicates: rolesArray)
predicates.append(compoundPredicate)
}
/// Hops Away
if hopsAway > 0 {

View file

@ -20,7 +20,6 @@ struct NodeListFilter: View {
@Binding var distanceFilter: Bool
@Binding var maximumDistance: Double
@Binding var hopsAway: Int
@Binding var deviceRole: Int
@Binding var roleFilter: Bool
@Binding var deviceRoles: Set<Int>
@ -114,21 +113,6 @@ struct NodeListFilter: View {
}
.pickerStyle(DefaultPickerStyle())
}
HStack {
Label("Device Role", systemImage: "apps.iphone")
Picker("", selection: $deviceRole) {
Text("All Roles")
.tag(-1)
ForEach(DeviceRoles.allCases) { dr in
Label {
Text(" \(dr.name)")
} icon: {
Image(systemName: dr.systemName)
}
}
}
.pickerStyle(DefaultPickerStyle())
}
Toggle(isOn: $roleFilter) {
Label {
@ -151,7 +135,7 @@ struct NodeListFilter: View {
}
.listStyle(.plain)
.environment(\.editMode, $editMode) /// bind it here!
.frame(minHeight: 210, maxHeight: .infinity)
.frame(minHeight: 490, maxHeight: .infinity)
}
}
}
@ -169,7 +153,7 @@ struct NodeListFilter: View {
.padding(.bottom)
#endif
}
.presentationDetents([.fraction(0.6), .fraction(0.75)])
.presentationDetents([.fraction(1.0)])
.presentationDragIndicator(.visible)
}
}

View file

@ -26,7 +26,6 @@ struct NodeList: View {
@State private var distanceFilter = false
@State private var maxDistance: Double = 800000
@State private var hopsAway: Int = -1
@State private var nodeRole: Int = -1
@State private var roleFilter = false
@State private var deviceRoles: Set<Int> = []
@ -190,7 +189,7 @@ struct NodeList: View {
}
}
.sheet(isPresented: $isEditingFilters) {
NodeListFilter(viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, deviceRole: $nodeRole, roleFilter: $roleFilter, deviceRoles: $deviceRoles)
NodeListFilter(viaLora: $viaLora, viaMqtt: $viaMqtt, isOnline: $isOnline, isFavorite: $isFavorite, distanceFilter: $distanceFilter, maximumDistance: $maxDistance, hopsAway: $hopsAway, roleFilter: $roleFilter, deviceRoles: $deviceRoles)
}
.safeAreaInset(edge: .bottom, alignment: .trailing) {
HStack {
@ -299,7 +298,7 @@ struct NodeList: View {
}
searchNodeList()
}
.onChange(of: nodeRole) { _ in
.onChange(of: [deviceRoles]) { _ in
searchNodeList()
}
.onChange(of: hopsAway) { _ in
@ -364,9 +363,14 @@ struct NodeList: View {
}
}
/// Role
if nodeRole > -1 {
let rolePredicate = NSPredicate(format: "user.role == %i", Int32(nodeRole))
predicates.append(rolePredicate)
if roleFilter && deviceRoles.count > 0 {
var rolesArray: [NSPredicate] = []
for dr in deviceRoles {
let deviceRolePredicate = NSPredicate(format: "user.role == %i", Int32(dr))
rolesArray.append(deviceRolePredicate)
}
let compoundPredicate = NSCompoundPredicate(type: .or, subpredicates: rolesArray)
predicates.append(compoundPredicate)
}
/// Hops Away
if hopsAway > 0 {