More actions for generation sheet

This commit is contained in:
Christoph Hagen
2025-05-04 21:49:16 +02:00
parent d779b7a42c
commit afa2e0b844
5 changed files with 140 additions and 15 deletions

View File

@ -20,9 +20,6 @@ struct MainView: App {
@StateObject
private var notifications: NotificationSender = .init()
@State
private var language: ContentLanguage = .english
@StateObject
private var selection: SelectedContent = .init()
@ -131,7 +128,7 @@ struct MainView: App {
}
.toolbar {
ToolbarItem {
Picker("", selection: $language) {
Picker("", selection: $selection.language) {
Text("English")
.tag(ContentLanguage.english)
Text("German")
@ -180,13 +177,13 @@ struct MainView: App {
}
}
.navigationTitle("")
.environment(\.language, language)
.environment(\.language, selection.language)
.environmentObject(content)
.environmentObject(selection)
.onAppear(perform: loadContent)
.sheet(isPresented: $showAddSheet) {
addItemSheet
.environment(\.language, language)
.environment(\.language, selection.language)
.environmentObject(content)
.environmentObject(selection)
}
@ -195,13 +192,14 @@ struct MainView: App {
.environmentObject(content)
}
.sheet(isPresented: $showSettingsSheet) {
SettingsSheet(language: $language)
SettingsSheet(language: $selection.language)
.environmentObject(content)
.presentedWindowStyle(.titleBar)
}
.sheet(isPresented: $showGenerationSheet) {
GenerationContentView()
.environmentObject(content)
.environmentObject(selection)
}
.sheet(isPresented: $showPreviewSheet) {
WebsitePreviewSheet()

View File

@ -2,6 +2,9 @@ import Foundation
final class SelectedContent: ObservableObject {
@Published
var language: ContentLanguage = .english
@Published
var tab: MainViewTab = .posts

View File

@ -9,6 +9,9 @@ struct GenerationContentView: View {
@EnvironmentObject
private var content: Content
@EnvironmentObject
private var selection: SelectedContent
@Environment(\.dismiss)
private var dismiss
@ -74,18 +77,34 @@ struct GenerationContentView: View {
text: "external files",
statusWhenNonEmpty: .nominal,
items: content.results.externalFiles) { $0.id }
GenerationStringIssuesView(
GenerationIssuesView(
text: "empty pages",
statusWhenNonEmpty: .warning,
items: content.results.emptyPages) { "\($0.pageId) (\($0.language))" }
GenerationStringIssuesView(
text: "draft pages",
items: $content.results.emptyPages) { pageId in
HStack {
Text("\(pageId.pageId) (\(pageId.language))")
Spacer()
Button("Show") {
show(page: pageId.pageId,
language: pageId.language)
}
}
}
GenerationIssuesActionView(
title: "draft pages",
statusWhenNonEmpty: .warning,
items: draftPages) { $0.id }
GenerationStringIssuesView(
text: "draft posts",
items: draftPages,
buttonText: "Show",
itemText: { $0.id },
action: { show($0) })
GenerationIssuesActionView(
title: "draft posts",
statusWhenNonEmpty: .warning,
items: draftPosts) { $0.id }
items: draftPosts,
buttonText: "Show",
itemText: { $0.id },
action: { show($0) })
GenerationIssuesView(
text: "additional output files",
statusWhenNonEmpty: .warning,
@ -147,6 +166,31 @@ struct GenerationContentView: View {
}
content.results.unusedFilesInOutput.remove(unusedFile)
}
private func show(page pageId: String, language: ContentLanguage? = nil) {
guard let page = content.page(pageId) else {
return
}
show(page, language: language)
}
private func show(_ page: Page, language: ContentLanguage? = nil) {
selection.page = page
if let language {
selection.language = language
}
selection.tab = .pages
dismiss()
}
private func show(_ post: Post, language: ContentLanguage? = nil) {
selection.post = post
if let language {
selection.language = language
}
selection.tab = .posts
dismiss()
}
}
#Preview {

View File

@ -0,0 +1,76 @@
import SwiftUI
struct GenerationIssuesActionView<S, T>: View where S: Collection, T: Hashable & Comparable, S.Element == T {
let title: String
let statusWhenNonEmpty: IssueStatus
let items: S
let buttonText: String
let itemText: (T) -> String
let action: (T) -> Void
@State
private var showList = false
var status: IssueStatus {
items.isEmpty ? .nominal : statusWhenNonEmpty
}
init(title: String, statusWhenNonEmpty: IssueStatus = .error, items: S, buttonText: String, itemText: @escaping (T) -> String, action: @escaping (T) -> Void) {
self.title = title
self.statusWhenNonEmpty = statusWhenNonEmpty
self.items = items
self.buttonText = buttonText
self.itemText = itemText
self.action = action
}
var body: some View {
HStack {
Button(action: showListIfNonEmpty) {
Image(systemSymbol: status.symbol)
.foregroundStyle(status.color)
}.buttonStyle(.plain)
Text("\(items.count) \(title)")
}
.sheet(isPresented: $showList) {
VStack {
Text("\(items.count) \(title)")
.font(.title)
List(items.sorted(), id: \.self) { item in
HStack {
Text(itemText(item))
Spacer()
Button(buttonText) { action(item) }
}
}
.frame(minHeight: 400)
Button("Close") { showList = false }
}.padding()
}
}
private func showListIfNonEmpty() {
guard !items.isEmpty else {
return
}
showList = true
}
}
extension GenerationIssuesActionView where S == Set<String> {
init(title: String, statusWhenNonEmpty: IssueStatus = .error, items: Set<String>, buttonText: String, action: @escaping (T) -> Void) {
self.title = title
self.statusWhenNonEmpty = statusWhenNonEmpty
self.items = items
self.buttonText = buttonText
self.itemText = { $0 }
self.action = action
}
}