library search

This commit is contained in:
Stefan Lange-Hegermann
2025-09-17 23:17:19 +02:00
parent c313c4e94b
commit 1b7d97a989

View File

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