Add empty page text, playlist text to settings

This commit is contained in:
Christoph Hagen 2025-01-07 11:26:59 +01:00
parent 9f120b251f
commit 9d95e7d210
23 changed files with 266 additions and 94 deletions

View File

@ -243,6 +243,10 @@
E2FE0F622D2C0D8D002963B7 /* VersionedVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F612D2C0D8D002963B7 /* VersionedVideo.swift */; };
E2FE0F642D2C2F4D002963B7 /* ButtonBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F632D2C2F46002963B7 /* ButtonBlock.swift */; };
E2FE0F662D2C3B3A002963B7 /* LabelsBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F652D2C3B33002963B7 /* LabelsBlock.swift */; };
E2FE0F682D2D2CF6002963B7 /* LocalizedPageSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F672D2D2CF0002963B7 /* LocalizedPageSettings.swift */; };
E2FE0F6A2D2D2D55002963B7 /* LocalizedPageSettingsFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F692D2D2D4F002963B7 /* LocalizedPageSettingsFile.swift */; };
E2FE0F6C2D2D335E002963B7 /* LocalizedPageSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F6B2D2D3358002963B7 /* LocalizedPageSettingsView.swift */; };
E2FE0F6E2D2D3689002963B7 /* LocalizedAudioPlayerSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F6D2D2D3685002963B7 /* LocalizedAudioPlayerSettings.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@ -477,6 +481,10 @@
E2FE0F612D2C0D8D002963B7 /* VersionedVideo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionedVideo.swift; sourceTree = "<group>"; };
E2FE0F632D2C2F46002963B7 /* ButtonBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonBlock.swift; sourceTree = "<group>"; };
E2FE0F652D2C3B33002963B7 /* LabelsBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelsBlock.swift; sourceTree = "<group>"; };
E2FE0F672D2D2CF0002963B7 /* LocalizedPageSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedPageSettings.swift; sourceTree = "<group>"; };
E2FE0F692D2D2D4F002963B7 /* LocalizedPageSettingsFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedPageSettingsFile.swift; sourceTree = "<group>"; };
E2FE0F6B2D2D3358002963B7 /* LocalizedPageSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedPageSettingsView.swift; sourceTree = "<group>"; };
E2FE0F6D2D2D3685002963B7 /* LocalizedAudioPlayerSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedAudioPlayerSettings.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -534,6 +542,7 @@
E25DA5372D00420D00AEF16D /* LocalizedPostSettingsFile.swift */,
E25DA5352D0041E200AEF16D /* PostSettingsFile.swift */,
E25DA5922D023B3600AEF16D /* PageSettingsFile.swift */,
E2FE0F692D2D2D4F002963B7 /* LocalizedPageSettingsFile.swift */,
E21850342CFAFA570090B18B /* SettingsFile.swift */,
E22990212D0ED129009F8D77 /* TagOverviewFile.swift */,
);
@ -544,10 +553,12 @@
isa = PBXGroup;
children = (
E2FE0F392D2B3E4E002963B7 /* AudioPlayerSettings.swift */,
E2FE0F6D2D2D3685002963B7 /* LocalizedAudioPlayerSettings.swift */,
E2FE0F012D266FCB002963B7 /* LocalizedNavigationSettings.swift */,
E21850362CFCA5580090B18B /* LocalizedPostSettings.swift */,
E2FE0EFB2D266D18002963B7 /* NavigationSettings.swift */,
E25DA58E2D02368A00AEF16D /* PageSettings.swift */,
E2FE0F672D2D2CF0002963B7 /* LocalizedPageSettings.swift */,
E29D31952D0C18690051B7F4 /* PathSettings.swift */,
E25DA5402D00446700AEF16D /* PostSettings.swift */,
E21850322CFAFA200090B18B /* Settings.swift */,
@ -673,6 +684,7 @@
E29D316E2D0822720051B7F4 /* SettingsListView.swift */,
E29D31702D08234D0051B7F4 /* GenerationDetailView.swift */,
E25DA5942D023BCC00AEF16D /* PageSettingsDetailView.swift */,
E2FE0F6B2D2D3358002963B7 /* LocalizedPageSettingsView.swift */,
E25DA5442D00952D00AEF16D /* SettingsSection.swift */,
E2A21C352CB9A3D70060935B /* PathSettingsView.swift */,
E25DA56C2D00EBC900AEF16D /* NavigationBarSettingsView.swift */,
@ -1117,6 +1129,7 @@
E29D31AD2D0DA5360051B7F4 /* AudioPlayerIcons.swift in Sources */,
E25DA5452D00952E00AEF16D /* SettingsSection.swift in Sources */,
E2A21C462CBAE2E60060935B /* FeedEntryContent.swift in Sources */,
E2FE0F682D2D2CF6002963B7 /* LocalizedPageSettings.swift in Sources */,
E2A37D1D2CEA922D0000979F /* LocalizedPost.swift in Sources */,
E21850172CEE55FC0090B18B /* FileType.swift in Sources */,
E2FE0F042D267206002963B7 /* LocalizedNavigationBarSettingsView.swift in Sources */,
@ -1126,12 +1139,14 @@
E242520A2C52C9260029FF16 /* ContentLanguage.swift in Sources */,
E2B85F452C429ED60047CD0C /* ImageGallery.swift in Sources */,
E2B85F3B2C428F0E0047CD0C /* Post.swift in Sources */,
E2FE0F6A2D2D2D55002963B7 /* LocalizedPageSettingsFile.swift in Sources */,
E29D31852D0AE8EE0051B7F4 /* KnownHeaderElement.swift in Sources */,
E25DA51B2CFF08BB00AEF16D /* PostFeedPageNavigation.swift in Sources */,
E22990422D107A95009F8D77 /* ImageVersion.swift in Sources */,
E29D317F2D086F4C0051B7F4 /* StatisticsIcons.swift in Sources */,
E2FE0F282D2AFB11002963B7 /* ImageCompare.swift in Sources */,
E229904E2D13535C009F8D77 /* SecurityBookmark.swift in Sources */,
E2FE0F6E2D2D3689002963B7 /* LocalizedAudioPlayerSettings.swift in Sources */,
E2A21C082CB17B870060935B /* TagView.swift in Sources */,
E29D313D2D047C1B0051B7F4 /* LocalizedPageContentView.swift in Sources */,
E2FE0F242D2A8C21002963B7 /* TagDisplayView.swift in Sources */,
@ -1274,6 +1289,7 @@
E2A37D0E2CE527070000979F /* Storage.swift in Sources */,
E2E06E002CA4A8F00019C2AF /* Page+Mock.swift in Sources */,
E29D314D2D04FCBF0051B7F4 /* FileToAddView.swift in Sources */,
E2FE0F6C2D2D335E002963B7 /* LocalizedPageSettingsView.swift in Sources */,
E218502D2CF791440090B18B /* PostImagesView.swift in Sources */,
E29D312A2D039B090051B7F4 /* FileDescriptions.swift in Sources */,
E2B85F572C4BD0BB0047CD0C /* Binding+Extension.swift in Sources */,

View File

@ -8,9 +8,12 @@ struct AudioPlayerCommand: CommandProcessor {
let results: PageGenerationResults
let language: ContentLanguage
init(content: Content, results: PageGenerationResults, language: ContentLanguage) {
self.content = content
self.results = results
self.language = language
}
func process(_ arguments: [String], markdown: Substring) -> String {
@ -104,6 +107,9 @@ struct AudioPlayerCommand: CommandProcessor {
.audioPlayerPause
)
return AudioPlayer(playingText: titleText, items: playlist).content
return AudioPlayer(
playlistText: content.settings.audioPlayer.localized(in: language).playlistText,
playingText: titleText,
items: playlist).content
}
}

View File

@ -19,19 +19,10 @@ final class PageGenerator {
}
private func makeEmptyPageContent(in language: ContentLanguage) -> String {
#warning("Configure empty page text in settings")
switch language {
case .english:
return ContentBox(
title: "Content not available",
text: "This page is not available yet. Try the German version or check back later.")
.content
case .german:
return ContentBox(
title: "Inhalt nicht verfügbar",
text: "Diese Seite ist noch nicht verfügbar. Versuche die englische Version oder komm später hierher zurück.")
.content
}
let settings = content.settings.pages.localized(in: language)
return ContentBox(
title: settings.emptyPageTitle,
text: settings.emptyPageText).content
}
func generate(page: Page, language: ContentLanguage, results: PageGenerationResults) -> String? {

View File

@ -16,18 +16,18 @@ struct FeedGeneratorSource: PostListPageGeneratorSource {
}
var pageTitle: String {
content.settings.localized(in: language).title
content.settings.posts.localized(in: language).title
}
var pageDescription: String {
content.settings.localized(in: language).description
content.settings.posts.localized(in: language).description
}
/**
The url to the page, including a leading slash
*/
func pageUrlPrefix(for language: ContentLanguage) -> String {
let prefix = content.settings.localized(in: language).feedUrlPrefix
let prefix = content.settings.posts.localized(in: language).feedUrlPrefix
if prefix.hasPrefix( "/" ) {
return prefix
}

View File

@ -46,7 +46,7 @@ final class PostListPageGenerator {
let linkUrl = post.linkedPage.map {
FeedEntryData.Link(
url: $0.absoluteUrl(in: language),
text: localized.pageLinkText ?? post.content.settings.localized(in: language).defaultPageLinkText)
text: localized.pageLinkText ?? post.content.settings.posts.localized(in: language).defaultPageLinkText)
}
// Use the tags of the page if one is linked

View File

@ -14,14 +14,24 @@ final class AudioPlayerSettings: ObservableObject {
@Published
var audioPlayerCssFile: FileResource?
@Published
var german: LocalizedAudioPlayerSettings
@Published
var english: LocalizedAudioPlayerSettings
init(playlistCoverImageSize: Int,
smallCoverImageSize: Int,
audioPlayerJsFile: FileResource?,
audioPlayerCssFile: FileResource?) {
audioPlayerCssFile: FileResource?,
german: LocalizedAudioPlayerSettings,
english: LocalizedAudioPlayerSettings) {
self.playlistCoverImageSize = playlistCoverImageSize
self.smallCoverImageSize = smallCoverImageSize
self.audioPlayerJsFile = audioPlayerJsFile
self.audioPlayerCssFile = audioPlayerCssFile
self.german = german
self.english = english
}
init(file: AudioPlayerSettingsFile, files: [String : FileResource]) {
@ -29,13 +39,17 @@ final class AudioPlayerSettings: ObservableObject {
self.smallCoverImageSize = file.smallCoverImageSize
self.audioPlayerJsFile = file.audioPlayerJsFile.map { files[$0] }
self.audioPlayerCssFile = file.audioPlayerCssFile.map { files[$0] }
self.german = .init(file: file.german)
self.english = .init(file: file.english)
}
var file: AudioPlayerSettingsFile {
.init(playlistCoverImageSize: playlistCoverImageSize,
smallCoverImageSize: smallCoverImageSize,
audioPlayerJsFile: audioPlayerJsFile?.id,
audioPlayerCssFile: audioPlayerCssFile?.id)
audioPlayerCssFile: audioPlayerCssFile?.id,
german: german.file,
english: english.file)
}
}
@ -45,5 +59,11 @@ extension AudioPlayerSettings {
playlistCoverImageSize: 280,
smallCoverImageSize: 78,
audioPlayerJsFile: nil,
audioPlayerCssFile: nil)
audioPlayerCssFile: nil,
german: .init(playlistText: "Wiedergabeliste"),
english: .init(playlistText: "Playlist"))
}
extension AudioPlayerSettings: LocalizedItem {
}

View File

@ -0,0 +1,19 @@
import Foundation
final class LocalizedAudioPlayerSettings: ObservableObject {
@Published
var playlistText: String
init(playlistText: String) {
self.playlistText = playlistText
}
init(file: LocalizedAudioPlayerSettingsFile) {
self.playlistText = file.playlistText
}
var file: LocalizedAudioPlayerSettingsFile {
.init(playlistText: playlistText)
}
}

View File

@ -0,0 +1,27 @@
import Foundation
final class LocalizedPageSettings: ObservableObject {
/// The title to show for the box on an empty page
@Published
var emptyPageTitle: String
/// The text to show in the box on an empty page
@Published
var emptyPageText: String
init(emptyPageTitle: String, emptyPageText: String) {
self.emptyPageTitle = emptyPageTitle
self.emptyPageText = emptyPageText
}
init(file: LocalizedPageSettingsFile) {
self.emptyPageTitle = file.emptyPageTitle
self.emptyPageText = file.emptyPageText
}
var file: LocalizedPageSettingsFile {
.init(emptyPageTitle: emptyPageTitle,
emptyPageText: emptyPageText)
}
}

View File

@ -26,6 +26,12 @@ final class PageSettings: ObservableObject {
@Published
var imageCompareCssFile: FileResource?
@Published
var german: LocalizedPageSettings
@Published
var english: LocalizedPageSettings
init(file: PageSettingsFile, files: [String : FileResource]) {
self.contentWidth = file.contentWidth
self.largeImageWidth = file.largeImageWidth
@ -35,6 +41,8 @@ final class PageSettings: ObservableObject {
self.modelViewerJsFile = file.modelViewerJsFile.map { files[$0] }
self.imageCompareCssFile = file.imageCompareCssFile.map { files[$0] }
self.imageCompareJsFile = file.imageCompareJsFile.map { files[$0] }
self.german = .init(file: file.german)
self.english = .init(file: file.english)
}
var file: PageSettingsFile {
@ -45,6 +53,12 @@ final class PageSettings: ObservableObject {
codeHighlightingJsFile: codeHighlightingJsFile?.id,
modelViewerJsFile: modelViewerJsFile?.id,
imageCompareJsFile: imageCompareJsFile?.id,
imageCompareCssFile: imageCompareCssFile?.id)
imageCompareCssFile: imageCompareCssFile?.id,
german: german.file,
english: english.file)
}
}
extension PageSettings: LocalizedItem {
}

View File

@ -19,26 +19,38 @@ final class PostSettings: ObservableObject {
@Published
var defaultCssFile: FileResource?
@Published
var german: LocalizedPostSettings
@Published
var english: LocalizedPostSettings
init(postsPerPage: Int,
contentWidth: Int,
swiperCssFile: FileResource?,
swiperJsFile: FileResource?,
defaultCssFile: FileResource?) {
defaultCssFile: FileResource?,
german: LocalizedPostSettings,
english: LocalizedPostSettings) {
self.postsPerPage = postsPerPage
self.contentWidth = contentWidth
self.swiperCssFile = swiperCssFile
self.swiperJsFile = swiperJsFile
self.defaultCssFile = defaultCssFile
self.german = german
self.english = english
}
// MARK: Storage
init(file: PostSettingsFile, files: [String : FileResource]) {
self.postsPerPage = file.postsPerPage
self.contentWidth = file.contentWidth
self.swiperCssFile = file.swiperCssFile.map { files[$0] }
self.swiperJsFile = file.swiperJsFile.map { files[$0] }
self.defaultCssFile = file.defaultCssFile.map { files[$0] }
self.german = .init(file: file.german)
self.english = .init(file: file.english)
}
var file: PostSettingsFile {
@ -46,6 +58,19 @@ final class PostSettings: ObservableObject {
contentWidth: contentWidth,
swiperCssFile: swiperCssFile?.id,
swiperJsFile: swiperJsFile?.id,
defaultCssFile: defaultCssFile?.id)
defaultCssFile: defaultCssFile?.id,
german: german.file,
english: english.file)
}
}
extension PostSettings {
static var `default`: PostSettings {
.init(file: .default, files: [:])
}
}
extension PostSettings: LocalizedItem {
}

View File

@ -18,34 +18,16 @@ final class Settings: ObservableObject {
@Published
var audioPlayer: AudioPlayerSettings
@Published
var german: LocalizedPostSettings
@Published
var english: LocalizedPostSettings
init(paths: PathSettings,
navigation: NavigationSettings,
posts: PostSettings,
pages: PageSettings,
audioPlayer: AudioPlayerSettings,
german: LocalizedPostSettings,
english: LocalizedPostSettings) {
audioPlayer: AudioPlayerSettings) {
self.paths = paths
self.navigation = navigation
self.posts = posts
self.pages = pages
self.audioPlayer = audioPlayer
self.german = german
self.english = english
}
func localized(in language: ContentLanguage) -> LocalizedPostSettings {
switch language {
case .english: return english
case .german: return german
}
}
init(file: SettingsFile, files: [String : FileResource], map: (String) -> Item?) {
@ -55,9 +37,6 @@ final class Settings: ObservableObject {
self.pages = PageSettings(file: file.pages, files: files)
self.paths = PathSettings(file: file.paths)
self.audioPlayer = .init(file: file.audioPlayer, files: files)
self.german = .init(file: file.german)
self.english = .init(file: file.english)
}
func file(tagOverview: TagOverviewPage?) -> SettingsFile {
@ -67,9 +46,7 @@ final class Settings: ObservableObject {
posts: posts.file,
pages: pages.file,
audioPlayer: audioPlayer.file,
tagOverview: tagOverview?.file,
german: german.file,
english: english.file)
tagOverview: tagOverview?.file)
}
}
@ -80,7 +57,5 @@ extension Settings {
navigation: .default,
posts: .default,
pages: .default,
audioPlayer: .default,
german: .german,
english: .english)
audioPlayer: .default)
}

View File

@ -1,6 +1,8 @@
struct AudioPlayer: HtmlProducer {
let playlistText: String
let playingText: String
let items: [PlaylistItem]
@ -59,7 +61,7 @@ struct AudioPlayer: HtmlProducer {
"""
<div id="playlist-container">
<div class="top">
<div class="queue">Playlist</div>
<div class="queue">\(playlistText)</div>
<div class="close-playlist"><svg><use href='#\(AudioPlayerCloseIcon.name)'></use></svg></div>
</div>
<div class="playlist">

View File

@ -7,13 +7,6 @@ extension PathSettings {
}
}
extension PostSettings {
static var `default`: PostSettings {
.init(file: .default, files: [:])
}
}
extension PageSettings {
static var `default`: PageSettings {

View File

@ -8,4 +8,17 @@ struct AudioPlayerSettingsFile: Codable {
let audioPlayerJsFile: String?
let audioPlayerCssFile: String?
let german: LocalizedAudioPlayerSettingsFile
let english: LocalizedAudioPlayerSettingsFile
}
struct LocalizedAudioPlayerSettingsFile: Codable {
let playlistText: String
}
extension AudioPlayerSettingsFile: LocalizedItem {
}

View File

@ -0,0 +1,23 @@
struct LocalizedPageSettingsFile {
let emptyPageTitle: String
let emptyPageText: String
init(emptyPageTitle: String, emptyPageText: String) {
self.emptyPageTitle = emptyPageTitle
self.emptyPageText = emptyPageText
}
}
extension LocalizedPageSettingsFile: Codable {
}
extension LocalizedPageSettingsFile {
static var `default`: LocalizedPageSettingsFile {
.init(emptyPageTitle: "Empty Page", emptyPageText: "This page is empty.")
}
}

View File

@ -16,6 +16,10 @@ struct PageSettingsFile {
let imageCompareJsFile: String?
let imageCompareCssFile: String?
let german: LocalizedPageSettingsFile
let english: LocalizedPageSettingsFile
}
extension PageSettingsFile: Codable {
@ -32,6 +36,12 @@ extension PageSettingsFile {
codeHighlightingJsFile: nil,
modelViewerJsFile: nil,
imageCompareJsFile: nil,
imageCompareCssFile: nil)
imageCompareCssFile: nil,
german: .default,
english: .default)
}
}
extension PageSettingsFile: LocalizedItem {
}

View File

@ -13,6 +13,10 @@ struct PostSettingsFile {
let swiperJsFile: String?
let defaultCssFile: String?
let german: LocalizedPostSettingsFile
let english: LocalizedPostSettingsFile
}
extension PostSettingsFile: Codable { }
@ -24,6 +28,8 @@ extension PostSettingsFile {
contentWidth: 600,
swiperCssFile: nil,
swiperJsFile: nil,
defaultCssFile: nil)
defaultCssFile: nil,
german: .default,
english: .default)
}
}

View File

@ -14,10 +14,6 @@ struct SettingsFile {
let audioPlayer: AudioPlayerSettingsFile
let tagOverview: TagOverviewFile?
let german: LocalizedPostSettingsFile
let english: LocalizedPostSettingsFile
}
extension SettingsFile: Codable { }
@ -31,9 +27,7 @@ extension SettingsFile {
posts: .default,
pages: .default,
audioPlayer: AudioPlayerSettings.default.file,
tagOverview: nil,
german: .default,
english: .default
tagOverview: nil
)
}
}

View File

@ -36,8 +36,24 @@ struct AudioSettingsDetailView: View {
footer: "The CSS file to provide the functionality for the audio player",
selectedFile: $audioPlayer.audioPlayerJsFile,
allowedType: .asset)
LocalizedAudioSettingsDetailView(settings: audioPlayer.localized(in: language))
.id(language)
}
.padding()
}
}
}
struct LocalizedAudioSettingsDetailView: View {
@ObservedObject
var settings: LocalizedAudioPlayerSettings
var body: some View {
StringPropertyView(
title: "Playlist Text",
text: $settings.playlistText,
footer: "The text on the audio player indicating the playlist")
}
}

View File

@ -14,9 +14,9 @@ struct GenerationDetailView: View {
case .navigationBar:
NavigationBarSettingsView()
case .postFeed:
PostFeedSettingsView()
PostFeedSettingsView(postSettings: content.settings.posts)
case .pages:
PageSettingsDetailView()
PageSettingsDetailView(pageSettings: content.settings.pages)
case .tagOverview:
TagOverviewDetailView()
case .audioPlayer:

View File

@ -0,0 +1,21 @@
import SwiftUI
struct LocalizedPageSettingsView: View {
@ObservedObject
var settings: LocalizedPageSettings
var body: some View {
VStack(alignment: .leading) {
StringPropertyView(
title: "Empty Page Title",
text: $settings.emptyPageTitle,
footer: "The title to show for the box on an empty page")
TextFieldPropertyView(
title: "Empty Page Text",
text: $settings.emptyPageText,
footer: "The text to show in the box on an empty page")
}
}
}

View File

@ -5,8 +5,8 @@ struct PageSettingsDetailView: View {
@Environment(\.language)
private var language
@EnvironmentObject
private var content: Content
@ObservedObject
var pageSettings: PageSettings
var body: some View {
ScrollView {
@ -17,50 +17,52 @@ struct PageSettingsDetailView: View {
IntegerPropertyView(
title: "Content Width",
value: $content.settings.pages.contentWidth,
value: $pageSettings.contentWidth,
footer: "The maximum width of the content in pages (in pixels)")
IntegerPropertyView(
title: "Fullscreen Image Width",
value: $content.settings.pages.largeImageWidth,
value: $pageSettings.largeImageWidth,
footer: "The maximum width of images that are diplayed fullscreen")
IntegerPropertyView(
title: "Page Link Image Width",
value: $content.settings.pages.pageLinkImageSize,
value: $pageSettings.pageLinkImageSize,
footer: "The maximum width of images diplayed as thumbnails on page links")
FilePropertyView(
title: "Default CSS File",
footer: "The CSS file containing the styling of all pages",
selectedFile: $content.settings.pages.defaultCssFile,
selectedFile: $pageSettings.defaultCssFile,
allowedType: .asset)
FilePropertyView(
title: "Code Highlighting File",
footer: "The JavaScript file to provide syntax highlighting of code blocks",
selectedFile: $content.settings.pages.codeHighlightingJsFile,
selectedFile: $pageSettings.codeHighlightingJsFile,
allowedType: .asset)
FilePropertyView(
title: "3D Model Viewer File",
footer: "The JavaScript file to provide the functionality for the 3D model viewer",
selectedFile: $content.settings.pages.modelViewerJsFile,
selectedFile: $pageSettings.modelViewerJsFile,
allowedType: .asset)
FilePropertyView(
title: "Image Comparison CSS File",
footer: "The CSS file to provide image comparisons",
selectedFile: $content.settings.pages.imageCompareCssFile,
selectedFile: $pageSettings.imageCompareCssFile,
allowedType: .asset)
FilePropertyView(
title: "Image Comparison JaveScript File",
footer: "The JavaScript file to provide image comparisons",
selectedFile: $content.settings.pages.imageCompareJsFile,
selectedFile: $pageSettings.imageCompareJsFile,
allowedType: .asset)
LocalizedPageSettingsView(settings: pageSettings.localized(in: language))
.id(language)
}
.padding()
}
@ -69,7 +71,6 @@ struct PageSettingsDetailView: View {
#Preview {
PageSettingsDetailView()
.environmentObject(Content.mock)
PageSettingsDetailView(pageSettings: .default)
.padding()
}

View File

@ -5,8 +5,8 @@ struct PostFeedSettingsView: View {
@Environment(\.language)
private var language
@EnvironmentObject
private var content: Content
@ObservedObject
var postSettings: PostSettings
var body: some View {
ScrollView {
@ -16,31 +16,32 @@ struct PostFeedSettingsView: View {
IntegerPropertyView(
title: "Content Width",
value: $content.settings.posts.contentWidth,
value: $postSettings.contentWidth,
footer: "The maximum width of the content the post feed (in pixels)")
IntegerPropertyView(
title: "Posts Per Page",
value: $content.settings.posts.postsPerPage,
value: $postSettings.postsPerPage,
footer: "The maximum number of posts displayed on a single page")
FilePropertyView(
title: "Default CSS File",
footer: "The CSS file containing the styling of all post pages",
selectedFile: $content.settings.posts.defaultCssFile)
selectedFile: $postSettings.defaultCssFile)
FilePropertyView(
title: "Swiper CSS File",
footer: "The CSS file containing the styling of image galleries in post feeds",
selectedFile: $content.settings.posts.swiperCssFile)
selectedFile: $postSettings.swiperCssFile)
FilePropertyView(
title: "Swiper JavaScript File",
footer: "The JavaScript file to load the image gallery code in post feeds",
selectedFile: $content.settings.posts.swiperJsFile)
selectedFile: $postSettings.swiperJsFile)
LocalizedPostFeedSettingsView(
settings: content.settings.localized(in: language))
settings: postSettings.localized(in: language))
.id(language)
}
.padding()
}
@ -49,7 +50,6 @@ struct PostFeedSettingsView: View {
#Preview {
PostFeedSettingsView()
.environmentObject(Content.mock)
PostFeedSettingsView(postSettings: .default)
.padding()
}