Improve page indicators, adding items
This commit is contained in:
@ -17,18 +17,16 @@ struct AddPageView: View {
|
||||
@State
|
||||
private var newPageId = ""
|
||||
|
||||
private let allowedCharactersInPageId = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: "-")).inverted
|
||||
|
||||
init(selected: Binding<Page?>) {
|
||||
self._selectedPage = selected
|
||||
}
|
||||
|
||||
private var idExists: Bool {
|
||||
content.pages.contains { $0.id == newPageId }
|
||||
!content.isNewIdForPage(newPageId)
|
||||
}
|
||||
|
||||
private var containsInvalidCharacters: Bool {
|
||||
newPageId.rangeOfCharacter(from: allowedCharactersInPageId) != nil
|
||||
private var isInvalidId: Bool {
|
||||
!content.isValidIdForTagOrPageOrPost(newPageId)
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
@ -42,12 +40,12 @@ struct AddPageView: View {
|
||||
if newPageId.isEmpty {
|
||||
Text("Enter the id of the new page to create")
|
||||
.foregroundStyle(.secondary)
|
||||
} else if isInvalidId {
|
||||
Text("The id contains invalid characters")
|
||||
.foregroundStyle(Color.red)
|
||||
} else if idExists {
|
||||
Text("A page with the same id already exists")
|
||||
.foregroundStyle(Color.red)
|
||||
} else if containsInvalidCharacters {
|
||||
Text("The id contains invalid characters")
|
||||
.foregroundStyle(Color.red)
|
||||
} else {
|
||||
Text("Create a new page with the id")
|
||||
.foregroundStyle(.secondary)
|
||||
@ -59,7 +57,7 @@ struct AddPageView: View {
|
||||
Button(action: addNewPage) {
|
||||
Text("Create")
|
||||
}
|
||||
.disabled(newPageId.isEmpty || containsInvalidCharacters || idExists)
|
||||
.disabled(isInvalidId || idExists)
|
||||
}
|
||||
}
|
||||
.padding()
|
||||
|
@ -7,13 +7,11 @@ struct LocalizedPageContentView: View {
|
||||
@EnvironmentObject
|
||||
var content: Content
|
||||
|
||||
let pageId: String
|
||||
@ObservedObject
|
||||
var page: Page
|
||||
|
||||
let language: ContentLanguage
|
||||
|
||||
@ObservedObject
|
||||
var page: LocalizedPage
|
||||
|
||||
@State
|
||||
private var pageContent: String = ""
|
||||
|
||||
@ -26,18 +24,8 @@ struct LocalizedPageContentView: View {
|
||||
@State
|
||||
private var didChangeContent = false
|
||||
|
||||
init(pageId: String, page: LocalizedPage, language: ContentLanguage) {
|
||||
self.pageId = pageId
|
||||
self.page = page
|
||||
self.language = language
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading) {
|
||||
TextField("", text: $page.title)
|
||||
.font(.title)
|
||||
.textFieldStyle(.plain)
|
||||
|
||||
HStack(alignment: .firstTextBaseline) {
|
||||
Button(action: loadContent) {
|
||||
Text("Load")
|
||||
@ -70,14 +58,14 @@ struct LocalizedPageContentView: View {
|
||||
|
||||
private func loadContent() {
|
||||
let language = language
|
||||
guard page.content.storage.hasPageContent(for: pageId, language: language) else {
|
||||
guard page.localized(in: language).hasContent else {
|
||||
pageContent = "New file"
|
||||
DispatchQueue.main.async {
|
||||
didChangeContent = false
|
||||
}
|
||||
return
|
||||
}
|
||||
guard let content = page.content.storage.pageContent(for: pageId, language: language) else {
|
||||
guard let content = page.pageContent(in: language) else {
|
||||
print("Failed to load page content")
|
||||
pageContent = "Failed to load"
|
||||
DispatchQueue.main.async {
|
||||
@ -108,7 +96,7 @@ struct LocalizedPageContentView: View {
|
||||
guard didChangeContent else {
|
||||
return
|
||||
}
|
||||
guard page.content.storage.save(pageContent: pageContent, for: pageId, language: language) else {
|
||||
guard page.save(pageContent: pageContent, in: language) else {
|
||||
print("Failed to save content")
|
||||
return
|
||||
}
|
||||
@ -120,9 +108,6 @@ struct LocalizedPageContentView: View {
|
||||
guard content != pageContentUsedForGeneration else {
|
||||
return
|
||||
}
|
||||
guard let page = self.content.page(pageId) else {
|
||||
return
|
||||
}
|
||||
guard !self.content.isGeneratingWebsite else {
|
||||
return
|
||||
}
|
||||
|
@ -41,8 +41,10 @@ struct PageContentView: View {
|
||||
}.padding()
|
||||
} else {
|
||||
VStack(alignment: .leading) {
|
||||
PageTitleView(page: page.localized(in: language))
|
||||
.id(page.id + language.rawValue)
|
||||
TagDisplayView(tags: $page.tags)
|
||||
LocalizedPageContentView(pageId: page.id, page: page.localized(in: language), language: language)
|
||||
LocalizedPageContentView(page: page, language: language)
|
||||
.id(page.id + language.rawValue)
|
||||
}
|
||||
.padding()
|
||||
|
@ -1,5 +1,40 @@
|
||||
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)
|
||||
@ -31,13 +66,8 @@ struct PageListView: View {
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.padding(.horizontal, 8)
|
||||
List(filteredPages, selection: $selectedPage) { page in
|
||||
HStack {
|
||||
Text(page.title(in: language))
|
||||
Spacer()
|
||||
if page.isDraft {
|
||||
DraftIndicator()
|
||||
}
|
||||
}.tag(page)
|
||||
PageListItem(page: page)
|
||||
.tag(page)
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
|
Reference in New Issue
Block a user