Add empty page text, playlist text to settings
This commit is contained in:
parent
9f120b251f
commit
9d95e7d210
@ -243,6 +243,10 @@
|
|||||||
E2FE0F622D2C0D8D002963B7 /* VersionedVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F612D2C0D8D002963B7 /* VersionedVideo.swift */; };
|
E2FE0F622D2C0D8D002963B7 /* VersionedVideo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F612D2C0D8D002963B7 /* VersionedVideo.swift */; };
|
||||||
E2FE0F642D2C2F4D002963B7 /* ButtonBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F632D2C2F46002963B7 /* ButtonBlock.swift */; };
|
E2FE0F642D2C2F4D002963B7 /* ButtonBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F632D2C2F46002963B7 /* ButtonBlock.swift */; };
|
||||||
E2FE0F662D2C3B3A002963B7 /* LabelsBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FE0F652D2C3B33002963B7 /* LabelsBlock.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 */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
@ -477,6 +481,10 @@
|
|||||||
E2FE0F612D2C0D8D002963B7 /* VersionedVideo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionedVideo.swift; sourceTree = "<group>"; };
|
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>"; };
|
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>"; };
|
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 */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -534,6 +542,7 @@
|
|||||||
E25DA5372D00420D00AEF16D /* LocalizedPostSettingsFile.swift */,
|
E25DA5372D00420D00AEF16D /* LocalizedPostSettingsFile.swift */,
|
||||||
E25DA5352D0041E200AEF16D /* PostSettingsFile.swift */,
|
E25DA5352D0041E200AEF16D /* PostSettingsFile.swift */,
|
||||||
E25DA5922D023B3600AEF16D /* PageSettingsFile.swift */,
|
E25DA5922D023B3600AEF16D /* PageSettingsFile.swift */,
|
||||||
|
E2FE0F692D2D2D4F002963B7 /* LocalizedPageSettingsFile.swift */,
|
||||||
E21850342CFAFA570090B18B /* SettingsFile.swift */,
|
E21850342CFAFA570090B18B /* SettingsFile.swift */,
|
||||||
E22990212D0ED129009F8D77 /* TagOverviewFile.swift */,
|
E22990212D0ED129009F8D77 /* TagOverviewFile.swift */,
|
||||||
);
|
);
|
||||||
@ -544,10 +553,12 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
E2FE0F392D2B3E4E002963B7 /* AudioPlayerSettings.swift */,
|
E2FE0F392D2B3E4E002963B7 /* AudioPlayerSettings.swift */,
|
||||||
|
E2FE0F6D2D2D3685002963B7 /* LocalizedAudioPlayerSettings.swift */,
|
||||||
E2FE0F012D266FCB002963B7 /* LocalizedNavigationSettings.swift */,
|
E2FE0F012D266FCB002963B7 /* LocalizedNavigationSettings.swift */,
|
||||||
E21850362CFCA5580090B18B /* LocalizedPostSettings.swift */,
|
E21850362CFCA5580090B18B /* LocalizedPostSettings.swift */,
|
||||||
E2FE0EFB2D266D18002963B7 /* NavigationSettings.swift */,
|
E2FE0EFB2D266D18002963B7 /* NavigationSettings.swift */,
|
||||||
E25DA58E2D02368A00AEF16D /* PageSettings.swift */,
|
E25DA58E2D02368A00AEF16D /* PageSettings.swift */,
|
||||||
|
E2FE0F672D2D2CF0002963B7 /* LocalizedPageSettings.swift */,
|
||||||
E29D31952D0C18690051B7F4 /* PathSettings.swift */,
|
E29D31952D0C18690051B7F4 /* PathSettings.swift */,
|
||||||
E25DA5402D00446700AEF16D /* PostSettings.swift */,
|
E25DA5402D00446700AEF16D /* PostSettings.swift */,
|
||||||
E21850322CFAFA200090B18B /* Settings.swift */,
|
E21850322CFAFA200090B18B /* Settings.swift */,
|
||||||
@ -673,6 +684,7 @@
|
|||||||
E29D316E2D0822720051B7F4 /* SettingsListView.swift */,
|
E29D316E2D0822720051B7F4 /* SettingsListView.swift */,
|
||||||
E29D31702D08234D0051B7F4 /* GenerationDetailView.swift */,
|
E29D31702D08234D0051B7F4 /* GenerationDetailView.swift */,
|
||||||
E25DA5942D023BCC00AEF16D /* PageSettingsDetailView.swift */,
|
E25DA5942D023BCC00AEF16D /* PageSettingsDetailView.swift */,
|
||||||
|
E2FE0F6B2D2D3358002963B7 /* LocalizedPageSettingsView.swift */,
|
||||||
E25DA5442D00952D00AEF16D /* SettingsSection.swift */,
|
E25DA5442D00952D00AEF16D /* SettingsSection.swift */,
|
||||||
E2A21C352CB9A3D70060935B /* PathSettingsView.swift */,
|
E2A21C352CB9A3D70060935B /* PathSettingsView.swift */,
|
||||||
E25DA56C2D00EBC900AEF16D /* NavigationBarSettingsView.swift */,
|
E25DA56C2D00EBC900AEF16D /* NavigationBarSettingsView.swift */,
|
||||||
@ -1117,6 +1129,7 @@
|
|||||||
E29D31AD2D0DA5360051B7F4 /* AudioPlayerIcons.swift in Sources */,
|
E29D31AD2D0DA5360051B7F4 /* AudioPlayerIcons.swift in Sources */,
|
||||||
E25DA5452D00952E00AEF16D /* SettingsSection.swift in Sources */,
|
E25DA5452D00952E00AEF16D /* SettingsSection.swift in Sources */,
|
||||||
E2A21C462CBAE2E60060935B /* FeedEntryContent.swift in Sources */,
|
E2A21C462CBAE2E60060935B /* FeedEntryContent.swift in Sources */,
|
||||||
|
E2FE0F682D2D2CF6002963B7 /* LocalizedPageSettings.swift in Sources */,
|
||||||
E2A37D1D2CEA922D0000979F /* LocalizedPost.swift in Sources */,
|
E2A37D1D2CEA922D0000979F /* LocalizedPost.swift in Sources */,
|
||||||
E21850172CEE55FC0090B18B /* FileType.swift in Sources */,
|
E21850172CEE55FC0090B18B /* FileType.swift in Sources */,
|
||||||
E2FE0F042D267206002963B7 /* LocalizedNavigationBarSettingsView.swift in Sources */,
|
E2FE0F042D267206002963B7 /* LocalizedNavigationBarSettingsView.swift in Sources */,
|
||||||
@ -1126,12 +1139,14 @@
|
|||||||
E242520A2C52C9260029FF16 /* ContentLanguage.swift in Sources */,
|
E242520A2C52C9260029FF16 /* ContentLanguage.swift in Sources */,
|
||||||
E2B85F452C429ED60047CD0C /* ImageGallery.swift in Sources */,
|
E2B85F452C429ED60047CD0C /* ImageGallery.swift in Sources */,
|
||||||
E2B85F3B2C428F0E0047CD0C /* Post.swift in Sources */,
|
E2B85F3B2C428F0E0047CD0C /* Post.swift in Sources */,
|
||||||
|
E2FE0F6A2D2D2D55002963B7 /* LocalizedPageSettingsFile.swift in Sources */,
|
||||||
E29D31852D0AE8EE0051B7F4 /* KnownHeaderElement.swift in Sources */,
|
E29D31852D0AE8EE0051B7F4 /* KnownHeaderElement.swift in Sources */,
|
||||||
E25DA51B2CFF08BB00AEF16D /* PostFeedPageNavigation.swift in Sources */,
|
E25DA51B2CFF08BB00AEF16D /* PostFeedPageNavigation.swift in Sources */,
|
||||||
E22990422D107A95009F8D77 /* ImageVersion.swift in Sources */,
|
E22990422D107A95009F8D77 /* ImageVersion.swift in Sources */,
|
||||||
E29D317F2D086F4C0051B7F4 /* StatisticsIcons.swift in Sources */,
|
E29D317F2D086F4C0051B7F4 /* StatisticsIcons.swift in Sources */,
|
||||||
E2FE0F282D2AFB11002963B7 /* ImageCompare.swift in Sources */,
|
E2FE0F282D2AFB11002963B7 /* ImageCompare.swift in Sources */,
|
||||||
E229904E2D13535C009F8D77 /* SecurityBookmark.swift in Sources */,
|
E229904E2D13535C009F8D77 /* SecurityBookmark.swift in Sources */,
|
||||||
|
E2FE0F6E2D2D3689002963B7 /* LocalizedAudioPlayerSettings.swift in Sources */,
|
||||||
E2A21C082CB17B870060935B /* TagView.swift in Sources */,
|
E2A21C082CB17B870060935B /* TagView.swift in Sources */,
|
||||||
E29D313D2D047C1B0051B7F4 /* LocalizedPageContentView.swift in Sources */,
|
E29D313D2D047C1B0051B7F4 /* LocalizedPageContentView.swift in Sources */,
|
||||||
E2FE0F242D2A8C21002963B7 /* TagDisplayView.swift in Sources */,
|
E2FE0F242D2A8C21002963B7 /* TagDisplayView.swift in Sources */,
|
||||||
@ -1274,6 +1289,7 @@
|
|||||||
E2A37D0E2CE527070000979F /* Storage.swift in Sources */,
|
E2A37D0E2CE527070000979F /* Storage.swift in Sources */,
|
||||||
E2E06E002CA4A8F00019C2AF /* Page+Mock.swift in Sources */,
|
E2E06E002CA4A8F00019C2AF /* Page+Mock.swift in Sources */,
|
||||||
E29D314D2D04FCBF0051B7F4 /* FileToAddView.swift in Sources */,
|
E29D314D2D04FCBF0051B7F4 /* FileToAddView.swift in Sources */,
|
||||||
|
E2FE0F6C2D2D335E002963B7 /* LocalizedPageSettingsView.swift in Sources */,
|
||||||
E218502D2CF791440090B18B /* PostImagesView.swift in Sources */,
|
E218502D2CF791440090B18B /* PostImagesView.swift in Sources */,
|
||||||
E29D312A2D039B090051B7F4 /* FileDescriptions.swift in Sources */,
|
E29D312A2D039B090051B7F4 /* FileDescriptions.swift in Sources */,
|
||||||
E2B85F572C4BD0BB0047CD0C /* Binding+Extension.swift in Sources */,
|
E2B85F572C4BD0BB0047CD0C /* Binding+Extension.swift in Sources */,
|
||||||
|
@ -8,9 +8,12 @@ struct AudioPlayerCommand: CommandProcessor {
|
|||||||
|
|
||||||
let results: PageGenerationResults
|
let results: PageGenerationResults
|
||||||
|
|
||||||
|
let language: ContentLanguage
|
||||||
|
|
||||||
init(content: Content, results: PageGenerationResults, language: ContentLanguage) {
|
init(content: Content, results: PageGenerationResults, language: ContentLanguage) {
|
||||||
self.content = content
|
self.content = content
|
||||||
self.results = results
|
self.results = results
|
||||||
|
self.language = language
|
||||||
}
|
}
|
||||||
|
|
||||||
func process(_ arguments: [String], markdown: Substring) -> String {
|
func process(_ arguments: [String], markdown: Substring) -> String {
|
||||||
@ -104,6 +107,9 @@ struct AudioPlayerCommand: CommandProcessor {
|
|||||||
.audioPlayerPause
|
.audioPlayerPause
|
||||||
)
|
)
|
||||||
|
|
||||||
return AudioPlayer(playingText: titleText, items: playlist).content
|
return AudioPlayer(
|
||||||
|
playlistText: content.settings.audioPlayer.localized(in: language).playlistText,
|
||||||
|
playingText: titleText,
|
||||||
|
items: playlist).content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,19 +19,10 @@ final class PageGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func makeEmptyPageContent(in language: ContentLanguage) -> String {
|
private func makeEmptyPageContent(in language: ContentLanguage) -> String {
|
||||||
#warning("Configure empty page text in settings")
|
let settings = content.settings.pages.localized(in: language)
|
||||||
switch language {
|
return ContentBox(
|
||||||
case .english:
|
title: settings.emptyPageTitle,
|
||||||
return ContentBox(
|
text: settings.emptyPageText).content
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func generate(page: Page, language: ContentLanguage, results: PageGenerationResults) -> String? {
|
func generate(page: Page, language: ContentLanguage, results: PageGenerationResults) -> String? {
|
||||||
|
@ -16,18 +16,18 @@ struct FeedGeneratorSource: PostListPageGeneratorSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var pageTitle: String {
|
var pageTitle: String {
|
||||||
content.settings.localized(in: language).title
|
content.settings.posts.localized(in: language).title
|
||||||
}
|
}
|
||||||
|
|
||||||
var pageDescription: String {
|
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
|
The url to the page, including a leading slash
|
||||||
*/
|
*/
|
||||||
func pageUrlPrefix(for language: ContentLanguage) -> String {
|
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( "/" ) {
|
if prefix.hasPrefix( "/" ) {
|
||||||
return prefix
|
return prefix
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ final class PostListPageGenerator {
|
|||||||
let linkUrl = post.linkedPage.map {
|
let linkUrl = post.linkedPage.map {
|
||||||
FeedEntryData.Link(
|
FeedEntryData.Link(
|
||||||
url: $0.absoluteUrl(in: language),
|
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
|
// Use the tags of the page if one is linked
|
||||||
|
@ -14,14 +14,24 @@ final class AudioPlayerSettings: ObservableObject {
|
|||||||
@Published
|
@Published
|
||||||
var audioPlayerCssFile: FileResource?
|
var audioPlayerCssFile: FileResource?
|
||||||
|
|
||||||
|
@Published
|
||||||
|
var german: LocalizedAudioPlayerSettings
|
||||||
|
|
||||||
|
@Published
|
||||||
|
var english: LocalizedAudioPlayerSettings
|
||||||
|
|
||||||
init(playlistCoverImageSize: Int,
|
init(playlistCoverImageSize: Int,
|
||||||
smallCoverImageSize: Int,
|
smallCoverImageSize: Int,
|
||||||
audioPlayerJsFile: FileResource?,
|
audioPlayerJsFile: FileResource?,
|
||||||
audioPlayerCssFile: FileResource?) {
|
audioPlayerCssFile: FileResource?,
|
||||||
|
german: LocalizedAudioPlayerSettings,
|
||||||
|
english: LocalizedAudioPlayerSettings) {
|
||||||
self.playlistCoverImageSize = playlistCoverImageSize
|
self.playlistCoverImageSize = playlistCoverImageSize
|
||||||
self.smallCoverImageSize = smallCoverImageSize
|
self.smallCoverImageSize = smallCoverImageSize
|
||||||
self.audioPlayerJsFile = audioPlayerJsFile
|
self.audioPlayerJsFile = audioPlayerJsFile
|
||||||
self.audioPlayerCssFile = audioPlayerCssFile
|
self.audioPlayerCssFile = audioPlayerCssFile
|
||||||
|
self.german = german
|
||||||
|
self.english = english
|
||||||
}
|
}
|
||||||
|
|
||||||
init(file: AudioPlayerSettingsFile, files: [String : FileResource]) {
|
init(file: AudioPlayerSettingsFile, files: [String : FileResource]) {
|
||||||
@ -29,13 +39,17 @@ final class AudioPlayerSettings: ObservableObject {
|
|||||||
self.smallCoverImageSize = file.smallCoverImageSize
|
self.smallCoverImageSize = file.smallCoverImageSize
|
||||||
self.audioPlayerJsFile = file.audioPlayerJsFile.map { files[$0] }
|
self.audioPlayerJsFile = file.audioPlayerJsFile.map { files[$0] }
|
||||||
self.audioPlayerCssFile = file.audioPlayerCssFile.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 {
|
var file: AudioPlayerSettingsFile {
|
||||||
.init(playlistCoverImageSize: playlistCoverImageSize,
|
.init(playlistCoverImageSize: playlistCoverImageSize,
|
||||||
smallCoverImageSize: smallCoverImageSize,
|
smallCoverImageSize: smallCoverImageSize,
|
||||||
audioPlayerJsFile: audioPlayerJsFile?.id,
|
audioPlayerJsFile: audioPlayerJsFile?.id,
|
||||||
audioPlayerCssFile: audioPlayerCssFile?.id)
|
audioPlayerCssFile: audioPlayerCssFile?.id,
|
||||||
|
german: german.file,
|
||||||
|
english: english.file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,5 +59,11 @@ extension AudioPlayerSettings {
|
|||||||
playlistCoverImageSize: 280,
|
playlistCoverImageSize: 280,
|
||||||
smallCoverImageSize: 78,
|
smallCoverImageSize: 78,
|
||||||
audioPlayerJsFile: nil,
|
audioPlayerJsFile: nil,
|
||||||
audioPlayerCssFile: nil)
|
audioPlayerCssFile: nil,
|
||||||
|
german: .init(playlistText: "Wiedergabeliste"),
|
||||||
|
english: .init(playlistText: "Playlist"))
|
||||||
|
}
|
||||||
|
|
||||||
|
extension AudioPlayerSettings: LocalizedItem {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
27
CHDataManagement/Model/Settings/LocalizedPageSettings.swift
Normal file
27
CHDataManagement/Model/Settings/LocalizedPageSettings.swift
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
@ -26,6 +26,12 @@ final class PageSettings: ObservableObject {
|
|||||||
@Published
|
@Published
|
||||||
var imageCompareCssFile: FileResource?
|
var imageCompareCssFile: FileResource?
|
||||||
|
|
||||||
|
@Published
|
||||||
|
var german: LocalizedPageSettings
|
||||||
|
|
||||||
|
@Published
|
||||||
|
var english: LocalizedPageSettings
|
||||||
|
|
||||||
init(file: PageSettingsFile, files: [String : FileResource]) {
|
init(file: PageSettingsFile, files: [String : FileResource]) {
|
||||||
self.contentWidth = file.contentWidth
|
self.contentWidth = file.contentWidth
|
||||||
self.largeImageWidth = file.largeImageWidth
|
self.largeImageWidth = file.largeImageWidth
|
||||||
@ -35,6 +41,8 @@ final class PageSettings: ObservableObject {
|
|||||||
self.modelViewerJsFile = file.modelViewerJsFile.map { files[$0] }
|
self.modelViewerJsFile = file.modelViewerJsFile.map { files[$0] }
|
||||||
self.imageCompareCssFile = file.imageCompareCssFile.map { files[$0] }
|
self.imageCompareCssFile = file.imageCompareCssFile.map { files[$0] }
|
||||||
self.imageCompareJsFile = file.imageCompareJsFile.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 {
|
var file: PageSettingsFile {
|
||||||
@ -45,6 +53,12 @@ final class PageSettings: ObservableObject {
|
|||||||
codeHighlightingJsFile: codeHighlightingJsFile?.id,
|
codeHighlightingJsFile: codeHighlightingJsFile?.id,
|
||||||
modelViewerJsFile: modelViewerJsFile?.id,
|
modelViewerJsFile: modelViewerJsFile?.id,
|
||||||
imageCompareJsFile: imageCompareJsFile?.id,
|
imageCompareJsFile: imageCompareJsFile?.id,
|
||||||
imageCompareCssFile: imageCompareCssFile?.id)
|
imageCompareCssFile: imageCompareCssFile?.id,
|
||||||
|
german: german.file,
|
||||||
|
english: english.file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension PageSettings: LocalizedItem {
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -19,26 +19,38 @@ final class PostSettings: ObservableObject {
|
|||||||
@Published
|
@Published
|
||||||
var defaultCssFile: FileResource?
|
var defaultCssFile: FileResource?
|
||||||
|
|
||||||
|
@Published
|
||||||
|
var german: LocalizedPostSettings
|
||||||
|
|
||||||
|
@Published
|
||||||
|
var english: LocalizedPostSettings
|
||||||
|
|
||||||
init(postsPerPage: Int,
|
init(postsPerPage: Int,
|
||||||
contentWidth: Int,
|
contentWidth: Int,
|
||||||
swiperCssFile: FileResource?,
|
swiperCssFile: FileResource?,
|
||||||
swiperJsFile: FileResource?,
|
swiperJsFile: FileResource?,
|
||||||
defaultCssFile: FileResource?) {
|
defaultCssFile: FileResource?,
|
||||||
|
german: LocalizedPostSettings,
|
||||||
|
english: LocalizedPostSettings) {
|
||||||
self.postsPerPage = postsPerPage
|
self.postsPerPage = postsPerPage
|
||||||
self.contentWidth = contentWidth
|
self.contentWidth = contentWidth
|
||||||
self.swiperCssFile = swiperCssFile
|
self.swiperCssFile = swiperCssFile
|
||||||
self.swiperJsFile = swiperJsFile
|
self.swiperJsFile = swiperJsFile
|
||||||
self.defaultCssFile = defaultCssFile
|
self.defaultCssFile = defaultCssFile
|
||||||
|
self.german = german
|
||||||
|
self.english = english
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Storage
|
// MARK: Storage
|
||||||
|
|
||||||
init(file: PostSettingsFile, files: [String : FileResource]) {
|
init(file: PostSettingsFile, files: [String : FileResource]) {
|
||||||
self.postsPerPage = file.postsPerPage
|
self.postsPerPage = file.postsPerPage
|
||||||
self.contentWidth = file.contentWidth
|
self.contentWidth = file.contentWidth
|
||||||
self.swiperCssFile = file.swiperCssFile.map { files[$0] }
|
self.swiperCssFile = file.swiperCssFile.map { files[$0] }
|
||||||
self.swiperJsFile = file.swiperJsFile.map { files[$0] }
|
self.swiperJsFile = file.swiperJsFile.map { files[$0] }
|
||||||
self.defaultCssFile = file.defaultCssFile.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 {
|
var file: PostSettingsFile {
|
||||||
@ -46,6 +58,19 @@ final class PostSettings: ObservableObject {
|
|||||||
contentWidth: contentWidth,
|
contentWidth: contentWidth,
|
||||||
swiperCssFile: swiperCssFile?.id,
|
swiperCssFile: swiperCssFile?.id,
|
||||||
swiperJsFile: swiperJsFile?.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 {
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -18,34 +18,16 @@ final class Settings: ObservableObject {
|
|||||||
@Published
|
@Published
|
||||||
var audioPlayer: AudioPlayerSettings
|
var audioPlayer: AudioPlayerSettings
|
||||||
|
|
||||||
@Published
|
|
||||||
var german: LocalizedPostSettings
|
|
||||||
|
|
||||||
@Published
|
|
||||||
var english: LocalizedPostSettings
|
|
||||||
|
|
||||||
|
|
||||||
init(paths: PathSettings,
|
init(paths: PathSettings,
|
||||||
navigation: NavigationSettings,
|
navigation: NavigationSettings,
|
||||||
posts: PostSettings,
|
posts: PostSettings,
|
||||||
pages: PageSettings,
|
pages: PageSettings,
|
||||||
audioPlayer: AudioPlayerSettings,
|
audioPlayer: AudioPlayerSettings) {
|
||||||
german: LocalizedPostSettings,
|
|
||||||
english: LocalizedPostSettings) {
|
|
||||||
self.paths = paths
|
self.paths = paths
|
||||||
self.navigation = navigation
|
self.navigation = navigation
|
||||||
self.posts = posts
|
self.posts = posts
|
||||||
self.pages = pages
|
self.pages = pages
|
||||||
self.audioPlayer = audioPlayer
|
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?) {
|
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.pages = PageSettings(file: file.pages, files: files)
|
||||||
self.paths = PathSettings(file: file.paths)
|
self.paths = PathSettings(file: file.paths)
|
||||||
self.audioPlayer = .init(file: file.audioPlayer, files: files)
|
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 {
|
func file(tagOverview: TagOverviewPage?) -> SettingsFile {
|
||||||
@ -67,9 +46,7 @@ final class Settings: ObservableObject {
|
|||||||
posts: posts.file,
|
posts: posts.file,
|
||||||
pages: pages.file,
|
pages: pages.file,
|
||||||
audioPlayer: audioPlayer.file,
|
audioPlayer: audioPlayer.file,
|
||||||
tagOverview: tagOverview?.file,
|
tagOverview: tagOverview?.file)
|
||||||
german: german.file,
|
|
||||||
english: english.file)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +57,5 @@ extension Settings {
|
|||||||
navigation: .default,
|
navigation: .default,
|
||||||
posts: .default,
|
posts: .default,
|
||||||
pages: .default,
|
pages: .default,
|
||||||
audioPlayer: .default,
|
audioPlayer: .default)
|
||||||
german: .german,
|
|
||||||
english: .english)
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
|
||||||
struct AudioPlayer: HtmlProducer {
|
struct AudioPlayer: HtmlProducer {
|
||||||
|
|
||||||
|
let playlistText: String
|
||||||
|
|
||||||
let playingText: String
|
let playingText: String
|
||||||
|
|
||||||
let items: [PlaylistItem]
|
let items: [PlaylistItem]
|
||||||
@ -59,7 +61,7 @@ struct AudioPlayer: HtmlProducer {
|
|||||||
"""
|
"""
|
||||||
<div id="playlist-container">
|
<div id="playlist-container">
|
||||||
<div class="top">
|
<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 class="close-playlist"><svg><use href='#\(AudioPlayerCloseIcon.name)'></use></svg></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="playlist">
|
<div class="playlist">
|
||||||
|
@ -7,13 +7,6 @@ extension PathSettings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension PostSettings {
|
|
||||||
|
|
||||||
static var `default`: PostSettings {
|
|
||||||
.init(file: .default, files: [:])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension PageSettings {
|
extension PageSettings {
|
||||||
|
|
||||||
static var `default`: PageSettings {
|
static var `default`: PageSettings {
|
||||||
|
@ -8,4 +8,17 @@ struct AudioPlayerSettingsFile: Codable {
|
|||||||
let audioPlayerJsFile: String?
|
let audioPlayerJsFile: String?
|
||||||
|
|
||||||
let audioPlayerCssFile: String?
|
let audioPlayerCssFile: String?
|
||||||
|
|
||||||
|
let german: LocalizedAudioPlayerSettingsFile
|
||||||
|
|
||||||
|
let english: LocalizedAudioPlayerSettingsFile
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LocalizedAudioPlayerSettingsFile: Codable {
|
||||||
|
|
||||||
|
let playlistText: String
|
||||||
|
}
|
||||||
|
|
||||||
|
extension AudioPlayerSettingsFile: LocalizedItem {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.")
|
||||||
|
}
|
||||||
|
}
|
@ -16,6 +16,10 @@ struct PageSettingsFile {
|
|||||||
let imageCompareJsFile: String?
|
let imageCompareJsFile: String?
|
||||||
|
|
||||||
let imageCompareCssFile: String?
|
let imageCompareCssFile: String?
|
||||||
|
|
||||||
|
let german: LocalizedPageSettingsFile
|
||||||
|
|
||||||
|
let english: LocalizedPageSettingsFile
|
||||||
}
|
}
|
||||||
|
|
||||||
extension PageSettingsFile: Codable {
|
extension PageSettingsFile: Codable {
|
||||||
@ -32,6 +36,12 @@ extension PageSettingsFile {
|
|||||||
codeHighlightingJsFile: nil,
|
codeHighlightingJsFile: nil,
|
||||||
modelViewerJsFile: nil,
|
modelViewerJsFile: nil,
|
||||||
imageCompareJsFile: nil,
|
imageCompareJsFile: nil,
|
||||||
imageCompareCssFile: nil)
|
imageCompareCssFile: nil,
|
||||||
|
german: .default,
|
||||||
|
english: .default)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension PageSettingsFile: LocalizedItem {
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -13,6 +13,10 @@ struct PostSettingsFile {
|
|||||||
let swiperJsFile: String?
|
let swiperJsFile: String?
|
||||||
|
|
||||||
let defaultCssFile: String?
|
let defaultCssFile: String?
|
||||||
|
|
||||||
|
let german: LocalizedPostSettingsFile
|
||||||
|
|
||||||
|
let english: LocalizedPostSettingsFile
|
||||||
}
|
}
|
||||||
|
|
||||||
extension PostSettingsFile: Codable { }
|
extension PostSettingsFile: Codable { }
|
||||||
@ -24,6 +28,8 @@ extension PostSettingsFile {
|
|||||||
contentWidth: 600,
|
contentWidth: 600,
|
||||||
swiperCssFile: nil,
|
swiperCssFile: nil,
|
||||||
swiperJsFile: nil,
|
swiperJsFile: nil,
|
||||||
defaultCssFile: nil)
|
defaultCssFile: nil,
|
||||||
|
german: .default,
|
||||||
|
english: .default)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,6 @@ struct SettingsFile {
|
|||||||
let audioPlayer: AudioPlayerSettingsFile
|
let audioPlayer: AudioPlayerSettingsFile
|
||||||
|
|
||||||
let tagOverview: TagOverviewFile?
|
let tagOverview: TagOverviewFile?
|
||||||
|
|
||||||
let german: LocalizedPostSettingsFile
|
|
||||||
|
|
||||||
let english: LocalizedPostSettingsFile
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SettingsFile: Codable { }
|
extension SettingsFile: Codable { }
|
||||||
@ -31,9 +27,7 @@ extension SettingsFile {
|
|||||||
posts: .default,
|
posts: .default,
|
||||||
pages: .default,
|
pages: .default,
|
||||||
audioPlayer: AudioPlayerSettings.default.file,
|
audioPlayer: AudioPlayerSettings.default.file,
|
||||||
tagOverview: nil,
|
tagOverview: nil
|
||||||
german: .default,
|
|
||||||
english: .default
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,24 @@ struct AudioSettingsDetailView: View {
|
|||||||
footer: "The CSS file to provide the functionality for the audio player",
|
footer: "The CSS file to provide the functionality for the audio player",
|
||||||
selectedFile: $audioPlayer.audioPlayerJsFile,
|
selectedFile: $audioPlayer.audioPlayerJsFile,
|
||||||
allowedType: .asset)
|
allowedType: .asset)
|
||||||
|
|
||||||
|
LocalizedAudioSettingsDetailView(settings: audioPlayer.localized(in: language))
|
||||||
|
.id(language)
|
||||||
}
|
}
|
||||||
.padding()
|
.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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -14,9 +14,9 @@ struct GenerationDetailView: View {
|
|||||||
case .navigationBar:
|
case .navigationBar:
|
||||||
NavigationBarSettingsView()
|
NavigationBarSettingsView()
|
||||||
case .postFeed:
|
case .postFeed:
|
||||||
PostFeedSettingsView()
|
PostFeedSettingsView(postSettings: content.settings.posts)
|
||||||
case .pages:
|
case .pages:
|
||||||
PageSettingsDetailView()
|
PageSettingsDetailView(pageSettings: content.settings.pages)
|
||||||
case .tagOverview:
|
case .tagOverview:
|
||||||
TagOverviewDetailView()
|
TagOverviewDetailView()
|
||||||
case .audioPlayer:
|
case .audioPlayer:
|
||||||
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -5,8 +5,8 @@ struct PageSettingsDetailView: View {
|
|||||||
@Environment(\.language)
|
@Environment(\.language)
|
||||||
private var language
|
private var language
|
||||||
|
|
||||||
@EnvironmentObject
|
@ObservedObject
|
||||||
private var content: Content
|
var pageSettings: PageSettings
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
@ -17,50 +17,52 @@ struct PageSettingsDetailView: View {
|
|||||||
|
|
||||||
IntegerPropertyView(
|
IntegerPropertyView(
|
||||||
title: "Content Width",
|
title: "Content Width",
|
||||||
value: $content.settings.pages.contentWidth,
|
value: $pageSettings.contentWidth,
|
||||||
footer: "The maximum width of the content in pages (in pixels)")
|
footer: "The maximum width of the content in pages (in pixels)")
|
||||||
|
|
||||||
IntegerPropertyView(
|
IntegerPropertyView(
|
||||||
title: "Fullscreen Image Width",
|
title: "Fullscreen Image Width",
|
||||||
value: $content.settings.pages.largeImageWidth,
|
value: $pageSettings.largeImageWidth,
|
||||||
footer: "The maximum width of images that are diplayed fullscreen")
|
footer: "The maximum width of images that are diplayed fullscreen")
|
||||||
|
|
||||||
IntegerPropertyView(
|
IntegerPropertyView(
|
||||||
title: "Page Link Image Width",
|
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")
|
footer: "The maximum width of images diplayed as thumbnails on page links")
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "Default CSS File",
|
title: "Default CSS File",
|
||||||
footer: "The CSS file containing the styling of all pages",
|
footer: "The CSS file containing the styling of all pages",
|
||||||
selectedFile: $content.settings.pages.defaultCssFile,
|
selectedFile: $pageSettings.defaultCssFile,
|
||||||
allowedType: .asset)
|
allowedType: .asset)
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "Code Highlighting File",
|
title: "Code Highlighting File",
|
||||||
footer: "The JavaScript file to provide syntax highlighting of code blocks",
|
footer: "The JavaScript file to provide syntax highlighting of code blocks",
|
||||||
selectedFile: $content.settings.pages.codeHighlightingJsFile,
|
selectedFile: $pageSettings.codeHighlightingJsFile,
|
||||||
allowedType: .asset)
|
allowedType: .asset)
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "3D Model Viewer File",
|
title: "3D Model Viewer File",
|
||||||
footer: "The JavaScript file to provide the functionality for the 3D model viewer",
|
footer: "The JavaScript file to provide the functionality for the 3D model viewer",
|
||||||
selectedFile: $content.settings.pages.modelViewerJsFile,
|
selectedFile: $pageSettings.modelViewerJsFile,
|
||||||
allowedType: .asset)
|
allowedType: .asset)
|
||||||
|
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "Image Comparison CSS File",
|
title: "Image Comparison CSS File",
|
||||||
footer: "The CSS file to provide image comparisons",
|
footer: "The CSS file to provide image comparisons",
|
||||||
selectedFile: $content.settings.pages.imageCompareCssFile,
|
selectedFile: $pageSettings.imageCompareCssFile,
|
||||||
allowedType: .asset)
|
allowedType: .asset)
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "Image Comparison JaveScript File",
|
title: "Image Comparison JaveScript File",
|
||||||
footer: "The JavaScript file to provide image comparisons",
|
footer: "The JavaScript file to provide image comparisons",
|
||||||
selectedFile: $content.settings.pages.imageCompareJsFile,
|
selectedFile: $pageSettings.imageCompareJsFile,
|
||||||
allowedType: .asset)
|
allowedType: .asset)
|
||||||
|
|
||||||
|
LocalizedPageSettingsView(settings: pageSettings.localized(in: language))
|
||||||
|
.id(language)
|
||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
@ -69,7 +71,6 @@ struct PageSettingsDetailView: View {
|
|||||||
|
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
PageSettingsDetailView()
|
PageSettingsDetailView(pageSettings: .default)
|
||||||
.environmentObject(Content.mock)
|
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ struct PostFeedSettingsView: View {
|
|||||||
@Environment(\.language)
|
@Environment(\.language)
|
||||||
private var language
|
private var language
|
||||||
|
|
||||||
@EnvironmentObject
|
@ObservedObject
|
||||||
private var content: Content
|
var postSettings: PostSettings
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
@ -16,31 +16,32 @@ struct PostFeedSettingsView: View {
|
|||||||
|
|
||||||
IntegerPropertyView(
|
IntegerPropertyView(
|
||||||
title: "Content Width",
|
title: "Content Width",
|
||||||
value: $content.settings.posts.contentWidth,
|
value: $postSettings.contentWidth,
|
||||||
footer: "The maximum width of the content the post feed (in pixels)")
|
footer: "The maximum width of the content the post feed (in pixels)")
|
||||||
|
|
||||||
IntegerPropertyView(
|
IntegerPropertyView(
|
||||||
title: "Posts Per Page",
|
title: "Posts Per Page",
|
||||||
value: $content.settings.posts.postsPerPage,
|
value: $postSettings.postsPerPage,
|
||||||
footer: "The maximum number of posts displayed on a single page")
|
footer: "The maximum number of posts displayed on a single page")
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "Default CSS File",
|
title: "Default CSS File",
|
||||||
footer: "The CSS file containing the styling of all post pages",
|
footer: "The CSS file containing the styling of all post pages",
|
||||||
selectedFile: $content.settings.posts.defaultCssFile)
|
selectedFile: $postSettings.defaultCssFile)
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "Swiper CSS File",
|
title: "Swiper CSS File",
|
||||||
footer: "The CSS file containing the styling of image galleries in post feeds",
|
footer: "The CSS file containing the styling of image galleries in post feeds",
|
||||||
selectedFile: $content.settings.posts.swiperCssFile)
|
selectedFile: $postSettings.swiperCssFile)
|
||||||
|
|
||||||
FilePropertyView(
|
FilePropertyView(
|
||||||
title: "Swiper JavaScript File",
|
title: "Swiper JavaScript File",
|
||||||
footer: "The JavaScript file to load the image gallery code in post feeds",
|
footer: "The JavaScript file to load the image gallery code in post feeds",
|
||||||
selectedFile: $content.settings.posts.swiperJsFile)
|
selectedFile: $postSettings.swiperJsFile)
|
||||||
|
|
||||||
LocalizedPostFeedSettingsView(
|
LocalizedPostFeedSettingsView(
|
||||||
settings: content.settings.localized(in: language))
|
settings: postSettings.localized(in: language))
|
||||||
|
.id(language)
|
||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
@ -49,7 +50,6 @@ struct PostFeedSettingsView: View {
|
|||||||
|
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
PostFeedSettingsView()
|
PostFeedSettingsView(postSettings: .default)
|
||||||
.environmentObject(Content.mock)
|
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user