2025-01-29 09:16:29 +01:00

93 lines
2.3 KiB
Swift

import SwiftUI
private struct PageListItem: View {
@Environment(\.language)
private var language
@ObservedObject
var page: Page
var body: some View {
HStack {
LocalizedPageListItem(page: page.localized(in: language))
Spacer()
if page.isExternalUrl {
TextIndicator(text: "External")
} else if page.isDraft {
TextIndicator(text: "Draft", background: .yellow)
} else {
ForEach(page.missingContentLanguages, id: \.self) { language in
TextIndicator(text: language.shortText, background: Color.red)
}
}
}
}
}
private struct LocalizedPageListItem: View {
@ObservedObject
var page: LocalizedPage
var body: some View {
Text(page.title)
}
}
struct PageListView: View {
@Environment(\.language)
private var language
@EnvironmentObject
private var selection: SelectedContent
@EnvironmentObject
private var content: Content
@State
private var searchString = ""
init() { }
private var filteredPages: [Page] {
guard !searchString.isEmpty else {
return content.pages
}
return content.pages.filter { $0.localized(in: language).title.contains(searchString) }
}
var body: some View {
VStack {
TextField("", text: $searchString, prompt: Text("Search"))
.textFieldStyle(.roundedBorder)
.padding(.horizontal, 8)
List(filteredPages) { page in
PageListItem(page: page)
.listRowBackground(RoundedRectangle(cornerRadius: 5)
.fill(selection.page == page ? Color.blue : Color.clear)
.padding(.horizontal, 10)
)
.contentShape(Rectangle())
.onTapGesture {
selection.page = page
}
}
}
.onAppear {
if selection.page == nil, let first = content.pages.first {
selection.page = first
}
}
}
}
#Preview {
let content = Content.mock
let selection = SelectedContent()
PageListView()
.environmentObject(content)
.environmentObject(selection)
}