Add visibility property to Tag, improve UI

This commit is contained in:
Christoph Hagen
2024-12-01 15:01:36 +01:00
parent 0e3fea9b0d
commit 1261ea534b
12 changed files with 132 additions and 20 deletions

View File

@ -76,6 +76,7 @@ final class Importer {
let tag = TagFile(
id: enTag.urlComponent,
isVisible: true,
german: deTag,
english: enTag)
tags[tagId] = tag

View File

@ -79,13 +79,13 @@ final class Content: ObservableObject {
.store(in: &cancellables)
}
private func convert(_ tag: LocalizedTagFile) -> LocalizedTag {
private func convert(_ tag: LocalizedTagFile, images: [String : ImageResource]) -> LocalizedTag {
LocalizedTag(
urlComponent: tag.urlComponent,
name: tag.name,
subtitle: tag.subtitle,
description: tag.description,
thumbnail: tag.thumbnail,
thumbnail: tag.thumbnail.map { images[$0] },
originalUrl: tag.originalURL)
}
@ -122,13 +122,6 @@ final class Content: ObservableObject {
let postsData = try storage.loadAllPosts()
let filesData = try storage.loadAllFiles()
let tags = tagData.reduce(into: [:]) { (tags, data) in
tags[data.key] = Tag(german: convert(data.value.german),
english: convert(data.value.english))
}
let pages: [String : Page] = loadPages(pagesData, tags: tags)
let images: [String : ImageResource] = filesData.reduce(into: [:]) { dict, item in
let (file, url) = item
let ext = file.components(separatedBy: ".").last!.lowercased()
@ -145,6 +138,15 @@ final class Content: ObservableObject {
}
return FileResource(uniqueId: file, description: "")
}
let tags = tagData.reduce(into: [:]) { (tags, data) in
tags[data.key] = Tag(
isVisible: data.value.isVisible,
german: convert(data.value.german, images: images),
english: convert(data.value.english, images: images))
}
let pages: [String : Page] = loadPages(pagesData, tags: tags)
let posts = postsData.map { postId, post in
let linkedPage = post.linkedPageId.map { pages[$0] }

View File

@ -17,7 +17,7 @@ final class LocalizedTag: ObservableObject {
/// The image id of the thumbnail
@Published
var thumbnail: String?
var thumbnail: ImageResource?
/// The original url in the previous site layout
let originalUrl: String?
@ -26,7 +26,7 @@ final class LocalizedTag: ObservableObject {
name: String,
subtitle: String? = nil,
description: String? = nil,
thumbnail: String? = nil,
thumbnail: ImageResource? = nil,
originalUrl: String? = nil) {
self.urlComponent = urlComponent
self.name = name

View File

@ -4,6 +4,7 @@ extension Tag {
var tagFile: TagFile {
.init(id: id,
isVisible: isVisible,
german: german.tagFile,
english: english.tagFile)
}
@ -16,7 +17,7 @@ extension LocalizedTag {
name: name,
subtitle: subtitle,
description: description,
thumbnail: thumbnail,
thumbnail: thumbnail?.id,
originalURL: originalUrl)
}
}

View File

@ -6,13 +6,17 @@ final class Tag: ObservableObject {
english.urlComponent
}
@Published
var isVisible: Bool
@Published
var german: LocalizedTag
@Published
var english: LocalizedTag
init(german: LocalizedTag, english: LocalizedTag) {
init(isVisible: Bool = true, german: LocalizedTag, english: LocalizedTag) {
self.isVisible = isVisible
self.german = german
self.english = english
}

View File

@ -0,0 +1,5 @@
import Foundation
final class WebsiteData: ObservableObject {
}

View File

@ -34,7 +34,7 @@ extension LocalizedTag {
name: "Electronics",
subtitle: "Projects with electronics",
description: "Some description of the tag",
thumbnail: "electronic-thumbnail.jpg",
thumbnail: ImageResource(resourceName: "image1"),
originalUrl: "projects/electronics")
static let german = LocalizedTag(
@ -42,6 +42,6 @@ extension LocalizedTag {
name: "Elektronik",
subtitle: "Projekte mit Elektronik",
description: "Eine Beschreibung des Tags",
thumbnail: "electronic-thumbnail.jpg",
thumbnail: ImageResource(resourceName: "image2"),
originalUrl: "projects/electronics")
}

View File

@ -4,6 +4,8 @@ struct TagFile {
let id: String
let isVisible: Bool
let german: LocalizedTagFile
let english: LocalizedTagFile

View File

@ -0,0 +1,49 @@
import Foundation
struct WebsiteDataFile {
let german: LocalizedWebsiteDataFile
let english: LocalizedWebsiteDataFile
}
extension WebsiteDataFile: Codable {
}
struct LocalizedWebsiteDataFile {
let title: String
let description: String
let iconDescription: String
}
extension LocalizedWebsiteDataFile: Codable {
}
/*
let navigationItems: [FeedNavigationLink] = [
.init(text: .init(en: "Projects", de: "Projekte"),
url: .init(en: "/projects", de: "/projekte")),
.init(text: .init(en: "Adventures", de: "Abenteuer"),
url: .init(en: "/adventures", de: "/abenteuer")),
.init(text: .init(en: "Services", de: "Dienste"),
url: .init(en: "/services", de: "/dienste")),
.init(text: .init(en: "Tags", de: "Kategorien"),
url: .init(en: "/tags", de: "/kategorien")),
]
let feed = Feed(
language: language,
title: .init(en: "Blog | CH", de: "Blog | CH"),
description: .init(en: "The latests posts, projects and adventures",
de: "Die neusten Beiträge, Projekte und Abenteuer"),
iconDescription: .init(en: "An icon consisting of the letters C and H in blue and orange",
de: "Ein Logo aus den Buchstaben C und H in Blau und Orange"),
navigationItems: navigationItems,
posts: posts)
*/

View File

@ -2,14 +2,25 @@ import SwiftUI
struct TagDetailView: View {
@Binding
var tagIsVisible: Bool
@ObservedObject
var tag: LocalizedTag
@EnvironmentObject
private var content: Content
@State
private var showImagePicker = false
var body: some View {
VStack(alignment: .leading) {
Toggle("Appears in overviews", isOn: $tagIsVisible)
.toggleStyle(.switch)
.font(.callout)
.foregroundStyle(.secondary)
Text("Name")
.font(.callout)
.foregroundStyle(.secondary)
@ -40,14 +51,23 @@ struct TagDetailView: View {
Text("Thumbnail")
.font(.callout)
.foregroundStyle(.secondary)
Text(tag.thumbnail ?? "-")
.padding(.top, 1)
.padding(.bottom)
Button(action: { showImagePicker = true }) {
Text(tag.thumbnail?.id ?? "Select")
}
.buttonStyle(.plain)
.foregroundStyle(.blue)
}
.padding()
.sheet(isPresented: $showImagePicker) {
ImagePickerView(showImagePicker: $showImagePicker) { image in
tag.thumbnail = image
}
}
}
}
#Preview {
TagDetailView(tag: Tag.mock.english)
TagDetailView(
tagIsVisible: .constant(true),
tag: Tag.mock.english)
}

View File

@ -1,5 +1,20 @@
import SwiftUI
private struct SelectedTagView: View {
@Environment(\.language)
private var language
@ObservedObject
var tag: Tag
var body: some View {
TagDetailView(
tagIsVisible: $tag.isVisible,
tag: tag.localized(in: language))
}
}
struct TagsListView: View {
@Environment(\.language)
@ -20,13 +35,18 @@ struct TagsListView: View {
}
} detail: {
if let selectedTag {
TagDetailView(tag: selectedTag.localized(in: language))
SelectedTagView(tag: selectedTag)
} else {
Text("Select a tag to show the details")
.font(.largeTitle)
.foregroundColor(.secondary)
}
}
.onAppear {
if selectedTag == nil {
selectedTag = content.tags.first
}
}
}
}