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