Rework storage structs, link preview

This commit is contained in:
Christoph Hagen
2025-01-08 14:59:04 +01:00
parent b99c064d10
commit a7197b9628
75 changed files with 1365 additions and 1454 deletions

View File

@ -73,12 +73,12 @@ struct FileDetailView: View {
switch language {
case .english:
StringPropertyView(
OptionalStringPropertyView(
title: "Description",
text: $file.english,
footer: "The description for the file. Descriptions are used for images and to explain the content of a file.")
case .german:
StringPropertyView(
OptionalStringPropertyView(
title: "Description",
text: $file.german,
footer: "The description for the file. Descriptions are used for images and to explain the content of a file.")
@ -151,8 +151,7 @@ struct FileDetailView: View {
file.determineFileSize()
// Force regeneration of images and/or file copying
file.removeFileFromOutputFolder()
// Trigger content view update to reload image
file.didChange()
file.modifiedDate = .now
}
}

View File

@ -47,7 +47,7 @@ struct ItemSelectionView: View {
}
.contentShape(Rectangle())
.onTapGesture {
if !selectedItems.contains(where: { $0 is TagOverviewPage }) {
if !selectedItems.contains(where: { $0.itemReference == tagOverview.itemReference }) {
selectedItems.append(tagOverview)
}
}

View File

@ -0,0 +1,29 @@
import SwiftUI
struct LinkPreviewDetailView: View {
@ObservedObject
var linkPreview: LinkPreview
let fallbackTitle: String?
var body: some View {
VStack(alignment: .leading) {
OptionalStringPropertyView(
title: "Preview Title",
text: $linkPreview.title,
prompt: fallbackTitle,
footer: "The title to use in a link preview")
OptionalImagePropertyView(
title: "Preview Image",
selectedImage: $linkPreview.image,
footer: "The image to show in a link preview")
OptionalTextFieldPropertyView(
title: "Preview Description",
text: $linkPreview.description,
footer: "The description to show in a link preview")
}
}
}

View File

@ -30,21 +30,7 @@ struct LocalizedPageDetailView: View {
}
}
OptionalStringPropertyView(
title: "Preview Title",
text: $page.linkPreviewTitle,
prompt: page.title,
footer: "The title to use for the page when linking to it")
OptionalImagePropertyView(
title: "Preview Image",
selectedImage: $page.linkPreviewImage,
footer: "The image to show for previews of this page")
OptionalTextFieldPropertyView(
title: "Preview Description",
text: $page.linkPreviewDescription,
footer: "The description to show in previews of the page")
LinkPreviewDetailView(linkPreview: page.linkPreview, fallbackTitle: page.title)
}
}
}

View File

@ -12,21 +12,7 @@ struct LocalizedPostDetailView: View {
text: $post.pageLinkText,
footer: "The custom text to show for the link to the linked page")
OptionalStringPropertyView(
title: "Preview Title",
text: $post.linkPreviewTitle,
prompt: post.title,
footer: "The title to use for the post when linking to it")
OptionalImagePropertyView(
title: "Preview Image",
selectedImage: $post.linkPreviewImage,
footer: "The image to show for previews of this post")
OptionalTextFieldPropertyView(
title: "Preview Description",
text: $post.linkPreviewDescription,
footer: "The description to show in previews of the post")
LinkPreviewDetailView(linkPreview: post.linkPreview, fallbackTitle: post.title)
}
}
}

View File

@ -31,6 +31,6 @@ struct LocalizedPostFeedSettingsView: View {
}
#Preview {
LocalizedPostFeedSettingsView(settings: .english)
LocalizedPostFeedSettingsView(settings: PostSettings.default.english)
.padding()
}

View File

@ -8,6 +8,12 @@ struct PathSettingsView: View {
@EnvironmentObject
private var content: Content
@State
private var showLoadErrorSheet: Bool = false
@State
private var loadErrors: [String] = []
var body: some View {
ScrollView {
VStack(alignment: .leading) {
@ -19,7 +25,7 @@ struct PathSettingsView: View {
title: "Content Folder",
folder: $content.storage.contentScope,
footer: "The folder where the raw content of the website is stored") { url in
content.update(contentPath: url)
content.update(contentPath: url, callback: showLoadErrors)
}
FolderOnDiskPropertyView(
@ -65,8 +71,32 @@ struct PathSettingsView: View {
footer: "The path in the output folder where assets are stored")
}
.padding()
.sheet(isPresented: $showLoadErrorSheet) {
VStack {
Text("Failed to load database")
.font(.headline)
List(loadErrors, id: \.self) { error in
HStack {
Text(error)
Spacer()
}
}
.frame(minHeight: 200)
Button("Dismiss", action: { showLoadErrorSheet = false })
.padding()
}
.padding()
}
}
}
private func showLoadErrors(errors: [String]) {
guard !errors.isEmpty else {
return
}
loadErrors = errors
showLoadErrorSheet = true
}
}
#Preview {

View File

@ -15,8 +15,8 @@ struct TagOverviewDetailView: View {
title: "Tag Overview",
text: "Configure the page showing all tags")
if let page = content.tagOverview?.localized(in: language) {
TagOverviewDetails(page: page)
if let tag = content.tagOverview?.localized(in: language) {
LocalizedTagDetailView(tag: tag)
.id(language)
} else {
Button("Create", action: createTagOverviewPage)
@ -27,50 +27,10 @@ struct TagOverviewDetailView: View {
}
private func createTagOverviewPage() {
content.tagOverview = TagOverviewPage(
content.tagOverview = Tag(
content: content,
german: .init(content: content, title: "Alle Tags", urlString: "alle"),
english: .init(content: content, title: "All tags", urlString: "all"))
}
}
private struct TagOverviewDetails: View {
@EnvironmentObject
private var content: Content
@ObservedObject
var page: LocalizedTagOverviewPage
var body: some View {
VStack(alignment: .leading) {
StringPropertyView(
title: "Title",
text: $page.title,
footer: "The title of the overview page")
IdPropertyView(
id: $page.urlComponent,
title: "Page URL String",
footer: "The url component to use for the link to the page",
validation: page.isValid,
update: { page.urlComponent = $0 })
OptionalStringPropertyView(
title: "Preview Title",
text: $page.linkPreviewTitle,
prompt: page.title,
footer: "The title to use for the page when linking to it")
OptionalImagePropertyView(
title: "Preview Image",
selectedImage: $page.linkPreviewImage,
footer: "The image to show for previews of this page")
OptionalTextFieldPropertyView(
title: "Preview Description",
text: $page.linkPreviewDescription,
footer: "The description to show in previews of the page")
}
id: "all-tags",
german: .init(content: content, urlComponent: "alle", name: "Alle Tags"),
english: .init(content: content, urlComponent: "all", name: "All tags"))
}
}

View File

@ -31,21 +31,7 @@ struct LocalizedTagDetailView: View {
}
}
OptionalStringPropertyView(
title: "Preview Title",
text: $tag.linkPreviewTitle,
prompt: tag.name,
footer: "The title to use for the tag in previews and on tag pages")
OptionalImagePropertyView(
title: "Preview Image",
selectedImage: $tag.linkPreviewImage,
footer: "The image to show for previews of this page")
OptionalTextFieldPropertyView(
title: "Preview Description",
text: $tag.linkPreviewDescription,
footer: "The description to show in previews of the page")
LinkPreviewDetailView(linkPreview: tag.linkPreview, fallbackTitle: tag.name)
}
}
}