library search
This commit is contained in:
@@ -140,8 +140,9 @@ final class ComponentLibraryViewModel: ObservableObject {
|
||||
struct ComponentLibraryView: View {
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@StateObject private var viewModel = ComponentLibraryViewModel()
|
||||
@State private var searchText: String = ""
|
||||
let onSelect: (ComponentLibraryItem) -> Void
|
||||
|
||||
|
||||
var body: some View {
|
||||
NavigationStack {
|
||||
content
|
||||
@@ -161,6 +162,7 @@ struct ComponentLibraryView: View {
|
||||
.refreshable {
|
||||
await viewModel.refresh()
|
||||
}
|
||||
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always), prompt: "Search components")
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
@@ -186,21 +188,21 @@ struct ComponentLibraryView: View {
|
||||
}
|
||||
.padding()
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
|
||||
} else if viewModel.items.isEmpty {
|
||||
} else if filteredItems.isEmpty {
|
||||
VStack(spacing: 12) {
|
||||
Image(systemName: "sparkles.rectangle.stack")
|
||||
Image(systemName: searchText.isEmpty ? "sparkles.rectangle.stack" : "magnifyingglass")
|
||||
.font(.system(size: 32))
|
||||
.foregroundColor(.secondary)
|
||||
Text("No components available")
|
||||
Text(searchText.isEmpty ? "No components available" : "No matches")
|
||||
.font(.headline)
|
||||
Text("Check back soon for new loads from VoltPlan.")
|
||||
Text(searchText.isEmpty ? "Check back soon for new loads from VoltPlan." : "Try searching for a different name.")
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
.padding()
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
|
||||
} else {
|
||||
List(viewModel.items) { item in
|
||||
List(filteredItems) { item in
|
||||
Button {
|
||||
onSelect(item)
|
||||
dismiss()
|
||||
@@ -212,6 +214,15 @@ struct ComponentLibraryView: View {
|
||||
.listStyle(.insetGrouped)
|
||||
}
|
||||
}
|
||||
|
||||
private var filteredItems: [ComponentLibraryItem] {
|
||||
let trimmedQuery = searchText.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
guard !trimmedQuery.isEmpty else { return viewModel.items }
|
||||
|
||||
return viewModel.items.filter { item in
|
||||
item.name.localizedCaseInsensitiveContains(trimmedQuery)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private struct ComponentRow: View {
|
||||
|
||||
Reference in New Issue
Block a user