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 */; };
|
||||
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 */,
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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? {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
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 {
|
||||
|
||||
}
|
||||
|
@ -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 {
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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">
|
||||
|
@ -7,13 +7,6 @@ extension PathSettings {
|
||||
}
|
||||
}
|
||||
|
||||
extension PostSettings {
|
||||
|
||||
static var `default`: PostSettings {
|
||||
.init(file: .default, files: [:])
|
||||
}
|
||||
}
|
||||
|
||||
extension PageSettings {
|
||||
|
||||
static var `default`: PageSettings {
|
||||
|
@ -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 {
|
||||
|
||||
}
|
||||
|
@ -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 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 {
|
||||
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
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()
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user